[sr-dev] [kamailio/kamailio] pv: extend $cnt to work with $xavp (PR #2940)

Nicolas C notifications at github.com
Thu Nov 18 13:56:24 CET 2021


As suggested in previous PR (#2936).
This is much more flexible as it can also handle sub XAVPs, and indexes.


This ended up being more complicated than I anticipated, but I wanted to handle all possible cases.
The tests I performed are detailled after, they should cover every possible use case.


#### Type Of Change
- [x] New feature (non-breaking change which adds new functionality)

#### Checklist:
- [x] Tested changes locally

#### Description

Allows counting XAVPs with `$cnt($xavp(...))`
In addition to the `$cnt($avp(...))` - which is not modified.

			/* Usage:
			 *
			 * $cnt($xavp(key[*])) : number of XAVPs "key".
			 * $cnt($xavp(key[n]=>sub[*])) : number of children "sub" in XAVP "key[n]".
			 * $cnt($xavp(key[*]=>sub[*])) : total number of children "sub" in all XAVPs "key".
			 *
			 * $cnt($xavp(key[n])) : 1 or 0 (if this index exists or not).
			 * $cnt($xavp(key[-n])) : same but with reverse indexing (-1 is the last index).
			 *
			 * $cnt($xavp(key[*]=>sub[n])) : number of children "sub[n]" that exist in all XAPVs "key".
			 *
			 * $cnt($xavp(key)) is the same as $cnt($xavp(key[*])).
			 * $cnt($xavp(key=>sub)) is the same as $cnt($xavp(key[*]=>sub[*])).
			 *
			 * Note: Usually for a XAVP no index means "index 0", not all.
			 * But this would be less intuitive in our case for counting.
			 */


#### Tests

I tried to be exhaustive. All the test cases below do work as expected.

```
$xavp(case1) = "case1.value1";
$xavp(case1) = "case1.value2";
$xavp(case1) = "case1.value3";

$xavp(case2=>sub1) = "case2.value1 sub1.value1";
$xavp(case2[0]=>sub1) = "case2.value1 sub1.value2";
$xavp(case2[0]=>sub1) = "case2.value1 sub1.value3";
$xavp(case2[0]=>sub2) = "case2.value1 sub2.value1";
$xavp(case2[0]=>sub2) = "case2.value1 sub2.value2";
# => will become case2[1] after adding the next entry

$xavp(case2=>sub1) = "case2.value2 sub1.value1";
$xavp(case2[0]=>sub1) = "case2.value2 sub1.value2";

xlog("L_INFO", "----------- TESTS $$cnt($$xavp...) - root XAVPs with no sub XAVPs\n");

xlog("L_INFO", "xavp(case1[0])         : value = $xavp(case1[0]) : cnt (expect: 1) = $cnt($xavp(case1[0]))\n");
xlog("L_INFO", "xavp(case1[1])         : value = $xavp(case1[1]) : cnt (expect: 1) = $cnt($xavp(case1[1]))\n");
xlog("L_INFO", "xavp(case1[-1])        : value = $xavp(case1[-1]) : cnt (expect: 1) = $cnt($xavp(case1[-1]))\n");
xlog("L_INFO", "xavp(case1[-2])        : value = $xavp(case1[-2]) : cnt (expect: 1) = $cnt($xavp(case1[-2]))\n");
xlog("L_INFO", "xavp(case1[-66])       : value = $xavp(case1[-66]) : cnt (expect: 0) = $cnt($xavp(case1[-66]))\n");
xlog("L_INFO", "xavp(case1[66])        : value = $xavp(case1[66]) : cnt (expect: 0) = $cnt($xavp(case1[66]))\n");
xlog("L_INFO", "xavp(case1[*])         : cnt (expect: 3) = $cnt($xavp(case1[*]))\n");
xlog("L_INFO", "xavp(case1)            : cnt (expect: 3) = $cnt($xavp(case1))\n");
xlog("L_INFO", "xavp(case1=>sub)       : cnt (expect: 0) = $cnt($xavp(case1=>sub))\n");
xlog("L_INFO", "xavp(case1[0]=>sub)    : cnt (expect: 0) = $cnt($xavp(case1[0]=>sub))\n");
xlog("L_INFO", "xavp(case1[0]=>sub[0]) : value = $xavp(case1[0]=>sub[0]) : cnt (expect: 0) = $cnt($xavp(case1[0]=>sub[0]))\n");

xlog("L_INFO", "----------- TESTS $$cnt($$xavp...) - root XAVPs using single index\n");

xlog("L_INFO", "xavp(case2[1]=>sub1[0])  : value = $xavp(case2[1]=>sub1[0]) : cnt (expect: 1) = $cnt($xavp(case2[1]=>sub1[0]))\n");
xlog("L_INFO", "xavp(case2[1]=>sub1[-1]) : value = $xavp(case2[1]=>sub1[-1]) : cnt (expect: 1) = $cnt($xavp(case2[1]=>sub1[-1]))\n");
xlog("L_INFO", "xavp(case2[1]=>sub1[3])  : value = $xavp(case2[1]=>sub1[3]) : cnt (expect: 0) = $cnt($xavp(case2[1]=>sub1[3]))\n");
xlog("L_INFO", "xavp(case2[1]=>sub1[*])  : cnt (expect: 3) = $cnt($xavp(case2[1]=>sub1[*]))\n");
xlog("L_INFO", "xavp(case2[1]=>sub1)     : cnt (expect: 3) = $cnt($xavp(case2[1]=>sub1))\n");
xlog("L_INFO", "xavp(case2[1]=>sub2[*])  : cnt (expect: 2) = $cnt($xavp(case2[1]=>sub2[*]))\n");
xlog("L_INFO", "xavp(case2[1]=>sub2)     : cnt (expect: 2) = $cnt($xavp(case2[1]=>sub2))\n");
xlog("L_INFO", "xavp(case2[66]=>sub1)    : cnt (expect: 0) = $cnt($xavp(case2[66]=>sub1))\n");
xlog("L_INFO", "xavp(case2[66]=>sub1[0]) : cnt (expect: 0) = $cnt($xavp(case2[66]=>sub1[0]))\n");

xlog("L_INFO", "----------- TESTS $$cnt($$xavp...) - root XAVPs using all index\n");

xlog("L_INFO", "xavp(case2=>sub1)        : cnt (expect: 5) = $cnt($xavp(case2=>sub1))\n");
xlog("L_INFO", "xavp(case2=>sub1[*])     : cnt (expect: 5) = $cnt($xavp(case2=>sub1[*]))\n");
xlog("L_INFO", "xavp(case2[*]=>sub1)     : cnt (expect: 5) = $cnt($xavp(case2[*]=>sub1))\n");
xlog("L_INFO", "xavp(case2[*]=>sub1[*])  : cnt (expect: 5) = $cnt($xavp(case2[*]=>sub1[*]))\n");
xlog("L_INFO", "xavp(case2[*]=>sub1)     : cnt (expect: 5) = $cnt($xavp(case2[*]=>sub1))\n");
xlog("L_INFO", "xavp(case2[*]=>sub1[0])  : cnt (expect: 2) = $cnt($xavp(case2[*]=>sub1[0]))\n");
xlog("L_INFO", "xavp(case2[*]=>sub1[2])  : cnt (expect: 1) = $cnt($xavp(case2[*]=>sub1[2]))\n");
xlog("L_INFO", "xavp(case2[*]=>sub1[-1]) : cnt (expect: 2) = $cnt($xavp(case2[*]=>sub1[-1]))\n");
xlog("L_INFO", "xavp(case2[*]=>sub2)     : cnt (expect: 2) = $cnt($xavp(case2[*]=>sub2))\n");
xlog("L_INFO", "xavp(case2[*]=>sub2[*])  : cnt (expect: 2) = $cnt($xavp(case2[*]=>sub2[*]))\n");

#xlog("L_INFO", "----------- TESTS $$cnt(...) - parsing errors\n");
# parsing error => server fails to start
#xlog("L_INFO", "PARSE ERROR: $cnt($xavu(test))\n");
#xlog("L_INFO", "PARSE ERROR: $cnt($var(test))\n");
#xlog("L_INFO", "PARSE ERROR: $cnt($unknown(test))\n");
```

You can view, comment on, or merge this pull request online at:

  https://github.com/kamailio/kamailio/pull/2940

-- Commit Summary --

  * pv: extend $cnt to work with $xavp

-- File Changes --

    M src/modules/pv/pv_core.c (156)

-- Patch Links --

https://github.com/kamailio/kamailio/pull/2940.patch
https://github.com/kamailio/kamailio/pull/2940.diff

-- 
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/kamailio/kamailio/pull/2940
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.kamailio.org/pipermail/sr-dev/attachments/20211118/ea783ffc/attachment-0001.htm>


More information about the sr-dev mailing list