[Gnucash-changes] Slightly modified version of Herbert Toma's fix to reduce load time with

David Hampton hampton at cvs.gnucash.org
Sun Oct 30 17:05:31 EST 2005


Log Message:
-----------
Slightly modified version of Herbert Toma's fix to reduce load time
with a large database of stock prices.

Tags:
----
gnucash-gnome2-dev

Modified Files:
--------------
    gnucash:
        ChangeLog
    gnucash/src/backend/file:
        gnc-pricedb-xml-v2.c
    gnucash/src/engine:
        Period.c
        gnc-pricedb-p.h
        gnc-pricedb.c
        gnc-pricedb.h

Revision Data
-------------
Index: ChangeLog
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/ChangeLog,v
retrieving revision 1.1487.2.362
retrieving revision 1.1487.2.363
diff -LChangeLog -LChangeLog -u -r1.1487.2.362 -r1.1487.2.363
--- ChangeLog
+++ ChangeLog
@@ -1,3 +1,12 @@
+2005-10-30  David Hampton  <hampton at employees.org>
+
+	* src/backend/file/gnc-pricedb-xml-v2.c:
+	* src/engine/Period.c:
+	* src/engine/gnc-pricedb-p.h:
+	* src/engine/gnc-pricedb.[ch]: Slightly modified version of
+	Herbert Toma's fix to reduce load time with a large database of
+	stock prices.
+
 2005-10-30  Joshua Sled  <jsled at asynchronous.org>
 
 	Patches from Scott Oonk <scott.oonk at gmail.com>:
Index: gnc-pricedb-xml-v2.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/backend/file/gnc-pricedb-xml-v2.c,v
retrieving revision 1.6.4.6
retrieving revision 1.6.4.7
diff -Lsrc/backend/file/gnc-pricedb-xml-v2.c -Lsrc/backend/file/gnc-pricedb-xml-v2.c -u -r1.6.4.6 -r1.6.4.7
--- src/backend/file/gnc-pricedb-xml-v2.c
+++ src/backend/file/gnc-pricedb-xml-v2.c
@@ -231,6 +231,7 @@
   QofBook *book = gdata->bookdata;
   GNCPriceDB *db = gnc_pricedb_create(book);
   g_return_val_if_fail(db, FALSE);
+  gnc_pricedb_set_bulk_update(db, TRUE);
   *result = db;
   return(TRUE);
 }
@@ -305,6 +306,8 @@
     gdata->cb(tag, gdata->parsedata, db);
     *result = NULL;
 
+    gnc_pricedb_set_bulk_update(db, FALSE);
+
     return TRUE;
 }
 
Index: gnc-pricedb-p.h
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/gnc-pricedb-p.h,v
retrieving revision 1.18.4.5
retrieving revision 1.18.4.6
diff -Lsrc/engine/gnc-pricedb-p.h -Lsrc/engine/gnc-pricedb-p.h -u -r1.18.4.5 -r1.18.4.6
--- src/engine/gnc-pricedb-p.h
+++ src/engine/gnc-pricedb-p.h
@@ -55,6 +55,7 @@
 {
   QofInstance inst;              /* globally unique object identifier */
   GHashTable *commodity_hash;
+  gboolean bulk_update;		 /* TRUE while reading XML file, etc. */
 };
 
 /* These structs define the kind of price lookup being done
Index: gnc-pricedb.h
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/gnc-pricedb.h,v
retrieving revision 1.27.4.6
retrieving revision 1.27.4.7
diff -Lsrc/engine/gnc-pricedb.h -Lsrc/engine/gnc-pricedb.h -u -r1.27.4.6 -r1.27.4.7
--- src/engine/gnc-pricedb.h
+++ src/engine/gnc-pricedb.h
@@ -216,7 +216,7 @@
 
 /** gnc_price_list_insert - insert a price into the given list, calling
      gnc_price_ref on it during the process. */
-gboolean gnc_price_list_insert(GList **prices, GNCPrice *p);
+gboolean gnc_price_list_insert(GList **prices, GNCPrice *p, gboolean check_dupl);
 
 /** gnc_price_list_remove - remove the price, p, from the given list,
      calling gnc_price_unref on it during the process. */
@@ -265,6 +265,11 @@
 void gnc_pricedb_begin_edit (GNCPriceDB *);
 void gnc_pricedb_commit_edit (GNCPriceDB *);
 
+/** Indicate whether or not the database is in the middle of a bulk
+ *  update.  Setting this flag will disable checks for duplicate
+ *  entries. */
+void gnc_pricedb_set_bulk_update(GNCPriceDB *db, gboolean bulk_update);
+
 /** gnc_pricedb_add_price - add a price to the pricedb, you may drop
      your reference to the price (i.e. call unref) after this
      succeeds, whenever you're finished with the price. */
