From ab04715c910d63e17c4711fca965915da3e7fc7c Mon Sep 17 00:00:00 2001 From: Christopher Lam Date: Sat, 28 Jun 2025 17:58:40 +0800 Subject: [PATCH] [Transaction.cpp] use qof_instance kvp API for Time64, with bugfix fixes bug whereby xaccTransRetDateDue returns 0 if the kvp time64 stored is 0. --- libgnucash/engine/Transaction.cpp | 19 +++---------------- libgnucash/engine/qofinstance.cpp | 2 ++ libgnucash/engine/test/utest-Transaction.cpp | 3 +-- 3 files changed, 6 insertions(+), 18 deletions(-) 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 (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 (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 value, const Path qof_instance_set_dirty (inst); } +template std::optional qof_instance_get_path_kvp (QofInstance*, const Path&); template std::optional qof_instance_get_path_kvp (QofInstance*, const Path&); template std::optional qof_instance_get_path_kvp (QofInstance*, const Path&); template std::optional qof_instance_get_path_kvp (QofInstance*, const Path&); template std::optional qof_instance_get_path_kvp (QofInstance*, const Path&); +template void qof_instance_set_path_kvp (QofInstance*, std::optional, const Path& path); template void qof_instance_set_path_kvp (QofInstance*, std::optional, const Path& path); template void qof_instance_set_path_kvp (QofInstance*, std::optional, const Path& path); template void qof_instance_set_path_kvp (QofInstance*, std::optional, 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()->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