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