Hello,
currently in CVS trunk of development version is a new feature 'transformations'. A transformations is basically a function that can be applied to a pseudo-variable (PV). In this way, the value of PV is not altered but the result is something different.
They are intended to facilitate access to different attributes of PV (like strlen of value, parts of value, substrings) or complete different value of PV (encoded in hexa, md5 value, escape/unescape PV value for DB operations...).
The format is '{id[,parameters]}' and they can be used inside parenthesis of pseudo-variables (note that even short name pseudo-variables must be enclosed in '(' and ')' to be able to apply transformations) For example: - $(ru{s.len}) - returns the lenth of R-URI - $(avp(i:3){s.md5}) - returns the md5 string over value of $avp(i:3)
The following classes of transformations are implemented
1) string - the name of transformation starts with 's.'. Available transformations in this class:
- {s.len} - returns strlen of PV value - {s.md5} - returs md5 over PV value - {s.substr,offset,length} - returns substring starting at offset having size of 'length'. If offset is negative, then it is counted from the end of PV value, -1 being the last char. In case of positive value, 0 is first char. Length must be positive, in case of 0, substring to the end of PV value is returned. offset and length can be PV as well. Example: "abcd"{s.substr,1,0} = "bcd" - {s.select,index,separator} - returns a field from PV value. The field is selected based on separator and index. The separator must be a character used to identify the fields. Index must be a integer value or a PV. If index is negative, the count of fields starts from end of PV value, -1 being last field. If index is positive, 0 is the first field. Example: "12,34,56"{s.select,1,,} = "34" ; "12,34,56"{s.select,-2,,} = "12" - {s.encode.hexa} - returns encoding in hexa of PV value - {s.decode.hexa} - returns decoding from hexa of PV value - {s.escape.common} - returns escaped string of PV value. Characters escaped are ''', '"', '' and 0. Useful when doing DB queries (care should be taken for non latin character set) - {s.unescape.common} - returns unescaped string of PV value. Reverse of above transformation.
2) uri - the name of transformation starts with 'uri.'. The PV value is considered to be a SIP URI. This transformation returns parts of SIP URI (see struct sip_uri). Available transformations in this class:
- {uri.user} - returns the user part - {uri.host} or {uri.domain} - returns the domain part - {uri.passwd} - returns the password - {uri.port} - returns the port - {uri.params} - returns the URI parameters in a string - {uri.param,name} - returns the value of parameter with name 'name' - {uri.headers} - returns URI headers - {uri.transport} - returns the value of transport parameter - {uri.ttl} - returns the value of ttl parameter - {uri.uparam} - returns the value of user parameter - {uri.maddr} - returns the value of maddr parameter - {uri.method} - returns the value of method parameter - {uri.lr} - returns the value of lr parameter - {uri.r2} - returns the value of r2 parameter
3) parameters list - the name of the transformation starts with 'param.'. The PV value is considered to be a string like "name1=value1;name2=value2;...". The transformations returns the value for a specific parameter, or the name of a parameter at a specific index. Available transformations in this class:
- {param.value,name} - returns the value of parameter 'name' Example: "a=1;b=2;c=3"{param.value,c} = "3" - {param.name,index} - returns the name of parameter at position 'index'. Example: "a=1;b=2;c=3"{param.name,1} = "b"
Within a PV, many transformation can be applied, being executed from left to right. Example: $var(x) = "a=1;b=22;c=333"; $(var(x){param.value,$(var(x){param.name,1})}{s.len}) = 2 - the length of the value of parameter at position 1 (remember 0 is first position, 1 is second position)
The transformations can be used anywhere, being considered parts of PV -- in xlog, avpops or other modules' functions and parameters, in right side assignment expressions or in comparisons.
Documentation page for transformations was opened at: http://openser.org/dokuwiki/doku.php/transformations:devel
Feedback is welcome!
Cheers, Daniel