Module: sip-router Branch: master Commit: 2dad021502d0f931fabde0e4c220baf70898a877 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=2dad0215...
Author: pd peter.dunkley@crocodile-rcs.com Committer: pd peter.dunkley@crocodile-rcs.com Date: Sun Dec 18 21:13:19 2011 +0000
lib/srdb1: Enable non-pooled database connections to be defined.
- Kamailio pools database connections, but sometimes this causes problems. For example, we (Crocodile) observed an issue with many different queries happening on the same connection while using db_fetch_next(). - This change enables you to specify a DB connection as non-pooled by putting a '*' at the start of the DB URL in kamailio.cfg. - Feature added by Paul Pankhurst @ Crocodile RCS
---
lib/srdb1/db.c | 13 +++++++++++-- lib/srdb1/db_id.c | 27 ++++++++++++++++++++++++--- lib/srdb1/db_id.h | 1 + 3 files changed, 36 insertions(+), 5 deletions(-)
diff --git a/lib/srdb1/db.c b/lib/srdb1/db.c index 892a849..5905bb0 100644 --- a/lib/srdb1/db.c +++ b/lib/srdb1/db.c @@ -182,8 +182,17 @@ int db_bind_mod(const str* mod, db_func_t* mydbf) return -1; } memcpy(name, "db_", 3); - memcpy(name+3, mod->s, mod->len); - name[mod->len+3] = 0; + + if (mod->s[0]=='*' ) + { + memcpy(name+3, (mod->s)+1, (mod->len)-1); + name[mod->len-1+3] = 0; + } + else + { + memcpy(name+3, mod->s, mod->len); + name[mod->len+3] = 0; + }
/* for safety we initialize mydbf with 0 (this will cause * a segfault immediately if someone tries to call a function diff --git a/lib/srdb1/db_id.c b/lib/srdb1/db_id.c index 8c8b2a3..4aa564b 100644 --- a/lib/srdb1/db_id.c +++ b/lib/srdb1/db_id.c @@ -65,12 +65,13 @@ static int dupl_string(char** dst, const char* begin, const char* end) * \param url parsed URL * \return 0 if parsing was successful and -1 otherwise */ -static int parse_db_url(struct db_id* id, const str* url) +static int parse_db_url(struct db_id* id, const str* url, int *poolid ) { #define SHORTEST_DB_URL "s://a/b" #define SHORTEST_DB_URL_LEN (sizeof(SHORTEST_DB_URL) - 1)
enum state { + ST_NONPOOL, /* Non pooling flag */ ST_SCHEME, /* Scheme part */ ST_SLASH1, /* First slash */ ST_SLASH2, /* Second slash */ @@ -99,11 +100,25 @@ static int parse_db_url(struct db_id* id, const str* url) /* Initialize all attributes to 0 */ memset(id, 0, sizeof(struct db_id)); - st = ST_SCHEME; + st = ST_NONPOOL; begin = url->s;
for(i = 0; i < len; i++) { switch(st) { + case ST_NONPOOL: + st = ST_SCHEME; + switch(url->s[i]) { + case '*': + id->poolid = ++(*poolid); + begin++; + break; + + default: + id->poolid = 0; + break; + } + break; + case ST_SCHEME: switch(url->s[i]) { case ':': @@ -229,6 +244,7 @@ static int parse_db_url(struct db_id* id, const str* url) */ struct db_id* new_db_id(const str* url) { + static int poolid=0; struct db_id* ptr;
if (!url || !url->s) { @@ -243,7 +259,7 @@ struct db_id* new_db_id(const str* url) } memset(ptr, 0, sizeof(struct db_id));
- if (parse_db_url(ptr, url) < 0) { + if (parse_db_url(ptr, url, &poolid) < 0) { LM_ERR("error while parsing database URL: '%.*s' \n", url->len, url->s); goto err; } @@ -286,6 +302,11 @@ unsigned char cmp_db_id(const struct db_id* id1, const struct db_id* id2) id1->pid, id2->pid); return 0; } + if(id1->poolid!=id2->poolid) { + LM_DBG("identical DB URLs, but different poolids [%d/%d]\n", + id1->poolid, id2->poolid); + return 0; + } return 1; }
diff --git a/lib/srdb1/db_id.h b/lib/srdb1/db_id.h index 20ab846..b7427a7 100644 --- a/lib/srdb1/db_id.h +++ b/lib/srdb1/db_id.h @@ -41,6 +41,7 @@ struct db_id { unsigned short port; /**< Port number */ char* database; /**< Database, case sensitive */ int pid; /**< Process ID (detect cross connections) */ + int poolid; /**< poolid within a pid */ };