[sr-dev] [tracker] Task opened: dialplan: allow match/subst rules with variables (Attachment added)

Victor Seva linuxmaniac at torreviejawireless.org
Sat May 17 11:08:54 CEST 2014


On 05/17/2014 06:42 AM, Juha Heinanen wrote:
> sip-router writes:
> 
>> Details - This allows the use of pv's at match and subst rules on
>> dialplan module.
> 
> 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.

pv_check_format code is in the first patch

relevant code in build_rule():

>  /*compile the expressions, and if ok, build the rule */
>  dpl_node_t * build_rule(db_val_t * values)
> @@ -359,9 +463,10 @@ dpl_node_t * build_rule(db_val_t * values)
>  	pcre *match_comp, *subst_comp;
>  	struct subst_expr *repl_comp;
>  	dpl_node_t * new_rule;
> -	str match_exp, subst_exp, repl_exp, attrs;
> +	str match_exp, subst_exp, repl_exp, attrs, tmp;
>  	int matchop;
>  	int cap_cnt=0;
> +	unsigned int pv_flags = 0;
>  
>  	matchop = VAL_INT(values+2);
>  
> @@ -377,11 +482,21 @@ dpl_node_t * build_rule(db_val_t * values)
>  
>  	GET_STR_VALUE(match_exp, values, 3);
>  	if(matchop == DP_REGEX_OP){
> -		match_comp = reg_ex_comp(match_exp.s, &cap_cnt);
> -		if(!match_comp){
> -			LM_ERR("failed to compile match expression %.*s\n",
> -					match_exp.len, match_exp.s);
> -			goto err;
> +		if(check_pv_marker(match_exp, &tmp))
> +			pv_flags |= DP_PV_MATCH_M;
> +		if(pv_check_format(&tmp)<0){
> +			pv_flags &= ~DP_PV_MATCH_MASK;
> +			match_comp = reg_ex_comp(match_exp.s, &cap_cnt);
> +			if(!match_comp){
> +				LM_ERR("failed to compile match expression %.*s\n",
> +						match_exp.len, match_exp.s);
> +				goto err;
> +			}
> +		}
> +		else{
> +			pv_flags |= DP_PV_MATCH;
> +			LM_DBG("match_exp DP_PV_MATCH_MASK\n");
> +			match_comp = NULL;
>  		}
>  	}
>  
> @@ -398,26 +513,38 @@ dpl_node_t * build_rule(db_val_t * values)
>  
>  	GET_STR_VALUE(subst_exp, values, 5);
>  	if(subst_exp.s && subst_exp.len){
> -		subst_comp = reg_ex_comp(subst_exp.s, &cap_cnt);
> -		if(!subst_comp){
> -			LM_ERR("failed to compile subst expression %.*s\n",
> -					subst_exp.len, subst_exp.s);
> -			goto err;
> +		if(check_pv_marker(subst_exp, &tmp))
> +			pv_flags |= DP_PV_SUBST_M;
> +		if(pv_check_format(&tmp)<0){
> +			pv_flags &= ~DP_PV_SUBST_MASK;
> +			subst_comp = reg_ex_comp(subst_exp.s, &cap_cnt);
> +			if(!subst_comp){
> +				LM_ERR("failed to compile subst expression %.*s\n",
> +						subst_exp.len, subst_exp.s);
> +				goto err;
> +			}
> +			if (cap_cnt > MAX_REPLACE_WITH) {
> +				LM_ERR("subst expression %.*s has too many sub-expressions\n",
> +						subst_exp.len, subst_exp.s);
> +				goto err;
> +			}
>  		}
> -		if (cap_cnt > MAX_REPLACE_WITH) {
> -			LM_ERR("subst expression %.*s has too many sub-expressions\n",
> -					subst_exp.len, subst_exp.s);
> -			goto err;
> +		else{
> +			pv_flags |= DP_PV_SUBST;
> +			LM_DBG("subst_exp DP_PV_SUBST_MASK\n");
> +			subst_comp = NULL;
>  		}
>  	}
>  
> -	if (repl_comp && (cap_cnt < repl_comp->max_pmatch) && 
> -			(repl_comp->max_pmatch != 0)) {
> -		LM_ERR("repl_exp %.*s refers to %d sub-expressions, but "
> -				"subst_exp %.*s has only %d\n",
> -				repl_exp.len, repl_exp.s, repl_comp->max_pmatch,
> -				subst_exp.len, subst_exp.s, cap_cnt);
> -		goto err;
> +	if((pv_flags&DP_PV_MASK)==0) {
> +		if (repl_comp && (cap_cnt < repl_comp->max_pmatch) &&
> +				(repl_comp->max_pmatch != 0)) {
> +			LM_ERR("repl_exp %.*s refers to %d sub-expressions, but "
> +					"subst_exp %.*s has only %d\n",
> +					repl_exp.len, repl_exp.s, repl_comp->max_pmatch,
> +					subst_exp.len, subst_exp.s, cap_cnt);
> +			goto err;
> +		}
>  	}
>  
>  	new_rule = (dpl_node_t *)shm_malloc(sizeof(dpl_node_t));
> @@ -450,6 +577,7 @@ dpl_node_t * build_rule(db_val_t * values)
>  	new_rule->match_comp = match_comp;
>  	new_rule->subst_comp = subst_comp;
>  	new_rule->repl_comp  = repl_comp;
> +	new_rule->pv_flags = pv_flags;
>  
>  	return new_rule;
>  
> @@ -550,6 +678,85 @@ err:
>  	return -1;
>  }



-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 880 bytes
Desc: OpenPGP digital signature
URL: <http://lists.sip-router.org/pipermail/sr-dev/attachments/20140517/e0c84d83/attachment.pgp>


More information about the sr-dev mailing list