Copyright year bumps for substantive changes 2017
[exim.git] / src / src / lookups / mysql.c
index b5133bc0088a91ccb9cac3c9de1cc414efc2f576..ff1ef83250d7236be7e83aeb8b747a66221d893f 100644 (file)
@@ -2,7 +2,7 @@
 *     Exim - an Internet mail transport agent    *
 *************************************************/
 
-/* Copyright (c) University of Cambridge 1995 - 2015 */
+/* Copyright (c) University of Cambridge 1995 - 2017 */
 /* See the file NOTICE for conditions of use and distribution. */
 
 /* Thanks to Paul Kelly for contributing the original code for these
@@ -19,12 +19,12 @@ and *_BASE_STR (char*). It's a bit of guesswork. Especially for mariadb
 with versions before 10.2, as they do not define there there specific symbols.
 */
 
-// Newer (>= 10.2) MariaDB
+/* Newer (>= 10.2) MariaDB */
 #if defined                   MARIADB_VERSION_ID
 #define EXIM_MxSQL_VERSION_ID MARIADB_VERSION_ID
 
-// MySQL defines MYSQL_VERSION_ID, and MariaDB does so
-// https://dev.mysql.com/doc/refman/5.7/en/c-api-server-client-versions.html
+/* MySQL defines MYSQL_VERSION_ID, and MariaDB does so */
+/* https://dev.mysql.com/doc/refman/5.7/en/c-api-server-client-versions.html */
 #elif defined                 LIBMYSQL_VERSION_ID
 #define EXIM_MxSQL_VERSION_ID LIBMYSQL_VERSION_ID
 #elif defined                 MYSQL_VERSION_ID
@@ -34,18 +34,18 @@ with versions before 10.2, as they do not define there there specific symbols.
 #define EXIM_MYSQL_VERSION_ID  0
 #endif
 
-// Newer (>= 10.2) MariaDB
+/* Newer (>= 10.2) MariaDB */
 #ifdef                         MARIADB_CLIENT_VERSION_STR
 #define EXIM_MxSQL_VERSION_STR MARIADB_CLIENT_VERSION_STR
 
-// Mysql uses MYSQL_SERVER_VERSION
+/* Mysql uses MYSQL_SERVER_VERSION */
 #elif defined                  LIBMYSQL_VERSION
 #define EXIM_MxSQL_VERSION_STR LIBMYSQL_VERSION
 #elif defined                  MYSQL_SERVER_VERSION
 #define EXIM_MxSQL_VERSION_STR MYSQL_SERVER_VERSION
 
 #else
-#define EXIM_MxSQL_VERSION_STR  "N.A."
+#define EXIM_MxSQL_VERSION_STR  "unknown"
 #endif
 
 #if defined                 MARIADB_BASE_VERSION
@@ -140,11 +140,9 @@ MYSQL_ROW mysql_row_data;
 MYSQL_FIELD *fields;
 
 int i;
-int ssize = 0;
-int offset = 0;
 int yield = DEFER;
 unsigned int num_fields;
-uschar *result = NULL;
+gstring * result = NULL;
 mysql_connection *cn;
 uschar *server_copy = NULL;
 uschar *sdata[4];
@@ -288,7 +286,8 @@ if ((mysql_result = mysql_use_result(mysql_handle)) == NULL)
   if ( mysql_field_count(mysql_handle) == 0 )
     {
     DEBUG(D_lookup) debug_printf("MYSQL: query was not one that returns data\n");
-    result = string_sprintf("%d", mysql_affected_rows(mysql_handle));
+    result = string_cat(result,
+              string_sprintf("%d", mysql_affected_rows(mysql_handle)));
     *do_cache = 0;
     goto MYSQL_EXIT;
     }
@@ -308,25 +307,25 @@ row, we insert '\n' between them. */
 
 fields = mysql_fetch_fields(mysql_result);
 
-while ((mysql_row_data = mysql_fetch_row(mysql_result)) != NULL)
+while ((mysql_row_data = mysql_fetch_row(mysql_result)))
   {
   unsigned long *lengths = mysql_fetch_lengths(mysql_result);
 
-  if (result != NULL)
-      result = string_catn(result, &ssize, &offset, US"\n", 1);
+  if (result)
+    result = string_catn(result, US"\n", 1);
 
   if (num_fields == 1)
     {
     if (mysql_row_data[0] != NULL)    /* NULL value yields nothing */
-      result = string_catn(result, &ssize, &offset, US mysql_row_data[0],
+      {
+      result = string_catn(result, US mysql_row_data[0],
         lengths[0]);
+      (void) string_from_gstring(result);
+      }
     }
 
   else for (i = 0; i < num_fields; i++)
-    {
-    result = lf_quote(US fields[i].name, US mysql_row_data[i], lengths[i],
-      result, &ssize, &offset);
-    }
+    result = lf_quote(US fields[i].name, US mysql_row_data[i], lengths[i], result);
   }
 
 /* more results? -1 = no, >0 = error, 0 = yes (keep looping)
@@ -348,15 +347,15 @@ while((i = mysql_next_result(mysql_handle)) >= 0) {
 Otherwise, we must terminate the string which has been built; string_cat()
 always leaves enough room for a terminating zero. */
 
-if (result == NULL)
+if (!result)
   {
   yield = FAIL;
   *errmsg = US"MYSQL: no data found";
   }
 else
   {
-  result[offset] = 0;
-  store_reset(result + offset + 1);
+  (void) string_from_gstring(result);
+  store_reset(result->s + result->ptr + 1);
   }
 
 /* Get here by goto from various error checks and from the case where no data
@@ -367,13 +366,13 @@ MYSQL_EXIT:
 /* Free mysal store for any result that was got; don't close the connection, as
 it is cached. */
 
-if (mysql_result != NULL) mysql_free_result(mysql_result);
+if (mysql_result) mysql_free_result(mysql_result);
 
 /* Non-NULL result indicates a successful result */
 
-if (result != NULL)
+if (result)
   {
-  *resultptr = result;
+  *resultptr = result->s;
   return OK;
   }
 else