Module: sip-router Branch: janakj/mysql Commit: 89215f17a700df083e99f16e58becb3d2ab28f0b URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=89215f17...
Author: Henning Westerholt henning.westerholt@1und1.de Committer: Henning Westerholt henning.westerholt@1und1.de Date: Mon Jan 5 12:27:49 2009 +0000
- add group functionality to read content from specified sections of the mysql config to the db_mysql module, db_url examples: * mysql://user:pass@[group]host:port/db or * mysql://user:pass@[group]/db or * mysql://[group]/db - existing functionality is not changed, this is backward compatible - check usernames for NULL before comparing in DB API, otherwise it would segfault when only a group name is specified - patch from Andreas Granig, agranig at sipwise dot com, closes #1815631
git-svn-id: https://openser.svn.sourceforge.net/svnroot/openser/trunk@5413 689a6050-402a-0410-94f2-e92a70836424
---
modules/db_mysql/km_README | 51 ++++++++++++++++++++++++++ modules/db_mysql/km_doc/db_mysql_admin.xml | 54 ++++++++++++++++++++++++++++ modules/db_mysql/km_my_con.c | 28 ++++++++++++-- 3 files changed, 129 insertions(+), 4 deletions(-)
diff --git a/modules/db_mysql/km_README b/modules/db_mysql/km_README index 54951d1..eb7693c 100644 --- a/modules/db_mysql/km_README +++ b/modules/db_mysql/km_README @@ -34,12 +34,16 @@ Daniel-Constantin Mierla
1.4. Exported Functions 1.5. Installation + 1.6. Reading configuration from my.cnf
List of Examples
1.1. Set ping_interval parameter 1.2. Set timeout_interval parameter 1.3. Set auto_reconnect parameter + 1.4. Set a my.cnf group in db_url parameter + 1.5. Adding a kamailio group to my.cnf + 1.6. Using [client] and specific group
Chapter 1. Admin Guide
@@ -121,3 +125,50 @@ modparam("auto_reconnect", "auto_reconnect", 0) * - from command line use: 'make all include_modules="db_mysql"; make install include_modules="db_mysql"'. + +1.6. Reading configuration from my.cnf + + In order to take into account specific mysql client options, a + my.cnf config group can be passed using the db_url module + parameter. This is done by setting [group] in front of or + instead of the host part. The following examples are valid + db_url definitions, which include a my.cnf group: + * mysql://user:pass@[group]host:port/db + * mysql://user:pass@[group]:port/db + * mysql://user:pass@[group]/db + * mysql://[group]/db + + Example 1.4. Set a my.cnf group in db_url parameter +... +modparam("usrloc", "db_url", "mysql://[kamailio]/kamailio) +... + + Example 1.5. Adding a kamailio group to my.cnf +... +[kamailio] +socket = /path/to/mysql.sock +user = kamailiouser +password = kamailiopass +default-character-set = utf8 +... + + In addition to the given group, also the [client] section is + read, in the order given in my.cnf. So if you for example + specify a socket in both your specific group and the client + group, then the value is taken from the last one. + + Example 1.6. Using [client] and specific group +... +[client] +socket = /var/run/mysql/mysqld.sock + +[kamailio] +socket = /path/to/mysqld.sock +user = kamailiouser +password = kamailiopass +default-character-set = utf8 +... + + In the example given above, the socket /path/to/mysqld.sock is + used by Kamailio because both [kamailio] and [client] define + this option, and the latter overwrites the first. diff --git a/modules/db_mysql/km_doc/db_mysql_admin.xml b/modules/db_mysql/km_doc/db_mysql_admin.xml index 31079e0..a484d02 100644 --- a/modules/db_mysql/km_doc/db_mysql_admin.xml +++ b/modules/db_mysql/km_doc/db_mysql_admin.xml @@ -140,5 +140,59 @@ modparam("auto_reconnect", "auto_reconnect", 0) </listitem> </itemizedlist> </section> + <section> + <title>Reading configuration from my.cnf</title> + <para> + In order to take into account specific mysql client options, a my.cnf config group can be passed using the <emphasis>db_url</emphasis> module parameter. This is done by setting <emphasis>[group]</emphasis> in front of or instead of the host part. The following examples are valid <emphasis>db_url</emphasis> definitions, which include a my.cnf group: + </para> + + <itemizedlist> + <listitem>mysql://user:pass@[group]host:port/db</listitem> + <listitem>mysql://user:pass@[group]:port/db</listitem> + <listitem>mysql://user:pass@[group]/db</listitem> + <listitem>mysql://[group]/db</listitem> + </itemizedlist> + <example> + <title>Set a my.cnf group in <varname>db_url</varname> parameter</title> + <programlisting format="linespecific"> +... +modparam("usrloc", "db_url", "mysql://[kamailio]/kamailio) +... +</programlisting> + </example> + <example> + <title>Adding a kamailio group to my.cnf</title> + <programlisting format="linespecific"> +... +[kamailio] +socket = /path/to/mysql.sock +user = kamailiouser +password = kamailiopass +default-character-set = utf8 +... +</programlisting> + </example> + <para> + In addition to the given group, also the <emphasis>[client]</emphasis> section is read, in the order given in my.cnf. So if you for example specify a <emphasis>socket</emphasis> in both your specific group and the client group, then the value is taken from the last one. + </para> + <example> + <title>Using [client] and specific group</title> + <programlisting format="linespecific"> +... +[client] +socket = /var/run/mysql/mysqld.sock + +[kamailio] +socket = /path/to/mysqld.sock +user = kamailiouser +password = kamailiopass +default-character-set = utf8 +... +</programlisting> + </example> + <para> + In the example given above, the socket <emphasis>/path/to/mysqld.sock</emphasis> is used by &kamailio; because both <emphasis>[kamailio]</emphasis> and <emphasis>[client]</emphasis> define this option, and the latter overwrites the first. + </para> + </section> </chapter>
diff --git a/modules/db_mysql/km_my_con.c b/modules/db_mysql/km_my_con.c index 1a907b9..b5ec56a 100644 --- a/modules/db_mysql/km_my_con.c +++ b/modules/db_mysql/km_my_con.c @@ -43,6 +43,7 @@ struct my_con* db_mysql_new_connection(const struct db_id* id) { struct my_con* ptr; + char *host, *grp;
if (!id) { LM_ERR("invalid parameter value\n"); @@ -66,11 +67,30 @@ struct my_con* db_mysql_new_connection(const struct db_id* id)
mysql_init(ptr->con);
+ if (id->host[0] == '[' && (host = strchr(id->host, ']')) != NULL) { + grp = id->host + 1; + *host = '\0'; + if (host != id->host + strlen(id->host)-1) { + host += 1; // host found after closing bracket + } + else { + // let mysql read host info from my.cnf + // (defaults to "localhost") + host = NULL; + } + // read [client] and [<grp>] sections in the order + // given in my.cnf + mysql_options(ptr->con, MYSQL_READ_DEFAULT_GROUP, grp); + } + else { + host = id->host; + } + if (id->port) { - LM_DBG("opening connection: mysql://xxxx:xxxx@%s:%d/%s\n", ZSW(id->host), + LM_DBG("opening connection: mysql://xxxx:xxxx@%s:%d/%s\n", ZSW(host), id->port, ZSW(id->database)); } else { - LM_DBG("opening connection: mysql://xxxx:xxxx@%s/%s\n", ZSW(id->host), + LM_DBG("opening connection: mysql://xxxx:xxxx@%s/%s\n", ZSW(host), ZSW(id->database)); }
@@ -80,10 +100,10 @@ struct my_con* db_mysql_new_connection(const struct db_id* id) mysql_options(ptr->con, MYSQL_OPT_WRITE_TIMEOUT, (const char *)&db_mysql_timeout_interval);
#if (MYSQL_VERSION_ID >= 40100) - if (!mysql_real_connect(ptr->con, id->host, id->username, id->password, + if (!mysql_real_connect(ptr->con, host, id->username, id->password, id->database, id->port, 0, CLIENT_MULTI_STATEMENTS)) { #else - if (!mysql_real_connect(ptr->con, id->host, id->username, id->password, + if (!mysql_real_connect(ptr->con, host, id->username, id->password, id->database, id->port, 0, 0)) { #endif LM_ERR("driver error: %s\n", mysql_error(ptr->con));