|
@@ -99,9 +99,12 @@ int mt_init_list_head(void)
|
|
|
/**
|
|
|
*
|
|
|
*/
|
|
|
-m_tree_t* mt_init_tree(str* tname, str *dbtable, int type, int multi)
|
|
|
+m_tree_t* mt_init_tree(str* tname, str *dbtable, str *scols, int type,
|
|
|
+ int multi)
|
|
|
{
|
|
|
m_tree_t *pt = NULL;
|
|
|
+ int i;
|
|
|
+ int c;
|
|
|
|
|
|
pt = (m_tree_t*)shm_malloc(sizeof(m_tree_t));
|
|
|
if(pt==NULL)
|
|
@@ -137,6 +140,53 @@ m_tree_t* mt_init_tree(str* tname, str *dbtable, int type, int multi)
|
|
|
memcpy(pt->dbtable.s, dbtable->s, dbtable->len);
|
|
|
pt->dbtable.len = dbtable->len;
|
|
|
|
|
|
+ if(scols!=NULL && scols->s!=NULL && scols->len>0) {
|
|
|
+ pt->scols[0].s = (char*)shm_malloc((1+scols->len)*sizeof(char));
|
|
|
+ if(pt->scols[0].s==NULL) {
|
|
|
+ shm_free(pt->tname.s);
|
|
|
+ shm_free(pt->dbtable.s);
|
|
|
+ shm_free(pt);
|
|
|
+ LM_ERR("no more shm memory\n");
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+ memset(pt->scols[0].s, 0, (1+scols->len)*sizeof(char));
|
|
|
+ memcpy(pt->scols[0].s, scols->s, scols->len);
|
|
|
+ pt->scols[0].len = scols->len;
|
|
|
+ c = 0;
|
|
|
+ for(i=0; i<scols->len; i++) {
|
|
|
+ if(pt->scols[0].s[i]==',') {
|
|
|
+ pt->scols[c].len = (pt->scols[0].s + i - pt->scols[c].s);
|
|
|
+ LM_DBG("db table column[%d]='%.*s'\n", c,
|
|
|
+ pt->scols[c].len, pt->scols[c].s);
|
|
|
+ c++;
|
|
|
+ if(c>=MT_MAX_COLS) {
|
|
|
+ LM_ERR("too many columns %d\n", c);
|
|
|
+ shm_free(pt->scols[0].s);
|
|
|
+ shm_free(pt->tname.s);
|
|
|
+ shm_free(pt->dbtable.s);
|
|
|
+ shm_free(pt);
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+ pt->scols[c].s = pt->scols[0].s + i + 1;
|
|
|
+ pt->scols[c].len = pt->scols[0].s + scols->len - pt->scols[c].s;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ LM_DBG("db table column[%d]='%.*s'\n", c,
|
|
|
+ pt->scols[c].len, pt->scols[c].s);
|
|
|
+ if(c==0) {
|
|
|
+ LM_ERR("there must be at least two columns (prefix, value)\n");
|
|
|
+ shm_free(pt->scols[0].s);
|
|
|
+ shm_free(pt->tname.s);
|
|
|
+ shm_free(pt->dbtable.s);
|
|
|
+ shm_free(pt);
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+ pt->ncols = c + 1;
|
|
|
+ pt->pack[0] = 'l';
|
|
|
+ pt->pack[1] = ',';
|
|
|
+ pt->pack[2] = '*';
|
|
|
+ }
|
|
|
+
|
|
|
return pt;
|
|
|
}
|
|
|
|
|
@@ -723,11 +773,14 @@ int mt_table_spec(char* val)
|
|
|
s.len = strlen(s.s);
|
|
|
if(s.s[s.len-1]==';')
|
|
|
s.len--;
|
|
|
+ LM_DBG("parsing [%.*s]\n", s.len, s.s);
|
|
|
if (parse_params(&s, CLASS_ANY, &phooks, ¶ms_list)<0)
|
|
|
return -1;
|
|
|
memset(&tmp, 0, sizeof(m_tree_t));
|
|
|
for (pit = params_list; pit; pit=pit->next)
|
|
|
{
|
|
|
+ LM_DBG("parm: %.*s=%.*s\n", pit->name.len, pit->name.s,
|
|
|
+ pit->body.len, pit->body.s);
|
|
|
if (pit->name.len==4
|
|
|
&& strncasecmp(pit->name.s, "name", 4)==0) {
|
|
|
tmp.tname = pit->body;
|
|
@@ -740,6 +793,10 @@ int mt_table_spec(char* val)
|
|
|
} else if(pit->name.len==7
|
|
|
&& strncasecmp(pit->name.s, "dbtable", 7)==0) {
|
|
|
tmp.dbtable = pit->body;
|
|
|
+ } else if(pit->name.len==4
|
|
|
+ && strncasecmp(pit->name.s, "cols", 4)==0) {
|
|
|
+ tmp.ncols = 1;
|
|
|
+ tmp.scols[0] = pit->body;
|
|
|
}
|
|
|
}
|
|
|
if(tmp.tname.s==NULL)
|
|
@@ -794,11 +851,12 @@ 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.scols[0], tmp.type,
|
|
|
tmp.multi);
|
|
|
if(ndl==NULL)
|
|
|
{
|
|
|
- LM_ERR("no more shm memory\n");
|
|
|
+ LM_ERR("cannot init the tree [%.*s]\n",
|
|
|
+ tmp.tname.len, tmp.tname.s);
|
|
|
goto error;
|
|
|
}
|
|
|
|
|
@@ -819,8 +877,8 @@ error:
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
-m_tree_t *mt_add_tree(m_tree_t **dpt, str *tname, str *dbtable, int type,
|
|
|
- int multi)
|
|
|
+m_tree_t *mt_add_tree(m_tree_t **dpt, str *tname, str *dbtable, str *cols,
|
|
|
+ int type, int multi)
|
|
|
{
|
|
|
m_tree_t *it = NULL;
|
|
|
m_tree_t *prev = NULL;
|
|
@@ -847,7 +905,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, multi);
|
|
|
+ ndl = mt_init_tree(tname, dbtable, cols, type, multi);
|
|
|
if(ndl==NULL)
|
|
|
{
|
|
|
LM_ERR("no more shm memory\n");
|