Skip to content

Commit

Permalink
Merge Chris Good's 'bug798205ImpOfx' into maint.
Browse files Browse the repository at this point in the history
  • Loading branch information
jralls committed Aug 7, 2021
2 parents bedc85a + 3dceb08 commit be6fb1a
Show file tree
Hide file tree
Showing 5 changed files with 5 additions and 168 deletions.
100 changes: 0 additions & 100 deletions gnucash/import-export/import-backend.c
Expand Up @@ -1048,106 +1048,6 @@ gnc_import_process_trans_item (GncImportMatchMap *matchmap,
return FALSE;
}

/********************************************************************\
* check_trans_online_id() Callback function used by
* gnc_import_exists_online_id. Takes pointers to transaction and split,
* returns 0 if their online_ids do NOT match, or if the split
* belongs to the transaction
\********************************************************************/
static gint check_trans_online_id(Transaction *trans1, void *user_data)
{
Account *account;
Split *split1;
Split *split2 = user_data;
const gchar *online_id1;
const gchar *online_id2;

account = xaccSplitGetAccount(split2);
split1 = xaccTransFindSplitByAccount(trans1, account);
if (split1 == split2)
return 0;

/* hack - we really want to iterate over the _splits_ of the account
instead of the transactions */
g_assert(split1 != NULL);

if (gnc_import_split_has_online_id(split1))
online_id1 = gnc_import_get_split_online_id(split1);
else
online_id1 = gnc_import_get_trans_online_id(trans1);

online_id2 = gnc_import_get_split_online_id(split2);

if ((online_id1 == NULL) ||
(online_id2 == NULL) ||
(strcmp(online_id1, online_id2) != 0))
{
return 0;
}
else
{
/*printf("test_trans_online_id(): Duplicate found\n");*/
return 1;
}
}

static gint collect_trans_online_id(Transaction *trans, void *user_data)
{
Split *split;
GHashTable *id_hash = user_data;
int i=0;

const gchar* online_id = gnc_import_get_trans_online_id (trans);
if (online_id)
g_hash_table_add (id_hash, (void*) online_id);

for (GList *splits = xaccTransGetSplitList (trans); splits; splits = splits->next)
{
if (gnc_import_split_has_online_id (splits->data))
g_hash_table_add(id_hash, (void*) gnc_import_get_split_online_id (splits->data));
}
return 0;
}

/** Checks whether the given transaction's online_id already exists in
its parent account. */
gboolean gnc_import_exists_online_id (Transaction *trans, GHashTable* acct_id_hash)
{
gboolean online_id_exists = FALSE;
Account *dest_acct;
Split *source_split;

/* Look for an online_id in the first split */
source_split = xaccTransGetSplit(trans, 0);
g_assert(source_split);

// No online id, no point in continuing. We'd crash if we tried.
if (!gnc_import_get_split_online_id (source_split))
return FALSE;
// Create a hash per account of a hash of all transactions IDs. Then the test below will be fast if
// we have many transactions to import.
dest_acct = xaccSplitGetAccount (source_split);
if (!g_hash_table_contains (acct_id_hash, dest_acct))
{
GHashTable* new_hash = g_hash_table_new (g_str_hash, g_str_equal);
g_hash_table_insert (acct_id_hash, dest_acct, new_hash);
xaccAccountForEachTransaction (dest_acct, collect_trans_online_id, new_hash);
}
online_id_exists = g_hash_table_contains (g_hash_table_lookup (acct_id_hash, dest_acct),
gnc_import_get_split_online_id (source_split));

/* If it does, abort the process for this transaction, since it is
already in the system. */
if (online_id_exists == TRUE)
{
DEBUG("%s", "Transaction with same online ID exists, destroying current transaction");
xaccTransDestroy(trans);
xaccTransCommitEdit(trans);
}
return online_id_exists;
}


/* ******************************************************************
*/

Expand Down
9 changes: 0 additions & 9 deletions gnucash/import-export/import-backend.h
Expand Up @@ -57,15 +57,6 @@ typedef enum _action
/** @name Non-GUI Functions */
/*@{*/

/** Checks whether the given transaction's online_id already exists in
* its parent account. The given transaction has to be open for
* editing. If a matching online_id exists, the transaction is
* destroyed (!) and TRUE is returned, otherwise FALSE is returned.
*
* @param trans The transaction for which to check for an existing
* online_id. */
gboolean gnc_import_exists_online_id (Transaction *trans, GHashTable* acct_id_hash);

