gnucash maint: Multiple changes pushed

Geert Janssens gjanssens at code.gnucash.org
Thu May 12 06:26:53 EDT 2016


Updated	 via  https://github.com/Gnucash/gnucash/commit/3b17b44e (commit)
	 via  https://github.com/Gnucash/gnucash/commit/99554bc7 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/709ed8b1 (commit)
	from  https://github.com/Gnucash/gnucash/commit/043ca5d3 (commit)



commit 3b17b44ef7e1c2c8c5f473a5faf991616ac6b454
Author: colinl <colin at clanlaw.org.uk>
Date:   Wed May 11 21:30:56 2016 +0100

    Improved adjust_sql_options_string, added tests

diff --git a/src/backend/dbi/gnc-backend-dbi.c b/src/backend/dbi/gnc-backend-dbi.c
index c72d35e..e58978b 100644
--- a/src/backend/dbi/gnc-backend-dbi.c
+++ b/src/backend/dbi/gnc-backend-dbi.c
@@ -793,47 +793,35 @@ gnc_dbi_unlock( QofBackend *qbe )
 // Given an sql_options string returns a copy of the string adjusted as necessary.
 // In particular if the string contains SQL_OPTION_TO_REMOVE it is removed along with 
 // comma separator.
-static gchar*
+gchar*
 adjust_sql_options_string( const gchar *str )
 {
-    char* pos;
-    char* answer = g_malloc( strlen(str)+1 );  // this must be freed by the calling code
-    int chars_to_copy;
-    pos = strstr( str, SQL_OPTION_TO_REMOVE );
-    if (pos)
+    GRegex* regex = NULL;
+    GError* err = NULL;
+    gchar* regex_str = NULL;
+    gchar* answer = NULL;
+    
+    // build a regex string that will find the pattern at the beginning, end or
+    // within the string as a whole word, comma separated
+    regex_str = g_strdup_printf( "(?:,%s$|\\b%s\\b,?)",
+        SQL_OPTION_TO_REMOVE, SQL_OPTION_TO_REMOVE );
+    
+    // compile the regular expression and check for errors
+    regex = g_regex_new( regex_str, 0, 0, &err );
+    if ( err != NULL )
     {
-        if ( pos == str )
-        {
-            if ( *(pos+strlen(SQL_OPTION_TO_REMOVE)) == ',' )
-            {
-                strcpy( answer, str + strlen(SQL_OPTION_TO_REMOVE) + 1 );
-            } else if ( *(pos+strlen(SQL_OPTION_TO_REMOVE)) == '\0' )
-            {
-                strcpy( answer, "" );
-            } else
-            {
-                strcpy( answer, str );
-            }
-        } else if ( *(pos + strlen(SQL_OPTION_TO_REMOVE)) == '\0' )
-        {
-            chars_to_copy =  strlen(str) - strlen(SQL_OPTION_TO_REMOVE) - 1;
-            strncpy( answer, str, chars_to_copy );
-            answer[chars_to_copy] = '\0';
-        } else if (*(pos-1) == ','  &&  *(pos+strlen(SQL_OPTION_TO_REMOVE)) == ',')
-        {
-            chars_to_copy =  pos - str - 1;
-            strncpy( answer, str, chars_to_copy );
-            strcpy( answer + chars_to_copy, pos+strlen(SQL_OPTION_TO_REMOVE));
-        } else
-        {
-            // not found
-            strcpy( answer, str );
-        }
+        g_error_free (err);
     } else
     {
-        // not found
-        strcpy( answer, str );
+        answer = g_regex_replace( regex, str, -1, 0, "", 0, NULL );
     }
+    // in case of errors set the answer to the passed in string
+    if ( !answer )
+    {
+        answer = g_strdup( str );
+    }
+    g_free( regex_str );
+    g_regex_unref( regex );
     return answer;
 }
 
