[sr-dev] git:master: usrloc: db_update contact by instance + reg-id

Victor Seva linuxmaniac at torreviejawireless.org
Fri Nov 1 16:05:50 CET 2013


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

Author: Victor Seva <linuxmaniac at torreviejawireless.org>
Committer: Victor Seva <linuxmaniac at torreviejawireless.org>
Date:   Thu Oct 10 15:21:47 2013 +0200

usrloc: db_update contact by instance + reg-id

---

 modules/usrloc/ucontact.c |  203 ++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 201 insertions(+), 2 deletions(-)

diff --git a/modules/usrloc/ucontact.c b/modules/usrloc/ucontact.c
index 9cc2e06..323dc4b 100644
--- a/modules/usrloc/ucontact.c
+++ b/modules/usrloc/ucontact.c
@@ -679,18 +679,21 @@ int db_update_ucontact_addr(ucontact_t* _c)
 	vals1[n1].type = DB1_STR;
 	vals1[n1].nul = 0;
 	vals1[n1].val.str_val = *_c->aor;
+	LM_DBG("aor:%.*s\n", vals1[n1].val.str_val.len, vals1[n1].val.str_val.s);
 	n1++;
 
 	keys1[n1] = &contact_col;
 	vals1[n1].type = DB1_STR;
 	vals1[n1].nul = 0;
 	vals1[n1].val.str_val = _c->c;
+	LM_DBG("contact:%.*s\n", vals1[n1].val.str_val.len, vals1[n1].val.str_val.s);
 	n1++;
 
 	keys1[n1] = &callid_col;
 	vals1[n1].type = DB1_STR;
 	vals1[n1].nul = 0;
 	vals1[n1].val.str_val = _c->callid;
+	LM_DBG("callid:%.*s\n", vals1[n1].val.str_val.len, vals1[n1].val.str_val.s);
 	n1++;
 
 	vals2[0].type = DB1_DATETIME;
@@ -866,6 +869,7 @@ int db_update_ucontact_ruid(ucontact_t* _c)
 	vals1[n1].type = DB1_STR;
 	vals1[n1].nul = 0;
 	vals1[n1].val.str_val = _c->ruid;
+	LM_DBG("ruid:%.*s\n", vals1[n1].val.str_val.len, vals1[n1].val.str_val.s);
 	n1++;
 
 	n2 = 0;
@@ -1008,7 +1012,197 @@ int db_update_ucontact_ruid(ucontact_t* _c)
 				adomain.len = _c->aor->s +
 					_c->aor->len - adomain.s;
 			}
