Browse Source

avops: use pv_cache_get instead of pv_parse_spec.

Victor Seva 12 years ago
parent
commit
5e775ff328
4 changed files with 57 additions and 57 deletions
  1. 14 14
      modules/avpops/avpops.c
  2. 28 28
      modules/avpops/avpops_impl.c
  3. 1 1
      modules/avpops/avpops_impl.h
  4. 14 14
      modules/avpops/avpops_parse.c

+ 14 - 14
modules/avpops/avpops.c

@@ -266,16 +266,16 @@ static int fixup_db_avp(void** param, int param_no, int allow_scheme)
 		} else {
 			/* is a variable $xxxxx */
 			s.len = strlen(s.s);
-			p = pv_parse_spec(&s, &sp->u.sval);
-			if (p==0 || sp->u.sval.type==PVT_NULL || sp->u.sval.type==PVT_EMPTY)
+			sp->u.sval = pv_cache_get(&s);
+			if (sp->u.sval==0 || sp->u.sval->type==PVT_NULL || sp->u.sval->type==PVT_EMPTY)
 			{
 				LM_ERR("bad param 1; "
 					"expected : $pseudo-variable or int/str value\n");
 				return E_UNSPEC;
 			}
 			
-			if(sp->u.sval.type==PVT_RURI || sp->u.sval.type==PVT_FROM
-					|| sp->u.sval.type==PVT_TO || sp->u.sval.type==PVT_OURI)
+			if(sp->u.sval->type==PVT_RURI || sp->u.sval->type==PVT_FROM
+					|| sp->u.sval->type==PVT_TO || sp->u.sval->type==PVT_OURI)
 			{
 				sp->opd = ((flags==0)?AVPOPS_FLAG_URI0:flags)|AVPOPS_VAL_PVAR;
 			} else {
@@ -396,7 +396,7 @@ static int fixup_delete_avp(void** param, int param_no)
 					" pseudo-variable in param \n");
 				return E_UNSPEC;
 			}
-			if (ap->u.sval.type!=PVT_AVP)
+			if (ap->u.sval->type!=PVT_AVP)
 			{
 				LM_ERR("bad param; expected : $avp(name)\n");
 				return E_UNSPEC;
@@ -500,7 +500,7 @@ static int fixup_copy_avp(void** param, int param_no)
 	}
 
 	/* attr name is mandatory */
-	if (ap->u.sval.type!=PVT_AVP)
+	if (ap->u.sval->type!=PVT_AVP)
 	{
 		LM_ERR("you must specify only AVP as parameter\n");
 		return E_UNSPEC;
@@ -566,7 +566,7 @@ static int fixup_pushto_avp(void** param, int param_no)
 			return E_OUT_OF_MEM;
 		}
 
