MySQL: fix build on Fedora 27, where MariaDB version information has become unavailable
[exim.git] / src / src / lookups / mysql.c
index 1ce8831e8950094638f4c8a16913b7cb160b7fce..40b27d5ba6a6997bdb1dd0521ccd685d171a7b8e 100644 (file)
@@ -13,6 +13,7 @@ functions. */
 #include "lf_functions.h"
 
 #include <mysql.h>       /* The system header */
+#include <mysql_version.h>
 
 
 /* Structure and anchor for caching connections. */
@@ -125,42 +126,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 +190,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],
@@ -257,12 +267,12 @@ while ((mysql_row_data = mysql_fetch_row(mysql_result)) != NULL)
   unsigned long *lengths = mysql_fetch_lengths(mysql_result);
 
   if (result != NULL)
-      result = string_cat(result, &ssize, &offset, US"\n", 1);
+      result = string_catn(result, &ssize, &offset, US"\n", 1);
 
   if (num_fields == 1)
     {
     if (mysql_row_data[0] != NULL)    /* NULL value yields nothing */
-      result = string_cat(result, &ssize, &offset, US mysql_row_data[0],
+      result = string_catn(result, &ssize, &offset, US mysql_row_data[0],
         lengths[0]);
     }
 
@@ -313,7 +323,7 @@ it is cached. */
 
 if (mysql_result != NULL) mysql_free_result(mysql_result);
 
-/* Non-NULL result indicates a sucessful result */
+/* Non-NULL result indicates a successful result */
 
 if (result != NULL)
   {
@@ -423,10 +433,15 @@ return quoted;
 void
 mysql_version_report(FILE *f)
 {
-fprintf(f, "Library version: MySQL: Compile: %s [%s]\n"
-           "                        Runtime: %s\n",
-        MYSQL_SERVER_VERSION, MYSQL_COMPILATION_COMMENT,
-        mysql_get_client_info());
+#ifdef MYSQL_SERVER_VERSION
+fprintf(f, "Library version: MySQL: Compile: %s [%s]\n",
+        MYSQL_SERVER_VERSION, MYSQL_COMPILATION_COMMENT);
+#else
+fprintf(f, "Library version: MySQL: Compile: (unknown)\n");
+#endif
+
+fprintf(f, "                        Runtime: %s\n", mysql_get_client_info());
+
 #ifdef DYNLOOKUP
 fprintf(f, "                        Exim version %s\n", EXIM_VERSION_STR);
 #endif