@@ -843,12 +831,12 @@ adjust_sql_options( dbi_conn connection )
 {
     dbi_result result;
     gint err;
-    const char* str;
-    const gchar *errmsg;
+    const char* errmsg;
     
     result = dbi_conn_query( connection, "SELECT @@sql_mode");
     if (result)
     {
+        const char* str;
         dbi_result_first_row(result);
         str = dbi_result_get_string_idx(result, 1);
         if (str)
@@ -862,8 +850,7 @@ adjust_sql_options( dbi_conn connection )
                 
                 adjusted_str = adjust_sql_options_string( str );
                 PINFO("Setting sql_mode to %s", adjusted_str);
-                set_str = g_malloc( strlen(adjusted_str) + 20 );
-                sprintf( set_str, "SET sql_mode='%s';", adjusted_str );
+                set_str = g_strdup_printf( "SET sql_mode='%s';", adjusted_str );
                 set_result = dbi_conn_query( connection, set_str);
                 if (set_result)
                 {
diff --git a/src/backend/dbi/gnc-backend-dbi.h b/src/backend/dbi/gnc-backend-dbi.h
index f228134..03466d2 100644
--- a/src/backend/dbi/gnc-backend-dbi.h
+++ b/src/backend/dbi/gnc-backend-dbi.h
@@ -38,6 +38,9 @@ void gnc_module_init_backend_dbi(void);
  * statically linked into the application. */
 void gnc_module_finalize_backend_dbi(void);
 
+/* external access required for tests */
+gchar* adjust_sql_options_string(const gchar *);
+
 #ifndef GNC_NO_LOADABLE_MODULES
 /** This is the standarized initialization function of a qof_backend
  * GModule, but compiling this can be disabled by defining
diff --git a/src/backend/dbi/test/test-backend-dbi-basic.c b/src/backend/dbi/test/test-backend-dbi-basic.c
index ec6d0ad..ee0738d 100644
--- a/src/backend/dbi/test/test-backend-dbi-basic.c
+++ b/src/backend/dbi/test/test-backend-dbi-basic.c
@@ -50,6 +50,8 @@
 #include "gncInvoice.h"
 /* For test_conn_index_functions */
 #include "../gnc-backend-dbi-priv.h"
+/* For test_adjust_options_string */
+#include "../gnc-backend-dbi.h"
 /* For version_control */
 #include <gnc-prefs.h>
 #include <qofsession-p.h>
@@ -596,6 +598,42 @@ test_dbi_business_store_and_reload (Fixture *fixture, gconstpointer pData)
 }
 
 static void
+test_adjust_sql_options_string(void)
+{
+    gchar *adjusted_str;
+    const char* in[] = {
+        "NO_ZERO_DATE",
+        "NO_ZERO_DATE,something_else",
+        "something,NO_ZERO_DATE",
+        "something,NO_ZERO_DATE,something_else",
+        "NO_ZERO_DATExx",
+        "NO_ZERO_DATExx,something_ else",
+        "something,NO_ZERO_DATExx",
+        "something,NO_ZERO_DATExx,something_ else",
+        "fred,jim,john"
+    };
+    const char* out[] = {
+        "",
+        "something_else",
+        "something",
+        "something,something_else",
+        "NO_ZERO_DATExx",
+        "NO_ZERO_DATExx,something_ else",
+        "something,NO_ZERO_DATExx",
+        "something,NO_ZERO_DATExx,something_ else",
+        "fred,jim,john"
+    };
+    
+    size_t i;
+    for( i = 0; i < sizeof(in) / sizeof(gchar*); i++)
+    {
+        gchar *adjusted_str = adjust_sql_options_string( in[i] );
+        g_assert_cmpstr( out[i],==,adjusted_str );
+        g_free( adjusted_str );
+    }
+}
+
+static void
 create_dbi_test_suite (gchar *dbm_name, gchar *url)
 {
     gchar *subsuite = g_strdup_printf ("%s/%s", suitename, dbm_name);
@@ -640,4 +678,6 @@ test_suite_gnc_backend_dbi (void)
         create_dbi_test_suite ("postgres", TEST_PGSQL_URL);
     }
 
+    GNC_TEST_ADD_FUNC( suitename, "adjust sql options string localtime", 
+        test_adjust_sql_options_string );
 }

commit 99554bc7c1241678b01c70c905b32220473c4f7f
Author: colinl <colin at clanlaw.org.uk>
Date:   Tue May 10 11:57:01 2016 +0100

    Tidied up adjust_sql_options

diff --git a/src/backend/dbi/gnc-backend-dbi.c b/src/backend/dbi/gnc-backend-dbi.c
index 282b435..c72d35e 100644
--- a/src/backend/dbi/gnc-backend-dbi.c
+++ b/src/backend/dbi/gnc-backend-dbi.c
@@ -799,52 +799,41 @@ adjust_sql_options_string( const gchar *str )
     char* pos;
     char* answer = g_malloc( strlen(str)+1 );  // this must be freed by the calling code
     int chars_to_copy;
-    PERR( "\nIn %s", str );
     pos = strstr( str, SQL_OPTION_TO_REMOVE );
     if (pos)
     {
-        PERR("%c %c", *(pos-1), *(pos+(strlen(SQL_OPTION_TO_REMOVE)+1)));
         if ( pos == str )
         {
-            PERR( "A" );
             if ( *(pos+strlen(SQL_OPTION_TO_REMOVE)) == ',' )
             {
-            PERR( "B" );
                 strcpy( answer, str + strlen(SQL_OPTION_TO_REMOVE) + 1 );
             } else if ( *(pos+strlen(SQL_OPTION_TO_REMOVE)) == '\0' )
             {
-            PERR( "C" );
                 strcpy( answer, "" );
             } else
             {
-                PERR( "A1" );
                 strcpy( answer, str );
             }
         } else if ( *(pos + strlen(SQL_OPTION_TO_REMOVE)) == '\0' )
         {
-            PERR( "D" );
             chars_to_copy =  strlen(str) - strlen(SQL_OPTION_TO_REMOVE) - 1;
             strncpy( answer, str, chars_to_copy );
             answer[chars_to_copy] = '\0';
         } else if (*(pos-1) == ','  &&  *(pos+strlen(SQL_OPTION_TO_REMOVE)) == ',')
         {
-            PERR( "E" );
             chars_to_copy =  pos - str - 1;
             strncpy( answer, str, chars_to_copy );
             strcpy( answer + chars_to_copy, pos+strlen(SQL_OPTION_TO_REMOVE));
         } else
         {
-            PERR( "F" );
             // not found
             strcpy( answer, str );
         }
     } else
     {
-        PERR( "G" );
         // not found
         strcpy( answer, str );
     }
-    PERR( "Out %s\n", answer );
     return answer;
 }
 
