r16912 - gnucash/branches/gda-dev2/src/backend/gda - Improve save performance when saving to a new db. If the db is empty,

Phil Longstaff plongstaff at cvs.gnucash.org
Sat Feb 2 18:27:04 EST 2008


Author: plongstaff
Date: 2008-02-02 18:27:04 -0500 (Sat, 02 Feb 2008)
New Revision: 16912
Trac: http://svn.gnucash.org/trac/changeset/16912

Modified:
   gnucash/branches/gda-dev2/src/backend/gda/gnc-account-gda.c
   gnucash/branches/gda-dev2/src/backend/gda/gnc-backend-gda.c
   gnucash/branches/gda-dev2/src/backend/gda/gnc-backend-util-gda.h
   gnucash/branches/gda-dev2/src/backend/gda/gnc-book-gda.c
   gnucash/branches/gda-dev2/src/backend/gda/gnc-budget-gda.c
   gnucash/branches/gda-dev2/src/backend/gda/gnc-commodity-gda.c
   gnucash/branches/gda-dev2/src/backend/gda/gnc-lots-gda.c
   gnucash/branches/gda-dev2/src/backend/gda/gnc-price-gda.c
   gnucash/branches/gda-dev2/src/backend/gda/gnc-schedxaction-gda.c
   gnucash/branches/gda-dev2/src/backend/gda/gnc-slots-gda.c
   gnucash/branches/gda-dev2/src/backend/gda/gnc-transaction-gda.c
Log:
Improve save performance when saving to a new db.  If the db is empty,
we don't need to a) delete old slots before saving new ones, b) delete
old splits for a tx before saving new ones, c) check to see if the
object already exists to know whether to use INSERT or UPDATE.



