MySQL: support MySQL config file option group names. Bug 1701
authorJeremy Harris <jgh146exb@wizmail.org>
Sat, 14 Nov 2015 17:32:29 +0000 (17:32 +0000)
committerJeremy Harris <jgh146exb@wizmail.org>
Sun, 22 Nov 2015 18:29:53 +0000 (18:29 +0000)
doc/doc-docbook/spec.xfpt
doc/doc-txt/ChangeLog
src/src/lookups/mysql.c

index f505250c860260753ff8999f2c384fb227b7f5cb..d7d981ea744bb83650621c75d6c57ee673f37f10 100644 (file)
@@ -7592,13 +7592,17 @@ ${lookup pgsql{servers=master/db/name/pw; UPDATE ...} }
 .section "Special MySQL features" "SECID73"
 For MySQL, an empty host name or the use of &"localhost"& in &%mysql_servers%&
 causes a connection to the server on the local host by means of a Unix domain
 .section "Special MySQL features" "SECID73"
 For MySQL, an empty host name or the use of &"localhost"& in &%mysql_servers%&
 causes a connection to the server on the local host by means of a Unix domain
-socket. An alternate socket can be specified in parentheses. The full syntax of
-each item in &%mysql_servers%& is:
+socket. An alternate socket can be specified in parentheses.
+.new
+An option group name for MySQL option files can be specified in square brackets;
+the default value is &"exim"&.
+.wen
+The full syntax of each item in &%mysql_servers%& is:
 .display
 .display
-<&'hostname'&>::<&'port'&>(<&'socket name'&>)/<&'database'&>/&&&
-  <&'user'&>/<&'password'&>
+<&'hostname'&>::<&'port'&>(<&'socket name'&>)[<&'option group'&>]/&&&
+  <&'database'&>/<&'user'&>/<&'password'&>
 .endd
 .endd
-Any of the three sub-parts of the first field can be omitted. For normal use on
+Any of the four sub-parts of the first field can be omitted. For normal use on
 the local host it can be left blank or set to just &"localhost"&.
 
 No database need be supplied &-- but if it is absent here, it must be given in
 the local host it can be left blank or set to just &"localhost"&.
 
 No database need be supplied &-- but if it is absent here, it must be given in
index 22ddaa2af04dabc651fe1a1052f3e1fc2c64b48d..d650fc1c03f0a2cbe52302fe8e0bbd301a323cfc 100644 (file)
@@ -102,6 +102,8 @@ GF/01 Bug 1715: Fix for race condition in exicyclog, where exim could attempt
       installations where exicyclog is run as root, rather than exim user;
       result is that the running daemon panics and dies.
 
       installations where exicyclog is run as root, rather than exim user;
       result is that the running daemon panics and dies.
 
+JH/20 Bug 1701: For MySQL lookups, support MySQL config file option group names.
+
 
 Exim version 4.86
 -----------------
 
 Exim version 4.86
 -----------------
index 1ce8831e8950094638f4c8a16913b7cb160b7fce..68b04dcc81d374a937187d5e1a2b8153a5e7e9bd 100644 (file)
@@ -125,42 +125,50 @@ sdata[0] = server;   /* What's left at the start */
 
 /* See if we have a cached connection to the server */
 
 
 /* See if we have a cached connection to the server */
 
-for (cn = mysql_connections; cn != NULL; cn = cn->next)
-  {
+for (cn = mysql_connections; cn; cn = cn->next)
   if (Ustrcmp(cn->server, server_copy) == 0)
     {
     mysql_handle = cn->handle;
     break;
     }
   if (Ustrcmp(cn->server, server_copy) == 0)
     {
     mysql_handle = cn->handle;
     break;
     }
-  }
 
 /* If no cached connection, we must set one up. Mysql allows for a host name
 and port to be specified. It also allows the name of a Unix socket to be used.
 Unfortunately, this contains slashes, but its use is expected to be rare, so
 the rather cumbersome syntax shouldn't inconvenience too many people. We use
 
 /* If no cached connection, we must set one up. Mysql allows for a host name
 and port to be specified. It also allows the name of a Unix socket to be used.
 Unfortunately, this contains slashes, but its use is expected to be rare, so
 the rather cumbersome syntax shouldn't inconvenience too many people. We use
-this:  host:port(socket)  where all the parts are optional. */
+this:  host:port(socket)[group]  where all the parts are optional.
+The "group" parameter specifies an option group from a MySQL option file. */
 
 
-if (cn == NULL)
+if (!cn)
   {
   uschar *p;
   uschar *socket = NULL;
   int port = 0;
   {
   uschar *p;
   uschar *socket = NULL;
   int port = 0;
+  uschar *group = US"exim";
+
+  if ((p = Ustrchr(sdata[0], '[')))
+    {
+    *p++ = 0;
+    group = p;
+    while (*p && *p != ']') p++;
+    *p = 0;
+    }
 
 
-  if ((p = Ustrchr(sdata[0], '(')) != NULL)
+  if ((p = Ustrchr(sdata[0], '(')))
     {
     *p++ = 0;
     socket = p;
     {
     *p++ = 0;
     socket = p;
-    while (*p != 0 && *p != ')') p++;
+    while (*p && *p != ')') p++;
     *p = 0;
     }
 
     *p = 0;
     }
 
-  if ((p = Ustrchr(sdata[0], ':')) != NULL)
+  if ((p = Ustrchr(sdata[0], ':')))
     {
     *p++ = 0;
     port = Uatoi(p);
     }
 
     {
     *p++ = 0;
     port = Uatoi(p);
     }
 
-  if (Ustrchr(sdata[0], '/') != NULL)
+  if (Ustrchr(sdata[0], '/'))
     {
     *errmsg = string_sprintf("unexpected slash in MySQL server hostname: %s",
       sdata[0]);
     {
     *errmsg = string_sprintf("unexpected slash in MySQL server hostname: %s",
       sdata[0]);
@@ -181,6 +189,7 @@ if (cn == NULL)
 
   mysql_handle = store_get(sizeof(MYSQL));
   mysql_init(mysql_handle);
 
   mysql_handle = store_get(sizeof(MYSQL));
   mysql_init(mysql_handle);
+  mysql_options(mysql_handle, MYSQL_READ_DEFAULT_GROUP, CS group);
   if (mysql_real_connect(mysql_handle,
       /*  host        user         passwd     database */
       CS sdata[0], CS sdata[2], CS sdata[3], CS sdata[1],
   if (mysql_real_connect(mysql_handle,
       /*  host        user         passwd     database */
       CS sdata[0], CS sdata[2], CS sdata[3], CS sdata[1],