From 47b85d3b2fcf9bed4f68b46a94f764d8cd0f4581 Mon Sep 17 00:00:00 2001 From: Christopher Lam Date: Mon, 27 Feb 2023 05:29:08 +0800 Subject: [PATCH 1/7] [gnc-xml-backend.cpp] g_free char* from g_path_get_dirname --- libgnucash/backend/xml/gnc-xml-backend.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libgnucash/backend/xml/gnc-xml-backend.cpp b/libgnucash/backend/xml/gnc-xml-backend.cpp index 03cc9b9b0e..5a4ff43917 100644 --- a/libgnucash/backend/xml/gnc-xml-backend.cpp +++ b/libgnucash/backend/xml/gnc-xml-backend.cpp @@ -136,7 +136,10 @@ GncXmlBackend::session_begin(QofSession* session, const char* new_uri, if (!check_path(m_fullpath.c_str(), mode == SESSION_NEW_STORE || mode == SESSION_NEW_OVERWRITE)) return; - m_dirname = g_path_get_dirname (m_fullpath.c_str()); + + auto dirname = g_path_get_dirname (m_fullpath.c_str()); + m_dirname = dirname; + g_free (dirname); From 6616ce10772bd91045343cc58ddc1d186dd4e9f6 Mon Sep 17 00:00:00 2001 From: mocsa Date: Sun, 26 Feb 2023 21:44:27 +0100 Subject: [PATCH 2/7] Translation update by mocsa using Weblate po/hu.po: 64.1% (3464 of 5401 strings; 960 fuzzy) 199 failing checks (3.6%) Translation: GnuCash/Program (Hungarian) Translate-URL: https://hosted.weblate.org/projects/gnucash/gnucash/hu/ Translation update by mocsa using Weblate po/hu.po: 64.0% (3461 of 5401 strings; 963 fuzzy) 199 failing checks (3.6%) Translation: GnuCash/Program (Hungarian) Translate-URL: https://hosted.weblate.org/projects/gnucash/gnucash/hu/ Co-authored-by: mocsa --- po/hu.po | 129 ++++++++++++++++++++----------------------------------- 1 file changed, 46 insertions(+), 83 deletions(-) diff --git a/po/hu.po b/po/hu.po index 640b4c77c8..450af2c7f7 100644 --- a/po/hu.po +++ b/po/hu.po @@ -14,8 +14,8 @@ msgstr "" "Report-Msgid-Bugs-To: https://bugs.gnucash.org/enter_bug." "cgi?product=GnuCash&component=Translations\n" "POT-Creation-Date: 2022-12-04 19:47-0800\n" -"PO-Revision-Date: 2023-02-23 16:38+0000\n" -"Last-Translator: Szia Tomi \n" +"PO-Revision-Date: 2023-02-26 20:44+0000\n" +"Last-Translator: mocsa \n" "Language-Team: Hungarian \n" "Language: hu\n" @@ -903,7 +903,7 @@ msgstr "A könyv lezárása sikeres volt." #. that will be created. This is a ngettext(3) message (but #. only for the %d part). #: gnucash/gnome/assistant-acct-period.c:315 -#, fuzzy, c-format +#, c-format msgid "" "The earliest transaction date found in this book is %s. Based on the " "selection made above, this book will be split into %d book." @@ -911,9 +911,8 @@ msgid_plural "" "The earliest transaction date found in this book is %s. Based on the " "selection made above, this book will be split into %d books." msgstr[0] "" -"A legkorábbi könyvelés dátuma a könyvben %s. A fenti kiválasztás alapján a " -"könyvelés-megosztás a %d könyvekben megy végbe. Kattintson a \"Következő\"-" -"re, hogy elkezdje bezárni az első könyvet." +"Ebben a főkönyvben a legkorábbi tranzakció dátuma %s. A fenti választás " +"alapján a könyv %d felé lesz szétosztva." #. Translators: Run the assistant in your language to see GTK's translation of the button labels. #: gnucash/gnome/assistant-acct-period.c:371 @@ -945,13 +944,13 @@ msgid "" msgstr "" #: gnucash/gnome/assistant-acct-period.c:525 -#, fuzzy, c-format +#, c-format msgid "" "%s\n" "Congratulations! You are done closing books!\n" msgstr "" "%s\n" -"Gratulálunk! Ön végzett a könyvek lezárásával!\n" +"Gratulálunk! Befejezte a könyvek lezárását!\n" #: gnucash/gnome/assistant-acct-period.c:594 #: gnucash/gtkbuilder/dialog-fincalc.glade:650 @@ -1725,10 +1724,8 @@ msgstr "Töltelék számla lett kiválasztva. Próbálja újra." #: gnucash/gnome/dialog-doclink.c:160 #: gnucash/gnome/gnc-plugin-page-register.c:4765 -#, fuzzy -#| msgid "Select Account" msgid "Select document" -msgstr "Folyószámla kiválasztása" +msgstr "Dokumentum kiválasztása" #: gnucash/gnome/dialog-doclink.c:163 gnucash/gnome/gnc-plugin-budget.c:323 #: gnucash/gnome-search/search-account.c:238 @@ -15789,9 +15786,8 @@ msgid "Linked Document" msgstr "Megbízás párbeszédablak" #: gnucash/gtkbuilder/dialog-doclink.glade:697 -#, fuzzy msgid "Available" -msgstr "Számlázható?" +msgstr "" #: gnucash/gtkbuilder/dialog-doclink.glade:712 msgid "Relative" @@ -16475,8 +16471,8 @@ msgstr "_Igen" msgid "" "Display Welcome Dialog Again?" msgstr "" -"Újból megjeleníti az " -"üdvözlőablakot?" +"Máskor is jelenjen meg az " +"Üdvözlőablak?" #: gnucash/gtkbuilder/dialog-new-user.glade:101 msgid "" @@ -16484,9 +16480,9 @@ msgid "" "will be displayed again next time you start GnuCash. If you press the No button, it will not be displayed again." msgstr "" -"Ha az Igen gombot nyomja meg, az Üdvözli a GnuCash ablak a " -"következő alkalommal is megjelenik, amikor elindítja GnuCash-t. Ha a Nem gombot nyomja meg, akkor nem jelenik meg újra." +"Ha az Igen gombra kattint, az Üdvözlőablak a GnuCash következő " +"indításakor is megjelenik. Ha a Nem gombra kattint, akkor nem jelenik " +"meg újra." #: gnucash/gtkbuilder/dialog-new-user.glade:210 msgid "Welcome to GnuCash!" @@ -19257,9 +19253,8 @@ msgid "Only show _active owners" msgstr "" #: gnucash/gtkbuilder/gnc-tree-view-owner.glade:79 -#, fuzzy msgid "Show _zero balance owners" -msgstr "Nulla egyenlegű elemek feltüntetése?" +msgstr "" #: gnucash/gtkbuilder/window-autoclear.glade:71 #, fuzzy @@ -21896,9 +21891,8 @@ msgid "Enter a name for the account" msgstr "Adjon meg egy folyószámlanevet" #: gnucash/import-export/qif-imp/dialog-account-picker.c:443 -#, fuzzy msgid "Placeholder?" -msgstr "Töltelék" +msgstr "Töltelék?" #: gnucash/import-export/qif-imp/gnc-plugin-qif-import.c:48 msgid "Import _QIF..." @@ -22312,10 +22306,9 @@ msgstr "sample:Költségek:Autó:Üzemanyag" #. Translators: Abbreviation sample for Taxable? #: gnucash/register/ledger-core/gncEntryLedgerLayout.c:132 -#, fuzzy msgctxt "sample for 'Taxable'" msgid "T?" -msgstr "A" +msgstr "" #. Translators: Abbreviation sample for Tax Included #: gnucash/register/ledger-core/gncEntryLedgerLayout.c:137 @@ -23077,9 +23070,8 @@ msgstr "Pénznem kiválasztása, amelyben jelentés értékei megjelennek." #: gnucash/report/options-utilities.scm:143 #: gnucash/report/reports/standard/advanced-portfolio.scm:81 #: gnucash/report/reports/standard/price-scatter.scm:78 -#, fuzzy msgid "The source of price information." -msgstr "Az árinformáció forrása" +msgstr "Árfolyamok forrása." #: gnucash/report/options-utilities.scm:144 msgid "Average cost of purchases weighted by volume" @@ -23486,27 +23478,23 @@ msgstr "" #: gnucash/report/reports/aging.scm:410 #: gnucash/report/reports/standard/new-aging.scm:52 -#, fuzzy msgid "Display Address 1." -msgstr "Dátum megjelenítése?" +msgstr "" #: gnucash/report/reports/aging.scm:418 #: gnucash/report/reports/standard/new-aging.scm:53 -#, fuzzy msgid "Display Address 2." -msgstr "Dátum megjelenítése?" +msgstr "" #: gnucash/report/reports/aging.scm:426 #: gnucash/report/reports/standard/new-aging.scm:54 -#, fuzzy msgid "Display Address 3." -msgstr "Dátum megjelenítése?" +msgstr "" #: gnucash/report/reports/aging.scm:434 #: gnucash/report/reports/standard/new-aging.scm:55 -#, fuzzy msgid "Display Address 4." -msgstr "Dátum megjelenítése?" +msgstr "" #: gnucash/report/reports/aging.scm:442 #: gnucash/report/reports/standard/new-aging.scm:56 @@ -23528,9 +23516,8 @@ msgstr "Rövid jelölések megjelenítése" #: gnucash/report/reports/aging.scm:466 #: gnucash/report/reports/standard/new-aging.scm:59 -#, fuzzy msgid "Display Active status." -msgstr "Dátum megjelenítése?" +msgstr "" #: gnucash/report/reports/aging.scm:539 #: gnucash/report/reports/standard/new-aging.scm:181 @@ -25530,9 +25517,8 @@ msgstr "Nem pénzjavak megjelenítése" #: gnucash/report/reports/standard/balsheet-pnl.scm:124 #: gnucash/report/trep-engine.scm:551 -#, fuzzy msgid "Also show original currency amounts" -msgstr "A számla idegen pénznembeli összegeinek megjelenítése?" +msgstr "Összegek megjelenítése eredeti pénznemben is" #: gnucash/report/reports/standard/balsheet-pnl.scm:126 msgid "If more than 1 period column, include overall period?" @@ -26110,19 +26096,16 @@ msgid "Include transfers to and from Trading Accounts in the report." msgstr "" #: gnucash/report/reports/standard/cashflow-barchart.scm:107 -#, fuzzy msgid "Show money in?" -msgstr "Rajz megjelenítése" +msgstr "" #: gnucash/report/reports/standard/cashflow-barchart.scm:113 -#, fuzzy msgid "Show money out?" -msgstr "Rajz megjelenítése" +msgstr "" #: gnucash/report/reports/standard/cashflow-barchart.scm:119 -#, fuzzy msgid "Show net money flow?" -msgstr "Rajz megjelenítése" +msgstr "Nettó pénzáramlás megjelenítése?" #: gnucash/report/reports/standard/cashflow-barchart.scm:303 #: gnucash/report/reports/standard/cashflow-barchart.scm:339 @@ -26952,24 +26935,20 @@ msgid "Display the price per item?" msgstr "Elemenkénti ár megjelenítése?" #: gnucash/report/reports/standard/invoice.scm:225 -#, fuzzy msgid "Display the entry's discount?" -msgstr "Tétel-kedvezmény megjelenítése" +msgstr "" #: gnucash/report/reports/standard/invoice.scm:230 -#, fuzzy msgid "Display the entry's taxable status?" -msgstr "Adókötelesség megjelenítése" +msgstr "" #: gnucash/report/reports/standard/invoice.scm:235 -#, fuzzy msgid "Display each entry's total total tax?" -msgstr "Minden tételösszeg összesített adója" +msgstr "" #: gnucash/report/reports/standard/invoice.scm:240 -#, fuzzy msgid "Display the entry's value?" -msgstr "Tétel értéke megjelenítése" +msgstr "" #: gnucash/report/reports/standard/invoice.scm:245 msgid "Display due date?" @@ -27530,22 +27509,19 @@ msgstr "Számla megjelenítése?" #: gnucash/report/reports/standard/new-owner-report.scm:918 #: gnucash/report/reports/standard/owner-report.scm:597 -#, fuzzy msgid "Display the period debits column?" -msgstr "Tétel-kedvezmény megjelenítése" +msgstr "" #: gnucash/report/reports/standard/new-owner-report.scm:923 #: gnucash/report/reports/standard/owner-report.scm:592 -#, fuzzy msgid "Display the period credits column?" -msgstr "Tétel-kedvezmény megjelenítése" +msgstr "" #: gnucash/report/reports/standard/new-owner-report.scm:928 #: gnucash/report/reports/standard/register.scm:413 #: gnucash/report/trep-engine.scm:962 -#, fuzzy msgid "Display a running balance?" -msgstr "Futó egyenleg megjelenítése" +msgstr "Folyó egyenleg megjelenítése?" #: gnucash/report/reports/standard/new-owner-report.scm:936 #, fuzzy @@ -27575,9 +27551,8 @@ msgid "Detailed" msgstr "Sikertelen" #: gnucash/report/reports/standard/new-owner-report.scm:949 -#, fuzzy msgid "Display document link?" -msgstr "Számlanév megjelenítése hiperhivatkozásként" +msgstr "Dokumentum hivatkozás megjelenítése?" #: gnucash/report/reports/standard/new-owner-report.scm:1068 #, fuzzy @@ -28169,9 +28144,8 @@ msgid "Display the Company Name?" msgstr "Számlanév megjelenítése?" #: gnucash/report/reports/standard/taxinvoice.scm:134 -#, fuzzy msgid "Invoice Number next to title?" -msgstr "Számlaszám" +msgstr "Számlaszám a cím mellett?" #: gnucash/report/reports/standard/taxinvoice.scm:135 #, fuzzy @@ -28179,14 +28153,12 @@ msgid "Display Job name?" msgstr "Számlanév megjelenítése?" #: gnucash/report/reports/standard/taxinvoice.scm:136 -#, fuzzy msgid "Invoice Job number?" -msgstr "Számlaszám" +msgstr "" #: gnucash/report/reports/standard/taxinvoice.scm:137 -#, fuzzy msgid "Show net price?" -msgstr "Árak feltüntetése" +msgstr "Nettó ár megjelenítése?" #: gnucash/report/reports/standard/taxinvoice.scm:154 msgid "Name of a file containing a logo to be used on the report." @@ -29176,9 +29148,8 @@ msgid "" msgstr "" #: gnucash/report/trep-engine.scm:637 -#, fuzzy msgid "Filter by reconcile status." -msgstr "Tranzakciódátum megjelenítése?" +msgstr "" #: gnucash/report/trep-engine.scm:644 #, fuzzy @@ -29224,18 +29195,16 @@ msgid "Show the account description for subheadings?" msgstr "Számlakód megjelenítése alösszegekhez és alcímekhez?" #: gnucash/report/trep-engine.scm:810 -#, fuzzy msgid "Show the informal headers for debit/credit accounts?" -msgstr "Bevételi- és költségszámlák megjelenítése" +msgstr "" #: gnucash/report/trep-engine.scm:817 msgid "Add indenting columns with grouping and subtotals?" msgstr "" #: gnucash/report/trep-engine.scm:824 -#, fuzzy msgid "Show subtotals only, hiding transactional detail?" -msgstr "Do not print transaction detail" +msgstr "" #: gnucash/report/trep-engine.scm:831 msgid "Subtotal according to the primary key?" @@ -29280,30 +29249,24 @@ msgid "Display the notes if the memo is unavailable?" msgstr "" #: gnucash/report/trep-engine.scm:952 gnucash/report/trep-engine.scm:955 -#, fuzzy msgid "Display the full account name?" -msgstr "Teljes számlanév megjelenítése" +msgstr "Teljes számlanév megjelenítése?" #: gnucash/report/trep-engine.scm:953 -#, fuzzy msgid "Display the account code?" -msgstr "Számlakód megjelenítése" +msgstr "Számlakód megjelenítése?" #: gnucash/report/trep-engine.scm:956 -#, fuzzy msgid "Display the other account code?" -msgstr "A másik számla kódjának megjelenítése" +msgstr "A másik számla kódjának megjelenítése?" #: gnucash/report/trep-engine.scm:958 -#, fuzzy -#| msgid "Display the transaction amount?" msgid "Display the transaction linked document" -msgstr "Tranzakció összegének megjelenítése?" +msgstr "" #: gnucash/report/trep-engine.scm:961 -#, fuzzy msgid "Display a subtotal summary table." -msgstr "Feltüntessem a részletösszegeket?" +msgstr "Részösszegek összefoglaló táblázatának megjelenítése." #: gnucash/report/trep-engine.scm:969 #, fuzzy From f483d7588e1ac7a5de5021ddea725145f5cd43c1 Mon Sep 17 00:00:00 2001 From: Szia Tomi Date: Sun, 26 Feb 2023 21:44:27 +0100 Subject: [PATCH 3/7] Translation update by Szia Tomi using Weblate po/glossary/hu.po: 100.0% (216 of 216 strings; 0 fuzzy) 0 failing checks (0.0%) Translation: GnuCash/Glossary (Hungarian) Translate-URL: https://hosted.weblate.org/projects/gnucash/glossary/hu/ Co-authored-by: Szia Tomi --- po/glossary/hu.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/po/glossary/hu.po b/po/glossary/hu.po index 2bb28f5eac..29971e7d58 100644 --- a/po/glossary/hu.po +++ b/po/glossary/hu.po @@ -12,8 +12,8 @@ msgstr "" "Report-Msgid-Bugs-To: https://bugs.gnucash.org/enter_bug." "cgi?product=GnuCash&component=Translations\n" "POT-Creation-Date: 2021-12-05 20:11+0100\n" -"PO-Revision-Date: 2023-02-23 12:38+0000\n" -"Last-Translator: mocsa \n" +"PO-Revision-Date: 2023-02-26 17:38+0000\n" +"Last-Translator: Szia Tomi \n" "Language-Team: Hungarian \n" "Language: hu\n" @@ -110,7 +110,7 @@ msgstr "számlatípus: Részvény" #. "This account type (new in gnucash-2.4.0) is used when exchanging or trading amounts from one currency into another" msgid "account type: trading" -msgstr "számlatípus: devizakonverziós" +msgstr "számlatípus: kereskedés(devizakonverziós)" #. "-" msgid "account: parent account" From de9c0eb5408ed1f90fd36abc4f1d2d4a7bc4af0a Mon Sep 17 00:00:00 2001 From: John Ralls Date: Mon, 27 Feb 2023 10:11:06 -0800 Subject: [PATCH 4/7] Bug 797903 - Transaction window: The 'blue line' is always... (erroneously) topmost when t. sorting order is inverted. Same problem for the 'red line'. Make register code aware of sort order and flip the logic when reverse sorting. --- gnucash/gnome/gnc-split-reg.c | 2 ++ .../register/ledger-core/split-register-load.c | 17 ++++++++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/gnucash/gnome/gnc-split-reg.c b/gnucash/gnome/gnc-split-reg.c index d6c37ce177..38cf709a7a 100644 --- a/gnucash/gnome/gnc-split-reg.c +++ b/gnucash/gnome/gnc-split-reg.c @@ -2148,6 +2148,8 @@ gnc_split_reg_set_sort_reversed(GNCSplitReg *gsr, gboolean rev, gboolean refresh Query *query = gnc_ledger_display_get_query( gsr->ledger ); qof_query_set_sort_increasing (query, !rev, !rev, !rev); gsr->sort_rev = rev; + Account *acct = gnc_ledger_display_leader (gsr->ledger); + xaccAccountSetSortReversed(acct, rev); if (refresh) gnc_ledger_display_refresh( gsr->ledger ); } diff --git a/gnucash/register/ledger-core/split-register-load.c b/gnucash/register/ledger-core/split-register-load.c index a86250be0b..99d8df6bd8 100644 --- a/gnucash/register/ledger-core/split-register-load.c +++ b/gnucash/register/ledger-core/split-register-load.c @@ -25,7 +25,11 @@ #include #include +#include +#include +#include "Account.h" +#include "Transaction.h" #include "account-quickfill.h" #include "combocell.h" #include "gnc-component-manager.h" @@ -373,6 +377,7 @@ gnc_split_register_load (SplitRegister* reg, GList* slist, gboolean need_divider_upper = FALSE; gboolean found_divider_upper = FALSE; gboolean found_divider = FALSE; + bool reverse_sort = xaccAccountGetSortReversed(default_account); gboolean has_last_num = FALSE; gboolean multi_line; gboolean dynamic; @@ -605,7 +610,8 @@ gnc_split_register_load (SplitRegister* reg, GList* slist, use_autoreadonly && !found_divider_upper) { - if (xaccTransGetDate (trans) >= autoreadonly_time) + if (((reverse_sort && xaccTransGetDate(trans) < autoreadonly_time) || + (!reverse_sort && xaccTransGetDate (trans) >= autoreadonly_time))) { table->model->dividing_row_upper = vcell_loc.virt_row; found_divider_upper = TRUE; @@ -616,9 +622,9 @@ gnc_split_register_load (SplitRegister* reg, GList* slist, } } - if (info->show_present_divider && - !found_divider && - (xaccTransGetDate (trans) > present)) + if (info->show_present_divider && !found_divider && + ((reverse_sort && xaccTransGetDate(trans) < present) || + (!reverse_sort && xaccTransGetDate (trans) > present))) { table->model->dividing_row = vcell_loc.virt_row; found_divider = TRUE; @@ -649,7 +655,6 @@ gnc_split_register_load (SplitRegister* reg, GList* slist, &vcell_loc); table->model->dividing_row_lower = vcell_loc.virt_row; - if (!multi_line) start_primary_color = !start_primary_color; @@ -731,7 +736,9 @@ gnc_split_register_load (SplitRegister* reg, GList* slist, &vcell_loc); if (future_after_blank) + { table->model->dividing_row_lower = vcell_loc.virt_row; + } } /* go to blank on first pass */ From ddc3f28899c71579abd9b2bd822baa6b95fc41d6 Mon Sep 17 00:00:00 2001 From: John Ralls Date: Mon, 27 Feb 2023 13:02:27 -0800 Subject: [PATCH 5/7] [kvp] Use static strings and boxed in gvalue_from_kvp_value. Saves allocating and copying complex values, avoiding potential memory leaks. --- libgnucash/engine/kvp-frame.cpp | 28 +++++++++++----------------- libgnucash/engine/kvp-value.hpp | 11 ++++++++++- libgnucash/engine/qofinstance.cpp | 10 +--------- 3 files changed, 22 insertions(+), 27 deletions(-) diff --git a/libgnucash/engine/kvp-frame.cpp b/libgnucash/engine/kvp-frame.cpp index 56be042d4c..c21370d054 100644 --- a/libgnucash/engine/kvp-frame.cpp +++ b/libgnucash/engine/kvp-frame.cpp @@ -261,15 +261,17 @@ kvp_value_list_from_gvalue (GValue *gval, gpointer pList) } GValue* -gvalue_from_kvp_value (const KvpValue *kval) +gvalue_from_kvp_value (const KvpValue *kval, GValue* val) { - GValue *val; gnc_numeric num; Time64 tm; GDate gdate; if (kval == NULL) return NULL; - val = g_slice_new0 (GValue); + if (!val) + val = g_slice_new0 (GValue); + else + g_value_unset(val); switch (kval->get_type()) { @@ -283,36 +285,28 @@ gvalue_from_kvp_value (const KvpValue *kval) break; case KvpValue::Type::NUMERIC: g_value_init (val, GNC_TYPE_NUMERIC); - num = kval->get(); - g_value_set_boxed (val, &num); + g_value_set_static_boxed (val, kval->get_ptr()); break; case KvpValue::Type::STRING: g_value_init (val, G_TYPE_STRING); - g_value_set_string (val, kval->get()); + g_value_set_static_string (val, kval->get()); break; case KvpValue::Type::GUID: g_value_init (val, GNC_TYPE_GUID); - g_value_set_boxed (val, kval->get()); + g_value_set_static_boxed (val, kval->get()); break; case KvpValue::Type::TIME64: g_value_init (val, GNC_TYPE_TIME64); - tm = kval->get(); - g_value_set_boxed (val, &tm); + g_value_set_boxed (val, kval->get_ptr()); break; case KvpValue::Type::GDATE: g_value_init (val, G_TYPE_DATE); - gdate = kval->get(); - g_value_set_boxed (val, &gdate); + g_value_set_static_boxed (val, kval->get_ptr()); break; case KvpValue::Type::GLIST: { - GList *gvalue_list = NULL; - GList *kvp_list = kval->get(); - g_list_foreach (kvp_list, (GFunc)gvalue_list_from_kvp_value, - &gvalue_list); g_value_init (val, GNC_TYPE_VALUE_LIST); - gvalue_list = g_list_reverse (gvalue_list); - g_value_set_boxed (val, gvalue_list); + g_value_set_static_boxed (val, kval->get()); break; } /* No transfer of KVP frames outside of QofInstance-derived classes! */ diff --git a/libgnucash/engine/kvp-value.hpp b/libgnucash/engine/kvp-value.hpp index 61b7dfd99f..e7083b2f24 100644 --- a/libgnucash/engine/kvp-value.hpp +++ b/libgnucash/engine/kvp-value.hpp @@ -142,6 +142,8 @@ struct KvpValueImpl template T get() const noexcept; + template + const T* get_ptr() const noexcept; template void set(T) noexcept; @@ -178,6 +180,13 @@ KvpValueImpl::get() const noexcept return boost::get(datastore); } +template const T* +KvpValueImpl::get_ptr() const noexcept +{ + if (this->datastore.type() != typeid(T)) return nullptr; + return boost::get(&datastore); +} + template void KvpValueImpl::set(T val) noexcept { @@ -190,7 +199,7 @@ KvpValueImpl::set(T val) noexcept * @param kval: A KvpValue. * @return GValue*. Must be freed with g_free(). */ -GValue* gvalue_from_kvp_value (const KvpValue *kval); +GValue* gvalue_from_kvp_value (const KvpValue *kval, GValue* val = nullptr); /** Convert a gvalue into a kvpvalue. * @param gval: A GValue of a type KvpValue can digest. diff --git a/libgnucash/engine/qofinstance.cpp b/libgnucash/engine/qofinstance.cpp index 16b964b7ed..97c3063e4e 100644 --- a/libgnucash/engine/qofinstance.cpp +++ b/libgnucash/engine/qofinstance.cpp @@ -1090,15 +1090,7 @@ qof_instance_get_kvp (QofInstance * inst, GValue * value, unsigned count, ...) for (unsigned i{0}; i < count; ++i) path.push_back (va_arg (args, char const *)); va_end (args); - auto temp = gvalue_from_kvp_value (inst->kvp_data->get_slot (path)); - if (G_IS_VALUE (temp)) - { - if (G_IS_VALUE (value)) - g_value_unset (value); - g_value_init (value, G_VALUE_TYPE (temp)); - g_value_copy (temp, value); - gnc_gvalue_free (temp); - } + gvalue_from_kvp_value (inst->kvp_data->get_slot (path), value); } void From 8a7c53925870501c8f103c8f09961ecba3341c84 Mon Sep 17 00:00:00 2001 From: John Ralls Date: Mon, 27 Feb 2023 14:54:46 -0800 Subject: [PATCH 6/7] Bug 798748 - Transaction Notes field's value does not appear in... reverse transaction. The proximate cause was that xaccTransBeginEdit put the KVP cache variable of the new transaction in a state that prevented the value from being copied. More generally the KVP cache variables didn't handle any invalidating events. With the change to GValue usage in qof_instance_get_kvp it's now a simple memory dereference with no copying except for POD types so caching is no longer useful. This commit removes caching from Transaction, eliminating the notes problem. --- libgnucash/engine/Transaction.c | 164 ++++++-------------- libgnucash/engine/TransactionP.h | 16 +- libgnucash/engine/mocks/gmock-Transaction.h | 2 - 3 files changed, 53 insertions(+), 129 deletions(-) diff --git a/libgnucash/engine/Transaction.c b/libgnucash/engine/Transaction.c index 4b1888cc36..987706f74f 100644 --- a/libgnucash/engine/Transaction.c +++ b/libgnucash/engine/Transaction.c @@ -255,9 +255,6 @@ void gen_event_trans (Transaction *trans) } } -static const char* -is_unset = "unset"; - /* GObject Initialization */ G_DEFINE_TYPE(Transaction, gnc_transaction, QOF_TYPE_INSTANCE) @@ -274,11 +271,6 @@ gnc_transaction_init(Transaction* trans) trans->date_posted = 0; trans->marker = 0; trans->orig = NULL; - trans->readonly_reason = (char*) is_unset; - trans->isClosingTxn_cached = -1; - trans->notes = (char*) is_unset; - trans->doclink = (char*) is_unset; - trans->void_reason = (char*) is_unset; trans->txn_type = TXN_TYPE_UNCACHED; LEAVE (" "); } @@ -821,24 +813,12 @@ xaccFreeTransaction (Transaction *trans) /* free up transaction strings */ CACHE_REMOVE(trans->num); CACHE_REMOVE(trans->description); - if (trans->readonly_reason != is_unset) - g_free (trans->readonly_reason); - if (trans->doclink != is_unset) - g_free (trans->doclink); - if (trans->void_reason != is_unset) - g_free (trans->void_reason); - if (trans->notes != is_unset) - g_free (trans->notes); /* Just in case someone looks up freed memory ... */ trans->num = (char *) 1; trans->description = NULL; trans->date_entered = 0; trans->date_posted = 0; - trans->readonly_reason = NULL; - trans->doclink = NULL; - trans->notes = NULL; - trans->void_reason = NULL; if (trans->orig) { xaccFreeTransaction (trans->orig); @@ -2047,7 +2027,7 @@ xaccTransSetDatePostedGDate (Transaction *trans, GDate date) * the future a date which was set as *date* (without time) can * clearly be distinguished from the time64. */ g_value_init (&v, G_TYPE_DATE); - g_value_set_boxed (&v, &date); + g_value_set_static_boxed (&v, &date); qof_instance_set_kvp (QOF_INSTANCE(trans), &v, 1, TRANS_DATE_POSTED); g_value_unset (&v); /* mark dirty and commit handled by SetDateInternal */ @@ -2105,7 +2085,7 @@ xaccTransSetDateDue (Transaction * trans, time64 time) GValue v = G_VALUE_INIT; if (!trans) return; g_value_init (&v, GNC_TYPE_TIME64); - g_value_set_boxed (&v, &time); + 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_dirty(QOF_INSTANCE(trans)); @@ -2126,7 +2106,7 @@ xaccTransSetTxnType (Transaction *trans, char type) g_value_unset (&v); return; } - g_value_set_string (&v, s); + 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)); @@ -2142,10 +2122,6 @@ void xaccTransClearReadOnly (Transaction *trans) qof_instance_set_kvp (QOF_INSTANCE (trans), NULL, 1, TRANS_READ_ONLY_REASON); qof_instance_set_dirty(QOF_INSTANCE(trans)); xaccTransCommitEdit(trans); - - if (trans->readonly_reason != is_unset) - g_free (trans->readonly_reason); - trans->readonly_reason = NULL; } } @@ -2156,16 +2132,12 @@ xaccTransSetReadOnly (Transaction *trans, const char *reason) { GValue v = G_VALUE_INIT; g_value_init (&v, G_TYPE_STRING); - g_value_set_string (&v, reason); + 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); - - if (trans->readonly_reason != is_unset) - g_free (trans->readonly_reason); - trans->readonly_reason = g_strdup (reason); } } @@ -2218,25 +2190,16 @@ xaccTransSetDocLink (Transaction *trans, const char *doclink) { if (!trans || !doclink) return; - if (trans->doclink != is_unset) - { - if (!g_strcmp0 (doclink, trans->doclink)) - return; - - g_free (trans->doclink); - } xaccTransBeginEdit(trans); if (doclink[0] == '\0') { - trans->doclink = NULL; qof_instance_set_kvp (QOF_INSTANCE (trans), NULL, 1, doclink_uri_str); } else { GValue v = G_VALUE_INIT; - trans->doclink = g_strdup (doclink); g_value_init (&v, G_TYPE_STRING); - g_value_set_string (&v, doclink); + 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); } @@ -2257,18 +2220,9 @@ xaccTransSetNotes (Transaction *trans, const char *notes) { GValue v = G_VALUE_INIT; if (!trans || !notes) return; - if (trans->notes != is_unset) - { - if (!g_strcmp0 (notes, trans->notes)) - return; - - g_free (trans->notes); - } g_value_init (&v, G_TYPE_STRING); - g_value_set_string (&v, notes); + g_value_set_static_string (&v, notes); xaccTransBeginEdit(trans); - - trans->notes = g_strdup (notes); qof_instance_set_kvp (QOF_INSTANCE (trans), &v, 1, trans_notes_str); qof_instance_set_dirty(QOF_INSTANCE(trans)); g_value_unset (&v); @@ -2288,12 +2242,10 @@ xaccTransSetIsClosingTxn (Transaction *trans, gboolean is_closing) g_value_set_int64 (&v, 1); qof_instance_set_kvp (QOF_INSTANCE (trans), &v, 1, trans_is_closing_str); g_value_unset (&v); - trans->isClosingTxn_cached = 1; } else { qof_instance_set_kvp (QOF_INSTANCE (trans), NULL, 1, trans_is_closing_str); - trans->isClosingTxn_cached = 0; } qof_instance_set_dirty(QOF_INSTANCE(trans)); xaccTransCommitEdit(trans); @@ -2431,50 +2383,46 @@ const char * xaccTransGetDocLink (const Transaction *trans) { g_return_val_if_fail (trans, NULL); - if (trans->doclink == is_unset) - { - GValue v = G_VALUE_INIT; - Transaction *t = (Transaction*) trans; - qof_instance_get_kvp (QOF_INSTANCE (trans), &v, 1, doclink_uri_str); - t->doclink = G_VALUE_HOLDS_STRING (&v) ? g_value_dup_string (&v) : NULL; - g_value_unset (&v); - } - return trans->doclink; + + GValue v = G_VALUE_INIT; + Transaction *t = (Transaction*) trans; + 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) : NULL; + g_value_unset (&v); + + return doclink; } const char * xaccTransGetNotes (const Transaction *trans) { g_return_val_if_fail (trans, NULL); - if (trans->notes == is_unset) - { - GValue v = G_VALUE_INIT; - Transaction *t = (Transaction*) trans; - qof_instance_get_kvp (QOF_INSTANCE (trans), &v, 1, trans_notes_str); - t->notes = G_VALUE_HOLDS_STRING (&v) ? g_value_dup_string (&v) : NULL; - g_value_unset (&v); - } - return trans->notes; + + GValue v = G_VALUE_INIT; + Transaction *t = (Transaction*) trans; + qof_instance_get_kvp (QOF_INSTANCE (trans), &v, 1, trans_notes_str); + const char *notes = G_VALUE_HOLDS_STRING (&v) ? g_value_dup_string (&v) : NULL; + g_value_unset (&v); + + return notes; } gboolean xaccTransGetIsClosingTxn (const Transaction *trans) { if (!trans) return FALSE; - if (trans->isClosingTxn_cached == -1) - { - Transaction* trans_nonconst = (Transaction*) trans; - GValue v = G_VALUE_INIT; - qof_instance_get_kvp (QOF_INSTANCE (trans), &v, 1, trans_is_closing_str); - if (G_VALUE_HOLDS_INT64 (&v)) - trans_nonconst->isClosingTxn_cached = (g_value_get_int64 (&v) ? 1 : 0); - else - trans_nonconst->isClosingTxn_cached = 0; - g_value_unset (&v); - } - return (trans->isClosingTxn_cached == 1) - ? TRUE - : FALSE; + + Transaction* trans_nonconst = (Transaction*) trans; + GValue v = G_VALUE_INIT; + gboolean rv; + qof_instance_get_kvp (QOF_INSTANCE (trans), &v, 1, trans_is_closing_str); + if (G_VALUE_HOLDS_INT64 (&v)) + rv = (g_value_get_int64 (&v) ? 1 : 0); + else + rv = 0; + g_value_unset (&v); + + return rv; } /********************************************************************\ @@ -2604,15 +2552,12 @@ xaccTransGetReadOnly (Transaction *trans) if (!trans) return NULL; - if (trans->readonly_reason == is_unset) - { - GValue v = G_VALUE_INIT; - qof_instance_get_kvp (QOF_INSTANCE(trans), &v, 1, TRANS_READ_ONLY_REASON); - trans->readonly_reason = G_VALUE_HOLDS_STRING (&v) ? - g_value_dup_string (&v) : NULL; - g_value_unset (&v); - } - return trans->readonly_reason; + 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) : NULL; + g_value_unset (&v); + return readonly_reason; } static gboolean @@ -2810,16 +2755,13 @@ xaccTransVoid(Transaction *trans, const char *reason) else g_value_init (&v, G_TYPE_STRING); - g_value_set_string (&v, _("Voided transaction")); + g_value_set_static_string (&v, _("Voided transaction")); qof_instance_set_kvp (QOF_INSTANCE (trans), &v, 1, trans_notes_str); - g_value_set_string (&v, reason); + g_value_set_static_string (&v, reason); qof_instance_set_kvp (QOF_INSTANCE (trans), &v, 1, void_reason_str); - if (trans->void_reason != is_unset) - g_free (trans->void_reason); - trans->void_reason = g_strdup (reason); gnc_time64_to_iso8601_buff (gnc_time(NULL), iso8601_str); - g_value_set_string (&v, 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); @@ -2841,15 +2783,13 @@ const char * xaccTransGetVoidReason(const Transaction *trans) { g_return_val_if_fail (trans, NULL); - if (trans->void_reason == is_unset) - { - GValue v = G_VALUE_INIT; - Transaction *t = (Transaction*) trans; - qof_instance_get_kvp (QOF_INSTANCE (trans), &v, 1, void_reason_str); - t->void_reason = G_VALUE_HOLDS_STRING (&v) ? g_value_dup_string (&v) : NULL; - g_value_unset (&v); - } - return trans->void_reason; + + 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) : NULL; + g_value_unset (&v); + + return void_reason; } time64 @@ -2889,8 +2829,6 @@ xaccTransUnvoid (Transaction *trans) qof_instance_set_kvp (QOF_INSTANCE (trans), NULL, 1, void_reason_str); qof_instance_set_kvp (QOF_INSTANCE (trans), NULL, 1, void_time_str); g_value_unset (&v); - g_free (trans->void_reason); - trans->void_reason = NULL; FOR_EACH_SPLIT(trans, xaccSplitUnvoid(s)); @@ -2927,7 +2865,7 @@ xaccTransReverse (Transaction *orig) /* Now update the original with a pointer to the new one */ g_value_init (&v, GNC_TYPE_GUID); - g_value_set_boxed (&v, xaccTransGetGUID(trans)); + g_value_set_static_boxed (&v, xaccTransGetGUID(trans)); qof_instance_set_kvp (QOF_INSTANCE (orig), &v, 1, TRANS_REVERSED_BY); g_value_unset (&v); diff --git a/libgnucash/engine/TransactionP.h b/libgnucash/engine/TransactionP.h index 3e107ff390..0a22be0cc3 100644 --- a/libgnucash/engine/TransactionP.h +++ b/libgnucash/engine/TransactionP.h @@ -111,23 +111,11 @@ struct transaction_s */ Transaction *orig; - /* The readonly_reason is a string that indicates why a transaction - * is marked as read-only. If NULL, the transaction is read-write. - * This value is stored in kvp, but we cache a copy here for - * performance reasons. + /* A flag to indicate when a transaction represents an invoice, a payment, + * or a link between the two. */ - char * readonly_reason; - - char * doclink; - char * void_reason; - char * notes; - char txn_type; - /* Cached bool value to indicate whether this is a closing txn. This is - * cached from the KVP value because it is queried a lot. Tri-state value: -1 - * = uninitialized; 0 = FALSE, 1 = TRUE. */ - gint isClosingTxn_cached; }; struct _TransactionClass diff --git a/libgnucash/engine/mocks/gmock-Transaction.h b/libgnucash/engine/mocks/gmock-Transaction.h index ce82437fa7..e9dcd53fc2 100644 --- a/libgnucash/engine/mocks/gmock-Transaction.h +++ b/libgnucash/engine/mocks/gmock-Transaction.h @@ -32,8 +32,6 @@ public: date_posted = 0; marker = 0; orig = nullptr; - readonly_reason = nullptr; - isClosingTxn_cached = -1; } void* operator new(size_t size) { From 7f0353adc4b0dc73586bdf056dc5a97eda2599f9 Mon Sep 17 00:00:00 2001 From: John Ralls Date: Mon, 27 Feb 2023 16:09:27 -0800 Subject: [PATCH 7/7] Fix a missed g_value_dup_string and some no longer used variables. --- libgnucash/engine/Transaction.c | 5 +---- libgnucash/engine/kvp-frame.cpp | 15 --------------- 2 files changed, 1 insertion(+), 19 deletions(-) diff --git a/libgnucash/engine/Transaction.c b/libgnucash/engine/Transaction.c index 987706f74f..1a77c4146e 100644 --- a/libgnucash/engine/Transaction.c +++ b/libgnucash/engine/Transaction.c @@ -2385,7 +2385,6 @@ xaccTransGetDocLink (const Transaction *trans) g_return_val_if_fail (trans, NULL); GValue v = G_VALUE_INIT; - Transaction *t = (Transaction*) trans; 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) : NULL; g_value_unset (&v); @@ -2399,9 +2398,8 @@ xaccTransGetNotes (const Transaction *trans) g_return_val_if_fail (trans, NULL); GValue v = G_VALUE_INIT; - Transaction *t = (Transaction*) trans; qof_instance_get_kvp (QOF_INSTANCE (trans), &v, 1, trans_notes_str); - const char *notes = G_VALUE_HOLDS_STRING (&v) ? g_value_dup_string (&v) : NULL; + const char *notes = G_VALUE_HOLDS_STRING (&v) ? g_value_get_string (&v) : NULL; g_value_unset (&v); return notes; @@ -2412,7 +2410,6 @@ xaccTransGetIsClosingTxn (const Transaction *trans) { if (!trans) return FALSE; - Transaction* trans_nonconst = (Transaction*) trans; GValue v = G_VALUE_INIT; gboolean rv; qof_instance_get_kvp (QOF_INSTANCE (trans), &v, 1, trans_is_closing_str); diff --git a/libgnucash/engine/kvp-frame.cpp b/libgnucash/engine/kvp-frame.cpp index c21370d054..48d300b4e1 100644 --- a/libgnucash/engine/kvp-frame.cpp +++ b/libgnucash/engine/kvp-frame.cpp @@ -238,17 +238,6 @@ int compare(const KvpFrameImpl & one, const KvpFrameImpl & two) noexcept return 0; } - -static void -gvalue_list_from_kvp_value (KvpValue *kval, gpointer pList) -{ - GList **gvlist = NULL; - GValue *gval = gvalue_from_kvp_value (kval); - gvlist = (GList**)pList; - if (G_VALUE_TYPE (gval)) - *gvlist = g_list_prepend (*gvlist, gval); -} - static void kvp_value_list_from_gvalue (GValue *gval, gpointer pList) { @@ -263,10 +252,6 @@ kvp_value_list_from_gvalue (GValue *gval, gpointer pList) GValue* gvalue_from_kvp_value (const KvpValue *kval, GValue* val) { - gnc_numeric num; - Time64 tm; - GDate gdate; - if (kval == NULL) return NULL; if (!val) val = g_slice_new0 (GValue);