gnucash maint: all online_id getters from import-utilities.c return a new char* which must be g_freed.

Christopher Lam clam at code.gnucash.org
Sun Jul 17 21:21:31 EDT 2022


Updated	 via  https://github.com/Gnucash/gnucash/commit/579ba443 (commit)
	from  https://github.com/Gnucash/gnucash/commit/ce4768c3 (commit)



commit 579ba443172fde921fd6526e37a0a30be7d2da5e
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Sun Jul 17 11:54:24 2022 +0800

    all online_id getters from import-utilities.c return a new char* which must be g_freed.

diff --git a/gnucash/import-export/aqb/assistant-ab-initial.c b/gnucash/import-export/aqb/assistant-ab-initial.c
index 2bb266267..6af610667 100644
--- a/gnucash/import-export/aqb/assistant-ab-initial.c
+++ b/gnucash/import-export/aqb/assistant-ab-initial.c
@@ -755,7 +755,7 @@ save_kvp_acc_cb(gpointer key, gpointer value, gpointer user_data)
     const gchar *ab_bankcode, *gnc_bankcode;
 #ifdef AQBANKING6
     gchar *ab_online_id;
-    const gchar *gnc_online_id;
+    gchar *gnc_online_id;
 #endif
 
     g_return_if_fail(ab_acc && gnc_acc);
@@ -796,6 +796,7 @@ save_kvp_acc_cb(gpointer key, gpointer value, gpointer user_data)
     if (ab_online_id && (!gnc_online_id || (strcmp(ab_online_id, gnc_online_id) != 0)))
         gnc_import_set_acc_online_id(gnc_acc, ab_online_id);
     g_free(ab_online_id);
+    g_free (gnc_online_id);
 #endif
 }
 
diff --git a/gnucash/import-export/import-account-matcher.c b/gnucash/import-export/import-account-matcher.c
index 55cc3d5a7..0311d2037 100644
--- a/gnucash/import-export/import-account-matcher.c
+++ b/gnucash/import-export/import-account-matcher.c
@@ -101,7 +101,7 @@ static AccountPickerDialog* gnc_import_new_account_picker(void)
 static gpointer test_acct_online_id_match(Account *acct, gpointer data)
 {
     AccountOnlineMatch *match = (AccountOnlineMatch*)data;
-    const char *acct_online_id = gnc_import_get_acc_online_id(acct);
+    char *acct_online_id = gnc_import_get_acc_online_id(acct);
     int acct_len, match_len;
 
     if (acct_online_id == NULL || match->online_id == NULL)
@@ -126,7 +126,7 @@ static gpointer test_acct_online_id_match(Account *acct, gpointer data)
         }
         else
         {
-            const char *partial_online_id =
+            char *partial_online_id =
                 gnc_import_get_acc_online_id(match->partial_match);
             int partial_len = strlen(partial_online_id);
             if (partial_online_id[partial_len - 1] == ' ')
@@ -157,9 +157,11 @@ static gpointer test_acct_online_id_match(Account *acct, gpointer data)
                 g_free (name1);
                 g_free (name2);
             }
+            g_free (partial_online_id);
         }
     }
 
+    g_free (acct_online_id);
     return NULL;
 }
 
