[sr-dev] git:master: lib/srdb1: Enable non-pooled database connections to be defined .

Peter Dunkley peter.dunkley at crocodile-rcs.com
Sun Dec 18 22:16:29 CET 2011


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

Author: pd <peter.dunkley at crocodile-rcs.com>
Committer: pd <peter.dunkley at 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 */
 };
 
 




More information about the sr-dev mailing list