Modified: gnucash/branches/gda-dev2/src/backend/gda/gnc-account-gda.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/gda/gnc-account-gda.c	2008-02-02 22:43:41 UTC (rev 16911)
+++ gnucash/branches/gda-dev2/src/backend/gda/gnc-account-gda.c	2008-02-02 23:27:04 UTC (rev 16912)
@@ -283,15 +283,21 @@
     // into the register and an account window will be opened.  The account info is not complete yet,
     // but the name has been set, triggering this commit
     if( xaccAccountGetCommodity( pAcc ) != NULL ) {
+		gint op;
+
         // Ensure the commodity is in the db
         gnc_gda_save_commodity( be, xaccAccountGetCommodity( pAcc ) );
 
-        (void)gnc_gda_do_db_operation( be,
-                        (qof_instance_get_destroying(inst) ? OP_DB_DELETE : OP_DB_ADD_OR_UPDATE ),
-                        TABLE_NAME,
-                        GNC_ID_ACCOUNT, pAcc,
-                        col_table );
+		if( qof_instance_get_destroying( inst ) ) {
+			op = OP_DB_DELETE;
+		} else if( be->is_pristine_db ) {
+			op = OP_DB_ADD;
+		} else {
+			op = OP_DB_ADD_OR_UPDATE;
+		}
 
+        (void)gnc_gda_do_db_operation( be, op, TABLE_NAME, GNC_ID_ACCOUNT, pAcc, col_table );
+
         // Now, commit or delete any slots
         guid = qof_instance_get_guid( inst );
         if( !qof_instance_get_destroying(inst) ) {

Modified: gnucash/branches/gda-dev2/src/backend/gda/gnc-backend-gda.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/gda/gnc-backend-gda.c	2008-02-02 22:43:41 UTC (rev 16911)
+++ gnucash/branches/gda-dev2/src/backend/gda/gnc-backend-gda.c	2008-02-02 23:27:04 UTC (rev 16912)
@@ -124,6 +124,8 @@
     be->pClient = gda_client_new();
 	be->pConnection = NULL;
 
+	// FIXME: better username/password handling
+
     /* Split book_id into provider and connection string.  If there's no
 	provider, use "file" */
     book_info = g_strdup( book_id );
@@ -583,10 +585,13 @@
 
     /* Save all contents */
 	be->primary_book = book;
+	be->is_pristine_db = TRUE;
 	be->obj_total = 0;
     be->obj_total += 1 + gnc_account_n_descendants( gnc_book_get_root_account( book ) );
 	be->obj_total += gnc_book_count_transactions( book );
 	be->operations_done = 0;
+
+	// FIXME: should write the set of commodities that are used 
     //write_commodities( be, book );
 	gnc_gda_save_book( QOF_INSTANCE(book), be );
     write_accounts( be );
@@ -594,6 +599,7 @@
     write_template_transactions( be );
     write_schedXactions( be );
     qof_object_foreach_backend( GNC_GDA_BACKEND, write_cb, be );
+	be->is_pristine_db = FALSE;
 
     LEAVE( "book=%p", book );
 }

Modified: gnucash/branches/gda-dev2/src/backend/gda/gnc-backend-util-gda.h
===================================================================
--- gnucash/branches/gda-dev2/src/backend/gda/gnc-backend-util-gda.h	2008-02-02 22:43:41 UTC (rev 16911)
+++ gnucash/branches/gda-dev2/src/backend/gda/gnc-backend-util-gda.h	2008-02-02 23:27:04 UTC (rev 16912)
@@ -45,6 +45,7 @@
   gboolean	loading;		/* We are performing an initial load */
   gboolean  in_query;
   gboolean  supports_transactions;
+  gboolean  is_pristine_db;	// Are we saving to a new pristine db?
 
   gint obj_total;			// Total # of objects (for percentage calculation)
   gint operations_done;		// Number of operations (save/load) done

Modified: gnucash/branches/gda-dev2/src/backend/gda/gnc-book-gda.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/gda/gnc-book-gda.c	2008-02-02 22:43:41 UTC (rev 16911)
+++ gnucash/branches/gda-dev2/src/backend/gda/gnc-book-gda.c	2008-02-02 23:27:04 UTC (rev 16912)
@@ -191,16 +191,20 @@
 gnc_gda_save_book( QofInstance* inst, GncGdaBackend* be )
 {
     const GUID* guid;
+	gint op;
 
 	g_return_if_fail( be != NULL );
 	g_return_if_fail( inst != NULL );
 	g_return_if_fail( QOF_IS_BOOK(inst) );
 
-    (void)gnc_gda_do_db_operation( be,
-                        qof_instance_get_destroying(inst) ? OP_DB_DELETE : OP_DB_ADD_OR_UPDATE,
-                        BOOK_TABLE,
-                        GNC_ID_BOOK, inst,
-                        col_table );
+	if( qof_instance_get_destroying( inst ) ) {
+		op = OP_DB_DELETE;
+	} else if( be->is_pristine_db ) {
+		op = OP_DB_ADD;
+	} else {
+		op = OP_DB_ADD_OR_UPDATE;
+	}
+    (void)gnc_gda_do_db_operation( be, op, BOOK_TABLE, GNC_ID_BOOK, inst, col_table );
 
     // Delete old slot info
     guid = qof_instance_get_guid( inst );

Modified: gnucash/branches/gda-dev2/src/backend/gda/gnc-budget-gda.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/gda/gnc-budget-gda.c	2008-02-02 22:43:41 UTC (rev 16911)
+++ gnucash/branches/gda-dev2/src/backend/gda/gnc-budget-gda.c	2008-02-02 23:27:04 UTC (rev 16912)
@@ -127,16 +127,20 @@
 {
     GncBudget* pBudget = GNC_BUDGET(inst);
     const GUID* guid;
+	gint op;
 
 	g_return_if_fail( be != NULL );
 	g_return_if_fail( inst != NULL );
 	g_return_if_fail( GNC_IS_BUDGET(inst) );
 
-    (void)gnc_gda_do_db_operation( be,
-                        qof_instance_get_destroying(inst) ? OP_DB_DELETE : OP_DB_ADD_OR_UPDATE,
-                        BUDGET_TABLE,
-                        GNC_ID_BUDGET, pBudget,
-                        col_table );
+	if( qof_instance_get_destroying( inst ) ) {
+		op = OP_DB_DELETE;
+	} else if( be->is_pristine_db ) {
+		op = OP_DB_ADD;
+	} else {
+		op = OP_DB_ADD_OR_UPDATE;
+	}
+    (void)gnc_gda_do_db_operation( be, op, BUDGET_TABLE, GNC_ID_BUDGET, pBudget, col_table );
 
     // Now, commit any slots and recurrence
     guid = qof_instance_get_guid( inst );

Modified: gnucash/branches/gda-dev2/src/backend/gda/gnc-commodity-gda.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/gda/gnc-commodity-gda.c	2008-02-02 22:43:41 UTC (rev 16911)
+++ gnucash/branches/gda-dev2/src/backend/gda/gnc-commodity-gda.c	2008-02-02 23:27:04 UTC (rev 16912)
@@ -178,16 +178,20 @@
 commit_commodity( QofInstance* inst, GncGdaBackend* be )
 {
     const GUID* guid;
+	gint op;
 
 	g_return_if_fail( be != NULL );
 	g_return_if_fail( inst != NULL );
 	g_return_if_fail( GNC_IS_COMMODITY(inst) );
 
-    (void)gnc_gda_do_db_operation( be,
-                        (qof_instance_get_destroying(inst) ? OP_DB_DELETE : OP_DB_ADD_OR_UPDATE ),
-                        COMMODITIES_TABLE,
-                        GNC_ID_COMMODITY, inst,
-                        col_table );
+	if( qof_instance_get_destroying( inst ) ) {
+		op = OP_DB_DELETE;
+	} else if( be->is_pristine_db ) {
+		op = OP_DB_ADD;
+	} else {
+		op = OP_DB_ADD_OR_UPDATE;
+	}
+    (void)gnc_gda_do_db_operation( be, op, COMMODITIES_TABLE, GNC_ID_COMMODITY, inst, col_table );
 
     // Delete old slot info
     guid = qof_instance_get_guid( inst );

Modified: gnucash/branches/gda-dev2/src/backend/gda/gnc-lots-gda.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/gda/gnc-lots-gda.c	2008-02-02 22:43:41 UTC (rev 16911)
+++ gnucash/branches/gda-dev2/src/backend/gda/gnc-lots-gda.c	2008-02-02 23:27:04 UTC (rev 16912)
@@ -153,15 +153,20 @@
 static void
 commit_lot( QofInstance* inst, GncGdaBackend* be )
 {
+	gint op;
+
 	g_return_if_fail( be != NULL );
 	g_return_if_fail( inst != NULL );
 	g_return_if_fail( GNC_IS_LOT(inst) );
 
-    (void)gnc_gda_do_db_operation( be,
-                        (qof_instance_get_destroying(inst) ? OP_DB_DELETE : OP_DB_ADD_OR_UPDATE ),
-                        TABLE_NAME,
-                        GNC_ID_LOT, inst,
-                        col_table );
+	if( qof_instance_get_destroying( inst ) ) {
+		op = OP_DB_DELETE;
+	} else if( be->is_pristine_db ) {
+		op = OP_DB_ADD;
+	} else {
+		op = OP_DB_ADD_OR_UPDATE;
+	}
+    (void)gnc_gda_do_db_operation( be, op, TABLE_NAME, GNC_ID_LOT, inst, col_table );
 
     // Now, commit any slots
     gnc_gda_slots_save( be, qof_instance_get_guid( inst ),

Modified: gnucash/branches/gda-dev2/src/backend/gda/gnc-price-gda.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/gda/gnc-price-gda.c	2008-02-02 22:43:41 UTC (rev 16911)
+++ gnucash/branches/gda-dev2/src/backend/gda/gnc-price-gda.c	2008-02-02 23:27:04 UTC (rev 16912)
@@ -125,6 +125,7 @@
 save_price( QofInstance* inst, GncGdaBackend* be )
 {
     GNCPrice* pPrice = GNC_PRICE(inst);
+	gint op;
 
 	g_return_if_fail( be != NULL );
 	g_return_if_fail( inst != NULL );
@@ -134,11 +135,14 @@
     gnc_gda_save_commodity( be, gnc_price_get_commodity( pPrice ) );
     gnc_gda_save_commodity( be, gnc_price_get_currency( pPrice ) );
 
-    (void)gnc_gda_do_db_operation( be,
-                        (qof_instance_get_destroying(inst) ? OP_DB_DELETE : OP_DB_ADD_OR_UPDATE ),
-                        TABLE_NAME,
-                        GNC_ID_PRICE, pPrice,
-                        col_table );
+	if( qof_instance_get_destroying( inst ) ) {
+		op = OP_DB_DELETE;
+	} else if( be->is_pristine_db ) {
+		op = OP_DB_ADD;
+	} else {
+		op = OP_DB_ADD_OR_UPDATE;
+	}
+    (void)gnc_gda_do_db_operation( be, op, TABLE_NAME, GNC_ID_PRICE, pPrice, col_table );
 }
 
 static gboolean

Modified: gnucash/branches/gda-dev2/src/backend/gda/gnc-schedxaction-gda.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/gda/gnc-schedxaction-gda.c	2008-02-02 22:43:41 UTC (rev 16911)
+++ gnucash/branches/gda-dev2/src/backend/gda/gnc-schedxaction-gda.c	2008-02-02 23:27:04 UTC (rev 16912)
@@ -239,16 +239,20 @@
 {
     SchedXaction* pSx = GNC_SX(inst);
     const GUID* guid;
+	gint op;
 
 	g_return_if_fail( inst != NULL );
 	g_return_if_fail( GNC_IS_SX(inst) );
 	g_return_if_fail( be != NULL );
 
-    (void)gnc_gda_do_db_operation( be,
-                        (qof_instance_get_destroying(inst) ? OP_DB_DELETE : OP_DB_ADD_OR_UPDATE ),
-                        SCHEDXACTION_TABLE,
-                        /*GNC_ID_SCHEDXACTION*/GNC_SX_ID, pSx,
-                        col_table );
+	if( qof_instance_get_destroying( inst ) ) {
+		op = OP_DB_DELETE;
+	} else if( be->is_pristine_db ) {
+		op = OP_DB_ADD;
+	} else {
+		op = OP_DB_ADD_OR_UPDATE;
+	}
+    (void)gnc_gda_do_db_operation( be, op, SCHEDXACTION_TABLE, /*GNC_ID_SCHEDXACTION*/GNC_SX_ID, pSx, col_table );
 	gnc_gda_recurrence_save_list( be, guid, gnc_sx_get_schedule( pSx ) );
 
     // Now, commit any slots

Modified: gnucash/branches/gda-dev2/src/backend/gda/gnc-slots-gda.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/gda/gnc-slots-gda.c	2008-02-02 22:43:41 UTC (rev 16911)
+++ gnucash/branches/gda-dev2/src/backend/gda/gnc-slots-gda.c	2008-02-02 23:27:04 UTC (rev 16912)
@@ -356,8 +356,10 @@
 	g_return_if_fail( guid != NULL );
 	g_return_if_fail( pFrame != NULL );
 
-    /* First, delete the old slots for this object */
-    gnc_gda_slots_delete( be, guid );
+    // If this is not saving into a new db, clear out the old saved slots first
+	if( !be->is_pristine_db ) {
+    	gnc_gda_slots_delete( be, guid );
+	}
 
     slot_info.be = be;
     slot_info.guid = guid;

Modified: gnucash/branches/gda-dev2/src/backend/gda/gnc-transaction-gda.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/gda/gnc-transaction-gda.c	2008-02-02 22:43:41 UTC (rev 16911)
+++ gnucash/branches/gda-dev2/src/backend/gda/gnc-transaction-gda.c	2008-02-02 23:27:04 UTC (rev 16912)
@@ -453,14 +453,19 @@
 static void
 commit_split( QofInstance* inst, GncGdaBackend* be )
 {
+	gint op;
+
 	g_return_if_fail( inst != NULL );
 	g_return_if_fail( be != NULL );
 
-    (void)gnc_gda_do_db_operation( be,
-                        (qof_instance_get_destroying(inst) ? OP_DB_DELETE : OP_DB_ADD_OR_UPDATE ),
-                        SPLIT_TABLE,
-                        GNC_ID_SPLIT, inst,
-                        split_col_table );
+	if( qof_instance_get_destroying( inst ) ) {
+		op = OP_DB_DELETE;
+	} else if( be->is_pristine_db ) {
+		op = OP_DB_ADD;
+	} else {
+		op = OP_DB_ADD_OR_UPDATE;
+	}
+    (void)gnc_gda_do_db_operation( be, op, SPLIT_TABLE, GNC_ID_SPLIT, inst, split_col_table );
     gnc_gda_slots_save( be,
                         qof_instance_get_guid( inst ),
                         qof_instance_get_slots( inst ) );
@@ -498,6 +503,7 @@
 {
     Transaction* pTx = GNC_TRANS(inst);
     const GUID* guid;
+	gint op;
 
 	g_return_if_fail( inst != NULL );
 	g_return_if_fail( GNC_IS_TRANS(inst) );
@@ -506,16 +512,22 @@
     // Ensure the commodity is in the db
     gnc_gda_save_commodity( be, xaccTransGetCurrency( pTx ) );
 
-    (void)gnc_gda_do_db_operation( be,
-                        (qof_instance_get_destroying(inst) ? OP_DB_DELETE : OP_DB_ADD_OR_UPDATE ),
-                        TRANSACTION_TABLE,
-                        GNC_ID_TRANS, pTx,
-                        tx_col_table );
+	if( qof_instance_get_destroying( inst ) ) {
+		op = OP_DB_DELETE;
+	} else if( be->is_pristine_db ) {
+		op = OP_DB_ADD;
+	} else {
+		op = OP_DB_ADD_OR_UPDATE;
+	}
 
+    (void)gnc_gda_do_db_operation( be, op, TRANSACTION_TABLE, GNC_ID_TRANS, pTx, tx_col_table );
+
     guid = qof_instance_get_guid( inst );
 
     // Delete any old slots and splits for this transaction
-    delete_splits( be, pTx );
+	if( !be->is_pristine_db ) {
+    	delete_splits( be, pTx );
+	}
 
     if( !qof_instance_get_destroying(inst) ) {
         SplitList* splits;



More information about the gnucash-changes mailing list