[SR-Dev] git:andrei/type_conversion: core expr eval: defined @select

Andrei Pelinescu-Onciul andrei at iptel.org
Tue Apr 28 12:44:25 CEST 2009


Module: sip-router
Branch: andrei/type_conversion
Commit: 970e1f64e93410101a3dcf8914151388991ba800
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=970e1f64e93410101a3dcf8914151388991ba800

Author: Andrei Pelinescu-Onciul <andrei at iptel.org>
Committer: Andrei Pelinescu-Onciul <andrei at iptel.org>
Date:   Tue Apr 28 09:50:07 2009 +0200

core expr eval: defined @select

- a select can now be undefined (defined @select when run_select
 returns >0 or error => true)
- RV_CACHE_SELECT introduced

---

 rvalue.c |   21 +++++++++++++++------
 rvalue.h |    3 ++-
 2 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/rvalue.c b/rvalue.c
index 897fb4d..aa99131 100644
--- a/rvalue.c
+++ b/rvalue.c
@@ -1386,9 +1386,11 @@ error:
 /** checks if rv is defined.
  * @param res - set to the result 1 - defined, 0 not defined
  * @return 0 on success, -1 on error
- * Can use cached rvalues (c1).
- * Note: a rv can be undefined if it's an undefined avp or pvar or
+ * Can use cached rvalues (cache).
+ * Note: a rv can be undefined if it's an undefined avp or pvar or select or
  * if it's NONE
+ * Note2: an error in the avp, pvar or select search is equivalent to 
+ *  undefined (and it's not reported)
  */
 inline static int rv_defined(struct run_act_ctx* h,
 						 struct sip_msg* msg, int* res,
@@ -1397,13 +1399,21 @@ inline static int rv_defined(struct run_act_ctx* h,
 	avp_t* r_avp;
 	int_str avp_val;
 	pv_value_t pval;
+	str tmp;
 	
 	*res=1;
 	switch(rv->type){
+		case RV_SEL:
+			if (unlikely(cache && cache->cache_type==RV_CACHE_SELECT)){
+				*res=(cache->val_type!=RV_NONE);
+			}else
+				/* run select returns 0 on success, -1 on error and >0 on 
+				   undefined. error is considered undefined */
+				*res=(run_select(&tmp, &rv->v.sel, msg)==0);
+			break;
 		case RV_AVP:
 			if (unlikely(cache && cache->cache_type==RV_CACHE_AVP)){
-				if (cache->val_type==RV_NONE)
-					*res=0;
+				*res=(cache->val_type!=RV_NONE);
 			}else{
 				r_avp = search_avp_by_index(rv->v.avps.type, rv->v.avps.name,
 											&avp_val, rv->v.avps.index);
@@ -1415,8 +1425,7 @@ inline static int rv_defined(struct run_act_ctx* h,
 		case RV_PVAR:
 			/* PV_VAL_NULL or pv_get_spec_value error => undef */
 			if (unlikely(cache && cache->cache_type==RV_CACHE_PVAR)){
-				if (cache->val_type==RV_NONE)
-					*res=0;
+				*res=(cache->val_type==RV_NONE);
 			}else{
 				memset(&pval, 0, sizeof(pval));
 				if (likely(pv_get_spec_value(msg, &rv->v.pvs, &pval)==0)){
diff --git a/rvalue.h b/rvalue.h
index a9dbe0d..e99d1f8 100644
--- a/rvalue.h
+++ b/rvalue.h
@@ -118,7 +118,8 @@ struct rval_expr{
 enum rval_cache_type{
 	RV_CACHE_EMPTY,
 	RV_CACHE_PVAR,
-	RV_CACHE_AVP
+	RV_CACHE_AVP,
+	RV_CACHE_SELECT
 };
 
 /** value cache for a rvalue struct.




More information about the sr-dev mailing list