Hello,
It would be great if you could implement the "non-pooled" flag as a
URL parameter, rather than putting an asterisk into the scheme part.
For example:
mysql://user:password@db_server/dbname;pool=false
The asterisk character is not allowed in the scheme name part, so by
using it there you'll break the generic URI syntax. That may have
unexpected consequences for provisioning applications (think
generating Kamailio config files from a template).
Also, the code below will most likely not work correctly if somebody
uses just "*" as the database name. In that case Kamailio ends up
searching for a database module named "db_", instead of reporting
syntax error.
-Jan
On Sun, Dec 18, 2011 at 22:16, Peter Dunkley
<peter.dunkley(a)crocodile-rcs.com> wrote:
Module: sip-router
Branch: master
Commit: 2dad021502d0f931fabde0e4c220baf70898a877
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=2dad021…
Author: pd <peter.dunkley(a)crocodile-rcs.com>
Committer: pd <peter.dunkley(a)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 */
};
_______________________________________________
sr-dev mailing list
sr-dev(a)lists.sip-router.org
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev