[SR-Dev] git:janakj/mysql: - add group functionality to read content from specified sections

Jan Janak jan at iptel.org
Mon Feb 16 22:07:54 CET 2009


Module: sip-router
Branch: janakj/mysql
Commit: 89215f17a700df083e99f16e58becb3d2ab28f0b
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=89215f17a700df083e99f16e58becb3d2ab28f0b

Author: Henning Westerholt <henning.westerholt at 1und1.de>
Committer: Henning Westerholt <henning.westerholt at 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));




More information about the sr-dev mailing list