gnucash stable: [Transaction.cpp] use qof_instance kvp API for Time64, with bugfix

Christopher Lam clam at code.gnucash.org
Wed Jul 2 20:34:52 EDT 2025


Updated	 via  https://github.com/Gnucash/gnucash/commit/ab04715c (commit)
	from  https://github.com/Gnucash/gnucash/commit/985f5918 (commit)



commit ab04715c910d63e17c4711fca965915da3e7fc7c
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Sat Jun 28 17:58:40 2025 +0800

    [Transaction.cpp] use qof_instance kvp API for Time64, with bugfix
    
    fixes bug whereby xaccTransRetDateDue returns 0 if the kvp time64
    stored is 0.

diff --git a/libgnucash/engine/Transaction.cpp b/libgnucash/engine/Transaction.cpp
index abd3e22b56..26d3aca870 100644
--- a/libgnucash/engine/Transaction.cpp
+++ b/libgnucash/engine/Transaction.cpp
@@ -1988,14 +1988,10 @@ xaccTransSetDate (Transaction *trans, int day, int mon, int year)
 void
 xaccTransSetDateDue (Transaction * trans, time64 time)
 {
-    GValue v = G_VALUE_INIT;
     if (!trans) return;
-    g_value_init (&v, GNC_TYPE_TIME64);
-    g_value_set_static_boxed (&v, &time);
     xaccTransBeginEdit(trans);
-    qof_instance_set_kvp (QOF_INSTANCE (trans), &v, 1, TRANS_DATE_DUE_KVP);
+    qof_instance_set_path_kvp<Time64> (QOF_INSTANCE (trans), Time64{time}, {TRANS_DATE_DUE_KVP});
     qof_instance_set_dirty(QOF_INSTANCE(trans));
-    g_value_unset (&v);
     xaccTransCommitEdit(trans);
 }
 
@@ -2339,18 +2335,9 @@ xaccTransRetDateEntered (const Transaction *trans)
 time64
 xaccTransRetDateDue(const Transaction *trans)
 {
-    time64 ret = 0;
-    GValue v = G_VALUE_INIT;
     if (!trans) return 0;
-    qof_instance_get_kvp (QOF_INSTANCE (trans), &v, 1, TRANS_DATE_DUE_KVP);
-    if (G_VALUE_HOLDS_BOXED (&v))
-    {
-        ret = ((Time64*)g_value_get_boxed (&v))->t;
-        g_value_unset (&v);
-    }
-    if (!ret)
-        return xaccTransRetDatePosted (trans);
-    return ret;
+    auto res = qof_instance_get_path_kvp<Time64> (QOF_INSTANCE (trans), {TRANS_DATE_DUE_KVP});
+    return res ? res->t : xaccTransRetDatePosted (trans);
 }
 
 char
diff --git a/libgnucash/engine/qofinstance.cpp b/libgnucash/engine/qofinstance.cpp
index 5e62dd2808..b78724f185 100644
--- a/libgnucash/engine/qofinstance.cpp
+++ b/libgnucash/engine/qofinstance.cpp
@@ -1080,11 +1080,13 @@ qof_instance_set_path_kvp (QofInstance* inst, std::optional<T> value, const Path
     qof_instance_set_dirty (inst);
 }
 
+template std::optional<Time64> qof_instance_get_path_kvp <Time64> (QofInstance*, const Path&);
 template std::optional<const char*> qof_instance_get_path_kvp <const char*> (QofInstance*, const Path&);
 template std::optional<gnc_numeric> qof_instance_get_path_kvp <gnc_numeric> (QofInstance*, const Path&);
 template std::optional<GncGUID*> qof_instance_get_path_kvp <GncGUID*> (QofInstance*, const Path&);
 template std::optional<int64_t> qof_instance_get_path_kvp <int64_t> (QofInstance*, const Path&);
 
+template void qof_instance_set_path_kvp <Time64> (QofInstance*, std::optional<Time64>, const Path& path);
 template void qof_instance_set_path_kvp <const char*> (QofInstance*, std::optional<const char*>, const Path& path);
 template void qof_instance_set_path_kvp <gnc_numeric> (QofInstance*, std::optional<gnc_numeric>, const Path& path);
 template void qof_instance_set_path_kvp <GncGUID*> (QofInstance*, std::optional<GncGUID*>, const Path& path);
diff --git a/libgnucash/engine/test/utest-Transaction.cpp b/libgnucash/engine/test/utest-Transaction.cpp
index e85d8d853d..fe58c2cc99 100644
--- a/libgnucash/engine/test/utest-Transaction.cpp
+++ b/libgnucash/engine/test/utest-Transaction.cpp
@@ -1833,8 +1833,7 @@ test_xaccTransGetDateDue (Fixture *fixture, gconstpointer pData)
 
     xaccTransSetDateDue (txn, 0);
     g_assert_cmpint (frame->get_slot({TRANS_DATE_DUE_KVP})->get_ptr<Time64>()->t, ==, 0);
-    // the next line is arguably buggy; shouldn't it return 0 as per kvp value?
-    g_assert_cmpint (xaccTransRetDateDue(txn), ==, xaccTransRetDatePosted(txn));
+    g_assert_cmpint (xaccTransRetDateDue(txn), ==, 0);
 }
 
 /* xaccTransGetReadOnly C: 7 in 5  Local: 1:0:0



Summary of changes:
 libgnucash/engine/Transaction.cpp            | 19 +++----------------
 libgnucash/engine/qofinstance.cpp            |  2 ++
 libgnucash/engine/test/utest-Transaction.cpp |  3 +--
 3 files changed, 6 insertions(+), 18 deletions(-)



More information about the gnucash-changes mailing list