Explorar o código

modules_k/p_usrloc : Fixed postgresql support

Used replace DB API export instead of insert_update which was not available of postgresql.
Patch by Dragos Dinu (dragos.dinu AT 1and1.ro)
Marius Zbihlei %!s(int64=13) %!d(string=hai) anos
pai
achega
5269ac4fce

+ 111 - 90
modules_k/p_usrloc/ucontact.c

@@ -390,125 +390,146 @@ int db_insert_ucontact(ucontact_t* _c)
 	char* dom;
 	db_key_t keys[15];
 	db_val_t vals[15];
-	
+	int nr_cols  = 0;
+	int nr_cols_key = 0;
+	struct udomain * _d;
+	str user={0, 0};
+	str domain={0, 0};
+
 	if (_c->flags & FL_MEM) {
 		return 0;
 	}
 
-	struct udomain * _d;
 	if(register_udomain(_c->domain->s, &_d) < 0){
 		return -1;
 	}
-	keys[0] = &user_col;
-	keys[1] = &contact_col;
-	keys[2] = &expires_col;
-	keys[3] = &q_col;
-	keys[4] = &callid_col;
-	keys[5] = &cseq_col;
-	keys[6] = &flags_col;
-	keys[7] = &cflags_col;
-	keys[8] = &user_agent_col;
-	keys[9] = &received_col;
-	keys[10] = &path_col;
-	keys[11] = &sock_col;
-	keys[12] = &methods_col;
-	keys[13] = &last_mod_col;
-	keys[14] = &domain_col;
-
-	vals[0].type = DB1_STR;
-	vals[0].nul = 0;
-	vals[0].val.str_val.s = _c->aor->s;
-	vals[0].val.str_val.len = _c->aor->len;
-
-	vals[1].type = DB1_STR;
-	vals[1].nul = 0;
-	vals[1].val.str_val.s = _c->c.s; 
-	vals[1].val.str_val.len = _c->c.len;
-
-	vals[2].type = DB1_DATETIME;
-	vals[2].nul = 0;
-	vals[2].val.time_val = _c->expires;
-
-	vals[3].type = DB1_DOUBLE;
-	vals[3].nul = 0;
-	vals[3].val.double_val = q2double(_c->q);
-
-	vals[4].type = DB1_STR;
-	vals[4].nul = 0;
-	vals[4].val.str_val.s = _c->callid.s;
-	vals[4].val.str_val.len = _c->callid.len;
+	LM_INFO("Domain set for contact %.*s\n", _c->domain->len, _c->domain->s);
 
-	vals[5].type = DB1_INT;
-	vals[5].nul = 0;
-	vals[5].val.int_val = _c->cseq;
+	keys[nr_cols] = &user_col;
+	vals[nr_cols].type = DB1_STR;
+	vals[nr_cols].nul = 0;
+	vals[nr_cols].val.str_val = *_c->aor;
+	nr_cols++;
 
-	vals[6].type = DB1_INT;
-	vals[6].nul = 0;
-	vals[6].val.bitmap_val = _c->flags;
+	keys[nr_cols] = &contact_col;
+	vals[nr_cols].type = DB1_STR;
+	vals[nr_cols].nul = 0;
+	vals[nr_cols].val.str_val = _c->c;
+	nr_cols++;
 
