r17505 - gnucash/trunk/src/backend/sql - If current lots version has account_guid constraint that it can't be null,
Phil Longstaff
plongstaff at cvs.gnucash.org
Sat Sep 13 14:49:57 EDT 2008
Author: plongstaff
Date: 2008-09-13 14:49:57 -0400 (Sat, 13 Sep 2008)
New Revision: 17505
Trac: http://svn.gnucash.org/trac/changeset/17505
Modified:
gnucash/trunk/src/backend/sql/gnc-backend-sql.c
gnucash/trunk/src/backend/sql/gnc-backend-sql.h
gnucash/trunk/src/backend/sql/gnc-lots-sql.c
Log:
If current lots version has account_guid constraint that it can't be null,
remove it and bump table version number.
Modified: gnucash/trunk/src/backend/sql/gnc-backend-sql.c
===================================================================
--- gnucash/trunk/src/backend/sql/gnc-backend-sql.c 2008-09-13 14:45:41 UTC (rev 17504)
+++ gnucash/trunk/src/backend/sql/gnc-backend-sql.c 2008-09-13 18:49:57 UTC (rev 17505)
@@ -815,10 +815,6 @@
/* ================================================================= */
-static void register_table_version( const GncSqlBackend* be, const gchar* table_name, gint version );
-static gint get_table_version( const GncSqlBackend* be, const gchar* table_name );
-
-/* ================================================================= */
static gint64
get_integer_value( const GValue* value )
{
@@ -1972,8 +1968,8 @@
return result;
}
-static gint
-execute_nonselect_sql( const GncSqlBackend* be, gchar* sql )
+gint
+gnc_sql_execute_nonselect_sql( const GncSqlBackend* be, gchar* sql )
{
GncSqlStatement* stmt;
gint result;
@@ -2363,11 +2359,18 @@
ok = create_table( be, table_name, col_table );
if( ok ) {
- register_table_version( be, table_name, table_version );
+ (void)gnc_sql_set_table_version( be, table_name, table_version );
}
return ok;
}
+gboolean
+gnc_sql_create_temp_table( const GncSqlBackend* be, const gchar* table_name,
+ const GncSqlColumnTableEntry* col_table )
+{
+ return create_table( be, table_name, col_table );
+}
+
void
gnc_sql_create_index( const GncSqlBackend* be, const gchar* index_name,
const gchar* table_name,
@@ -2397,8 +2400,8 @@
return 0;
}
- return get_table_version( be, table_name );
- }
+ return GPOINTER_TO_INT(g_hash_table_lookup( be->versions, table_name ));
+}
/* ================================================================= */
#define VERSION_TABLE_NAME "versions"
@@ -2496,18 +2499,19 @@
* @param be Backend struct
* @param table_name Table name
* @param version Version number
+ * @return TRUE if successful, FALSE if unsuccessful
*/
-static void
-register_table_version( const GncSqlBackend* be, const gchar* table_name, gint version )
+gboolean
+gnc_sql_set_table_version( const GncSqlBackend* be, const gchar* table_name, gint version )
{
gchar* sql;
gint cur_version;
- g_return_if_fail( be != NULL );
- g_return_if_fail( table_name != NULL );
- g_return_if_fail( version > 0 );
+ g_return_val_if_fail( be != NULL, FALSE );
+ g_return_val_if_fail( table_name != NULL, FALSE );
+ g_return_val_if_fail( version > 0, FALSE );
- cur_version = get_table_version( be, table_name );
+ cur_version = gnc_sql_get_table_version( be, table_name );
if( cur_version != version ) {
if( cur_version == 0 ) {
sql = g_strdup_printf( "INSERT INTO %s VALUES('%s',%d)", VERSION_TABLE_NAME,
@@ -2517,25 +2521,12 @@
VERSION_COL_NAME, version,
TABLE_COL_NAME, table_name );
}
- execute_nonselect_sql( be, sql );
+ (void)gnc_sql_execute_nonselect_sql( be, sql );
}
g_hash_table_insert( be->versions, g_strdup( table_name ), GINT_TO_POINTER(version) );
-}
-/**
- * Returns the registered version number for a table.
- *
- * @param be Backend struct
- * @param table_name Table name
- * @return Version number
- */
-static gint
-get_table_version( const GncSqlBackend* be, const gchar* table_name )
-{
- g_return_val_if_fail( be != NULL, 0 );
- g_return_val_if_fail( table_name != NULL, 0 );
-
- return GPOINTER_TO_INT(g_hash_table_lookup( be->versions, table_name ));
+ return TRUE;
}
+
/* ========================== END OF FILE ===================== */
Modified: gnucash/trunk/src/backend/sql/gnc-backend-sql.h
===================================================================
--- gnucash/trunk/src/backend/sql/gnc-backend-sql.h 2008-09-13 14:45:41 UTC (rev 17504)
+++ gnucash/trunk/src/backend/sql/gnc-backend-sql.h 2008-09-13 18:49:57 UTC (rev 17505)
@@ -435,6 +435,15 @@
GncSqlResult* gnc_sql_execute_select_sql( const GncSqlBackend* be, gchar* sql );
/**
+ * Executes an SQL non-SELECT statement from an SQL char string.
+ *
+ * @param be SQL backend struct
+ * @param sql SQL non-SELECT string
+ * @returns Number of rows affected
+ */
+gint gnc_sql_execute_nonselect_sql( const GncSqlBackend* be, gchar* sql );
+
+/**
* Creates a statement from an SQL char string.
*
* @param be SQL backend struct
@@ -481,6 +490,18 @@
gint gnc_sql_get_table_version( const GncSqlBackend* be, const gchar* table_name );
/**
+ * Sets the version number for a DB table.
+ *
+ * @param be SQL backend struct
+ * @param table_name Table name
+ * @param table_version Table version
+ * @return TRUE if successful, FALSE if unsuccessful
+ */
+gboolean gnc_sql_set_table_version( const GncSqlBackend* be,
+ const gchar* table_name,
+ gint table_version );
+
+/**
* Creates a table in the database
*
* @param be SQL backend struct
@@ -489,10 +510,25 @@
* @param col_table DB table description
* @return TRUE if successful, FALSE if unsuccessful
*/
-gboolean gnc_sql_create_table( const GncSqlBackend* be, const gchar* table_name,
- gint table_version, const GncSqlColumnTableEntry* col_table );
+gboolean gnc_sql_create_table( const GncSqlBackend* be,
+ const gchar* table_name,
+ gint table_version,
+ const GncSqlColumnTableEntry* col_table );
/**
+ * Creates a temporary table in the database. A temporary table does not
+ * have a version number added to the versions table.
+ *
+ * @param be SQL backend struct
+ * @param table_name Table name
+ * @param col_table DB table description
+ * @return TRUE if successful, FALSE if unsuccessful
+ */
+gboolean gnc_sql_create_temp_table( const GncSqlBackend* be,
+ const gchar* table_name,
+ const GncSqlColumnTableEntry* col_table );
+
+/**
* Creates an index in the database
*
* @param be SQL backend struct
Modified: gnucash/trunk/src/backend/sql/gnc-lots-sql.c
===================================================================
--- gnucash/trunk/src/backend/sql/gnc-lots-sql.c 2008-09-13 14:45:41 UTC (rev 17504)
+++ gnucash/trunk/src/backend/sql/gnc-lots-sql.c 2008-09-13 18:49:57 UTC (rev 17505)
@@ -41,7 +41,7 @@
static QofLogModule log_module = G_LOG_DOMAIN;
#define TABLE_NAME "lots"
-#define TABLE_VERSION 1
+#define TABLE_VERSION 2
static gpointer get_lot_account( gpointer pObject, const QofParam* param );
static void set_lot_account( gpointer pObject, gpointer pValue );
@@ -157,7 +157,31 @@
version = gnc_sql_get_table_version( be, TABLE_NAME );
if( version == 0 ) {
+ /* The table doesn't exist, so create it */
gnc_sql_create_table( be, TABLE_NAME, TABLE_VERSION, col_table );
+ } else if( version == 1 ) {
+ /* Version 1 -> 2 removes the 'NOT NULL' constraint on the account_guid
+ field.
+
+ Create a temporary table, copy the data from the old table, delete the
+ old table, then rename the new one. */
+ gchar* sql;
+#define TEMP_TABLE_NAME "lots_new"
+ GncSqlStatement* stmt;
+
+ gnc_sql_create_temp_table( be, TEMP_TABLE_NAME, col_table );
+ sql = g_strdup_printf( "INSERT INTO %s SELECT * FROM %s",
+ TEMP_TABLE_NAME, TABLE_NAME );
+ (void)gnc_sql_execute_nonselect_sql( be, sql );
+
+ sql = g_strdup_printf( "DROP TABLE %s", TABLE_NAME );
+ (void)gnc_sql_execute_nonselect_sql( be, sql );
+
+ sql = g_strdup_printf( "ALTER TABLE %s RENAME TO %s",
+ TEMP_TABLE_NAME, TABLE_NAME );
+ (void)gnc_sql_execute_nonselect_sql( be, sql );
+
+ gnc_sql_set_table_version( be, TABLE_NAME, TABLE_VERSION );
}
}
More information about the gnucash-changes
mailing list