mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
[gnc-pricedb.cpp] rewrite price_list_insert more efficiently
no need for PriceListIsDuplStruct and shortcut "return true" if price is a duplicate
This commit is contained in:
parent
d6b49bbc89
commit
040ccb79b6
@ -704,61 +704,33 @@ compare_prices_by_date(gconstpointer a, gconstpointer b)
|
||||
gnc_price_get_guid((GNCPrice *) b));
|
||||
}
|
||||
|
||||
typedef struct
|
||||
static bool
|
||||
price_is_duplicate (const GNCPrice *pPrice, const GNCPrice *cPrice)
|
||||
{
|
||||
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;
|
||||
time64 time_a, time_b;
|
||||
|
||||
time_a = time64CanonicalDayTime( gnc_price_get_time64( pPrice ) );
|
||||
time_b = time64CanonicalDayTime( gnc_price_get_time64( 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 (time_a != time_b) return;
|
||||
|
||||
pStruct->isDupl = TRUE;
|
||||
return (gnc_numeric_equal (gnc_price_get_value (pPrice), gnc_price_get_value (cPrice)) &&
|
||||
gnc_price_get_commodity (pPrice) == gnc_price_get_commodity (cPrice) &&
|
||||
gnc_price_get_currency (pPrice) == gnc_price_get_currency (cPrice) &&
|
||||
time64CanonicalDayTime (gnc_price_get_time64 (pPrice)) == time64CanonicalDayTime (gnc_price_get_time64 (cPrice)));
|
||||
}
|
||||
|
||||
gboolean
|
||||
gnc_price_list_insert(PriceList **prices, GNCPrice *p, gboolean check_dupl)
|
||||
{
|
||||
GList *result_list;
|
||||
PriceListIsDuplStruct* pStruct;
|
||||
gboolean isDupl;
|
||||
|
||||
if (!prices || !p) return FALSE;
|
||||
gnc_price_ref(p);
|
||||
|
||||
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 );
|
||||
for (auto n = *prices; n; n = g_list_next (n))
|
||||
if (price_is_duplicate (static_cast<GNCPrice*>(n->data), p))
|
||||
return true;
|
||||
|
||||
if ( isDupl )
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
auto result_list = g_list_insert_sorted(*prices, p, compare_prices_by_date);
|
||||
if (!result_list)
|
||||
return false;
|
||||
|
||||
result_list = g_list_insert_sorted(*prices, p, compare_prices_by_date);
|
||||
if (!result_list) return FALSE;
|
||||
*prices = result_list;
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
gboolean
|
||||
|
Loading…
Reference in New Issue
Block a user