gnucash stable: Multiple changes pushed
Christopher Lam
clam at code.gnucash.org
Wed Jul 2 20:31:21 EDT 2025
Updated via https://github.com/Gnucash/gnucash/commit/985f5918 (commit)
via https://github.com/Gnucash/gnucash/commit/7e740bab (commit)
via https://github.com/Gnucash/gnucash/commit/23a2e091 (commit)
from https://github.com/Gnucash/gnucash/commit/754a1eb4 (commit)
commit 985f5918308dde01c408e07c7879e31d85e7cfd1
Author: Christopher Lam <christopher.lck at gmail.com>
Date: Fri Jun 27 21:50:25 2025 +0800
[Transaction.cpp] small modification to xaccTransSetNotes
diff --git a/libgnucash/engine/Transaction.cpp b/libgnucash/engine/Transaction.cpp
index aa65820313..abd3e22b56 100644
--- a/libgnucash/engine/Transaction.cpp
+++ b/libgnucash/engine/Transaction.cpp
@@ -2080,15 +2080,8 @@ qofTransSetNotes (Transaction *trans, const char *notes)
void
xaccTransSetNotes (Transaction *trans, const char *notes)
{
- GValue v = G_VALUE_INIT;
if (!trans || !notes) return;
- g_value_init (&v, G_TYPE_STRING);
- g_value_set_static_string (&v, notes);
- xaccTransBeginEdit(trans);
- qof_instance_set_kvp (QOF_INSTANCE (trans), &v, 1, trans_notes_str);
- qof_instance_set_dirty(QOF_INSTANCE(trans));
- g_value_unset (&v);
- xaccTransCommitEdit(trans);
+ set_kvp_string_path (trans, {trans_notes_str}, notes);
}
void
diff --git a/libgnucash/engine/test/utest-Transaction.cpp b/libgnucash/engine/test/utest-Transaction.cpp
index 3dd81b1d06..e85d8d853d 100644
--- a/libgnucash/engine/test/utest-Transaction.cpp
+++ b/libgnucash/engine/test/utest-Transaction.cpp
@@ -1870,8 +1870,8 @@ test_xaccTransSetNotes (Fixture *fixture, gconstpointer pData)
g_assert_cmpstr (frame->get_slot({trans_notes_str})->get<const char*>(), ==, "set");
xaccTransSetNotes (trans, "");
- g_assert_cmpstr (xaccTransGetNotes (trans), ==, "");
- g_assert_cmpstr (frame->get_slot({trans_notes_str})->get<const char*>(), ==, "");
+ g_assert_cmpstr (xaccTransGetNotes (trans), ==, nullptr);
+ g_assert_null (frame->get_slot({trans_notes_str}));
xaccTransSetNotes (trans, "reset");
g_assert_cmpstr (xaccTransGetNotes (trans), ==, "reset");
commit 7e740babdfe374098db12ee6e04acb0fef073018
Author: Christopher Lam <christopher.lck at gmail.com>
Date: Mon Jun 23 10:36:56 2025 +0800
[Transaction.cpp] small modification to xaccTransSetReadOnly
if reason is "" then remove the kvp
diff --git a/libgnucash/engine/Transaction.cpp b/libgnucash/engine/Transaction.cpp
index dd08ec9e39..aa65820313 100644
--- a/libgnucash/engine/Transaction.cpp
+++ b/libgnucash/engine/Transaction.cpp
@@ -2015,16 +2015,7 @@ void
xaccTransSetReadOnly (Transaction *trans, const char *reason)
{
if (trans && reason)
- {
- GValue v = G_VALUE_INIT;
- g_value_init (&v, G_TYPE_STRING);
- g_value_set_static_string (&v, reason);
- xaccTransBeginEdit(trans);
- qof_instance_set_kvp (QOF_INSTANCE (trans), &v, 1, TRANS_READ_ONLY_REASON);
- qof_instance_set_dirty(QOF_INSTANCE(trans));
- g_value_unset (&v);
- xaccTransCommitEdit(trans);
- }
+ set_kvp_string_path (trans, {TRANS_READ_ONLY_REASON}, reason);
}
/********************************************************************\
diff --git a/libgnucash/engine/test/utest-Transaction.cpp b/libgnucash/engine/test/utest-Transaction.cpp
index 6117052ef5..3dd81b1d06 100644
--- a/libgnucash/engine/test/utest-Transaction.cpp
+++ b/libgnucash/engine/test/utest-Transaction.cpp
@@ -1764,8 +1764,8 @@ test_xaccTransGetReadOnly (Fixture *fixture, gconstpointer pData)
g_assert_null (frame->get_slot({TRANS_READ_ONLY_REASON}));
xaccTransSetReadOnly (txn, "");
- g_assert_cmpstr (xaccTransGetReadOnly (txn), ==, "");
- g_assert_cmpstr (frame->get_slot({TRANS_READ_ONLY_REASON})->get<const char*>(), ==, "");
+ g_assert_cmpstr (xaccTransGetReadOnly (txn), ==, nullptr);
+ g_assert_null (frame->get_slot({TRANS_READ_ONLY_REASON}));
xaccTransClearReadOnly (txn);
g_assert_null (frame->get_slot({TRANS_READ_ONLY_REASON}));
commit 23a2e091c740f78dba2ed7386d18bb8d3c908c20
Author: Christopher Lam <christopher.lck at gmail.com>
Date: Sun Jun 22 13:47:16 2025 +0800
[Transaction.cpp] use qof_instance kvp API for const char*
diff --git a/libgnucash/engine/Transaction.cpp b/libgnucash/engine/Transaction.cpp
index 82a822cc87..dd08ec9e39 100644
--- a/libgnucash/engine/Transaction.cpp
+++ b/libgnucash/engine/Transaction.cpp
@@ -1873,6 +1873,24 @@ xaccTransOrder_num_action (const Transaction *ta, const char *actna,
/********************************************************************\
\********************************************************************/
+static void
+set_kvp_string_path (Transaction *txn, const Path& path, const char *value)
+{
+ g_return_if_fail (GNC_IS_TRANSACTION(txn));
+ xaccTransBeginEdit(txn);
+ auto val = value && *value ? std::make_optional<const char*>(g_strdup(value)) : std::nullopt;
+ qof_instance_set_path_kvp<const char*> (QOF_INSTANCE(txn), val, path);
+ qof_instance_set_dirty (QOF_INSTANCE(txn));
+ xaccTransCommitEdit(txn);
+}
+
+static const char*
+get_kvp_string_path (const Transaction *txn, const Path& path)
+{
+ auto rv{qof_instance_get_path_kvp<const char*> (QOF_INSTANCE(txn), path)};
+ return rv ? *rv : nullptr;
+}
+
static inline void
xaccTransSetDateInternal(Transaction *trans, time64 *dadate, time64 val)
{
@@ -1985,32 +2003,12 @@ void
xaccTransSetTxnType (Transaction *trans, char type)
{
char s[2] = {type, '\0'};
- GValue v = G_VALUE_INIT;
- g_return_if_fail(trans);
- g_value_init (&v, G_TYPE_STRING);
- qof_instance_get_kvp (QOF_INSTANCE (trans), &v, 1, TRANS_TXN_TYPE_KVP);
- if (!g_strcmp0 (s, g_value_get_string (&v)))
- {
- g_value_unset (&v);
- return;
- }
- g_value_set_static_string (&v, s);
- xaccTransBeginEdit(trans);
- qof_instance_set_kvp (QOF_INSTANCE (trans), &v, 1, TRANS_TXN_TYPE_KVP);
- qof_instance_set_dirty(QOF_INSTANCE(trans));
- g_value_unset (&v);
- xaccTransCommitEdit(trans);
+ set_kvp_string_path (trans, {TRANS_TXN_TYPE_KVP}, s);
}
void xaccTransClearReadOnly (Transaction *trans)
{
- if (trans)
- {
- xaccTransBeginEdit(trans);
- qof_instance_set_kvp (QOF_INSTANCE (trans), nullptr, 1, TRANS_READ_ONLY_REASON);
- qof_instance_set_dirty(QOF_INSTANCE(trans));
- xaccTransCommitEdit(trans);
- }
+ set_kvp_string_path (trans, {TRANS_READ_ONLY_REASON}, nullptr);
}
void
@@ -2077,22 +2075,7 @@ void
xaccTransSetDocLink (Transaction *trans, const char *doclink)
{
if (!trans || !doclink) return;
-
- xaccTransBeginEdit(trans);
- if (doclink[0] == '\0')
- {
- qof_instance_set_kvp (QOF_INSTANCE (trans), nullptr, 1, doclink_uri_str);
- }
- else
- {
- GValue v = G_VALUE_INIT;
- g_value_init (&v, G_TYPE_STRING);
- g_value_set_static_string (&v, doclink); //Gets copied at the other end
- qof_instance_set_kvp (QOF_INSTANCE (trans), &v, 1, doclink_uri_str);
- g_value_unset (&v);
- }
- qof_instance_set_dirty(QOF_INSTANCE(trans));
- xaccTransCommitEdit(trans);
+ set_kvp_string_path (trans, {doclink_uri_str}, doclink);
}
static void
@@ -2289,27 +2272,13 @@ xaccTransGetDescription (const Transaction *trans)
const char *
xaccTransGetDocLink (const Transaction *trans)
{
- g_return_val_if_fail (trans, nullptr);
-
- GValue v = G_VALUE_INIT;
- qof_instance_get_kvp (QOF_INSTANCE (trans), &v, 1, doclink_uri_str);
- const char* doclink = G_VALUE_HOLDS_STRING (&v) ? g_value_get_string (&v) : nullptr;
- g_value_unset (&v);
-
- return doclink;
+ return get_kvp_string_path (trans, {doclink_uri_str});
}
const char *
xaccTransGetNotes (const Transaction *trans)
{
- g_return_val_if_fail (trans, nullptr);
-
- GValue v = G_VALUE_INIT;
- qof_instance_get_kvp (QOF_INSTANCE (trans), &v, 1, trans_notes_str);
- const char *notes = G_VALUE_HOLDS_STRING (&v) ? g_value_get_string (&v) : nullptr;
- g_value_unset (&v);
-
- return notes;
+ return get_kvp_string_path (trans, {trans_notes_str});
}
gboolean
@@ -2442,15 +2411,7 @@ xaccTransGetTxnType (Transaction *trans)
const char *
xaccTransGetReadOnly (Transaction *trans)
{
- if (!trans)
- return nullptr;
-
- GValue v = G_VALUE_INIT;
- qof_instance_get_kvp (QOF_INSTANCE(trans), &v, 1, TRANS_READ_ONLY_REASON);
- const char *readonly_reason = G_VALUE_HOLDS_STRING (&v) ?
- g_value_get_string (&v) : nullptr;
- g_value_unset (&v);
- return readonly_reason;
+ return get_kvp_string_path (trans, {TRANS_READ_ONLY_REASON});
}
static gboolean
@@ -2608,9 +2569,6 @@ gnc_book_count_transactions(QofBook *book)
void
xaccTransVoid(Transaction *trans, const char *reason)
{
- GValue v = G_VALUE_INIT;
- char iso8601_str[ISO_DATELENGTH + 1] = "";
-
g_return_if_fail(trans && reason);
/* Prevent voiding transactions that are already marked
@@ -2622,21 +2580,15 @@ xaccTransVoid(Transaction *trans, const char *reason)
return;
}
xaccTransBeginEdit(trans);
- qof_instance_get_kvp (QOF_INSTANCE (trans), &v, 1, trans_notes_str);
- if (G_VALUE_HOLDS_STRING (&v))
- qof_instance_set_kvp (QOF_INSTANCE (trans), &v, 1, void_former_notes_str);
- else
- g_value_init (&v, G_TYPE_STRING);
-
- g_value_set_static_string (&v, _("Voided transaction"));
- qof_instance_set_kvp (QOF_INSTANCE (trans), &v, 1, trans_notes_str);
- g_value_set_static_string (&v, reason);
- qof_instance_set_kvp (QOF_INSTANCE (trans), &v, 1, void_reason_str);
+ char iso8601_str[ISO_DATELENGTH + 1] = "";
gnc_time64_to_iso8601_buff (gnc_time(nullptr), iso8601_str);
- g_value_set_static_string (&v, iso8601_str);
- qof_instance_set_kvp (QOF_INSTANCE (trans), &v, 1, void_time_str);
- g_value_unset (&v);
+
+ if (auto s = get_kvp_string_path (trans, {trans_notes_str}))
+ set_kvp_string_path (trans, {void_former_notes_str}, s);
+ set_kvp_string_path (trans, {trans_notes_str}, _("Voided transaction"));
+ set_kvp_string_path (trans, {void_reason_str}, reason);
+ set_kvp_string_path (trans, {void_time_str}, iso8601_str);
FOR_EACH_SPLIT(trans, xaccSplitVoid(s));
@@ -2655,53 +2607,30 @@ xaccTransGetVoidStatus(const Transaction *trans)
const char *
xaccTransGetVoidReason(const Transaction *trans)
{
- g_return_val_if_fail (trans, nullptr);
-
- GValue v = G_VALUE_INIT;
- qof_instance_get_kvp (QOF_INSTANCE (trans), &v, 1, void_reason_str);
- const char *void_reason = G_VALUE_HOLDS_STRING (&v) ? g_value_get_string (&v) : nullptr;
- g_value_unset (&v);
-
- return void_reason;
+ return get_kvp_string_path (trans, {void_reason_str});
}
time64
xaccTransGetVoidTime(const Transaction *tr)
{
- GValue v = G_VALUE_INIT;
- const char *s = nullptr;
- time64 void_time = 0;
-
- g_return_val_if_fail(tr, void_time);
- qof_instance_get_kvp (QOF_INSTANCE (tr), &v, 1, void_time_str);
- if (G_VALUE_HOLDS_STRING (&v))
- {
- s = g_value_get_string (&v);
- if (s)
- void_time = gnc_iso8601_to_time64_gmt (s);
- }
- g_value_unset (&v);
- return void_time;
+ auto void_str{get_kvp_string_path (tr, {void_time_str})};
+ return void_str ? gnc_iso8601_to_time64_gmt (void_str) : 0;
}
void
xaccTransUnvoid (Transaction *trans)
{
- GValue v = G_VALUE_INIT;
- const char *s = nullptr;
g_return_if_fail(trans);
- s = xaccTransGetVoidReason (trans);
- if (s == nullptr) return; /* Transaction isn't voided. Bail. */
+ if (xaccTransGetVoidReason (trans) == nullptr)
+ return; /* Transaction isn't voided. Bail. */
+
xaccTransBeginEdit(trans);
- qof_instance_get_kvp (QOF_INSTANCE (trans), &v, 1, void_former_notes_str);
- if (G_VALUE_HOLDS_STRING (&v))
- qof_instance_set_kvp (QOF_INSTANCE (trans), &v, 1, trans_notes_str);
- qof_instance_set_kvp (QOF_INSTANCE (trans), nullptr, 1, void_former_notes_str);
- qof_instance_set_kvp (QOF_INSTANCE (trans), nullptr, 1, void_reason_str);
- qof_instance_set_kvp (QOF_INSTANCE (trans), nullptr, 1, void_time_str);
- g_value_unset (&v);
+ set_kvp_string_path (trans, {trans_notes_str}, get_kvp_string_path (trans, {void_former_notes_str}));
+ set_kvp_string_path (trans, {void_former_notes_str}, nullptr);
+ set_kvp_string_path (trans, {void_reason_str}, nullptr);
+ set_kvp_string_path (trans, {void_time_str}, nullptr);
FOR_EACH_SPLIT(trans, xaccSplitUnvoid(s));
Summary of changes:
libgnucash/engine/Transaction.cpp | 173 +++++++--------------------
libgnucash/engine/test/utest-Transaction.cpp | 8 +-
2 files changed, 47 insertions(+), 134 deletions(-)
More information about the gnucash-changes
mailing list