diff --git a/gnucash/import-export/import-backend.c b/gnucash/import-export/import-backend.c
index 8b796ab94..52f6e103c 100644
--- a/gnucash/import-export/import-backend.c
+++ b/gnucash/import-export/import-backend.c
@@ -1057,8 +1057,10 @@ gnc_import_process_trans_item (GncImportMatchMap *matchmap,
                the match will be remembered */
             if (gnc_import_split_has_online_id(trans_info->first_split))
             {
-                gnc_import_set_split_online_id(selected_match->split,
-                                               gnc_import_get_split_online_id(trans_info->first_split));
+                char *online_id = gnc_import_get_split_online_id
+                    (trans_info->first_split);
+                gnc_import_set_split_online_id(selected_match->split, online_id);
+                g_free (online_id);
             }
 
             /* Done editing. */
@@ -1112,9 +1114,12 @@ gnc_import_process_trans_item (GncImportMatchMap *matchmap,
             /* Copy the online id to the reconciled transaction, so
             		 the match will be remembered */
             if (gnc_import_split_has_online_id(trans_info->first_split))
-                gnc_import_set_split_online_id
-                (selected_match->split,
-                 gnc_import_get_split_online_id(trans_info->first_split));
+            {
+                char *online_id = gnc_import_get_split_online_id
+                    (trans_info->first_split);
+                gnc_import_set_split_online_id (selected_match->split, online_id);
+                g_free (online_id);
+            }
 
             /* Done editing. */
             /*DEBUG("CommitEdit selected_match")*/
@@ -1152,8 +1157,8 @@ 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;
+    gchar *online_id1, *online_id2;
+    gint retval;
 
     account = xaccSplitGetAccount(split2);
     split1 = xaccTransFindSplitByAccount(trans1, account);
@@ -1164,24 +1169,18 @@ static gint check_trans_online_id(Transaction *trans1, void *user_data)
        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_id1 = gnc_import_get_split_online_id (split1);
+
+    if (!online_id1 || !online_id1[0])
+        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;
-    }
+    retval = (!online_id1 || !online_id2 || strcmp (online_id1, online_id2)) ? 0 : 1;
+
+    g_free (online_id1);
+    g_free (online_id2);
+    return retval;
 }
 
 /** Checks whether the given transaction's online_id already exists in
@@ -1191,30 +1190,38 @@ gboolean gnc_import_exists_online_id (Transaction *trans, GHashTable* acct_id_ha
     gboolean online_id_exists = FALSE;
     Account *dest_acct;
     Split *source_split;
+    char *source_online_id;
 
     /* Look for an online_id in the first split */
     source_split = xaccTransGetSplit(trans, 0);
     g_assert(source_split);
 
+    source_online_id = gnc_import_get_split_online_id (source_split);
+
     // No online id, no point in continuing. We'd crash if we tried.
-    if (!gnc_import_get_split_online_id (source_split))
+    if (!source_online_id)
         return FALSE;
-    // Create a hash per account of a hash of all split IDs. Then the test below will be fast if
-    // we have many transactions to import.
+
+    // Create a hash per account of a hash of all split 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);
-        GList* split_list = xaccAccountGetSplitList(dest_acct);
+        GHashTable* new_hash = g_hash_table_new_full
+            (g_str_hash, g_str_equal, g_free, NULL);
         g_hash_table_insert (acct_id_hash, dest_acct, new_hash);
-        for (;split_list;split_list=split_list->next)
+        for (GList *n = xaccAccountGetSplitList (dest_acct) ; n; n=n->next)
         {
-            if (gnc_import_split_has_online_id (split_list->data))
-                g_hash_table_add (new_hash, (void*) gnc_import_get_split_online_id (split_list->data));
+            if (gnc_import_split_has_online_id (n->data))
+            {
+                char *id = gnc_import_get_split_online_id (n->data);
+                g_hash_table_insert (new_hash, (void*) id, GINT_TO_POINTER (1));
+                /* note we don't want to free id yet */
+            }
         }
     }
     online_id_exists = g_hash_table_contains (g_hash_table_lookup (acct_id_hash, dest_acct),
-                                              gnc_import_get_split_online_id (source_split));
+                                              source_online_id);
     
     /* If it does, abort the process for this transaction, since it is
        already in the system. */
@@ -1224,6 +1231,7 @@ gboolean gnc_import_exists_online_id (Transaction *trans, GHashTable* acct_id_ha
         xaccTransDestroy(trans);
         xaccTransCommitEdit(trans);
     }
+    g_free (source_online_id);
     return online_id_exists;
 }
 
diff --git a/gnucash/import-export/import-utilities.c b/gnucash/import-export/import-utilities.c
index 8d672d4e0..a0480221c 100644
--- a/gnucash/import-export/import-utilities.c
+++ b/gnucash/import-export/import-utilities.c
@@ -40,7 +40,8 @@
  * Account, Transaction and Split
 \********************************************************************/
 
