On 05/17/2014 11:14 AM, Juha Heinanen wrote:
Victor Seva writes:
is there
any performance penalty compared to current version when pvs
are not used?
Calling to the new core function pv_check_format(str *) in the load
process in order to detect if the match/subst rule has pv vars.
performance penalty during load of rules from dialplan table is fine as
long as there is no penalty to dp_translate() call.
You can see that if the flag is not matched nothing changes there.
#define DP_MAX_ATTRS_LEN 128
static char dp_attrs_buf[DP_MAX_ATTRS_LEN+1];
int translate(struct sip_msg *msg, str input, str *output, dpl_id_p idp,
str *attrs)
{
dpl_node_p rulep;
+ dpl_pv_node_p rule_pv;
dpl_index_p indexp;
+ pcre *match_comp = NULL;
int user_len, rez;
char b;
@@ -339,7 +486,27 @@ search_rule:
case DP_REGEX_OP:
LM_DBG("regex operator testing\n");
- rez = pcre_exec(rulep->match_comp, NULL, input.s, input.len,
+ if(rulep->pv_flags&DP_PV_MATCH) {
+ if(!msg) {
+ LM_ERR("Cannot translate using a regex match with pv "
+ "without message\n");
+ continue;
+ }
+ rule_pv = get_pv_rule(rulep, idp->dp_id, user_len);
+ if(rule_pv) {
+ if(build_pv_comp(msg, rule_pv)<0){
+ LM_ERR("error rule regex comp. Skip this\n");
+ continue;
+ }
+ match_comp = rule_pv->match_comp;
+ }
+ else {
+ LM_ERR("pv rule not found.Skip this\n");
+ continue;
+ }
+ }
+ else match_comp = rulep->match_comp;
+ rez = pcre_exec(match_comp, NULL, input.s, input.len,
0, 0, NULL, 0);
break;
@@ -382,8 +549,9 @@ search_rule:
return -1;
repl:
- LM_DBG("found a matching rule %p: pr %i, match_exp %.*s\n",
- rulep, rulep->pr, rulep->match_exp.len, rulep->match_exp.s);
+ LM_DBG("found a matching rule %p: pr %i, match_exp %.*s pv_flags:%d\n",
+ rulep, rulep->pr, rulep->match_exp.len, rulep->match_exp.s,
+ rulep->pv_flags);
if(attrs) {
attrs->len = 0;
@@ -405,7 +573,10 @@ repl:
}
}
- if(rule_translate(msg, input, rulep, output)!=0){
+ if(!(rulep->pv_flags&DP_PV_MASK))
+ rule_pv = NULL;
+
+ if(rule_translate(msg, input, rulep, rule_pv, output)!=0){
LM_ERR("could not build the output\n");
return -1;
}