/** Evaluates the match between trans_info and split using the provided parameters.
*
* @param trans_info The TransInfo for the imported transaction
Expand Down
30 changes: 5 additions & 25 deletions gnucash/import-export/import-main-matcher.c
Expand Up @@ -76,7 +76,6 @@ struct _main_matcher_info
gboolean add_toggled; // flag to indicate that add has been toggled to stop selection
gint id;
GSList* temp_trans_list; // Temporary list of imported transactions
GHashTable* acct_id_hash; // Hash table, per account, of list of transaction IDs.
GSList* edited_accounts; // List of accounts currently edited.
};

Expand Down Expand Up @@ -144,14 +143,6 @@ static gboolean query_tooltip_tree_view_cb (GtkWidget *widget, gint x, gint y,
gpointer user_data);
/* end local prototypes */

static
gboolean delete_hash (gpointer key, gpointer value, gpointer user_data)
{
// Value is a hash table that needs to be destroyed.
g_hash_table_destroy (value);
return TRUE;
}

static void
update_all_balances (GNCImportMainMatcher *info)
{
Expand Down Expand Up @@ -218,8 +209,6 @@ gnc_gen_trans_list_delete (GNCImportMainMatcher *info)
// We've deferred balance computations on many accounts. Let's do it now that we're done.
update_all_balances (info);

g_hash_table_foreach_remove (info->acct_id_hash, delete_hash, NULL);
info->acct_id_hash = NULL;
g_free (info);
}

Expand Down Expand Up @@ -1141,8 +1130,6 @@ gnc_gen_trans_init_view (GNCImportMainMatcher *info,
G_CALLBACK(gnc_gen_trans_onButtonPressed_cb), info);
g_signal_connect (view, "popup-menu",
G_CALLBACK(gnc_gen_trans_onPopupMenu_cb), info);

info->acct_id_hash = g_hash_table_new (g_direct_hash, g_direct_equal);
}

static void
Expand Down Expand Up @@ -1723,16 +1710,11 @@ gnc_gen_trans_list_add_trans_with_ref_id (GNCImportMainMatcher *gui, Transaction
g_assert (gui);
g_assert (trans);

if (gnc_import_exists_online_id (trans, gui->acct_id_hash))
return;
else
{
transaction_info = gnc_import_TransInfo_new (trans, NULL);
gnc_import_TransInfo_set_ref_id (transaction_info, ref_id);
// It's much faster to gather the imported transactions into a GSList than directly into the
// treeview.
gui->temp_trans_list = g_slist_prepend (gui->temp_trans_list, transaction_info);
}
transaction_info = gnc_import_TransInfo_new (trans, NULL);
gnc_import_TransInfo_set_ref_id (transaction_info, ref_id);
// It's much faster to gather the imported transactions into a GSList than directly into the
// treeview.
gui->temp_trans_list = g_slist_prepend (gui->temp_trans_list, transaction_info);
return;
}

Expand Down Expand Up @@ -1796,8 +1778,6 @@ create_hash_of_potential_matches (GList *candidate_txns,
{
Account* split_account;
GSList* split_list;
if (gnc_import_split_has_online_id (candidate->data))
continue;
split_account = xaccSplitGetAccount (candidate->data);
/* g_hash_table_steal_extended would do the two calls in one shot but is
* not available until GLib 2.58.
Expand Down
23 changes: 0 additions & 23 deletions gnucash/import-export/import-utilities.c
Expand Up @@ -57,29 +57,6 @@ void gnc_import_set_acc_online_id (Account *account, const gchar *id)
xaccAccountCommitEdit (account);
}

const gchar * gnc_import_get_trans_online_id (Transaction * transaction)
{
gchar *id = NULL;
qof_instance_get (QOF_INSTANCE (transaction), "online-id", &id, NULL);
return id;
}
/* Not actually used */
void gnc_import_set_trans_online_id (Transaction *transaction,
const gchar *id)
{
g_return_if_fail (transaction != NULL);
xaccTransBeginEdit (transaction);
qof_instance_set (QOF_INSTANCE (transaction), "online-id", id, NULL);
xaccTransCommitEdit (transaction);
}

gboolean gnc_import_trans_has_online_id(Transaction * transaction)
{
const gchar * online_id;
online_id = gnc_import_get_trans_online_id(transaction);
return (online_id != NULL && strlen(online_id) > 0);
}

const gchar * gnc_import_get_split_online_id (Split * split)
{
gchar *id = NULL;
Expand Down
11 changes: 0 additions & 11 deletions gnucash/import-export/import-utilities.h
Expand Up @@ -49,17 +49,6 @@ const gchar * gnc_import_get_acc_online_id(Account * account);
void gnc_import_set_acc_online_id(Account * account,
const gchar * string_value);
/** @} */
/** @name Setter-getters
Setter and getter functions for the online_id field for
Transactions.
@{
*/
const gchar * gnc_import_get_trans_online_id(Transaction * transaction);
void gnc_import_set_trans_online_id(Transaction * transaction,
const gchar * string_value);
/** @} */

gboolean gnc_import_trans_has_online_id(Transaction * transaction);

/** @name Setter-getters
Setter and getter functions for the online_id field for
Expand Down

0 comments on commit be6fb1a

Please sign in to comment.