AUDIT: r22450 - gnucash/trunk/src/backend/dbi - Bug #677488 - DROP INDEX missing ON <table>

Geert Janssens gjanssens at code.gnucash.org
Fri Oct 26 04:49:54 EDT 2012


Author: gjanssens
Date: 2012-10-26 04:49:54 -0400 (Fri, 26 Oct 2012)
New Revision: 22450
Trac: http://svn.gnucash.org/trac/changeset/22450

Modified:
   gnucash/trunk/src/backend/dbi/gnc-backend-dbi-priv.h
   gnucash/trunk/src/backend/dbi/gnc-backend-dbi.c
Log:
Bug #677488 - DROP INDEX missing ON <table>
BP

Modified: gnucash/trunk/src/backend/dbi/gnc-backend-dbi-priv.h
===================================================================
--- gnucash/trunk/src/backend/dbi/gnc-backend-dbi-priv.h	2012-10-26 08:49:41 UTC (rev 22449)
+++ gnucash/trunk/src/backend/dbi/gnc-backend-dbi-priv.h	2012-10-26 08:49:54 UTC (rev 22450)
@@ -56,18 +56,20 @@
     GNC_DBI_FAIL_TEST
 } GncDbiTestResult;
 
-typedef gchar* (*CREATE_TABLE_DDL_FN)( GncSqlConnection* conn,
-                                       const gchar* table_name,
-                                       const GList* col_info_list );
-typedef GSList* (*GET_TABLE_LIST_FN)( dbi_conn conn, const gchar* dbname );
-typedef void (*APPEND_COLUMN_DEF_FN)( GString* ddl, GncSqlColumnInfo* info );
-typedef GSList* (*GET_INDEX_LIST_FN)( dbi_conn conn );
+typedef gchar* (*CREATE_TABLE_DDL_FN)   ( GncSqlConnection* conn,
+                                          const gchar* table_name,
+                                          const GList* col_info_list );
+typedef GSList* (*GET_TABLE_LIST_FN)    ( dbi_conn conn, const gchar* dbname );
+typedef void    (*APPEND_COLUMN_DEF_FN) ( GString* ddl, GncSqlColumnInfo* info );
+typedef GSList* (*GET_INDEX_LIST_FN)    ( dbi_conn conn );
+typedef void    (*DROP_INDEX_FN)        ( dbi_conn conn, const gchar* index );
 typedef struct
 {
     CREATE_TABLE_DDL_FN     create_table_ddl;
     GET_TABLE_LIST_FN       get_table_list;
     APPEND_COLUMN_DEF_FN    append_col_def;
     GET_INDEX_LIST_FN       get_index_list;
+    DROP_INDEX_FN           drop_index;
 } provider_functions_t;
 
 

Modified: gnucash/trunk/src/backend/dbi/gnc-backend-dbi.c
===================================================================
--- gnucash/trunk/src/backend/dbi/gnc-backend-dbi.c	2012-10-26 08:49:41 UTC (rev 22449)
+++ gnucash/trunk/src/backend/dbi/gnc-backend-dbi.c	2012-10-26 08:49:54 UTC (rev 22450)
@@ -86,12 +86,14 @@
 static GSList* conn_get_table_list_sqlite3( dbi_conn conn, const gchar* dbname );
 static void append_sqlite3_col_def( GString* ddl, GncSqlColumnInfo* info );
 static GSList *conn_get_index_list_sqlite3( dbi_conn conn );
+static void conn_drop_index_sqlite3 (dbi_conn conn, const gchar *index );
 static provider_functions_t provider_sqlite3 =
 {
     conn_create_table_ddl_sqlite3,
     conn_get_table_list_sqlite3,
     append_sqlite3_col_def,
-    conn_get_index_list_sqlite3
+    conn_get_index_list_sqlite3,
+    conn_drop_index_sqlite3
 };
 #define SQLITE3_TIMESPEC_STR_FORMAT "%04d%02d%02d%02d%02d%02d"
 
@@ -100,12 +102,14 @@
         const GList* col_info_list );
 static void append_mysql_col_def( GString* ddl, GncSqlColumnInfo* info );
 static GSList *conn_get_index_list_mysql( dbi_conn conn );