@@ -853,54 +842,36 @@ static void
 adjust_sql_options( dbi_conn connection )
 {
     dbi_result result;
-    int err;
+    gint err;
     const char* str;
     const gchar *errmsg;
-    gchar *adjusted_str;
-    gchar *set_str;
-    const char * strings[] = {
-        "NO_ZERO_DATE",
-        "NO_ZERO_DATE,something else",
-        "something,NO_ZERO_DATE",
-        "something,NO_ZERO_DATE,something else",
-        "NO_ZERO_DATExx",
-        "NO_ZERO_DATExx,something else",
-        "something,NO_ZERO_DATExx",
-        "something,NO_ZERO_DATExx,something else",
-        "fred,jim,john"
-    };
     
-    size_t i;
-    for( i = 0; i < sizeof(strings) / sizeof(char*); i++)
-    {
-        adjusted_str = adjust_sql_options_string( strings[i] );
-        g_free( adjusted_str );
-    }
-    
-    PERR("in adjust_sql_options");
     result = dbi_conn_query( connection, "SELECT @@sql_mode");
     if (result)
     {
-        err = dbi_result_first_row(result);
-        if (!err)
-        {
-            PERR("first_row err");
-        }
+        dbi_result_first_row(result);
         str = dbi_result_get_string_idx(result, 1);
         if (str)
         {
-            PERR("*************** %s", str);
+            PINFO("Initial sql_mode: %s", str);
             if( strstr( str, SQL_OPTION_TO_REMOVE ) )
             {
+                gchar *adjusted_str;
+                gchar *set_str;
+                dbi_result set_result;
+                
                 adjusted_str = adjust_sql_options_string( str );
+                PINFO("Setting sql_mode to %s", adjusted_str);
                 set_str = g_malloc( strlen(adjusted_str) + 20 );
                 sprintf( set_str, "SET sql_mode='%s';", adjusted_str );
-                PERR("*** %s", set_str);
-                result = dbi_conn_query( connection, set_str);
-                if (!result)
+                set_result = dbi_conn_query( connection, set_str);
+                if (set_result)
+                {
+                    dbi_result_free( set_result );
+                } else
                 {
-                    err = dbi_conn_error(connection, &errmsg);
-                    PERR("null result %d : %s", err, errmsg );
+                  err = dbi_conn_error(connection, &errmsg);
+                  PERR("Unable to set sql_mode %d : %s", err, errmsg );
                 }
                 g_free( adjusted_str );
                 g_free( set_str );
@@ -908,14 +879,15 @@ adjust_sql_options( dbi_conn connection )
         }
         else
         {
-            PERR("null str");
+            err = dbi_conn_error(connection, &errmsg);
+            PERR("Unable to get sql_mode %d : %s", err, errmsg );
         }
         dbi_result_free(result);
     }
     else
     {
       err = dbi_conn_error(connection, &errmsg);
-      PERR("null result %d : %s", err, errmsg );
+      PERR("Unable to read sql_mode %d : %s", err, errmsg );
     }
 }
 

commit 709ed8b1d3162a1ecc2d07f889bd25d85f16684a
Author: colinl <colin at clanlaw.org.uk>
Date:   Tue May 10 08:12:53 2016 +0100

    adjust_sql_options working but needs tidy up and remove diagnostics

diff --git a/src/backend/dbi/gnc-backend-dbi.c b/src/backend/dbi/gnc-backend-dbi.c
index 79b7116..282b435 100644
--- a/src/backend/dbi/gnc-backend-dbi.c
+++ b/src/backend/dbi/gnc-backend-dbi.c
@@ -788,6 +788,137 @@ gnc_dbi_unlock( QofBackend *qbe )
     qof_backend_set_error( qbe, ERR_BACKEND_SERVER_ERR );
 }
 
