summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Harris <jgh146exb@wizmail.org>2015-11-14 17:32:29 +0000
committerJeremy Harris <jgh146exb@wizmail.org>2015-11-22 18:29:53 +0000
commita159f203b559a406a5489f3ef2a60a61574bbb86 (patch)
treed22cfc92d0c4664ce64fffea51e35c950f730ec5
parentd066e592c2e5fb2e96b0d1b51b4bdd7f824ddafd (diff)
MySQL: support MySQL config file option group names. Bug 1701
-rw-r--r--doc/doc-docbook/spec.xfpt14
-rw-r--r--doc/doc-txt/ChangeLog2
-rw-r--r--src/src/lookups/mysql.c27
3 files changed, 29 insertions, 14 deletions
diff --git a/doc/doc-docbook/spec.xfpt b/doc/doc-docbook/spec.xfpt
index f505250c8..d7d981ea7 100644
--- a/doc/doc-docbook/spec.xfpt
+++ b/doc/doc-docbook/spec.xfpt
@@ -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
-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
-<&'hostname'&>::<&'port'&>(<&'socket name'&>)/<&'database'&>/&&&
- <&'user'&>/<&'password'&>
+<&'hostname'&>::<&'port'&>(<&'socket name'&>)[<&'option group'&>]/&&&
+ <&'database'&>/<&'user'&>/<&'password'&>
.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
diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog
index 22ddaa2af..d650fc1c0 100644
--- a/doc/doc-txt/ChangeLog
+++ b/doc/doc-txt/ChangeLog
@@ -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.
+JH/20 Bug 1701: For MySQL lookups, support MySQL config file option group names.
+
Exim version 4.86
-----------------
diff --git a/src/src/lookups/mysql.c b/src/src/lookups/mysql.c
index 1ce8831e8..68b04dcc8 100644
--- a/src/src/lookups/mysql.c
+++ b/src/src/lookups/mysql.c
@@ -125,42 +125,50 @@ sdata[0] = server; /* What's left at the start */
/* 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 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 *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;
- while (*p != 0 && *p != ')') p++;
+ while (*p && *p != ')') p++;
*p = 0;
}
- if ((p = Ustrchr(sdata[0], ':')) != NULL)
+ if ((p = Ustrchr(sdata[0], ':')))
{
*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]);
@@ -181,6 +189,7 @@ if (cn == NULL)
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],