+static void conn_drop_index_mysql (dbi_conn conn, const gchar *index );
 static provider_functions_t provider_mysql =
 {
     conn_create_table_ddl_mysql,
     conn_get_table_list,
     append_mysql_col_def,
-    conn_get_index_list_mysql
+    conn_get_index_list_mysql,
+    conn_drop_index_mysql
 };
 #define MYSQL_TIMESPEC_STR_FORMAT "%04d%02d%02d%02d%02d%02d"
 
@@ -115,13 +119,15 @@
 static GSList* conn_get_table_list_pgsql( dbi_conn conn, const gchar* dbname );
 static void append_pgsql_col_def( GString* ddl, GncSqlColumnInfo* info );
 static GSList *conn_get_index_list_pgsql( dbi_conn conn );
+static void conn_drop_index_pgsql (dbi_conn conn, const gchar *index );
 
 static provider_functions_t provider_pgsql =
 {
     conn_create_table_ddl_pgsql,
     conn_get_table_list_pgsql,
     append_pgsql_col_def,
-    conn_get_index_list_pgsql
+    conn_get_index_list_pgsql,
+    conn_drop_index_pgsql
 };
 #define PGSQL_TIMESPEC_STR_FORMAT "%04d%02d%02d %02d%02d%02d"
 
@@ -394,6 +400,14 @@
 }
 
 static void
+conn_drop_index_sqlite3 (dbi_conn conn, const gchar *index )
+{
+    dbi_result result = dbi_conn_queryf (conn, "DROP INDEX %s", index);
+    if ( result )
+        dbi_result_free( result );
+}
+
+static void
 mysql_error_fn( dbi_conn conn, void* user_data )
 {
     GncDbiBackend *be = (GncDbiBackend*)user_data;
@@ -978,7 +992,7 @@
         while ( dbi_result_next_row( result ) != 0 )
         {
             const gchar*  index_name = dbi_result_get_string_idx( result, 3 );
-            index_list = g_slist_prepend( index_list, strdup( index_name ) );
+            index_list = g_slist_prepend( index_list, g_strjoin( " ", index_name, table_name, NULL ) );
         }
         dbi_result_free( result );
     }
@@ -987,6 +1001,31 @@
 }
 
 static void
+conn_drop_index_mysql (dbi_conn conn, const gchar *index )
+{
+    dbi_result result;
+    gchar **index_table_split = g_strsplit (index, " ", 2);
+    int splitlen = -1;
+
+    /* Check if the index split can be valid */
+    while (index_table_split[++splitlen] != NULL)
+    { /* do nothing, just count split members */ }
+
+    if (splitlen != 2)
+    {
+        g_print ("Drop index error: invalid MySQL index format (<index> <table>): %s", index);
+        return;
+    }
+
+    result = dbi_conn_queryf (conn, "DROP INDEX %s ON %s",
+                              index_table_split[0], index_table_split[1]);
+    if ( result )
+        dbi_result_free( result );
+
+    g_strfreev (index_table_split);
+}
+
+static void
 pgsql_error_fn( dbi_conn conn, void* user_data )
 {
     GncDbiBackend *be = (GncDbiBackend*)user_data;
@@ -1273,7 +1312,15 @@
     return list;
 }
 
+static void
+conn_drop_index_pgsql (dbi_conn conn, const gchar *index )
+{
+    dbi_result result = dbi_conn_queryf (conn, "DROP INDEX %s", index);
+    if ( result )
+        dbi_result_free( result );
+}
 
+
 /* ================================================================= */
 
 static void
@@ -1590,10 +1637,7 @@
     for ( iter = index_list; iter != NULL; iter = g_slist_next( iter) )
     {
         const char *errmsg;
-        dbi_result result =
-            dbi_conn_queryf( conn->conn, "DROP INDEX %s", iter->data );
-        if ( result )
-            dbi_result_free( result );
+        conn->provider->drop_index (conn->conn, iter->data);
         if ( DBI_ERROR_NONE != dbi_conn_error( conn->conn, &errmsg ) )
         {
             qof_backend_set_error( qbe, ERR_BACKEND_SERVER_ERR );



More information about the gnucash-changes mailing list