-		switch(ap->u.sval.type) {
+		switch(ap->u.sval->type) {
 			case PVT_RURI:
 				ap->opd = AVPOPS_VAL_NONE|AVPOPS_USE_RURI;
 				if ( p && !(
@@ -623,7 +623,7 @@ static int fixup_pushto_avp(void** param, int param_no)
 			LM_ERR("unable to get pseudo-variable in param 2\n");
 			return E_OUT_OF_MEM;
 		}
-		if (ap->u.sval.type==PVT_NULL)
+		if (ap->u.sval->type==PVT_NULL)
 		{
 			LM_ERR("bad param 2; expected : $pseudo-variable ...\n");
 			pkg_free(ap);
@@ -669,7 +669,7 @@ static int fixup_check_avp(void** param, int param_no)
 			return E_OUT_OF_MEM;
 		}
 		/* attr name is mandatory */
-		if (ap->u.sval.type==PVT_NULL)
+		if (ap->u.sval->type==PVT_NULL)
 		{
 			LM_ERR("null pseudo-variable in param 1\n");
 			return E_UNSPEC;
@@ -745,7 +745,7 @@ static int fixup_subst(void** param, int param_no)
 			LM_ERR("unable to get pseudo-variable in param 2 [%s]\n", s);
 			return E_OUT_OF_MEM;
 		}
-		if (ap->u.sval.type!=PVT_AVP)
+		if (ap->u.sval->type!=PVT_AVP)
 		{
 			LM_ERR("bad attribute name <%s>\n", (char*)*param);
 			pkg_free(av);
@@ -779,7 +779,7 @@ static int fixup_subst(void** param, int param_no)
 					return E_OUT_OF_MEM;
 				}
 			
-				if (ap->u.sval.type!=PVT_AVP)
+				if (ap->u.sval->type!=PVT_AVP)
 				{
 					LM_ERR("bad attribute name <%s>!\n", s);
 					pkg_free(av);
@@ -865,7 +865,7 @@ static int fixup_op_avp(void** param, int param_no)
 			LM_ERR("unable to get pseudo-variable in param 1\n");
 			return E_OUT_OF_MEM;
 		}
-		if (av[0]->u.sval.type!=PVT_AVP)
+		if (av[0]->u.sval->type!=PVT_AVP)
 		{
 			LM_ERR("bad attribute name <%s>\n", (char*)*param);
 			pkg_free(av);
@@ -884,7 +884,7 @@ static int fixup_op_avp(void** param, int param_no)
 			LM_ERR("unable to get pseudo-variable in param 1 (2)\n");
 			return E_OUT_OF_MEM;
 		}
-		if (ap->u.sval.type!=PVT_AVP)
+		if (ap->u.sval->type!=PVT_AVP)
 		{
 			LM_ERR("bad attribute name/alias <%s>!\n", s);
 			pkg_free(av);
@@ -930,7 +930,7 @@ static int fixup_is_avp_set(void** param, int param_no)
 			return E_OUT_OF_MEM;
 		}
 		
-		if (ap->u.sval.type!=PVT_AVP)
+		if (ap->u.sval->type!=PVT_AVP)
 		{
 			LM_ERR("bad attribute name <%s>\n", (char*)*param);
 			return E_UNSPEC;

+ 28 - 28
modules/avpops/avpops_impl.c

@@ -216,7 +216,7 @@ static int dbrow2avp(struct db_row *row, struct db_param *dbp, int_str attr,
 	/* added the avp */
 	db_flags |= AVP_IS_IN_DB;
 	/* set script flags */
-	db_flags |= dbp->a.u.sval.pvp.pvn.u.isname.type&0xff00;
+	db_flags |= dbp->a.u.sval->pvp.pvn.u.isname.type&0xff00;
 	return add_avp( (unsigned short)db_flags, avp_attr, avp_val);
 }
 
@@ -274,7 +274,7 @@ static int avpops_get_aname(struct sip_msg* msg, struct fis_param *ap,
 		return -1;
 	}
 
-	return pv_get_avp_name(msg, &ap->u.sval.pvp, avp_name, name_type);
+	return pv_get_avp_name(msg, &ap->u.sval->pvp, avp_name, name_type);
 }
 
 #define AVPOPS_ATTR_LEN	64
@@ -301,7 +301,7 @@ int ops_dbload_avps (struct sip_msg* msg, struct fis_param *sp,
 	/* get uuid from avp */
 	if (sp->opd&AVPOPS_VAL_PVAR)
 	{
-		if(pv_get_spec_value(msg, &(sp->u.sval), &xvalue)!=0)
+		if(pv_get_spec_value(msg, sp->u.sval, &xvalue)!=0)
 		{
 			LM_CRIT("failed to get PVAR value (%d/%d)\n", sp->opd, sp->ops);
 			goto error;
@@ -343,9 +343,9 @@ int ops_dbload_avps (struct sip_msg* msg, struct fis_param *sp,
 	/* is dynamic avp name ? */
 	if(dbp->a.type==AVPOPS_VAL_PVAR)
 	{
-		if(pv_has_dname(&(dbp->a.u.sval)))
+		if(pv_has_dname(dbp->a.u.sval))
 		{
-			if(pv_get_spec_name(msg, &(dbp->a.u.sval.pvp), &xvalue)!=0)
+			if(pv_get_spec_name(msg, &(dbp->a.u.sval->pvp), &xvalue)!=0)
 			{
 				LM_CRIT("failed to get value for P2\n");
 				goto error;
@@ -394,7 +394,7 @@ int ops_dbload_avps (struct sip_msg* msg, struct fis_param *sp,
 		memset(&avp_name, 0, sizeof(int_str));
 		if(dbp->a.type==AVPOPS_VAL_PVAR)
 		{
-			if(pv_has_dname(&dbp->a.u.sval))
+			if(pv_has_dname(dbp->a.u.sval))
 			{
 				if(xvalue.flags&PV_TYPE_INT)
 				{
@@ -404,8 +404,8 @@ int ops_dbload_avps (struct sip_msg* msg, struct fis_param *sp,
 					avp_type = AVP_NAME_STR;
 				}
 			} else {
-				avp_name = dbp->a.u.sval.pvp.pvn.u.isname.name;
-				avp_type = dbp->a.u.sval.pvp.pvn.u.isname.type;
+				avp_name = dbp->a.u.sval->pvp.pvn.u.isname.name;
+				avp_type = dbp->a.u.sval->pvp.pvn.u.isname.type;
 			}
 		}
 		//if ( dbrow2avp( &res->rows[i], dbp->a.opd, avp_name, sh_flg) < 0 )
@@ -442,7 +442,7 @@ int ops_dbdelete_avps (struct sip_msg* msg, struct fis_param *sp,
 	/* get uuid from avp */
 	if (sp->opd&AVPOPS_VAL_PVAR)
 	{
-		if(pv_get_spec_value(msg, &(sp->u.sval), &xvalue)!=0)
+		if(pv_get_spec_value(msg, sp->u.sval, &xvalue)!=0)
 		{
 			LM_CRIT("failed to get PVAR value (%d/%d)\n", sp->opd, sp->ops);
 			goto error;
@@ -484,9 +484,9 @@ int ops_dbdelete_avps (struct sip_msg* msg, struct fis_param *sp,
 	/* is dynamic avp name ? */
 	if(dbp->a.type==AVPOPS_VAL_PVAR)
 	{
-		if(pv_has_dname(&dbp->a.u.sval))
+		if(pv_has_dname(dbp->a.u.sval))
 		{
-			if(pv_get_spec_name(msg, &(dbp->a.u.sval.pvp), &xvalue)!=0)
+			if(pv_get_spec_name(msg, &(dbp->a.u.sval->pvp), &xvalue)!=0)
 			{
 				LM_CRIT("failed to get value for P2\n");
 				goto error;
@@ -562,7 +562,7 @@ int ops_dbstore_avps (struct sip_msg* msg, struct fis_param *sp,
 	/* get uuid from avp */
 	if (sp->opd&AVPOPS_VAL_PVAR)
 	{
-		if(pv_get_spec_value(msg, &(sp->u.sval), &xvalue)!=0)
+		if(pv_get_spec_value(msg, sp->u.sval, &xvalue)!=0)
 		{
 			LM_CRIT("failed to get PVAR value (%d/%d)\n", sp->opd, sp->ops);
 			goto error;
@@ -610,9 +610,9 @@ int ops_dbstore_avps (struct sip_msg* msg, struct fis_param *sp,
 	/* is dynamic avp name ? */
 	if(dbp->a.type==AVPOPS_VAL_PVAR)
 	{
-		if(pv_has_dname(&dbp->a.u.sval))
+		if(pv_has_dname(dbp->a.u.sval))
 		{
-			if(pv_get_spec_name(msg, &(dbp->a.u.sval.pvp), &xvalue)!=0)
+			if(pv_get_spec_name(msg, &(dbp->a.u.sval->pvp), &xvalue)!=0)
 			{
 				LM_CRIT("failed to get value for P2\n");
 				goto error;
@@ -647,14 +647,14 @@ int ops_dbstore_avps (struct sip_msg* msg, struct fis_param *sp,
 				goto error;
 			}
 		} else {
-			name_type = dbp->a.u.sval.pvp.pvn.u.isname.type;
-			avp_name = dbp->a.u.sval.pvp.pvn.u.isname.name;
+			name_type = dbp->a.u.sval->pvp.pvn.u.isname.type;
+			avp_name = dbp->a.u.sval->pvp.pvn.u.isname.name;
 		}
 	}
 
 	/* set the script flags */
 	if(dbp->a.type==AVPOPS_VAL_PVAR)
-		name_type |= dbp->a.u.sval.pvp.pvn.u.isname.type&0xff00;
+		name_type |= dbp->a.u.sval->pvp.pvn.u.isname.type&0xff00;
 	
 	/* set uuid/(username and domain) fields */
 
@@ -795,8 +795,8 @@ int ops_delete_avp(struct sip_msg* msg, struct fis_param *ap)
 			((ap->opd&AVPOPS_VAL_INT)&&((avp->flags&AVP_NAME_STR))==0) ||
 			((ap->opd&AVPOPS_VAL_STR)&&(avp->flags&AVP_NAME_STR)) )  )
 				continue;
-			if((ap->u.sval.pvp.pvn.u.isname.type&AVP_SCRIPT_MASK)!=0
-					&& ((ap->u.sval.pvp.pvn.u.isname.type&AVP_SCRIPT_MASK)
+			if((ap->u.sval->pvp.pvn.u.isname.type&AVP_SCRIPT_MASK)!=0
+					&& ((ap->u.sval->pvp.pvn.u.isname.type&AVP_SCRIPT_MASK)
 								&avp->flags)==0)
 				continue;
 			/* remove avp */
@@ -925,7 +925,7 @@ int ops_pushto_avp (struct sip_msg* msg, struct fis_param* dst,
 
 	avp = NULL;
 	flags = 0;
-	if(src->u.sval.type==PVT_AVP)
+	if(src->u.sval->type==PVT_AVP)
 	{
 		/* search for the avp */
 		if(avpops_get_aname(msg, src, &avp_name, &name_type)!=0)
@@ -941,7 +941,7 @@ int ops_pushto_avp (struct sip_msg* msg, struct fis_param* dst,
 		}
 		flags = avp->flags;
 	} else {
-		if(pv_get_spec_value(msg, &(src->u.sval), &xvalue)!=0)
+		if(pv_get_spec_value(msg, src->u.sval, &xvalue)!=0)
 		{
 			LM_ERR("cannot get src value\n");
 			goto error;
@@ -1073,7 +1073,7 @@ int ops_check_avp( struct sip_msg* msg, struct fis_param* src,
 	regex_t	       *re;
 
 	/* look if the required avp(s) is/are present */
-	if(src->u.sval.type==PVT_AVP)
+	if(src->u.sval->type==PVT_AVP)
 	{
 		/* search for the avp */
 		if(avpops_get_aname(msg, src, &avp_name1, &name_type1)!=0)
@@ -1091,7 +1091,7 @@ int ops_check_avp( struct sip_msg* msg, struct fis_param* src,
 	} else {
 		avp1 = 0;
 		flags = 0;
-		if(pv_get_spec_value(msg, &(src->u.sval), &xvalue)!=0)
+		if(pv_get_spec_value(msg, src->u.sval, &xvalue)!=0)
 		{
 			LM_ERR("cannot get src value\n");
 			goto error;
@@ -1123,7 +1123,7 @@ cycle1:
 	{
 		/* the 2nd operator is variable -> get avp value */
 		check_flags = 0;
-		if(val->u.sval.type==PVT_AVP)
+		if(val->u.sval->type==PVT_AVP)
 		{
 			/* search for the avp */
 			if(avpops_get_aname(msg, val, &avp_name2, &name_type2)!=0)
@@ -1140,7 +1140,7 @@ cycle1:
 			check_flags = avp2->flags;
 		} else {
 			avp2 = 0;
-			if(pv_get_spec_value(msg, &(val->u.sval), &xvalue)!=0)
+			if(pv_get_spec_value(msg, val->u.sval, &xvalue)!=0)
 			{
 				LM_ERR("cannot get dst value\n");
 				goto error;
@@ -1538,7 +1538,7 @@ cycle1:
 	if (val->opd&AVPOPS_VAL_PVAR)
 	{
 		/* the 2nd operator is variable -> get value */
-		if(val->u.sval.type==PVT_AVP)
+		if(val->u.sval->type==PVT_AVP)
 		{
 			/* search for the avp */
 			if(avpops_get_aname(msg, val, &avp_name2, &name_type2)!=0)
@@ -1560,7 +1560,7 @@ cycle1:
 			}
 		} else {
 			avp2 = 0;
-			if(pv_get_spec_value(msg, &(val->u.sval), &xvalue)!=0)
+			if(pv_get_spec_value(msg, val->u.sval, &xvalue)!=0)
 			{
 				LM_ERR("cannot get dst value\n");
 				goto error;
@@ -1680,7 +1680,7 @@ int ops_is_avp_set(struct sip_msg* msg, struct fis_param *ap)
 	}
 
 	/* get avp index */
-	if(pv_get_spec_index(msg, &ap->u.sval.pvp, &index, &findex)!=0)
+	if(pv_get_spec_index(msg, &ap->u.sval->pvp, &index, &findex)!=0)
 	{
 		LM_ERR("failed to get AVP index\n");
 		return -1;

+ 1 - 1
modules/avpops/avpops_impl.h

@@ -104,7 +104,7 @@ struct fis_param
 	int     opd;       /* operand flags */
 	int     type;
 	union {
-		pv_spec_t sval;    /* values int or str */
+		pv_spec_t *sval;    /* values int or str */
 		int n;
 		str s;
 	} u;

+ 14 - 14
modules/avpops/avpops_parse.c

@@ -69,7 +69,8 @@ struct fis_param *avpops_parse_pvar(char *in)
 	}
 	memset( ap, 0, sizeof(struct fis_param));
 	s.s = in; s.len = strlen(s.s);
-	if(pv_parse_spec(&s, &ap->u.sval)==0)
+	ap->u.sval = pv_cache_get(&s);
+	if(ap->u.sval==NULL)
 	{
 		pkg_free(ap);
 		return NULL;
@@ -87,7 +88,6 @@ int parse_avp_db(char *s, struct db_param *dbp, int allow_scheme)
 	str   tmp;
 	str   s0;
 	char  have_scheme;
-	char *p;
 	char *p0;
 	unsigned int flags;
 
@@ -129,12 +129,12 @@ int parse_avp_db(char *s, struct db_param *dbp, int allow_scheme)
 				goto error;
 			}
 		}
-		dbp->a.u.sval.pvp.pvn.u.isname.type |= (flags<<8)&0xff00;
+		dbp->a.u.sval->pvp.pvn.u.isname.type |= (flags<<8)&0xff00;
 		dbp->a.type = AVPOPS_VAL_NONE;
 	} else {
 		s0.s = s; s0.len = strlen(s0.s);
-		p = pv_parse_spec(&s0, &dbp->a.u.sval);
-		if (p==0 || *p!='\0' || dbp->a.u.sval.type!=PVT_AVP)
+		dbp->a.u.sval = pv_cache_get(&s0);
+		if (dbp->a.u.sval==0 || dbp->a.u.sval->type!=PVT_AVP)
 		{
 			LM_ERR("bad param - expected : $avp(name) or int/str value\n");
 			return E_UNSPEC;
@@ -147,22 +147,22 @@ int parse_avp_db(char *s, struct db_param *dbp, int allow_scheme)
 	if (dbp->a.type == AVPOPS_VAL_PVAR)
 	{
 		dbp->a.opd = AVPOPS_VAL_PVAR;
-		if(pv_has_sname(&dbp->a.u.sval))
+		if(pv_has_sname(dbp->a.u.sval))
 		{
 			dbp->sa.s=(char*)pkg_malloc(
-					dbp->a.u.sval.pvp.pvn.u.isname.name.s.len+1);
+					dbp->a.u.sval->pvp.pvn.u.isname.name.s.len+1);
 			if (dbp->sa.s==0)
 			{
 				LM_ERR("no more pkg mem\n");
 				goto error;
 			}
-			memcpy(dbp->sa.s, dbp->a.u.sval.pvp.pvn.u.isname.name.s.s,
-					dbp->a.u.sval.pvp.pvn.u.isname.name.s.len);
-			dbp->sa.len = dbp->a.u.sval.pvp.pvn.u.isname.name.s.len;
+			memcpy(dbp->sa.s, dbp->a.u.sval->pvp.pvn.u.isname.name.s.s,
+					dbp->a.u.sval->pvp.pvn.u.isname.name.s.len);
+			dbp->sa.len = dbp->a.u.sval->pvp.pvn.u.isname.name.s.len;
 			dbp->sa.s[dbp->sa.len] = 0;
 			dbp->a.opd = AVPOPS_VAL_PVAR|AVPOPS_VAL_STR;
-		} else if(pv_has_iname(&dbp->a.u.sval)) {
-			ul = (unsigned long)dbp->a.u.sval.pvp.pvn.u.isname.name.n;
+		} else if(pv_has_iname(dbp->a.u.sval)) {
+			ul = (unsigned long)dbp->a.u.sval->pvp.pvn.u.isname.name.n;
 			tmp.s = int2str( ul, &(tmp.len) );
 			dbp->sa.s = (char*)pkg_malloc( tmp.len + 1 );
 			if (dbp->sa.s==0)
@@ -514,7 +514,7 @@ struct fis_param* parse_check_value(char *s)
 			LM_ERR("unable to get pseudo-variable\n");
 			goto error;
 		}
-		if (vp->u.sval.type==PVT_NULL)
+		if (vp->u.sval->type==PVT_NULL)
 		{
 			LM_ERR("bad param; expected : $pseudo-variable or int/str value\n");
 			goto error;
@@ -620,7 +620,7 @@ struct fis_param* parse_op_value(char *s)
 			LM_ERR("unable to get pseudo-variable\n");
 			goto error;
 		}
-		if (vp->u.sval.type==PVT_NULL)
+		if (vp->u.sval->type==PVT_NULL)
 		{
 			LM_ERR("bad param; expected : $pseudo-variable or int/str value\n");
 			goto error;