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

Jan Janak jan at ryngle.com
Mon Dec 19 00:37:11 CET 2011


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 at 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=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 */
>  };
>
>
>
>
> _______________________________________________
> sr-dev mailing list
> sr-dev at lists.sip-router.org
> http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev



More information about the sr-dev mailing list