-			
+
+			uldb_delete_attrs(_c->domain, &auser,
+					  &adomain, &_c->ruid);
+			uldb_insert_attrs(_c->domain, &auser,
+					  &adomain, &_c->ruid, _c->xavp);
+		} else {
+			uldb_delete_attrs(_c->domain, &auser,
+					  NULL, &_c->ruid);
+			uldb_insert_attrs(_c->domain, &auser,
+					  NULL, &_c->ruid, _c->xavp);
+		}
+	}
+
+	return 0;
+}
+
+/*!
+ * \brief Update contact in the database by instance reg_id
+ * \param _c updated contact
+ * \return 0 on success, -1 on failure
+ */
+int db_update_ucontact_instance(ucontact_t* _c)
+{
+	str auser;
+	str adomain;
+	db_key_t keys1[2];
+	db_val_t vals1[2];
+	int n1;
+
+	db_key_t keys2[13];
+	db_val_t vals2[13];
+	int n2;
+
+
+	if (_c->flags & FL_MEM) {
+		return 0;
+	}
+
+	if(_c->instance.len<=0) {
+		LM_ERR("updating record in database failed - empty instance\n");
+		return -1;
+	}
+
+	n1 = 0;
+	keys1[n1] = &instance_col;
+	vals1[n1].type = DB1_STR;
+	vals1[n1].nul = 0;
+	vals1[n1].val.str_val = _c->instance;
+	LM_DBG("instance:%.*s\n", vals1[n1].val.str_val.len, vals1[n1].val.str_val.s);
+	n1++;
+
+	keys1[n1] = &reg_id_col;
+	vals1[n1].type = DB1_INT;
+	vals1[n1].nul = 0;
+	vals1[n1].val.int_val = (int)_c->reg_id;
+	LM_DBG("reg-id:%d\n", vals1[n1].val.int_val);
+	n1++;
+
+	n2 = 0;
+	keys2[n2] = &expires_col;
+	vals2[n2].type = DB1_DATETIME;
+	vals2[n2].nul = 0;
+	vals2[n2].val.time_val = _c->expires;
+	n2++;
+
+	keys2[n2] = &q_col;
+	vals2[n2].type = DB1_DOUBLE;
+	vals2[n2].nul = 0;
+	vals2[n2].val.double_val = q2double(_c->q);
+	n2++;
+
+	keys2[n2] = &cseq_col;
+	vals2[n2].type = DB1_INT;
+	vals2[n2].nul = 0;
+	vals2[n2].val.int_val = _c->cseq;
+	n2++;
+
+	keys2[n2] = &flags_col;
+	vals2[n2].type = DB1_INT;
+	vals2[n2].nul = 0;
+	vals2[n2].val.bitmap_val = _c->flags;
+	n2++;
+
+	keys2[n2] = &cflags_col;
+	vals2[n2].type = DB1_INT;
+	vals2[n2].nul = 0;
+	vals2[n2].val.bitmap_val = _c->cflags;
+	n2++;
+
+	keys2[n2] = &user_agent_col;
+	vals2[n2].type = DB1_STR;
+	vals2[n2].nul = 0;
+	vals2[n2].val.str_val = _c->user_agent;
+	n2++;
+
+	keys2[n2] = &received_col;
+	vals2[n2].type = DB1_STR;
+	if (_c->received.s == 0) {
+		vals2[n2].nul = 1;
+	} else {
+		vals2[n2].nul = 0;
+		vals2[n2].val.str_val = _c->received;
+	}
+	n2++;
+
+	keys2[n2] = &path_col;
+	vals2[n2].type = DB1_STR;
+	if (_c->path.s == 0) {
+		vals2[n2].nul = 1;
+	} else {
+		vals2[n2].nul = 0;
+		vals2[n2].val.str_val = _c->path;
+	}
+	n2++;
+
+	keys2[n2] = &sock_col;
+	vals2[n2].type = DB1_STR;
+	if (_c->sock) {
+		vals2[n2].val.str_val = _c->sock->sock_str;
+		vals2[n2].nul = 0;
+	} else {
+		vals2[n2].nul = 1;
+	}
+	n2++;
+
+	keys2[n2] = &methods_col;
+	vals2[n2].type = DB1_BITMAP;
+	if (_c->methods == 0xFFFFFFFF) {
+		vals2[n2].nul = 1;
+	} else {
+		vals2[n2].val.bitmap_val = _c->methods;
+		vals2[n2].nul = 0;
+	}
+	n2++;
+
+	keys2[n2] = &last_mod_col;
+	vals2[n2].type = DB1_DATETIME;
+	vals2[n2].nul = 0;
+	vals2[n2].val.time_val = _c->last_modified;
+	n2++;
+
+	keys2[n2] = &callid_col;
+	vals2[n2].type = DB1_STR;
+	vals2[n2].nul = 0;
+	vals2[n2].val.str_val = _c->callid;
+	n2++;
+
+	keys2[n2] = &contact_col;
+	vals2[n2].type = DB1_STR;
+	vals2[n2].nul = 0;
+	vals2[n2].val.str_val.s = _c->c.s;
+	vals2[n2].val.str_val.len = _c->c.len;
+	LM_DBG("contact:%.*s\n", vals2[n2].val.str_val.len, vals2[n2].val.str_val.s);
+	n2++;
+
+	if (ul_dbf.use_table(ul_dbh, _c->domain) < 0) {
+		LM_ERR("sql use_table failed\n");
+		return -1;
+	}
+
+	if (ul_dbf.update(ul_dbh, keys1, 0, vals1, keys2, vals2, n1, n2) < 0) {
+		LM_ERR("updating database failed\n");
+		return -1;
+	}
+
+	if (ul_db_check_update==1 && ul_dbf.affected_rows) {
+		LM_DBG("update affected_rows 0\n");
+		/* supposed to be an UPDATE, but if affected rows is 0, then try
+		 * to do an INSERT */
+		if(ul_dbf.affected_rows(ul_dbh)==0) {
+			LM_DBG("affected rows by UPDATE was 0, doing an INSERT\n");
+			if(db_insert_ucontact(_c)<0)
+				return -1;
+		}
+	}
+
+	/* delete old db attrs and add the current list */
+	if (ul_xavp_contact_name.s) {
+	        auser = *_c->aor;
+	        if (use_domain) {
+			adomain.s = memchr(_c->aor->s, '@', _c->aor->len);
+			if (adomain.s==0) {
+				auser.len = 0;
+				adomain = *_c->aor;
+			} else {
+				auser.len = adomain.s - _c->aor->s;
+				adomain.s++;
+				adomain.len = _c->aor->s +
+					_c->aor->len - adomain.s;
+			}
+
 			uldb_delete_attrs(_c->domain, &auser,
 					  &adomain, &_c->ruid);
 			uldb_insert_attrs(_c->domain, &auser,
@@ -1032,7 +1226,12 @@ int db_update_ucontact_ruid(ucontact_t* _c)
 int db_update_ucontact(ucontact_t* _c)
 {
 	if(ul_db_ops_ruid==0)
-		return db_update_ucontact_addr(_c);
+		if (_c->instance.len<=0) {
+			return db_update_ucontact_addr(_c);
+		}
+		else {
+			return db_update_ucontact_instance(_c);
+		}
 	else
 		return db_update_ucontact_ruid(_c);
 }




More information about the sr-dev mailing list