-	vals[7].type = DB1_INT;
-	vals[7].nul = 0;
-	vals[7].val.bitmap_val = _c->cflags;
+	if(use_domain) {
+		keys[nr_cols] = &domain_col;
+		vals[nr_cols].type = DB1_STR;
+		vals[nr_cols].nul = 0;
 
-	vals[8].type = DB1_STR;
-	vals[8].nul = 0;
-	vals[8].val.str_val.s = _c->user_agent.s;
-	vals[8].val.str_val.len = _c->user_agent.len;
-
-	vals[9].type = DB1_STR;
+		dom = memchr(_c->aor->s, '@', _c->aor->len);
+		if (dom==0) {
+			LM_INFO("*** use domain and AOR does not contain @\n");
+			vals[nr_cols].val.str_val.len = 0;
+			vals[nr_cols].val.str_val.s = 0;
+		} else {
+			vals[0].val.str_val.len = dom - _c->aor->s;
+			vals[nr_cols].val.str_val.s = dom + 1;
+			vals[nr_cols].val.str_val.len = _c->aor->s + _c->aor->len - dom - 1;
+		}
+		domain = vals[nr_cols].val.str_val;
+		LM_DBG("** Username=%.*s  Domain=%.*s\n", vals[0].val.str_val.len, vals[0].val.str_val.s,
+				vals[nr_cols].val.str_val.len, vals[nr_cols].val.str_val.s);
+		nr_cols++;
+	}
+	nr_cols_key  = nr_cols;
+	user = vals[0].val.str_val;
+
+	keys[nr_cols] = &expires_col;
+	vals[nr_cols].type = DB1_DATETIME;
+	vals[nr_cols].nul = 0;
+	vals[nr_cols].val.time_val = _c->expires;
+	nr_cols++;
+
+	keys[nr_cols] = &q_col;
+	vals[nr_cols].type = DB1_DOUBLE;
+	vals[nr_cols].nul = 0;
+	vals[nr_cols].val.double_val = q2double(_c->q);
+	nr_cols++;
+
+	keys[nr_cols] = &callid_col;
+	vals[nr_cols].type = DB1_STR;
+	vals[nr_cols].nul = 0;
+	vals[nr_cols].val.str_val = _c->callid;
+	nr_cols++;
+
+	keys[nr_cols] = &cseq_col;
+	vals[nr_cols].type = DB1_INT;
+	vals[nr_cols].nul = 0;
+	vals[nr_cols].val.int_val = _c->cseq;
+	nr_cols++;
+
+	keys[nr_cols] = &flags_col;
+	vals[nr_cols].type = DB1_INT;
+	vals[nr_cols].nul = 0;
+	vals[nr_cols].val.bitmap_val = _c->flags;
+	nr_cols++;
+
+	keys[nr_cols] = &cflags_col;
+	vals[nr_cols].type = DB1_INT;
+	vals[nr_cols].nul = 0;
+	vals[nr_cols].val.bitmap_val = _c->cflags;
+	nr_cols++;
+
+	keys[nr_cols] = &user_agent_col;
+	vals[nr_cols].type = DB1_STR;
+	vals[nr_cols].nul = 0;
+	vals[nr_cols].val.str_val = _c->user_agent;
+	nr_cols++;
+
+	keys[nr_cols] = &received_col;
+	vals[nr_cols].type = DB1_STR;
 	if (_c->received.s == 0) {
-		vals[9].nul = 1;
+		vals[nr_cols].nul = 1;
 	} else {
-		vals[9].nul = 0;
-		vals[9].val.str_val.s = _c->received.s;
-		vals[9].val.str_val.len = _c->received.len;
+		vals[nr_cols].nul = 0;
+		vals[nr_cols].val.str_val = _c->received;
 	}
-	
-	vals[10].type = DB1_STR;
+	nr_cols++;
+
+	keys[nr_cols] = &path_col;
+	vals[nr_cols].type = DB1_STR;
 	if (_c->path.s == 0) {
-		vals[10].nul = 1;
+		vals[nr_cols].nul = 1;
 	} else {
-		vals[10].nul = 0;
-		vals[10].val.str_val.s = _c->path.s;
-		vals[10].val.str_val.len = _c->path.len;
+		vals[nr_cols].nul = 0;
+		vals[nr_cols].val.str_val = _c->path;
 	}
+	nr_cols++;
 
