Module: sip-router
Branch: master
Commit: 22b559cb25c25b3801b1849a5da76a8ec937ef83
URL:    
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=22b559cb25c25b3801b1849a5da76a8ec937ef83

Author: Hugh Waite <[email protected]>
Committer: Hugh Waite <[email protected]>
Date:   Tue Sep 23 13:29:15 2014 +0100

usrloc: restore usrloc attributes in DB_ONLY mode

- restores xavps per location during a lookup

---

 modules/usrloc/udomain.c |   88 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 88 insertions(+), 0 deletions(-)

diff --git a/modules/usrloc/udomain.c b/modules/usrloc/udomain.c
index bf00b63..184e9d5 100644
--- a/modules/usrloc/udomain.c
+++ b/modules/usrloc/udomain.c
@@ -531,12 +531,18 @@ error:
  */
 urecord_t* db_load_urecord(db1_con_t* _c, udomain_t* _d, str *_aor)
 {
+       char tname_buf[64];
+       str tname;
        ucontact_info_t *ci;
        db_key_t columns[16];
        db_key_t keys[2];
        db_key_t order;
        db_val_t vals[2];
        db1_res_t* res = NULL;
+       db_row_t *row;
+       str aname;
+       str avalue;
+       sr_xval_t aval;
        str contact;
        char *domain;
        int i;
@@ -630,6 +636,88 @@ urecord_t* db_load_urecord(db1_con_t* _c, udomain_t* _d, 
str *_aor)
        }
 
        ul_dbf.free_result(_c, res);
+
+       /* Retrieve ul attributes */
+       if(ul_xavp_contact_name.s==NULL) {
+               /* feature disabled by mod param */
+               goto done;
+       }
+
+       if(_d->name->len + 6>=64) {
+               LM_ERR("attributes table name is too big\n");
+               goto done;
+       }
+       strncpy(tname_buf, _d->name->s, _d->name->len);
+       tname_buf[_d->name->len] = '\0';
+       strcat(tname_buf, "_attrs");
+       tname.s = tname_buf;
+       tname.len = _d->name->len + 6;
+
+       keys[0] = &ulattrs_ruid_col;
+       vals[0].type = DB1_STR;
+       vals[0].nul = 0;
+       columns[0] = &ulattrs_aname_col;
+       columns[1] = &ulattrs_atype_col;
+       columns[2] = &ulattrs_avalue_col;
+
+       if (ul_dbf.use_table(ul_dbh, &tname) < 0) {
+               LM_ERR("sql use_table failed for %.*s\n", tname.len, tname.s);
+               goto done;
+       }
+
+       for (c = r->contacts; c != NULL; c = c->next) {
+               vals[0].val.str_val.s = c->ruid.s;
+               vals[0].val.str_val.len = c->ruid.len;
+
+               if (ul_dbf.query(ul_dbh, keys, 0, vals, columns, 1, 3, 0, &res) 
< 0) {
+                       LM_ERR("db_query failed\n");
+                       continue;
+               }
+
+               if (RES_ROW_N(res) == 0) {
+                       LM_DBG("location attrs table is empty\n");
+                       ul_dbf.free_result(ul_dbh, res);
+                       continue;
+               }
+
+               for(i = 0; i < RES_ROW_N(res); i++) {
+                       row = RES_ROWS(res) + i;
+
+                       aname.s = (char*)VAL_STRING(ROW_VALUES(row));
+                       aname.len = strlen(aname.s);
+                       avalue.s = (char*)VAL_STRING(ROW_VALUES(row) + 2);
+                       avalue.len = strlen(avalue.s);
+                       memset(&aval, 0, sizeof(sr_xval_t));
+                       if(VAL_INT(ROW_VALUES(row)+1)==0) {
+                               /* string value */
+                               aval.v.s = avalue;
+                               aval.type = SR_XTYPE_STR;
+                       } else if(VAL_INT(ROW_VALUES(row)+1)==1) {
+                               /* int value */
+                               str2sint(&avalue, &aval.v.i);
+                               aval.type = SR_XTYPE_INT;
+                       } else {
+                               /* unknown type - ignore */
+                               continue;
+                       }
+
+                       /* add xavp to contact */
+                       if(c->xavp==NULL) {
+                               if(xavp_add_xavp_value(&ul_xavp_contact_name, 
&aname,
+                                                       &aval, &c->xavp)==NULL)
+                                       LM_INFO("cannot add first xavp to 
contact - ignoring\n");
+                       } else {
+                               if(c->xavp->val.type==SR_XTYPE_XAVP) {
+                                       if(xavp_add_value(&aname, &aval, 
&c->xavp->val.v.xavp)==NULL)
+                                               LM_INFO("cannot add values to 
contact xavp\n");
+                               }
+                       }
+               }
+               ul_dbf.free_result(ul_dbh, res);
+       }
+
+
+done:
        return r;
 }
 


_______________________________________________
sr-dev mailing list
[email protected]
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to