-const gchar * gnc_import_get_acc_online_id (Account * account)
+gchar *
+gnc_import_get_acc_online_id (Account * account)
 {
     gchar *id = NULL;
     qof_instance_get (QOF_INSTANCE (account), "online-id", &id, NULL);
@@ -49,7 +50,8 @@ const gchar * gnc_import_get_acc_online_id (Account * account)
 
 /* Used in the midst of editing a transaction; make it save the
  * account data. */
-void gnc_import_set_acc_online_id (Account *account, const gchar *id)
+void
+gnc_import_set_acc_online_id (Account *account, const gchar *id)
 {
     g_return_if_fail (account != NULL);
     xaccAccountBeginEdit (account);
@@ -57,15 +59,17 @@ 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 *
+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)
+void
+gnc_import_set_trans_online_id (Transaction *transaction, const gchar *id)
 {
     g_return_if_fail (transaction != NULL);
     xaccTransBeginEdit (transaction);
@@ -73,33 +77,40 @@ void gnc_import_set_trans_online_id (Transaction *transaction,
     xaccTransCommitEdit (transaction);
 }
 
-gboolean gnc_import_trans_has_online_id(Transaction * 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);
+    gchar *online_id = gnc_import_get_trans_online_id(transaction);
+    gboolean retval = (online_id && *online_id);
+    g_free (online_id);
+    return retval;
 }
 
-const gchar * gnc_import_get_split_online_id (Split * split)
+gchar *
+gnc_import_get_split_online_id (Split * split)
 {
     gchar *id = NULL;
     qof_instance_get (QOF_INSTANCE (split), "online-id", &id, NULL);
     return id;
 }
+
 /* Used several places in a transaction edit where many other
  * parameters are also being set, so individual commits wouldn't be
  * appropriate. Besides, there isn't a function for one.*/
-void gnc_import_set_split_online_id (Split *split, const gchar *id)
+void
+gnc_import_set_split_online_id (Split *split, const gchar *id)
 {
     g_return_if_fail (split != NULL);
     qof_instance_set (QOF_INSTANCE (split), "online-id", id, NULL);
 }
 
-gboolean gnc_import_split_has_online_id(Split * split)
+gboolean
+gnc_import_split_has_online_id (Split * split)
 {
-    const gchar * online_id;
-    online_id = gnc_import_get_split_online_id(split);
-    return (online_id != NULL && strlen(online_id) > 0);
+    gchar *online_id = gnc_import_get_split_online_id(split);
+    gboolean retval = (online_id && *online_id);
+    g_free (online_id);
+    return retval;
 }
 
 /* @} */
diff --git a/gnucash/import-export/import-utilities.h b/gnucash/import-export/import-utilities.h
index 1ef733d8b..204643bf6 100644
--- a/gnucash/import-export/import-utilities.h
+++ b/gnucash/import-export/import-utilities.h
@@ -45,7 +45,7 @@
     Accounts.
 	@{
 */
-const gchar * gnc_import_get_acc_online_id(Account * account);
+gchar * gnc_import_get_acc_online_id(Account * account);
 void gnc_import_set_acc_online_id(Account * account,
                                   const gchar * string_value);
 /** @} */
@@ -54,7 +54,7 @@ void gnc_import_set_acc_online_id(Account * account,
     Transactions.
 	@{
 */
-const gchar * gnc_import_get_trans_online_id(Transaction * transaction);
+gchar * gnc_import_get_trans_online_id(Transaction * transaction);
 void gnc_import_set_trans_online_id(Transaction * transaction,
                                     const gchar * string_value);
 /** @} */
@@ -66,7 +66,7 @@ gboolean gnc_import_trans_has_online_id(Transaction * transaction);
     Splits.
 	@{
 */
-const gchar * gnc_import_get_split_online_id(Split * split);
+gchar * gnc_import_get_split_online_id(Split * split);
 void gnc_import_set_split_online_id(Split * split,
                                     const gchar * string_value);
 /** @} */



Summary of changes:
 gnucash/import-export/aqb/assistant-ab-initial.c |  3 +-
 gnucash/import-export/import-account-matcher.c   |  6 +-
 gnucash/import-export/import-backend.c           | 70 +++++++++++++-----------
 gnucash/import-export/import-utilities.c         | 41 +++++++++-----
 gnucash/import-export/import-utilities.h         |  6 +-
 5 files changed, 74 insertions(+), 52 deletions(-)



More information about the gnucash-changes mailing list