Prechádzať zdrojové kódy

modules/mqueue: Queue names can now be in pseudo variables

- mq_add()/mq_fetch() can use pseudo variables (as well as strings)
  for queue names.
- $mqk()/$mqv() can use pseudo variables (as well as strings) for
  for queue names.
Peter Dunkley 13 rokov pred
rodič
commit
77209fb7fc

+ 70 - 26
modules/mqueue/mqueue_api.c

@@ -33,6 +33,7 @@
 #include "../../parser/parse_param.h"
 #include "../../ut.h"
 #include "../../shm_init.h"
+#include "../../lib/kcore/faked_msg.h"
 
 #include "mqueue_api.h"
 
@@ -353,21 +354,54 @@ int mq_item_add(str *qname, str *key, str *val)
 /**
  *
  */
-int pv_parse_mqk_name(pv_spec_t *sp, str *in)
+int pv_parse_mq_name(pv_spec_t *sp, str *in)
 {
-	mq_head_t *mh = NULL;
-	mh = mq_head_get(in);
-	if(mh==NULL)
-	{
-		LM_ERR("mqueue not found: %.*s\n", in->len, in->s);
-		return -1;
-	}
 	sp->pvp.pvn.u.isname.name.s = *in;
 	sp->pvp.pvn.type = PV_NAME_INTSTR;
 	sp->pvp.pvn.u.isname.type = 1;
 	return 0;
 }
 
+str *pv_get_mq_name(str *in)
+{
+	str *queue;
+
+	if (in->s[0] != '$')
+		queue = in;
+	else
+	{
+		pv_spec_t *pvs;
+		pv_value_t pvv;
+
+		if (pv_locate_name(in) != in->len)
+		{
+			LM_ERR("invalid pv [%.*s]\n", in->len, in->s);
+			return NULL;
+		}
+		if ((pvs = pv_cache_get(in)) == NULL)
+		{
+			LM_ERR("failed to get pv spec for [%.*s]\n", in->len, in->s);
+			return NULL;
+		}
+
+		memset(&pvv, 0, sizeof(pv_value_t));
+		if (faked_msg_init() < 0)
+		{
+			LM_ERR("faked_msg_init() failed\n");
+			return NULL;
+		}
+		if (pv_get_spec_value(faked_msg_next(), pvs, &pvv) != 0)
+		{
+			LM_ERR("failed to get pv value for [%.*s]\n", in->len, in->s);
+			return NULL;
+		}
+
+		queue = &pvv.rs;
+	}
+
+	return queue;
+}
+
 /**
  *
  */
@@ -375,28 +409,24 @@ int pv_get_mqk(struct sip_msg *msg, pv_param_t *param,
 		pv_value_t *res)
 {
 	mq_pv_t *mp = NULL;
-	mp = mq_pv_get(&param->pvn.u.isname.name.s);
-	if(mp==NULL || mp->item==NULL || mp->item->key.len<=0)
-		return pv_get_null(msg, param, res);
-	return pv_get_strval(msg, param, res, &mp->item->key);
-}
+	str *in = pv_get_mq_name(&param->pvn.u.isname.name.s);
 