Index: gnc-pricedb.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/gnc-pricedb.c,v
retrieving revision 1.48.4.13
retrieving revision 1.48.4.14
diff -Lsrc/engine/gnc-pricedb.c -Lsrc/engine/gnc-pricedb.c -u -r1.48.4.13 -r1.48.4.14
--- src/engine/gnc-pricedb.c
+++ src/engine/gnc-pricedb.c
@@ -455,7 +455,7 @@
 }
 
 gboolean
-gnc_price_list_insert(GList **prices, GNCPrice *p)
+gnc_price_list_insert(GList **prices, GNCPrice *p, gboolean check_dupl)
 {
   GList *result_list;
   PriceListIsDuplStruct* pStruct;
@@ -464,15 +464,17 @@
   if(!prices || !p) return FALSE;
   gnc_price_ref(p);
 
-  pStruct = g_new0( PriceListIsDuplStruct, 1 );
-  pStruct->pPrice = p;
-  pStruct->isDupl = FALSE;
-  g_list_foreach( *prices, price_list_is_duplicate, pStruct );
-  isDupl = pStruct->isDupl;
-  g_free( pStruct );
+  if (check_dupl) {
+    pStruct = g_new0( PriceListIsDuplStruct, 1 );
+    pStruct->pPrice = p;
+    pStruct->isDupl = FALSE;
+    g_list_foreach( *prices, price_list_is_duplicate, pStruct );
+    isDupl = pStruct->isDupl;
+    g_free( pStruct );
 
-  if( isDupl ) {
-	return TRUE;
+    if( isDupl ) {
+      return TRUE;
+    }
   }
 
   result_list = g_list_insert_sorted(*prices, p, compare_prices_by_date);
@@ -651,6 +653,12 @@
   g_free(db);
 }
 
+void
+gnc_pricedb_set_bulk_update(GNCPriceDB *db, gboolean bulk_update)
+{
+  db->bulk_update = bulk_update;
+}
+
 /* ==================================================================== */
 /* This is kind of weird, the way its done.  Each collection of prices
  * for a given commodity should get its own guid, be its own entity, etc.
@@ -816,7 +824,7 @@
   }
 
   price_list = g_hash_table_lookup(currency_hash, currency);
-  if(!gnc_price_list_insert(&price_list, p)) 
+  if(!gnc_price_list_insert(&price_list, p, !db->bulk_update)) 
   {
 	  LEAVE ("gnc_price_list_insert failed");
 	  return FALSE;
@@ -1053,7 +1061,7 @@
   if(!price_list) return;
 
   /* the latest price is the first in list */
-  gnc_price_list_insert(return_list, price_list->data);
+  gnc_price_list_insert(return_list, price_list->data, FALSE);
 }
 
 GList *
@@ -1264,7 +1272,7 @@
     GNCPrice *p = item->data;
     Timespec price_time = timespecCanonicalDayTime(gnc_price_get_time(p));
     if(timespec_equal(&price_time, &t)) {
-      gnc_price_list_insert(return_list, item->data);
+      gnc_price_list_insert(return_list, item->data, FALSE);
     }
     item = item->next;
   }
@@ -1379,7 +1387,7 @@
     GNCPrice *p = item->data;
     Timespec price_time = gnc_price_get_time(p);
     if(timespec_equal(&price_time, &t)) {
-      gnc_price_list_insert(return_list, item->data);
+      gnc_price_list_insert(return_list, item->data, FALSE);
     }
     item = item->next;
   }
@@ -1557,7 +1565,7 @@
     }
   }
 
-  gnc_price_list_insert(return_list, result);
+  gnc_price_list_insert(return_list, result, FALSE);
 }
 
 GList *
Index: Period.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/Period.c,v
retrieving revision 1.27.4.5
retrieving revision 1.27.4.6
diff -Lsrc/engine/Period.c -Lsrc/engine/Period.c -u -r1.27.4.5 -r1.27.4.6
--- src/engine/Period.c
+++ src/engine/Period.c
@@ -505,6 +505,7 @@
 
    gnc_pricedb_begin_edit (src_pdb);
    gnc_pricedb_begin_edit (dest_pdb);
+   gnc_pricedb_set_bulk_update (dest_pdb, TRUE);
 
    qof_query_set_book (query, src_book);
    price_list = qof_query_run (query);
@@ -516,6 +517,7 @@
       gnc_book_insert_price (dest_book, pr);
    }
 
+   gnc_pricedb_set_bulk_update (dest_pdb, FALSE);
    gnc_pricedb_commit_edit (dest_pdb);
    gnc_pricedb_commit_edit (src_pdb);
 


More information about the gnucash-changes mailing list