gnucash maint: Multiple changes pushed
Christopher Lam
clam at code.gnucash.org
Fri Jul 29 00:58:02 EDT 2022
Updated via https://github.com/Gnucash/gnucash/commit/ebf34395 (commit)
via https://github.com/Gnucash/gnucash/commit/7c2a2495 (commit)
from https://github.com/Gnucash/gnucash/commit/7880f9b1 (commit)
commit ebf34395586ba3ed76a067a73f0d5ab57f1bb877
Author: Christopher Lam <christopher.lck at gmail.com>
Date: Fri Jul 29 10:58:05 2022 +0800
[gnc-sx-instance-model] free some GHashTable keys & Values
diff --git a/libgnucash/app-utils/gnc-sx-instance-model.c b/libgnucash/app-utils/gnc-sx-instance-model.c
index f79396644..75c624785 100644
--- a/libgnucash/app-utils/gnc-sx-instance-model.c
+++ b/libgnucash/app-utils/gnc-sx-instance-model.c
@@ -101,7 +101,8 @@ scrub_sx_split_numeric (Split* split, gboolean is_credit, GList **changes)
const char *numeric = is_credit ? "sx-credit-numeric" : "sx-debit-numeric";
char *formval;
gnc_numeric *numval = NULL;
- GHashTable *parser_vars = g_hash_table_new (g_str_hash, g_str_equal);
+ GHashTable *parser_vars = g_hash_table_new_full
+ (g_str_hash, g_str_equal, g_free, (GDestroyNotify)gnc_sx_variable_free);
char *error_loc;
gnc_numeric amount = gnc_numeric_zero ();
gboolean parse_result = FALSE;
@@ -205,6 +206,9 @@ GHashTable*
gnc_sx_instance_get_variables_for_parser(GHashTable *instance_var_hash)
{
GHashTable *parser_vars;
+
+ /* fixme: the following GHashTable should g_free keys and
+ gnc_sx_variable_free the values, however this breaks SX formulas */
parser_vars = g_hash_table_new(g_str_hash, g_str_equal);
g_hash_table_foreach(instance_var_hash, (GHFunc)_sx_var_to_raw_numeric, parser_vars);
return parser_vars;
commit 7c2a24951106c19f562efc745ed5c8d605cd5d53
Author: Christopher Lam <christopher.lck at gmail.com>
Date: Wed Jul 27 21:38:31 2022 +0800
[gnc-sx-instance-model.c] refactor Scrub function
This scrubbing function calls xaccTransRollbackEdit which is
leaky. Instead of trying to fix xaccTransRollbackEdit which requires
superhuman skills, it's easiest to track the changes separately in a
GList, and use xaccTransBeginEdit/xaccTransCommitEdit only if
necessary.
diff --git a/libgnucash/app-utils/gnc-sx-instance-model.c b/libgnucash/app-utils/gnc-sx-instance-model.c
index f54b78e52..f79396644 100644
--- a/libgnucash/app-utils/gnc-sx-instance-model.c
+++ b/libgnucash/app-utils/gnc-sx-instance-model.c
@@ -88,41 +88,45 @@ static void _gnc_sx_instance_event_handler(QofInstance *ent, QofEventId event_ty
static gnc_commodity* get_transaction_currency(SxTxnCreationData *creation_data, SchedXaction *sx, Transaction *template_txn);
/* ------------------------------------------------------------ */
-static gboolean
-scrub_sx_split_numeric (Split* split, const char *debcred)
+typedef struct
+{
+ const char *name;
+ gnc_numeric amount;
+} ScrubItem;
+
+static void
+scrub_sx_split_numeric (Split* split, gboolean is_credit, GList **changes)
{
- const gboolean is_credit = g_strcmp0 (debcred, "credit") == 0;
- const char *formula = is_credit ?
- "sx-credit-formula" : "sx-debit-formula";
- const char *numeric = is_credit ?
- "sx-credit-numeric" : "sx-debit-numeric";
+ const char *formula = is_credit ? "sx-credit-formula" : "sx-debit-formula";
+ const char *numeric = is_credit ? "sx-credit-numeric" : "sx-debit-numeric";
char *formval;
gnc_numeric *numval = NULL;
GHashTable *parser_vars = g_hash_table_new (g_str_hash, g_str_equal);
char *error_loc;
gnc_numeric amount = gnc_numeric_zero ();
gboolean parse_result = FALSE;
- gboolean num_val_changed = FALSE;
- qof_instance_get (QOF_INSTANCE (split),
- formula, &formval,
- numeric, &numval,
- NULL);
- parse_result =
- gnc_exp_parser_parse_separate_vars (formval, &amount,
- &error_loc, parser_vars);
+
+ qof_instance_get (QOF_INSTANCE (split), formula, &formval,
+ numeric, &numval, NULL);
+
+ parse_result = gnc_exp_parser_parse_separate_vars (formval, &amount,
+ &error_loc, parser_vars);
+
if (!parse_result || g_hash_table_size (parser_vars) != 0)
amount = gnc_numeric_zero ();
+
g_hash_table_unref (parser_vars);
+
if (!numval || !gnc_numeric_eq (amount, *numval))
{
- qof_instance_set (QOF_INSTANCE (split),
- numeric, &amount,
- NULL);
- num_val_changed = TRUE;
+ ScrubItem *change = g_new (ScrubItem, 1);
+ change->name = numeric;
+ change->amount = amount;
+ *changes = g_list_prepend (*changes, change);
}
+
g_free (formval);
g_free (numval);
- return num_val_changed;
}
/* Fixes error in pre-2.6.16 where the numeric slot wouldn't get changed if the
@@ -133,14 +137,20 @@ gnc_sx_scrub_split_numerics (gpointer psplit, gpointer puser)
{
Split *split = GNC_SPLIT (psplit);
Transaction *trans = xaccSplitGetParent (split);
- gboolean changed;
+ GList *changes = NULL;
+ scrub_sx_split_numeric (split, TRUE, &changes);
+ scrub_sx_split_numeric (split, FALSE, &changes);
+ if (!changes)
+ return;
+
xaccTransBeginEdit (trans);
- changed = scrub_sx_split_numeric (split, "credit") +
- scrub_sx_split_numeric (split, "debit");
- if (!changed)
- xaccTransRollbackEdit (trans);
- else
- xaccTransCommitEdit (trans);
+ for (GList *n = changes; n; n = n->next)
+ {
+ ScrubItem *change = n->data;
+ qof_instance_set (QOF_INSTANCE (split), change->name, &change->amount, NULL);
+ }
+ xaccTransCommitEdit (trans);
+ g_list_free_full (changes, g_free);
}
static void
Summary of changes:
libgnucash/app-utils/gnc-sx-instance-model.c | 70 +++++++++++++++++-----------
1 file changed, 42 insertions(+), 28 deletions(-)
More information about the gnucash-changes
mailing list