فهرست منبع

modules/mtree: added 'multi' param to mtree definition
- new 'multi' param makes it possible to store both integer and string
typed mtrees into single db table

Juha Heinanen 12 سال پیش
والد
کامیت
25ee7ea17b
5فایلهای تغییر یافته به همراه59 افزوده شده و 22 حذف شده
  1. 6 2
      modules/mtree/README
  2. 7 2
      modules/mtree/doc/mtree_admin.xml
  3. 18 5
      modules/mtree/mtree.c
  4. 3 2
      modules/mtree/mtree.h
  5. 25 11
      modules/mtree/mtree_mod.c

+ 6 - 2
modules/mtree/README

@@ -186,13 +186,17 @@ modparam("mtree", "db_table", "mymtrees")
 
 3.3. mtree (string)
 
-   Definition of memory tree
+   Definition of memory tree with parameters name, dbtable, type, and
+   multi. Name is name of the tree, dbtable is name of dbtable where tree
+   is stored, type is type of tree elements (0 = string, 2 = integer), and
+   multi tells if dbtable can contain more than one tree (0 = one tree, 1
+   = more than one tree identified by tname column).
 
    Default value is "none".
 
    Example 1.3. Set mtree parameter
 ...
-modparam("mtree", "mtree", "name=mytable;dbtable=routes;type=0;")
+modparam("mtree", "mtree", "name=mytree;dbtable=routes;type=0;multi=1")
 ...
 
 3.4. tname_column (string)

+ 7 - 2
modules/mtree/doc/mtree_admin.xml

@@ -97,7 +97,12 @@ modparam("mtree", "db_table", "mymtrees")
 	<section>
 	    <title><varname>mtree</varname> (string)</title>
 	    <para>
-		Definition of memory tree
+		Definition of memory tree with parameters name, dbtable,
+		type, and multi.  Name is name of the tree, dbtable is name
+		of dbtable where tree is stored, type is type of tree elements
+		(0 = string, 2 = integer), and multi tells if dbtable can
+		contain more than one tree (0 = one tree, 1 = more than
+		one tree identified by tname column). 
 	    </para>
 	    <para>
 		<emphasis>
@@ -108,7 +113,7 @@ modparam("mtree", "db_table", "mymtrees")
 		<title>Set <varname>mtree</varname> parameter</title>
 		<programlisting format="linespecific">
 ...
-modparam("mtree", "mtree", "name=mytable;dbtable=routes;type=0;")
+modparam("mtree", "mtree", "name=mytree;dbtable=routes;type=0;multi=1")
 ...
 </programlisting>
 	    </example>

+ 18 - 5
modules/mtree/mtree.c

@@ -98,7 +98,7 @@ int mt_init_list_head(void)
 /**
  *
  */
