[Gnucash-changes] Phil Longstaff's patch to prevent duplicate pricedb entries.

Derek Atkins warlord at cvs.gnucash.org
Sun Oct 31 19:45:22 EST 2004


Log Message:
-----------
Phil Longstaff's patch to prevent duplicate pricedb entries.

	* src/engine/gnc-pricedb.c:
	  Phil Longstaff's patch to prevent duplicate pricedb entries.

Tags:
----
gnucash-1-8-branch

Modified Files:
--------------
    gnucash:
        ChangeLog
    gnucash/src/engine:
        gnc-pricedb.c

Revision Data
-------------
Index: ChangeLog
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/ChangeLog,v
retrieving revision 1.1461.2.360
retrieving revision 1.1461.2.361
diff -LChangeLog -LChangeLog -u -r1.1461.2.360 -r1.1461.2.361
--- ChangeLog
+++ ChangeLog
@@ -1,3 +1,8 @@
+2004-10-31  Derek Atkins  <derek at ihtfp.com>
+
+	* src/engine/gnc-pricedb.c:
+	  Phil Longstaff's patch to prevent duplicate pricedb entries.
+
 2004-10-30  Christian Stimming  <stimming at tuhh.de>
 
 	* doc/README.HBCI: Updated HBCI readme.
Index: gnc-pricedb.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/gnc-pricedb.c,v
retrieving revision 1.48.2.2
retrieving revision 1.48.2.3
diff -Lsrc/engine/gnc-pricedb.c -Lsrc/engine/gnc-pricedb.c -u -r1.48.2.2 -r1.48.2.3
--- src/engine/gnc-pricedb.c
+++ src/engine/gnc-pricedb.c
@@ -522,13 +522,52 @@
                        gnc_price_get_guid((GNCPrice *) b));
 }
 
+typedef struct {
+	GNCPrice* pPrice;
+	gboolean isDupl;
+} PriceListIsDuplStruct;
+
+static void
+price_list_is_duplicate( gpointer data, gpointer user_data )
+{
+	GNCPrice* pPrice = (GNCPrice*)data;
+	PriceListIsDuplStruct* pStruct = (PriceListIsDuplStruct*)user_data;
+	Timespec time_a, time_b;
+
+    time_a = timespecCanonicalDayTime( gnc_price_get_time( pPrice ) );
+    time_b = timespecCanonicalDayTime( gnc_price_get_time( pStruct->pPrice ) );
+
+	/* If the date, currency, commodity and price match, it's a duplicate */
+	if( !gnc_numeric_equal( gnc_price_get_value( pPrice ),  gnc_price_get_value( pStruct->pPrice ) ) ) return;
+	if( gnc_price_get_commodity( pPrice ) != gnc_price_get_commodity( pStruct->pPrice ) ) return;
+	if( gnc_price_get_currency( pPrice ) != gnc_price_get_currency( pStruct->pPrice ) ) return;
+
+  if( timespec_cmp( &time_a, &time_b ) != 0 ) return;
+
+	pStruct->isDupl = TRUE;
+}
+
 gboolean
 gnc_price_list_insert(GList **prices, GNCPrice *p)
 {
   GList *result_list;
+  PriceListIsDuplStruct* pStruct;
+  gboolean isDupl;
 
   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( isDupl ) {
+	return TRUE;
+  }
+
   result_list = g_list_insert_sorted(*prices, p, compare_prices_by_date);
   if(!result_list) return FALSE;
   *prices = result_list;


More information about the gnucash-changes mailing list