-	vals[11].type = DB1_STR;
+	keys[nr_cols] = &sock_col;
+	vals[nr_cols].type = DB1_STR;
 	if (_c->sock) {
-		vals[11].val.str_val = _c->sock->sock_str;
-		vals[11].nul = 0;
+		vals[nr_cols].val.str_val = _c->sock->sock_str;
+		vals[nr_cols].nul = 0;
 	} else {
-		vals[11].nul = 1;
+		vals[nr_cols].nul = 1;
 	}
+	nr_cols++;
 
-	vals[12].type = DB1_BITMAP;
+	keys[nr_cols] = &methods_col;
+	vals[nr_cols].type = DB1_BITMAP;
 	if (_c->methods == 0xFFFFFFFF) {
-		vals[12].nul = 1;
+		vals[nr_cols].nul = 1;
 	} else {
-		vals[12].val.bitmap_val = _c->methods;
-		vals[12].nul = 0;
+		vals[nr_cols].val.bitmap_val = _c->methods;
+		vals[nr_cols].nul = 0;
 	}
+	nr_cols++;
 
-	vals[13].type = DB1_DATETIME;
-	vals[13].nul = 0;
-	vals[13].val.time_val = _c->last_modified;
+	keys[nr_cols] = &last_mod_col;
+	vals[nr_cols].type = DB1_DATETIME;
+	vals[nr_cols].nul = 0;
+	vals[nr_cols].val.time_val = _c->last_modified;
 
-	if (use_domain) {
-		vals[14].type = DB1_STR;
-		vals[14].nul = 0;
 
-		dom = memchr(_c->aor->s, '@', _c->aor->len);
-		if (dom==0) {
-			vals[0].val.str_val.len = 0;
-			vals[14].val.str_val = *_c->aor;
-		} else {
-			vals[0].val.str_val.len = dom - _c->aor->s;
-			vals[14].val.str_val.s = dom + 1;
-			vals[14].val.str_val.len = _c->aor->s + _c->aor->len - dom - 1;
-		}
-	}
 	/* to prevent errors from the DB because of duplicated entries */