+#define SQL_OPTION_TO_REMOVE "NO_ZERO_DATE"
+
+// Given an sql_options string returns a copy of the string adjusted as necessary.
+// In particular if the string contains SQL_OPTION_TO_REMOVE it is removed along with 
+// comma separator.
+static gchar*
+adjust_sql_options_string( const gchar *str )
+{
+    char* pos;
+    char* answer = g_malloc( strlen(str)+1 );  // this must be freed by the calling code
+    int chars_to_copy;
+    PERR( "\nIn %s", str );
+    pos = strstr( str, SQL_OPTION_TO_REMOVE );
+    if (pos)
+    {
+        PERR("%c %c", *(pos-1), *(pos+(strlen(SQL_OPTION_TO_REMOVE)+1)));
+        if ( pos == str )
+        {
+            PERR( "A" );
+            if ( *(pos+strlen(SQL_OPTION_TO_REMOVE)) == ',' )
+            {
+            PERR( "B" );
+                strcpy( answer, str + strlen(SQL_OPTION_TO_REMOVE) + 1 );
+            } else if ( *(pos+strlen(SQL_OPTION_TO_REMOVE)) == '\0' )
+            {
+            PERR( "C" );
+                strcpy( answer, "" );
+            } else
+            {
+                PERR( "A1" );
+                strcpy( answer, str );
+            }
+        } else if ( *(pos + strlen(SQL_OPTION_TO_REMOVE)) == '\0' )
+        {
+            PERR( "D" );
+            chars_to_copy =  strlen(str) - strlen(SQL_OPTION_TO_REMOVE) - 1;
+            strncpy( answer, str, chars_to_copy );
+            answer[chars_to_copy] = '\0';
+        } else if (*(pos-1) == ','  &&  *(pos+strlen(SQL_OPTION_TO_REMOVE)) == ',')
+        {
+            PERR( "E" );
+            chars_to_copy =  pos - str - 1;
+            strncpy( answer, str, chars_to_copy );
+            strcpy( answer + chars_to_copy, pos+strlen(SQL_OPTION_TO_REMOVE));
+        } else
+        {
+            PERR( "F" );
+            // not found
+            strcpy( answer, str );
+        }
+    } else
+    {
+        PERR( "G" );
+        // not found
+        strcpy( answer, str );
+    }
+    PERR( "Out %s\n", answer );
+    return answer;
+}
+
+/* checks mysql sql_options and adjusts if necessary */
+static void
+adjust_sql_options( dbi_conn connection )
+{
+    dbi_result result;
+    int err;
+    const char* str;
+    const gchar *errmsg;
+    gchar *adjusted_str;
+    gchar *set_str;
+    const char * strings[] = {
+        "NO_ZERO_DATE",
+        "NO_ZERO_DATE,something else",
+        "something,NO_ZERO_DATE",
+        "something,NO_ZERO_DATE,something else",
+        "NO_ZERO_DATExx",
+        "NO_ZERO_DATExx,something else",
+        "something,NO_ZERO_DATExx",
+        "something,NO_ZERO_DATExx,something else",
+        "fred,jim,john"
+    };
+    
+    size_t i;
+    for( i = 0; i < sizeof(strings) / sizeof(char*); i++)
+    {
+        adjusted_str = adjust_sql_options_string( strings[i] );
+        g_free( adjusted_str );
+    }
+    
+    PERR("in adjust_sql_options");
+    result = dbi_conn_query( connection, "SELECT @@sql_mode");
+    if (result)
+    {
+        err = dbi_result_first_row(result);
+        if (!err)
+        {
+            PERR("first_row err");
+        }
+        str = dbi_result_get_string_idx(result, 1);
+        if (str)
+        {
+            PERR("*************** %s", str);
+            if( strstr( str, SQL_OPTION_TO_REMOVE ) )
+            {
+                adjusted_str = adjust_sql_options_string( str );
+                set_str = g_malloc( strlen(adjusted_str) + 20 );
+                sprintf( set_str, "SET sql_mode='%s';", adjusted_str );
+                PERR("*** %s", set_str);
+                result = dbi_conn_query( connection, set_str);
+                if (!result)
+                {
+                    err = dbi_conn_error(connection, &errmsg);
+                    PERR("null result %d : %s", err, errmsg );
+                }
+                g_free( adjusted_str );
+                g_free( set_str );
+            }
+        }
+        else
+        {
+            PERR("null str");
+        }
+        dbi_result_free(result);
+    }
+    else
+    {
+      err = dbi_conn_error(connection, &errmsg);
+      PERR("null result %d : %s", err, errmsg );
+    }
+}
+
 static void
 gnc_dbi_mysql_session_begin( QofBackend* qbe, QofSession *session,
                              const gchar *book_id, gboolean ignore_lock,
@@ -848,6 +979,7 @@ gnc_dbi_mysql_session_begin( QofBackend* qbe, QofSession *session,
     result = dbi_conn_connect( be->conn );
     if ( result == 0 )
     {
+        adjust_sql_options( be->conn );
         dbi_test_result = conn_test_dbi_library( be->conn );
         switch ( dbi_test_result )
         {
@@ -907,6 +1039,7 @@ gnc_dbi_mysql_session_begin( QofBackend* qbe, QofSession *session,
                 qof_backend_set_error( qbe, ERR_BACKEND_SERVER_ERR );
                 goto exit;
             }
+            adjust_sql_options( be->conn );
             dresult = dbi_conn_queryf( be->conn, "CREATE DATABASE %s CHARACTER SET utf8", dbname );
             if ( dresult == NULL )
             {
@@ -944,6 +1077,7 @@ gnc_dbi_mysql_session_begin( QofBackend* qbe, QofSession *session,
                 qof_backend_set_error( qbe, ERR_BACKEND_SERVER_ERR );
                 goto exit;
             }
+            adjust_sql_options( be->conn );
             dbi_test_result = conn_test_dbi_library( be->conn );
             switch ( dbi_test_result )
             {



Summary of changes:
 src/backend/dbi/gnc-backend-dbi.c             | 93 +++++++++++++++++++++++++++
 src/backend/dbi/gnc-backend-dbi.h             |  3 +
 src/backend/dbi/test/test-backend-dbi-basic.c | 40 ++++++++++++
 3 files changed, 136 insertions(+)



More information about the gnucash-changes mailing list