-m_tree_t* mt_init_tree(str* tname, str *dbtable, int type)
+m_tree_t* mt_init_tree(str* tname, str *dbtable, int type, int multi)
 {
 	m_tree_t *pt = NULL;
 
@@ -111,6 +111,7 @@ m_tree_t* mt_init_tree(str* tname, str *dbtable, int type)
 	memset(pt, 0, sizeof(m_tree_t));
 
 	pt->type = type;
+	pt->multi = multi;
 	pt->tname.s = (char*)shm_malloc((1+tname->len)*sizeof(char));
 	if(pt->tname.s==NULL)
 	{
@@ -156,6 +157,9 @@ int mt_add_to_tree(m_tree_t *pt, str *sp, str *svalue)
 		return -1;
 	}
 
+	LM_DBG("adding to tree <%.*s> of type <%d>\n", pt->tname.len,
+	       pt->tname.s, pt->type);
+
 	if ((pt->type == MT_TREE_IVAL) && (str2sint(svalue, &ivalue) != 0)) {
 		LM_ERR("bad integer string <%.*s>\n", svalue->len, svalue->s);
 		return -1;
@@ -720,6 +724,9 @@ int mt_table_spec(char* val)
 		} else if(pit->name.len==4
 				&& strncasecmp(pit->name.s, "type", 4)==0) {
 			str2sint(&pit->body, &tmp.type);
+		} else if(pit->name.len==5
+				&& strncasecmp(pit->name.s, "multi", 5)==0) {
+			str2sint(&pit->body, &tmp.multi);
 		}  else if(pit->name.len==7
 				&& strncasecmp(pit->name.s, "dbtable", 7)==0) {
 			tmp.dbtable = pit->body;
@@ -740,7 +747,11 @@ int mt_table_spec(char* val)
 		LM_ERR("unknown tree type <%d>\n", tmp.type);
 		goto error;
 	}
-
+	if ((tmp.multi != 0) && (tmp.multi != 1)) {
+		LM_ERR("unknown multi value <%d>\n", tmp.multi);
+		goto error;
+	}
+	
 	/* check for same tree */
 	if(_ptree == 0)
 	{
@@ -773,7 +784,8 @@ int mt_table_spec(char* val)
 	{
 		LM_DBG("adding new tname [%s]\n", tmp.tname.s);
 
-		ndl = mt_init_tree(&tmp.tname, &tmp.dbtable, tmp.type);
+		ndl = mt_init_tree(&tmp.tname, &tmp.dbtable, tmp.type,
+				   tmp.multi);
 		if(ndl==NULL)
 		{
 			LM_ERR("no more shm memory\n");
@@ -797,7 +809,8 @@ error:
 	return -1;
 }
 
-m_tree_t *mt_add_tree(m_tree_t **dpt, str *tname, str *dbtable, int type)
+m_tree_t *mt_add_tree(m_tree_t **dpt, str *tname, str *dbtable, int type,
+		      int multi)
 {
 	m_tree_t *it = NULL;
 	m_tree_t *prev = NULL;
@@ -824,7 +837,7 @@ m_tree_t *mt_add_tree(m_tree_t **dpt, str *tname, str *dbtable, int type)
 	{
 		LM_DBG("adding new tname [%s]\n", tname->s);
 
-		ndl = mt_init_tree(tname, dbtable, type);
+		ndl = mt_init_tree(tname, dbtable, type, multi);
 		if(ndl==NULL)
 		{
 			LM_ERR("no more shm memory\n");

+ 3 - 2
modules/mtree/mtree.h

@@ -66,6 +66,7 @@ typedef struct _m_tree
 	str tname;
 	str dbtable;
 	int type;
+	int multi;
 	unsigned int nrnodes;
 	unsigned int nritems;
 	unsigned int memsize;
@@ -84,7 +85,7 @@ is_t* mt_get_tvalue(m_tree_t *pt, str *tomatch);
 int mt_match_prefix(struct sip_msg *msg, m_tree_t *pt,
 		    str *tomatch, int mode);
 
-m_tree_t* mt_init_tree(str* tname, str* dbtable, int type);
+m_tree_t* mt_init_tree(str* tname, str* dbtable, int type, int multi);
 void mt_free_tree(m_tree_t *pt);
 int mt_print_tree(m_tree_t *pt);
 void mt_free_node(mt_node_t *pn, int type);
@@ -100,7 +101,7 @@ int mt_defined_trees(void);
 m_tree_t *mt_swap_list_head(m_tree_t *ntree);
 int mt_init_list_head(void);
 m_tree_t *mt_add_tree(m_tree_t **dpt, str *tname, str *dbtable,
-		int type);
+		      int type, int multi);
 
 #endif
 

+ 25 - 11
modules/mtree/mtree_mod.c

@@ -120,7 +120,7 @@ static struct mi_root* mt_mi_reload(struct mi_root*, void* param);
 static struct mi_root* mt_mi_list(struct mi_root*, void* param);
 static struct mi_root* mt_mi_summary(struct mi_root*, void* param);
 
-static int mt_load_db(str *tname);
+static int mt_load_db(m_tree_t *pt);
 static int mt_load_db_trees();
 
 static cmd_export_t cmds[]={
@@ -291,8 +291,11 @@ static int mod_init(void)
 
 		while(pt!=NULL)
 		{
+		        LM_DBG("loading from tree <%.*s>\n",
+			        pt->tname.len, pt->tname.s);
+
 			/* loading all information from database */
-			if(mt_load_db(&pt->tname)!=0)
+			if(mt_load_db(pt)!=0)
 			{
 				LM_ERR("cannot load info from database\n");
 				goto error1;
@@ -488,9 +491,12 @@ error:
 
 }
 
-static int mt_load_db(str *tname)
+static int mt_load_db(m_tree_t *pt)
 {
 	db_key_t db_cols[3] = {&tprefix_column, &tvalue_column};
+	db_key_t key_cols[1];
+	db_op_t op[1] = {OP_EQ};
+	db_val_t vals[1];
 	str tprefix, tvalue;
 	db1_res_t* db_res = NULL;
 	int i, ret;
@@ -498,16 +504,22 @@ static int mt_load_db(str *tname)
 	m_tree_t *old_tree = NULL; 
 	mt_node_t *bk_head = NULL; 
 
+	key_cols[0] = &tname_column;
+	VAL_TYPE(vals) = DB1_STRING;
+	VAL_NULL(vals) = 0;
+	VAL_STRING(vals) = pt->tname.s;
+
 	if(db_con==NULL)
 	{
 		LM_ERR("no db connection\n");
 		return -1;
 	}
 
-	old_tree = mt_get_tree(tname);
+	old_tree = mt_get_tree(&(pt->tname));
 	if(old_tree==NULL)
 	{
-		LM_ERR("tree definition not found [%.*s]\n", tname->len, tname->s);
+		LM_ERR("tree definition not found [%.*s]\n", pt->tname.len,
+		       pt->tname.s);
 		return -1;
 	}
 	memcpy(&new_tree, old_tree, sizeof(m_tree_t));
@@ -521,7 +533,8 @@ static int mt_load_db(str *tname)
 	}
 
 	if (DB_CAPABILITY(mt_dbf, DB_CAP_FETCH)) {
-		if(mt_dbf.query(db_con, 0, 0, 0, db_cols, 0, 2, 0, 0) < 0)
+		if(mt_dbf.query(db_con, key_cols, op, vals, db_cols, pt->multi,
+				2, 0, 0) < 0)
 		{
 			LM_ERR("Error while querying db\n");
 			return -1;
@@ -539,8 +552,8 @@ static int mt_load_db(str *tname)
 			}
 		}
 	} else {
-		if((ret=mt_dbf.query(db_con, NULL, NULL, NULL, db_cols,
-						0, 2, 0, &db_res))!=0
+		if((ret=mt_dbf.query(db_con, key_cols, op, vals, db_cols,
+						pt->multi, 2, 0, &db_res))!=0
 				|| RES_ROW_N(db_res)<=0 )
 		{
 			mt_dbf.free_result(db_con, db_res);
@@ -697,7 +710,8 @@ static int mt_load_db_trees()
 				LM_ERR("Error - bad values in db\n");
 				continue;
 			}
-			new_tree = mt_add_tree(&new_head, &tname, &db_table, _mt_tree_type);
+			new_tree = mt_add_tree(&new_head, &tname, &db_table,
+					       _mt_tree_type, 0);
 			if(new_tree==NULL)
 			{
 				LM_ERR("New tree cannot be initialized\n");
@@ -797,7 +811,7 @@ static struct mi_root* mt_mi_reload(struct mi_root *cmd_tree, void *param)
 						&& strncmp(pt->tname.s, tname.s, tname.len)==0))
 			{
 				/* re-loading table from database */
-				if(mt_load_db(&pt->tname)!=0)
+				if(mt_load_db(pt)!=0)
 				{
 					LM_ERR("cannot re-load info from database\n");	
 					goto error;
@@ -1081,7 +1095,7 @@ void rpc_mtree_reload(rpc_t* rpc, void* c)
 						&& strncmp(pt->tname.s, tname.s, tname.len)==0))
 			{
 				/* re-loading table from database */
-				if(mt_load_db(&pt->tname)!=0)
+				if(mt_load_db(pt)!=0)
 				{
 					LM_ERR("cannot re-load mtree from database\n");	
 					goto error;