2
0
Эх сурвалжийг харах

kazoo: add json.count transformation

lazedo 8 жил өмнө
parent
commit
551413f095

+ 18 - 0
src/modules/kazoo/kz_json.c

@@ -197,6 +197,24 @@ struct json_object * kz_json_get_field_object(str* json, str* field)
 	return ret;
 	return ret;
 }
 }
 
 
+int kz_json_get_count(str* json, str* field, pv_value_p dst_val)
+{
+
+  struct json_object *jtree = kz_json_get_field_object(json, field);
+
+
+	dst_val->flags = PV_TYPE_INT | PV_VAL_INT;
+    dst_val->rs = kz_pv_str_empty;
+    dst_val->ri = 0;
+	if(jtree != NULL) {
+		if(json_object_is_type(jtree, json_type_array)) {
+			dst_val->ri = json_object_array_length(jtree);
+		}
+        json_object_put(jtree);
+	}
+	return 1;
+}
+
 
 
 int kz_json_get_field_ex(str* json, str* field, pv_value_p dst_val)
 int kz_json_get_field_ex(str* json, str* field, pv_value_p dst_val)
 {
 {

+ 1 - 0
src/modules/kazoo/kz_json.h

@@ -33,6 +33,7 @@
 #include <json.h>
 #include <json.h>
 
 
 
 
+int kz_json_get_count(str* json, str* field, pv_value_p dst_val);
 int kz_json_get_field(struct sip_msg* msg, char* json, char* field, char* dst);
 int kz_json_get_field(struct sip_msg* msg, char* json, char* field, char* dst);
 int kz_json_get_field_ex(str* json, str* field, pv_value_p dst_val);
 int kz_json_get_field_ex(str* json, str* field, pv_value_p dst_val);
 int kz_json_get_keys(struct sip_msg* msg, char* json, char* field, char* dst);
 int kz_json_get_keys(struct sip_msg* msg, char* json, char* field, char* dst);

+ 77 - 0
src/modules/kazoo/kz_trans.c

@@ -283,6 +283,8 @@ int kz_tr_eval(struct sip_msg *msg, tr_param_t *tp, int subtype, pv_value_t *val
 				kz_destroy_pv_value(pv);
 				kz_destroy_pv_value(pv);
 				return -1;
 				return -1;
 			}
 			}
+
+			kz_free_pv_value(val);
             
             
 			strncpy(_kz_tr_buffer, pv->rs.s, pv->rs.len);
 			strncpy(_kz_tr_buffer, pv->rs.s, pv->rs.len);
 			_kz_tr_buffer[pv->rs.len] = '\0';
 			_kz_tr_buffer[pv->rs.len] = '\0';
@@ -293,8 +295,64 @@ int kz_tr_eval(struct sip_msg *msg, tr_param_t *tp, int subtype, pv_value_t *val
 			val->rs.len = pv->rs.len;
 			val->rs.len = pv->rs.len;
 
 
 			kz_destroy_pv_value(pv);
 			kz_destroy_pv_value(pv);
+
+			break;
+
+		case TR_KAZOO_JSON_COUNT:
+			if(tp==NULL)
+			{
+				LM_ERR("kazoo json.count transform invalid parameter\n");
+				return -1;
+			}
+
+			pv = kz_alloc_pv_value();
+			if(pv == NULL)
+			{
+				LM_ERR("kazoo json.count transform : no more private memory\n");
+				return -1;
+			}
+
+
+			if(tp->type == TR_PARAM_STRING)
+			{
+				v1 = tp->v.s.s;
+				if(fixup_spve_null(&v1, 1) != 0) {
+					LM_ERR("cannot get spve_value from TR_PARAM_STRING : %.*s\n", tp->v.s.len, tp->v.s.s);
+					return -1;
+				}
+				if (fixup_get_svalue(msg, (gparam_p)v1, &v2) != 0) {
+					LM_ERR("cannot get value from TR_PARAM_STRING\n");
+					fixup_free_spve_null(&v1, 1);
+					return -1;
+				}
+				fixup_free_spve_null(&v1, 1);
+				sv = v2;
+			} else {
+				if(pv_get_spec_value(msg, (pv_spec_p)tp->v.data, &v)!=0
+						|| (!(v.flags&PV_VAL_STR)) || v.rs.len<=0)
+				{
+					LM_ERR("value cannot get spec value in json transform\n");
+					kz_destroy_pv_value(pv);
+					return -1;
+				}
+				sv = v.rs;
+			}
+
+			if(kz_json_get_count(&val->rs, &sv, pv ) != 1) {
+				LM_ERR("error getting json\n");
+				kz_destroy_pv_value(pv);
+				return -1;
+			}
+
 			kz_free_pv_value(val);
 			kz_free_pv_value(val);
 
 
+			val->flags = PV_TYPE_INT | PV_VAL_INT;
+			val->rs.s = NULL;
+			val->rs.len = 0;
+			val->ri = pv->ri;
+
+			kz_destroy_pv_value(pv);
+
 			break;
 			break;
 
 
 		default:
 		default:
@@ -400,6 +458,25 @@ char* kz_tr_parse(str* in, trans_t *t)
 	{
 	{
 		t->subtype = TR_KAZOO_ENCODE;
 		t->subtype = TR_KAZOO_ENCODE;
 		goto done;
 		goto done;
+	} else if(name.len==10 && strncasecmp(name.s, "json.count", 10)==0) {
+		t->subtype = TR_KAZOO_JSON_COUNT;
+		if(*p!=TR_PARAM_MARKER)
+		{
+			LM_ERR("invalid json transformation: %.*s!\n", in->len, in->s);
+			goto error;
+		}
+		p++;
+		_kz_tr_parse_sparam(p, p0, tp, spec, ps, in, s);
+		t->params = tp;
+		tp = 0;
+		while(*p && (*p==' ' || *p=='\t' || *p=='\n')) p++;
+		if(*p!=TR_RBRACKET)
+		{
+			LM_ERR("invalid json transformation: %.*s!!\n",
+				in->len, in->s);
+			goto error;
+		}
+		goto done;
 	} else if(name.len==4 && strncasecmp(name.s, "json", 4)==0) {
 	} else if(name.len==4 && strncasecmp(name.s, "json", 4)==0) {
 		t->subtype = TR_KAZOO_JSON;
 		t->subtype = TR_KAZOO_JSON;
 		if(*p!=TR_PARAM_MARKER)
 		if(*p!=TR_PARAM_MARKER)

+ 1 - 1
src/modules/kazoo/kz_trans.h

@@ -34,7 +34,7 @@
 
 
 
 
 enum _kz_tr_type { TR_NONE=0, TR_KAZOO };
 enum _kz_tr_type { TR_NONE=0, TR_KAZOO };
-enum _kz_tr_subtype { TR_KAZOO_NONE=0, TR_KAZOO_ENCODE, TR_KAZOO_JSON };
+enum _kz_tr_subtype { TR_KAZOO_NONE=0, TR_KAZOO_ENCODE, TR_KAZOO_JSON, TR_KAZOO_JSON_COUNT };
 
 
 char* kz_tr_parse(str *in, trans_t *tr);
 char* kz_tr_parse(str *in, trans_t *tr);