-	if (ul_db_layer_insert_update(_d, &vals[0].val.str_val, &vals[14].val.str_val, keys, vals, (use_domain) ? (15) : (14)) < 0) {	                
+	if (ul_db_layer_replace(_d, &user, &domain, keys, vals, nr_cols, nr_cols_key) <0) {
 		LM_ERR("inserting contact in db failed\n");
 		return -1;
 	}

+ 2 - 2
modules_k/p_usrloc/ul_db.c

@@ -302,7 +302,7 @@ int ul_db_insert(str * table, str * first, str * second,
 }
 
 int ul_db_replace(str * table, str * first, str * second,
-                 db_key_t* _k, db_val_t* _v, int _n) {
+                 db_key_t* _k, db_val_t* _v, int _n, int  _un) {
 	ul_db_handle_t * handle;
 	if(!db_write){
 		LM_ERR("not allowed in read only mode, abort.\n");
@@ -312,7 +312,7 @@ int ul_db_replace(str * table, str * first, str * second,
 		LM_ERR("could not retrieve db handle.\n");
 		return -1;
 	}
-	return db_replace(handle, table, _k, _v, _n);
+	return db_replace(handle, table, _k, _v, _n, _un);
 }
 
 int ul_db_update(str * table, str * first, str * second,

+ 1 - 4
modules_k/p_usrloc/ul_db.h

@@ -80,11 +80,8 @@ int ul_db_update(str * table, str * first, str * second,
 				db_key_t* _k, db_op_t * _op, db_val_t* _v,
 				db_key_t* _uk, db_val_t* _uv, int _n, int _un);
 
-int ul_db_insert_update(str * table, str * first, str * second,
-					 db_key_t* _k,	db_val_t* _v, int _n);
-
 int ul_db_replace(str * table, str * first, str * second,
-			  db_key_t* _k, db_val_t* _v, int _n);
+			  db_key_t* _k, db_val_t* _v, int _n, int _un);
 
 int ul_db_delete(str * table, str * first, str * second,
 			  db_key_t* _k, db_op_t* _o, db_val_t* _v, int _n);

+ 0 - 6
modules_k/p_usrloc/ul_db_api.c

@@ -41,12 +41,6 @@ int bind_ul_db(ul_db_api_t* api)
 		return -1;
 	}
 	
-	api->insert_update = (ul_db_insert_update_t) ul_db_insert_update;
-	if(api->insert_update == 0){
-		LM_ERR("can't bind ul_db_insert_update\n");
-		return -1;
-	}
-	
 	api->replace = (ul_db_replace_t) ul_db_replace;
 	if(api->replace == 0){
 		LM_ERR("can't bind ul_db_replace\n");

+ 1 - 1
modules_k/p_usrloc/ul_db_api.h

@@ -36,7 +36,7 @@ typedef int (* ul_db_insert_update_t) (str * table, str * first, str * second,
 				db_key_t* _k, db_val_t* _v, int _n);
 
 typedef int (* ul_db_replace_t) (str * table, str * first, str * second,
-				db_key_t* _k, db_val_t* _v, int _n);
+				db_key_t* _k, db_val_t* _v, int _n, int _un);
 
 typedef int (* ul_db_delete_t) (str * table, str * first, str * second,
 				 db_key_t* _k, db_op_t* _o, db_val_t* _v, int _n);

+ 3 - 3
modules_k/p_usrloc/ul_db_form_query.c

@@ -115,15 +115,15 @@ static int db_do_query(ul_db_op_t ul_op, db_func_t * dbf, db1_con_t * dbh, str *
 			}
 			return 0;
 			case UL_DB_REPL:
-			if(dbf->replace(dbh, _k, _v, _n, 0, 0) < 0) {
+			if(dbf->replace(dbh, _k, _v, _n, _un, 0) < 0) {
 				LM_ERR("error in replacing in "
 				    "table %.*s.\n", table->len, table->s);
 				return -1;
 			}
 			return 0;
 			case UL_DB_INS_UPD:
-			if(dbf->insert_update(dbh, _k, _v, _n) < 0) {
-				LM_ERR("error in inserting/updating "
+			if(dbf->insert_update(dbh, _k, _v, _n ) < 0) {
+				LM_ERR("error in inserting/updating in "
 				    "table %.*s.\n", table->len, table->s);
 				return -1;
 			}

+ 2 - 2
modules_k/p_usrloc/ul_db_handle.c

@@ -541,7 +541,7 @@ static int compute_id(str* first, str* second){
 
 		tmp.len = first->len + second->len + 1;
 		if( tmp.len > BUF_MAXSIZE - 1 ){
-			LM_ERR("Very long user or domain");
+			LM_ERR("Very long user or domain\n");
 			return -1;
 		}
 		memcpy(aux, first->s, first->len);
@@ -549,7 +549,7 @@ static int compute_id(str* first, str* second){
 		memcpy(aux + first->len + 1, second->s, second->len);
 		tmp.s = aux;
 
-                crc32_uint(&tmp, &crc32_val);
+		crc32_uint(&tmp, &crc32_val);
 		return crc32_val % max_loc_nr + 1;
 	}else{
 		crc32_uint(first, &crc32_val);

+ 1 - 1
modules_k/p_usrloc/ul_db_handle.h

@@ -26,7 +26,7 @@
 #ifndef SP_P_USRLOC_UL_DB_HANDLE_H
 #define SP_P_USRLOC_UL_DB_HANDLE_H
 
-#define DB_NUM 1
+#define DB_NUM 2
 
 #define DB_OFF 0
 #define DB_ON 1

+ 5 - 5
modules_k/p_usrloc/ul_db_layer.c

@@ -101,11 +101,11 @@ int ul_db_layer_update(udomain_t * domain, str * user, str * sipdomain, db_key_t
 	}
 }
 
-int ul_db_layer_insert_update(udomain_t * domain, str * user, str * sipdomain,
-                              db_key_t* _k,	db_val_t* _v, int _n) {
+int ul_db_layer_replace (udomain_t * domain, str * user, str * sipdomain,
+                              db_key_t* _k,	db_val_t* _v, int _n, int _un) {
 	ul_domain_db_t * d;
 	switch(domain->dbt) {
-			case DB_TYPE_CLUSTER: return p_ul_dbf.insert_update(domain->name, user, sipdomain, _k, _v, _n);;
+			case DB_TYPE_CLUSTER: { return p_ul_dbf.replace(domain->name, user, sipdomain, _k, _v, _n, _un);;}
 			case DB_TYPE_SINGLE: if(!domain->dbh){
 				if((d = ul_find_domain(domain->name->s)) == 0){
 					return -1;
@@ -117,7 +117,7 @@ int ul_db_layer_insert_update(udomain_t * domain, str * user, str * sipdomain,
 				if(dbf.use_table(domain->dbh, domain->name) < 0) {
 				return -1;
 			}
-			return dbf.insert_update(domain->dbh, _k, _v, _n);
+			return dbf.replace(domain->dbh, _k, _v, _n, _un, 0);
 			default: return -1;
 	}
 }
@@ -212,7 +212,7 @@ int ul_db_layer_free_result(udomain_t * domain, db1_res_t * res) {
 
 int ul_add_domain_db(str * d, int t, str * url) {
 	ul_domain_db_list_t * new_d = NULL;
-	LM_ERR("%.*s, type: %s\n", d->len, d->s,
+	LM_DBG("%.*s, type: %s\n", d->len, d->s,
 			t==DB_TYPE_SINGLE ? "SINGLE" : "CLUSTER");
 	if((new_d = pkg_malloc(sizeof(ul_domain_db_list_t))) == NULL) {
 		return -1;

+ 2 - 2
modules_k/p_usrloc/ul_db_layer.h

@@ -35,8 +35,8 @@ int ul_db_layer_insert(udomain_t * domain, str * user, str * sipdomain,
 int ul_db_layer_update(udomain_t * domain, str * user, str * sipdomain, db_key_t* _k, db_op_t* _o, db_val_t* _v,
 	         db_key_t* _uk, db_val_t* _uv, int _n, int _un);
 
-int ul_db_layer_insert_update(udomain_t * domain, str * user, str * sipdomain, 
-						db_key_t* _k,	db_val_t* _v, int _n);
+int ul_db_layer_replace(udomain_t * domain, str * user, str * sipdomain, 
+						db_key_t* _k,	db_val_t* _v, int _n, int _un);
 
 int ul_db_layer_delete(udomain_t * domain, str * user, str * sipdomain, 
 				 db_key_t* _k, db_op_t* _o, db_val_t* _v, int _n);

+ 2 - 2
modules_k/p_usrloc/ul_db_repl.c

@@ -23,6 +23,6 @@
 #include "ul_db_form_query.h"
 
 int db_replace(ul_db_handle_t * handle, str * table,
-              db_key_t* _k, db_val_t* _v, int _n) {
-	return db_submit_query(UL_DB_REPL, handle, table, _k, NULL, _v, NULL, NULL, _n, 0);
+              db_key_t* _k, db_val_t* _v, int _n, int _un) {
+	return db_submit_query(UL_DB_REPL, handle, table, _k, NULL, _v, NULL, NULL, _n, _un);
 }

+ 1 - 1
modules_k/p_usrloc/ul_db_repl.h

@@ -25,6 +25,6 @@
 #include "../../lib/srdb1/db.h"
 #include "ul_db_handle.h"
 
-int db_replace(ul_db_handle_t * handle, str * table,  db_key_t* _k, db_val_t* _v, int _n);
+int db_replace(ul_db_handle_t * handle, str * table,  db_key_t* _k, db_val_t* _v, int _n, int _un);
 
 #endif