Module: sip-router Branch: master Commit: 22b559cb25c25b3801b1849a5da76a8ec937ef83 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=22b559cb...
Author: Hugh Waite hugh.waite@acision.com Committer: Hugh Waite hugh.waite@acision.com 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; }