-/**
- *
- */
-int pv_parse_mqv_name(pv_spec_t *sp, str *in)
-{
-	mq_head_t *mh = NULL;
-	mh = mq_head_get(in);
-	if(mh==NULL)
+	if (in == NULL)
+	{
+		LM_ERR("failed to get mq name\n");
+		return -1;
+	}
+
+	if (mq_head_get(in) == NULL)
 	{
 		LM_ERR("mqueue not found: %.*s\n", in->len, in->s);
 		return -1;
 	}
-	sp->pvp.pvn.u.isname.name.s = *in;
-	sp->pvp.pvn.type = PV_NAME_INTSTR;
-	sp->pvp.pvn.u.isname.type = 1;
-	return 0;
+
+	mp = mq_pv_get(in);
+	if(mp==NULL || mp->item==NULL || mp->item->key.len<=0)
+		return pv_get_null(msg, param, res);
+	return pv_get_strval(msg, param, res, &mp->item->key);
 }
 
 /**
@@ -406,7 +436,21 @@ int pv_get_mqv(struct sip_msg *msg, pv_param_t *param,
 		pv_value_t *res)
 {
 	mq_pv_t *mp = NULL;
-	mp = mq_pv_get(&param->pvn.u.isname.name.s);
+	str *in = pv_get_mq_name(&param->pvn.u.isname.name.s);
+
+	if (in == NULL)
+	{
+		LM_ERR("failed to get mq name\n");
+		return -1;
+	}
+
+	if (mq_head_get(in) == NULL)
+	{
+		LM_ERR("mqueue not found: %.*s\n", in->len, in->s);
+		return -1;
+	}
+
+	mp = mq_pv_get(in);
 	if(mp==NULL || mp->item==NULL || mp->item->val.len<=0)
 		return pv_get_null(msg, param, res);
 	return pv_get_strval(msg, param, res, &mp->item->val);

+ 1 - 2
modules/mqueue/mqueue_api.h

@@ -28,10 +28,9 @@
 #include "../../pvar.h"
 #include "../../parser/msg_parser.h"
 
-int pv_parse_mqk_name(pv_spec_p sp, str *in);
+int pv_parse_mq_name(pv_spec_p sp, str *in);
 int pv_get_mqk(struct sip_msg *msg, pv_param_t *param,
 		pv_value_t *res);
-int pv_parse_mqv_name(pv_spec_p sp, str *in);
 int pv_get_mqv(struct sip_msg *msg, pv_param_t *param,
 		pv_value_t *res);
 

+ 22 - 11
modules/mqueue/mqueue_mod.c

@@ -52,15 +52,15 @@ static int bind_mq(mq_api_t* api);
 
 static pv_export_t mod_pvs[] = {
 	{ {"mqk", sizeof("mqk")-1}, PVT_OTHER, pv_get_mqk, 0,
-		pv_parse_mqk_name, 0, 0, 0 },
+		pv_parse_mq_name, 0, 0, 0 },
 	{ {"mqv", sizeof("mqv")-1}, PVT_OTHER, pv_get_mqv, 0,
-		pv_parse_mqv_name, 0, 0, 0 },
+		pv_parse_mq_name, 0, 0, 0 },
 	{ {0, 0}, 0, 0, 0, 0, 0, 0, 0 }
 };
 
 
 static cmd_export_t cmds[]={
-	{"mq_fetch", (cmd_function)w_mq_fetch, 1, fixup_str_null,
+	{"mq_fetch", (cmd_function)w_mq_fetch, 1, fixup_spve_null,
 		0, ANY_ROUTE},
 	{"mq_add", (cmd_function)w_mq_add, 3, fixup_mq_add,
 		0, ANY_ROUTE},
@@ -114,8 +114,14 @@ static void mod_destroy(void)
 static int w_mq_fetch(struct sip_msg* msg, char* mq, char* str2)
 {
 	int ret;
+	str q;
 
-	ret = mq_head_fetch((str*)mq);
+	if(fixup_get_svalue(msg, (gparam_t*)mq, &q)<0)
+	{
+		LM_ERR("cannot get the queue\n");
+		return -1;
+	}
+	ret = mq_head_fetch(&q);
 	if(ret<0)
 		return ret;
 	return 1;
@@ -123,8 +129,15 @@ static int w_mq_fetch(struct sip_msg* msg, char* mq, char* str2)
 
 static int w_mq_add(struct sip_msg* msg, char* mq, char* key, char* val)
 {
+	str q;
 	str qkey;
 	str qval;
+
+	if(fixup_get_svalue(msg, (gparam_t*)mq, &q)<0)
+	{
+		LM_ERR("cannot get the queue\n");
+		return -1;
+	}
 	if(fixup_get_svalue(msg, (gparam_t*)key, &qkey)<0)
 	{
 		LM_ERR("cannot get the key\n");
@@ -135,7 +148,7 @@ static int w_mq_add(struct sip_msg* msg, char* mq, char* key, char* val)
 		LM_ERR("cannot get the val\n");
 		return -1;
 	}
-	if(mq_item_add((str*)mq, &qkey, &qval)<0)
+	if(mq_item_add(&q, &qkey, &qval)<0)
 		return -1;
 	return 1;
 }
@@ -202,14 +215,12 @@ int mq_param(modparam_t type, void *val)
 
 static int fixup_mq_add(void** param, int param_no)
 {
-    if(param_no==2 || param_no==3) {
+    if(param_no==1 || param_no==2 || param_no==3) {
 		return fixup_spve_null(param, 1);
     }
-    if (param_no != 1)	{
-		LM_ERR("invalid parameter number %d\n", param_no);
-		return E_UNSPEC;
-    }
-    return fixup_str_null(param, 1);
+
+    LM_ERR("invalid parameter number %d\n", param_no);
+    return E_UNSPEC;
 }
 
 static int bind_mq(mq_api_t* api)