[OpenSER-Users] get Count of items in lists

Dave Singer dave.singer at wideideas.com
Wed Dec 12 21:12:51 CET 2007


using openser 1.3, is there a way to get a count of how many items there are
in an avp variable other than:
while ( is_avp_set("$avp(s:fork_uri)") )
    {
        $var(fork_uri_count) = $var(fork_uri_count) + 1 ;
        avp_copy("$avp(s:fork_uri)", "$avp(s:fork_uri_rev_order)/d") ;
    }
then if you wanted things in the same order as they were originally you
would also have to:
while ( is_avp_set("$avp(s:fork_uri_rev_order)") )
    {
        avp_copy("$avp(s:fork_uri_rev_order)", "$avp(s:fork_uri)/d") ;
    }

talk about an expensive counting

Several ways I could see this implimented:
   New function avp_count("$avp(s:myvar)", "$avp(s:count_result)") or
avp_count("$avp(s:myvar)") where $rc contains the result.
   is_avp_set("$avp(s:myvar)") where $rc is set to the count, probably best
as you could test if exitst and the go right to processing.
   avp_check("$avp(s:myvar)", "cn/g") where $rc is set to the count. It
could always set $rc to count of found matches for when the g flag is used.
Of course using $rc for is_avp_set() or avp_check() depends on if setting
that to non-zero makes a test like if( is_avp_set("$avp(s:myvar)") ) always
trigger as false.

also on getting a count ...

another place I need to get a count is how many times a character(s) (or
shoot the moon, a regex) occurs in a string.
for handeling things like transformations like {s.select,index,seperator},
eg: $(var(findme){ s.select,$var(count),,})
  sidenote ... (not sure what values for seperator are valid)
a transformation like {s.count,seperator}

Here is an example of something I was trying to do that would have benifited
from knowing the count of seperator.
I think that I got a warning or error when the test for the while indexed
past the end of the string.

xlog("L_INFO", "Original findme list to parse: $avp(s:findme)\n");
if ( $avp(s:findme) =~ "\|" )
{
    $var(findme) = $(avp(s:findme){s.select,0,|}) ;
    $var(findme_tm_out) = $(avp(s:findme){s.select,1,|}) ;
    xlog("L_INFO", "This findme has a timeout: $var(findme_tm_out)\n");
}
else
{
    $var(findme) = $avp(s:findme) ;
}
xlog("L_INFO", "findme list to parse: $var(findme)\n");
$var(findme_cnt) = 0 ;
while ($(var(findme){s.select,$var(findme_cnt),,}{s.len }) > 0  )
{
    xlog("L_INFO", "Loop $var(findme_cnt), Adding
$(var(findme){s.select,$var(findme_cnt),,})
to TO_list\n");
    $avp(s:TO_list) = $(var(findme){s.select,$var(findme_cnt),,}) ;
    $var(findme_cnt) = $var(findme_cnt) + 1 ;
}

can/do $var()'s stack like $avp()'s?

Thanks
Dave
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sip-router.org/pipermail/sr-users/attachments/20071212/2e420b0c/attachment.htm>


More information about the sr-users mailing list