gnucash maint: Multiple changes pushed

Geert Janssens gjanssens at code.gnucash.org
Thu Apr 26 17:07:00 EDT 2018


Updated	 via  https://github.com/Gnucash/gnucash/commit/74fd6e04 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/2498f939 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/c7120462 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/4aadfbe6 (commit)
	from  https://github.com/Gnucash/gnucash/commit/0106a771 (commit)



commit 74fd6e046b42a255b1f29ebfb0471616003a851f
Author: Geert Janssens <geert at kobaltwit.be>
Date:   Thu Apr 26 23:05:55 2018 +0200

    Add a few unit tests for qofquerycore

diff --git a/libgnucash/engine/test/CMakeLists.txt b/libgnucash/engine/test/CMakeLists.txt
index 74ec718..e1818cc 100644
--- a/libgnucash/engine/test/CMakeLists.txt
+++ b/libgnucash/engine/test/CMakeLists.txt
@@ -202,6 +202,12 @@ SET(test_import_map_SOURCES
 GNC_ADD_TEST(test-import-map "${test_import_map_SOURCES}"
   gtest_engine_INCLUDES gtest_old_engine_LIBS)
 
+set(test_qofquerycore_SOURCES
+gtest-qofquerycore.cpp
+${GTEST_SRC})
+gnc_add_test(test-qofquerycore "${test_qofquerycore_SOURCES}"
+  gtest_engine_INCLUDES gtest_old_engine_LIBS)
+
 ############################
 # This is a C test that needs GUILE environment variables set.
 # It does not pass on Win32.
diff --git a/libgnucash/engine/test/gtest-qofquerycore.cpp b/libgnucash/engine/test/gtest-qofquerycore.cpp
new file mode 100644
index 0000000..353bee0
--- /dev/null
+++ b/libgnucash/engine/test/gtest-qofquerycore.cpp
@@ -0,0 +1,196 @@
+/********************************************************************\
+ * gtest-qofquerycore.cpp -- Unit tests for qofquerycore            *
+ *                                                                  *
+ * Copyright 2018 Geert Janssens <geert at kobaltwit.be>               *
+ *                                                                  *
+ * This program is free software; you can redistribute it and/or    *
+ * modify it under the terms of the GNU General Public License as   *
+ * published by the Free Software Foundation; either version 2 of   *
+ * the License, or (at your option) any later version.              *
+ *                                                                  *
+ * This program is distributed in the hope that it will be useful,  *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of   *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *
+ * GNU General Public License for more details.                     *
+ *                                                                  *
+ * You should have received a copy of the GNU General Public License*
+ * along with this program; if not, contact:                        *
+ *                                                                  *
+ * Free Software Foundation           Voice:  +1-617-542-5942       *
+ * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652       *
+ * Boston, MA  02110-1301,  USA       gnu at gnu.org                   *
+ *                                                                  *
+ \ *********************************************************************/
+
+#include <config.h>
+#include <glib.h>
+#include "../test-core/test-engine-stuff.h"
+#include "../qofquerycore.h"
+#include "../qofquerycore-p.h"
+#include <gtest/gtest.h>
+
+TEST(qof_query_construct_predicate, string)
+{
+    query_string_def *pdata;
+    pdata = (query_string_def*)qof_query_string_predicate(
+        QOF_COMPARE_EQUAL,
+        "Test",
+        QOF_STRING_MATCH_NORMAL,
+        FALSE
+    );
+    EXPECT_STREQ (QOF_TYPE_STRING,      pdata->pd.type_name);
+    EXPECT_EQ (QOF_COMPARE_EQUAL,       pdata->pd.how);
+    EXPECT_EQ (QOF_STRING_MATCH_NORMAL, pdata->options);
+    EXPECT_STREQ ("Test",               pdata->matchstring);
+    EXPECT_EQ (FALSE,                   pdata->is_regex);
+}
+
+TEST(qof_query_construct_predicate, date)
+{
+    query_date_def *pdata;
+    pdata = (query_date_def*)qof_query_date_predicate(
+        QOF_COMPARE_LT,
+        QOF_DATE_MATCH_DAY,
+        1524772012
+    );
+    EXPECT_STREQ (QOF_TYPE_DATE,   pdata->pd.type_name);
+    EXPECT_EQ (QOF_COMPARE_LT,     pdata->pd.how);
+    EXPECT_EQ (QOF_DATE_MATCH_DAY, pdata->options);
+    EXPECT_EQ (1524772012,         pdata->date);
+}
+
+TEST(qof_query_construct_predicate, numeric)
+{
+    query_numeric_def *pdata;
+    pdata = (query_numeric_def*)qof_query_numeric_predicate(
+        QOF_COMPARE_LTE,
+        QOF_NUMERIC_MATCH_CREDIT,
+        { 500, 100 }
+    );
+    EXPECT_STREQ (QOF_TYPE_NUMERIC,      pdata->pd.type_name);
+    EXPECT_EQ (QOF_COMPARE_LTE,          pdata->pd.how);
+    EXPECT_EQ (QOF_NUMERIC_MATCH_CREDIT, pdata->options);
+    EXPECT_TRUE (gnc_numeric_eq({ 500, 100 }, pdata->amount));
+}
+
+TEST(qof_query_construct_predicate, guid)
+{
+    GncGUID *guid = guid_new();
+    GList *guidlist = g_list_prepend (NULL, guid);
+    query_guid_def *pdata;
+    pdata = (query_guid_def*)qof_query_guid_predicate(
+        QOF_GUID_MATCH_ANY,
+        guidlist
+    );
+    EXPECT_STREQ (QOF_TYPE_GUID,   pdata->pd.type_name);
+    EXPECT_EQ (QOF_GUID_MATCH_ANY, pdata->options);
+    EXPECT_TRUE (guid_equal (guid, (const GncGUID*)pdata->guids->data));
+    EXPECT_EQ (NULL,               pdata->guids->next);
+}
+
+TEST(qof_query_construct_predicate, int32)
+{
+    query_int32_def *pdata;
+    pdata = (query_int32_def*)qof_query_int32_predicate(
+        QOF_COMPARE_EQUAL,
+        -613
+    );
+    EXPECT_STREQ (QOF_TYPE_INT32, pdata->pd.type_name);
+    EXPECT_EQ (QOF_COMPARE_EQUAL, pdata->pd.how);
+    EXPECT_EQ (-613,              pdata->val);
+}
+
+TEST(qof_query_construct_predicate, int64)
+{
+    query_int64_def *pdata;
+    pdata = (query_int64_def*)qof_query_int64_predicate(
+        QOF_COMPARE_GT,
+        1000000
+    );
+    EXPECT_STREQ (QOF_TYPE_INT64, pdata->pd.type_name);
+    EXPECT_EQ (QOF_COMPARE_GT,    pdata->pd.how);
+    EXPECT_EQ (1000000,           pdata->val);
+}
+
+TEST(qof_query_construct_predicate, double)
+{
+    query_double_def *pdata;
+    pdata = (query_double_def*)qof_query_double_predicate(
+        QOF_COMPARE_GTE,
+        10.05
+    );
+    EXPECT_STREQ (QOF_TYPE_DOUBLE, pdata->pd.type_name);
+    EXPECT_EQ (QOF_COMPARE_GTE,    pdata->pd.how);
+    EXPECT_EQ (10.05,              pdata->val);
+}
+
+TEST(qof_query_construct_predicate, boolean)
+{
+    query_boolean_def *pdata;
+    pdata = (query_boolean_def*)qof_query_boolean_predicate(
+        QOF_COMPARE_NEQ,
+        TRUE
+    );
+    EXPECT_STREQ (QOF_TYPE_BOOLEAN, pdata->pd.type_name);
+    EXPECT_EQ (QOF_COMPARE_NEQ,     pdata->pd.how);
+    EXPECT_EQ (TRUE,                pdata->val);
+}
+
+TEST(qof_query_construct_predicate, char)
+{
+    query_char_def *pdata;
+    pdata = (query_char_def*)qof_query_char_predicate(
+        QOF_CHAR_MATCH_ANY,
+        "Foo"
+    );
+    EXPECT_STREQ (QOF_TYPE_CHAR,   pdata->pd.type_name);
+    EXPECT_EQ (QOF_COMPARE_EQUAL,  pdata->pd.how);
+    EXPECT_EQ (QOF_CHAR_MATCH_ANY, pdata->options);
+    EXPECT_STREQ ("Foo",           pdata->char_list);
+}
+
+TEST(qof_query_core_predicate_copy, date)
+{
+    qof_query_core_init();
+    query_date_def *pdata, *pdata2;
+    pdata = (query_date_def*)qof_query_date_predicate(
+        QOF_COMPARE_LT,
+        QOF_DATE_MATCH_DAY,
+        1524772012
+    );
+    pdata2 = (query_date_def*) qof_query_core_predicate_copy ((QofQueryPredData*)pdata);
+
+    EXPECT_STREQ (pdata2->pd.type_name, pdata->pd.type_name);
+    EXPECT_EQ (pdata2->pd.how,          pdata->pd.how);
+    EXPECT_EQ (pdata2->options,         pdata->options);
+    EXPECT_EQ (pdata2->date,            pdata->date);
+}
+
+TEST(qof_query_core_predicate_get_date, date)
+{
+    qof_query_core_init();
+    time64 date;
+    QofQueryPredData *pdata;
+    pdata = qof_query_date_predicate(
+        QOF_COMPARE_LT,
+        QOF_DATE_MATCH_DAY,
+        1524772012
+    );
+
+    EXPECT_TRUE (qof_query_date_predicate_get_date(pdata, &date));
+    EXPECT_EQ (1524772012, date);
+}
+
+TEST(qof_query_core_predicate_get_date, numeric)
+{
+    qof_query_core_init();
+    time64 date;
+    QofQueryPredData *pdata;
+    pdata = qof_query_numeric_predicate(
+        QOF_COMPARE_LT,
+        QOF_NUMERIC_MATCH_CREDIT,
+        { 1000, 100 }
+    );
+
+    EXPECT_FALSE (qof_query_date_predicate_get_date(pdata, &date));
+}

commit 2498f9393dcfed049c1f46a2b9c37fa467e626ad
Author: Geert Janssens <geert at kobaltwit.be>
Date:   Thu Apr 26 23:01:28 2018 +0200

    Update make-testfile for new sourcefile locations

diff --git a/test-templates/make-testfile b/test-templates/make-testfile
index 3c4aa15..2e989ad 100755
--- a/test-templates/make-testfile
+++ b/test-templates/make-testfile
@@ -93,10 +93,10 @@ sub search_external {
     my @excludes = qw(test* utest* swig* gnucash_core.c);
     push @excludes, $infile;
     my $exclude_string = "--exclude=" . join(" --exclude=", @excludes);
-    my $calls = `egrep -r $name --include="*.c" $exclude_string src | wc -l`;
+    my $calls = `egrep -r $name --include="*.c" $exclude_string bindings common gnucash libgnucash | wc -l`;
     chomp $calls;
     $calls =~ s/\s//g;
-    my $files = `egrep -rl $name --include="*.c" $exclude_string src | wc -l`;
+    my $files = `egrep -rl $name --include="*.c" $exclude_string bindings common gnucash libgnucash | wc -l`;
     chomp $files;
     $files =~ s/\s//g;
 
@@ -107,10 +107,10 @@ sub search_scheme {
     my ($name) = @_;
     $name =~ tr/_/-/;
     my $egrepre = '\b' . $name . '[^\w_-]';
-    my $calls = `egrep -r "$egrepre"  --include="*.scm" src | wc -l`;
+    my $calls = `egrep -r "$egrepre"  --include="*.scm" bindings common gnucash libgnucash | wc -l`;
     chomp $calls;
     $calls =~ s/\s//g;
-    my $files = `egrep -rl "$egrepre" --include="*.scm" src | wc -l`;
+    my $files = `egrep -rl "$egrepre" --include="*.scm" bindings common gnucash libgnucash | wc -l`;
     chomp $files;
     $files =~ s/\s//g;
 
@@ -119,10 +119,10 @@ sub search_scheme {
 
 sub search_glade {
     my ($name) = @_;
-    my $calls = `egrep -r $name --include="*.glade" --include=*.xml"  --include=*.ui" src | wc -l`;
+    my $calls = `egrep -r $name --include="*.glade" --include=*.xml"  --include=*.ui" bindings common gnucash libgnucash | wc -l`;
     chomp $calls;
     $calls =~ s/\s//g;
-    my $files = `egrep -rl $name --include="*.glade" --include=*.xml"  --include=*.ui" src | wc -l`;
+    my $files = `egrep -rl $name --include="*.glade" --include=*.xml"  --include=*.ui" bindings common gnucash libgnucash | wc -l`;
     chomp $files;
     $files =~ s/\s//g;
 
@@ -277,8 +277,8 @@ make_testfile "Author Name <author at email.addr>" path/to/input [path/to/output]
 
 Creates template unit test files from C source files. The default
 output file is utest-filename in a subdirectory named "test". For
-example, if the input file is src/engine/Account.c, the default output
-file will be src/engine/test/utest-Account.c.
+example, if the input file is libgnucash/engine/Account.c, the default output
+file will be libgnucash/engine/test/utest-Account.c.
 
 The program scans the input file to find function signatures. Each
 function signature will generate a comment with the function's

commit c71204628d2e139c7668b22e89faf8e434347d41
Author: Geert Janssens <geert at kobaltwit.be>
Date:   Thu Apr 26 15:48:06 2018 +0200

    Bug 795031 - 3.0 Crashes on loading when opening 2.6.19 file

diff --git a/gnucash/gnome-search/search-date.c b/gnucash/gnome-search/search-date.c
index b78b632..9523c3f 100644
--- a/gnucash/gnome-search/search-date.c
+++ b/gnucash/gnome-search/search-date.c
@@ -113,7 +113,7 @@ gnc_search_date_class_init (GNCSearchDateClass *klass)
 static void
 gnc_search_date_init (GNCSearchDate *o)
 {
-    o->ts.tv_sec = gnc_time (NULL);
+    o->tt = gnc_time (NULL);
     o->how = QOF_COMPARE_LT;
 }
 
@@ -148,12 +148,12 @@ gnc_search_date_new (void)
 }
 
 void
-gnc_search_date_set_date (GNCSearchDate *fi, Timespec ts)
+gnc_search_date_set_date (GNCSearchDate *fi, time64 tt)
 {
     g_return_if_fail (fi);
     g_return_if_fail (IS_GNCSEARCH_DATE (fi));
 
-    fi->ts = ts;
+    fi->tt = tt;
 }
 
 void
@@ -181,7 +181,7 @@ gncs_validate (GNCSearchCoreType *fe)
 static void
 date_changed (GNCDateEdit *date_edit, GNCSearchDate *fe)
 {
-    fe->ts = gnc_date_edit_get_date_ts (date_edit);
+    fe->tt = gnc_date_edit_get_date (date_edit);
 }
 
 static GtkWidget *
@@ -251,7 +251,7 @@ gncs_get_widget (GNCSearchCoreType *fe)
     gtk_box_pack_start (GTK_BOX (box), menu, FALSE, FALSE, 3);
 
     /* Build and connect the date entry window */
-    entry = gnc_date_edit_new_ts (fi->ts, FALSE, FALSE);
+    entry = gnc_date_edit_new (fi->tt, FALSE, FALSE);
     g_signal_connect (G_OBJECT (entry), "date_changed", G_CALLBACK (date_changed), fe);
     gtk_box_pack_start (GTK_BOX (box), entry, FALSE, FALSE, 3);
     g_object_ref (entry);
@@ -272,9 +272,9 @@ static QofQueryPredData* gncs_get_predicate (GNCSearchCoreType *fe)
     /* Make sure we actually use the currently-entered date */
     priv = _PRIVATE(fi);
     if (priv->entry)
-        fi->ts = gnc_date_edit_get_date_ts (GNC_DATE_EDIT (priv->entry));
+        fi->tt = gnc_date_edit_get_date (GNC_DATE_EDIT (priv->entry));
 
-    return qof_query_date_predicate (fi->how, QOF_DATE_MATCH_NORMAL, fi->ts);
+    return qof_query_date_predicate (fi->how, QOF_DATE_MATCH_NORMAL, fi->tt);
 }
 
 static GNCSearchCoreType *gncs_clone(GNCSearchCoreType *fe)
@@ -285,7 +285,7 @@ static GNCSearchCoreType *gncs_clone(GNCSearchCoreType *fe)
     g_return_val_if_fail (IS_GNCSEARCH_DATE (fse), NULL);
 
     se = gnc_search_date_new ();
-    gnc_search_date_set_date (se, fse->ts);
+    gnc_search_date_set_date (se, fse->tt);
     gnc_search_date_set_how (se, fse->how);
 
     return (GNCSearchCoreType *)se;
diff --git a/gnucash/gnome-search/search-date.h b/gnucash/gnome-search/search-date.h
index f8750a6..766ff06 100644
--- a/gnucash/gnome-search/search-date.h
+++ b/gnucash/gnome-search/search-date.h
@@ -38,8 +38,8 @@ struct _GNCSearchDate
 {
     GNCSearchCoreType parent;
 
-    QofQueryCompare	how;
-    Timespec		ts;
+    QofQueryCompare   how;
+    time64            tt;
 };
 
 struct _GNCSearchDateClass
@@ -55,7 +55,7 @@ GType		gnc_search_date_get_type	(void);
 GNCSearchDate	*gnc_search_date_new	(void);
 
 /* methods */
-void	gnc_search_date_set_date (GNCSearchDate *fi, Timespec ts);
+void	gnc_search_date_set_date (GNCSearchDate *fi, time64 tt);
 void	gnc_search_date_set_how (GNCSearchDate *fi, QofQueryCompare how);
 
 #endif /* ! _GNCSEARCH_DATE_H */
diff --git a/gnucash/gnome/assistant-acct-period.c b/gnucash/gnome/assistant-acct-period.c
index c2a22b5..87a503a 100644
--- a/gnucash/gnome/assistant-acct-period.c
+++ b/gnucash/gnome/assistant-acct-period.c
@@ -149,7 +149,6 @@ get_num_xactions_before_date(QofBook *book, time64 close_date)
     QofQuery *q;
     GSList *param;
     QofQueryPredData *pred;
-    Timespec ts;
     GList *res, *n;
     int cnt = 0;
 
@@ -159,8 +158,7 @@ get_num_xactions_before_date(QofBook *book, time64 close_date)
 
     /* Look for transactions earlier than the closing date */
     param = g_slist_prepend (NULL, TRANS_DATE_POSTED);
-    timespecFromTime64 (&ts, close_date);
-    pred = qof_query_date_predicate (QOF_COMPARE_LTE, QOF_DATE_MATCH_NORMAL, ts);
+    pred = qof_query_date_predicate (QOF_COMPARE_LTE, QOF_DATE_MATCH_NORMAL, close_date);
     qof_query_add_term (q,  param, pred, QOF_QUERY_FIRST_TERM);
 
     /* Run the query, find how many transactions there are */
diff --git a/gnucash/gnome/dialog-invoice.c b/gnucash/gnome/dialog-invoice.c
index 043666f..82afc93 100644
--- a/gnucash/gnome/dialog-invoice.c
+++ b/gnucash/gnome/dialog-invoice.c
@@ -3323,7 +3323,6 @@ gnc_invoice_show_docs_due (GtkWindow *parent, QofBook *book, double days_in_adva
     gchar *message, *title;
     DialogQueryView *dialog;
     gint len;
-    Timespec ts;
     static GList *param_list = NULL;
     static GNCDisplayViewButton vendorbuttons[] =
     {
@@ -3413,9 +3412,7 @@ gnc_invoice_show_docs_due (GtkWindow *parent, QofBook *book, double days_in_adva
         days_in_advance = 0;
     end_date += days_in_advance * 60 * 60 * 24;
 
-    ts.tv_sec = (gint64) end_date;
-    ts.tv_nsec = 0;
-    pred_data = qof_query_date_predicate (QOF_COMPARE_LTE, QOF_DATE_MATCH_NORMAL, ts);
+    pred_data = qof_query_date_predicate (QOF_COMPARE_LTE, QOF_DATE_MATCH_NORMAL, end_date);
     qof_query_add_term (q, g_slist_prepend(NULL, INVOICE_DUE), pred_data, QOF_QUERY_AND);
 
     res = qof_query_run(q);
diff --git a/gnucash/gnome/dialog-order.c b/gnucash/gnome/dialog-order.c
index f2fd400..1cb7cb9 100644
--- a/gnucash/gnome/dialog-order.c
+++ b/gnucash/gnome/dialog-order.c
@@ -25,6 +25,7 @@
 
 #include <gtk/gtk.h>
 #include <glib/gi18n.h>
+#include <stdint.h>
 
 #include "dialog-utils.h"
 #include "gnc-component-manager.h"
@@ -125,7 +126,7 @@ static void gnc_ui_to_order (OrderWindow *ow, GncOrder *order)
     GtkTextBuffer* text_buffer;
     GtkTextIter start, end;
     gchar *text;
-    Timespec ts;
+    time64 tt;
 
     /* Do nothing if this is view only */
     if (ow->dialog_type == VIEW_ORDER)
@@ -145,8 +146,8 @@ static void gnc_ui_to_order (OrderWindow *ow, GncOrder *order)
     gncOrderSetReference (order, gtk_editable_get_chars
                           (GTK_EDITABLE (ow->ref_entry), 0, -1));
 
-    ts = gnc_date_edit_get_date_ts (GNC_DATE_EDIT (ow->opened_date));
-    gncOrderSetDateOpened (order, ts);
+    tt = gnc_date_edit_get_date (GNC_DATE_EDIT (ow->opened_date));
+    gncOrderSetDateOpened (order, tt);
 
     if (ow->active_check)
         gncOrderSetActive (order, gtk_toggle_button_get_active
@@ -260,7 +261,7 @@ gnc_order_window_close_order_cb (GtkWidget *widget, gpointer data)
     GList *entries;
     char *message, *label;
     gboolean non_inv = FALSE;
-    Timespec ts;
+    Timespec ts = {gnc_time (NULL), 0};
 
     /* Make sure the order is ok */
     if (!gnc_order_window_verify_ok (ow))
@@ -309,11 +310,10 @@ gnc_order_window_close_order_cb (GtkWidget *widget, gpointer data)
     message = _("Do you really want to close the order?");
     label = _("Close Date");
 
-    timespecFromTime64 (&ts, gnc_time (NULL));
     if (!gnc_dialog_date_close_parented (ow->dialog, message, label, TRUE, &ts))
         return;
 
-    gncOrderSetDateClosed (order, ts);
+    gncOrderSetDateClosed (order, ts.tv_nsec);
 
     /* save it off */
     gnc_order_window_ok_save (ow);
@@ -461,7 +461,7 @@ gnc_order_update_window (OrderWindow *ow)
     {
         GtkTextBuffer* text_buffer;
         const char *string;
-        Timespec ts, ts_zero = {0, 0};
+        time64 tt;
 
         gtk_entry_set_text (GTK_ENTRY (ow->ref_entry),
                             gncOrderGetReference (order));
@@ -470,23 +470,23 @@ gnc_order_update_window (OrderWindow *ow)
         text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(ow->notes_text));
         gtk_text_buffer_set_text (text_buffer, string, -1);
 
-        ts = gncOrderGetDateOpened (order);
-        if (timespec_equal (&ts, &ts_zero))
+        tt = gncOrderGetDateOpened (order);
+        if (tt == INT64_MAX)
         {
             gnc_date_edit_set_time (GNC_DATE_EDIT (ow->opened_date),
                                     gnc_time (NULL));
         }
         else
         {
-            gnc_date_edit_set_time_ts (GNC_DATE_EDIT (ow->opened_date), ts);
+            gnc_date_edit_set_time (GNC_DATE_EDIT (ow->opened_date), tt);
         }
 
         /* If this is a "New Order Window" we can stop here! */
         if (ow->dialog_type == NEW_ORDER)
             return;
 
-        ts = gncOrderGetDateClosed (order);
-        if (timespec_equal (&ts, &ts_zero))
+        tt = gncOrderGetDateClosed (order);
+        if (tt == INT64_MAX)
         {
             gnc_date_edit_set_time (GNC_DATE_EDIT (ow->closed_date),
                                     gnc_time (NULL));
@@ -494,7 +494,7 @@ gnc_order_update_window (OrderWindow *ow)
         }
         else
         {
-            gnc_date_edit_set_time_ts (GNC_DATE_EDIT (ow->closed_date), ts);
+            gnc_date_edit_set_time (GNC_DATE_EDIT (ow->closed_date), tt);
         }
 
         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ow->active_check),
@@ -770,11 +770,8 @@ gnc_ui_order_edit (GtkWindow *parent, GncOrder *order)
     if (!order) return NULL;
 
     type = EDIT_ORDER;
-    {
-        Timespec ts = gncOrderGetDateClosed (order);
-        if (ts.tv_sec || ts.tv_nsec)
-            type = VIEW_ORDER;
-    }
+    if (gncOrderGetDateClosed (order) == INT64_MAX)
+        type = VIEW_ORDER;
 
     ow = gnc_order_new_window (parent, gncOrderGetBook(order), type, order,
                                gncOrderGetOwner (order));
diff --git a/libgnucash/backend/sql/gnc-transaction-sql.cpp b/libgnucash/backend/sql/gnc-transaction-sql.cpp
index c7640b9..1627183 100644
--- a/libgnucash/backend/sql/gnc-transaction-sql.cpp
+++ b/libgnucash/backend/sql/gnc-transaction-sql.cpp
@@ -857,7 +857,7 @@ convert_query_term_to_sql (const GncSqlBackend* sql_be, const gchar* fieldName,
         {
             query_date_t date_data = (query_date_t)pPredData;
 
-            GncDateTime time(date_data->date.tv_sec);
+            GncDateTime time(date_data->date);
             sql << time.format_zulu ("%Y-%m-%d %H:%M:%S");
         }
         else if (strcmp (pPredData->type_name, QOF_TYPE_INT32) == 0)
diff --git a/libgnucash/backend/xml/gnc-order-xml-v2.cpp b/libgnucash/backend/xml/gnc-order-xml-v2.cpp
index 1909cc5..bb27192 100644
--- a/libgnucash/backend/xml/gnc-order-xml-v2.cpp
+++ b/libgnucash/backend/xml/gnc-order-xml-v2.cpp
@@ -75,7 +75,7 @@ static xmlNodePtr
 order_dom_tree_create (GncOrder* order)
 {
     xmlNodePtr ret;
-    Timespec ts;
+    time64 tt;
 
     ret = xmlNewNode (NULL, BAD_CAST gnc_order_string);
     xmlSetProp (ret, BAD_CAST "version", BAD_CAST order_version_string);
@@ -89,12 +89,12 @@ order_dom_tree_create (GncOrder* order)
     xmlAddChild (ret, gnc_owner_to_dom_tree (order_owner_string,
                                              gncOrderGetOwner (order)));
 
-    ts = gncOrderGetDateOpened (order);
-    xmlAddChild (ret, time64_to_dom_tree (order_opened_string, ts.tv_sec));
+    tt = gncOrderGetDateOpened (order);
+    xmlAddChild (ret, time64_to_dom_tree (order_opened_string, tt));
 
-    ts = gncOrderGetDateClosed (order);
-    if (ts.tv_sec)
-        xmlAddChild (ret, time64_to_dom_tree (order_closed_string, ts.tv_sec));
+    tt = gncOrderGetDateClosed (order);
+    if (tt != INT64_MAX)
+        xmlAddChild (ret, time64_to_dom_tree (order_closed_string, tt));
 
     maybe_add_string (ret, order_notes_string, gncOrderGetNotes (order));
     maybe_add_string (ret, order_reference_string, gncOrderGetReference (order));
@@ -131,13 +131,12 @@ set_string (xmlNodePtr node, GncOrder* order,
 }
 
 static inline gboolean
-set_timespec (xmlNodePtr node, GncOrder* order,
-              void (*func) (GncOrder* order, Timespec ts))
+set_time64 (xmlNodePtr node, GncOrder* order,
+              void (*func) (GncOrder* order, time64 tt))
 {
     time64 time = dom_tree_to_time64 (node);
     if (!dom_tree_valid_time64 (time, node->name)) return FALSE;
-    Timespec ts {time, 0};
-    func (order, ts);
+    func (order, time);
     return TRUE;
 }
 
@@ -194,7 +193,7 @@ order_opened_handler (xmlNodePtr node, gpointer order_pdata)
 {
     struct order_pdata* pdata = static_cast<decltype (pdata)> (order_pdata);
 
-    return set_timespec (node, pdata->order, gncOrderSetDateOpened);
+    return set_time64 (node, pdata->order, gncOrderSetDateOpened);
 }
 
 static gboolean
@@ -202,7 +201,7 @@ order_closed_handler (xmlNodePtr node, gpointer order_pdata)
 {
     struct order_pdata* pdata = static_cast<decltype (pdata)> (order_pdata);
 
-    return set_timespec (node, pdata->order, gncOrderSetDateClosed);
+    return set_time64 (node, pdata->order, gncOrderSetDateClosed);
 }
 
 static gboolean
diff --git a/libgnucash/engine/Query.c b/libgnucash/engine/Query.c
index 7aa4060..2d16f46 100644
--- a/libgnucash/engine/Query.c
+++ b/libgnucash/engine/Query.c
@@ -380,9 +380,9 @@ xaccQueryAddNumericMatch (QofQuery *q, gnc_numeric amount, QofNumericMatch sign,
  */
 
 void
-xaccQueryAddDateMatchTS (QofQuery * q,
-                         gboolean use_start, Timespec sts,
-                         gboolean use_end, Timespec ets,
+xaccQueryAddDateMatchTT (QofQuery * q,
+                         gboolean use_start, time64 stt,
+                         gboolean use_end, time64 ett,
                          QofQueryOp op)
 {
     QofQuery *tmp_q = NULL;
@@ -396,7 +396,7 @@ xaccQueryAddDateMatchTS (QofQuery * q,
 
     if (use_start)
     {
-        pred_data = qof_query_date_predicate (QOF_COMPARE_GTE, QOF_DATE_MATCH_NORMAL, sts);
+        pred_data = qof_query_date_predicate (QOF_COMPARE_GTE, QOF_DATE_MATCH_NORMAL, stt);
         if (!pred_data)
         {
             qof_query_destroy (tmp_q);
@@ -409,7 +409,7 @@ xaccQueryAddDateMatchTS (QofQuery * q,
 
     if (use_end)
     {
-        pred_data = qof_query_date_predicate (QOF_COMPARE_LTE, QOF_DATE_MATCH_NORMAL, ets);
+        pred_data = qof_query_date_predicate (QOF_COMPARE_LTE, QOF_DATE_MATCH_NORMAL, ett);
         if (!pred_data)
         {
             qof_query_destroy (tmp_q);
@@ -425,16 +425,16 @@ xaccQueryAddDateMatchTS (QofQuery * q,
 }
 
 void
-xaccQueryGetDateMatchTS (QofQuery * q,
-                         Timespec * sts,
-                         Timespec * ets)
+xaccQueryGetDateMatchTT (QofQuery * q,
+                         time64 * stt,
+                         time64 * ett)
 {
     QofQueryPredData *term_data;
     GSList *param_list;
     GSList *terms, *tmp;
 
-    sts->tv_sec = sts->tv_nsec = 0;
-    ets->tv_sec = ets->tv_nsec = 0;
+    *stt = 0;
+    *ett = 0;
 
     param_list = qof_query_build_param_list (SPLIT_TRANS, TRANS_DATE_POSTED, NULL);
     terms = qof_query_get_term_type (q, param_list);
@@ -444,9 +444,9 @@ xaccQueryGetDateMatchTS (QofQuery * q,
     {
         term_data = tmp->data;
         if (term_data->how == QOF_COMPARE_GTE)
-            qof_query_date_predicate_get_date(term_data, sts);
+            qof_query_date_predicate_get_date(term_data, stt);
         if (term_data->how == QOF_COMPARE_LTE)
-            qof_query_date_predicate_get_date(term_data, ets);
+            qof_query_date_predicate_get_date(term_data, ett);
     }
     g_slist_free(terms);
 }
@@ -463,55 +463,13 @@ xaccQueryAddDateMatch(QofQuery * q,
                       QofQueryOp op)
 {
     /* gcc -O3 will auto-inline this function, avoiding a call overhead */
-    xaccQueryAddDateMatchTS (q, use_start,
-                             gnc_dmy2timespec(sday, smonth, syear),
+    xaccQueryAddDateMatchTT (q, use_start,
+                             gnc_dmy2time64(sday, smonth, syear),
                              use_end,
-                             gnc_dmy2timespec_end(eday, emonth, eyear),
+                             gnc_dmy2time64_end(eday, emonth, eyear),
                              op);
 }
 
-/********************************************************************
- * xaccQueryAddDateMatchTT
- * Add a date filter to an existing query.
- ********************************************************************/
-
-void
-xaccQueryAddDateMatchTT(QofQuery * q,
-                        gboolean use_start,
-                        time64 stt,
-                        gboolean use_end,
-                        time64 ett,
-                        QofQueryOp op)
-{
-    Timespec   sts;
-    Timespec   ets;
-
-    sts.tv_sec  = stt;
-    sts.tv_nsec = 0;
-
-    ets.tv_sec  = ett;
-    ets.tv_nsec = 0;
-
-    /* gcc -O3 will auto-inline this function, avoiding a call overhead */
-    xaccQueryAddDateMatchTS (q, use_start, sts,
-                             use_end, ets, op);
-
-}
-
-void
-xaccQueryGetDateMatchTT (QofQuery * q,
-                         time64 * stt,
-                         time64 * ett)
-{
-    Timespec   sts;
-    Timespec   ets;
-
-    xaccQueryGetDateMatchTS (q, &sts, &ets);
-
-    *stt = sts.tv_sec;
-    *ett = ets.tv_sec;
-}
-
 void
 xaccQueryAddClearedMatch(QofQuery * q, cleared_match_t how, QofQueryOp op)
 {
diff --git a/libgnucash/engine/Query.h b/libgnucash/engine/Query.h
index 0d27ad1..b3722ae 100644
--- a/libgnucash/engine/Query.h
+++ b/libgnucash/engine/Query.h
@@ -154,17 +154,10 @@ void xaccQueryAddDateMatch(QofQuery * q, gboolean use_start,
                            int sday, int smonth, int syear,
                            gboolean use_end, int eday, int emonth, int eyear,
                            QofQueryOp op);
-void xaccQueryAddDateMatchTS(QofQuery * q,
-                             gboolean use_start, Timespec sts,
-                             gboolean use_end, Timespec ets,
-                             QofQueryOp op);
 void xaccQueryAddDateMatchTT(QofQuery * q,
                              gboolean use_start, time64 stt,
                              gboolean use_end, time64 ett,
                              QofQueryOp op);
-void xaccQueryGetDateMatchTS (QofQuery * q,
-                              Timespec * sts,
-                              Timespec * ets);
 void xaccQueryGetDateMatchTT (QofQuery * q,
                               time64 * stt,
                               time64 * ett);
diff --git a/libgnucash/engine/README.query-api b/libgnucash/engine/README.query-api
index 32b1ba8..956ff7f 100644
--- a/libgnucash/engine/README.query-api
+++ b/libgnucash/engine/README.query-api
@@ -150,7 +150,6 @@ the union is.  The values of type are:
 PD_DATE : match a date range.  Specify a start date and an end date. 
 
 Used in: xaccQueryAddDateMatch
-         xaccQueryAddDateMatchTS
          xaccQueryAddDateMatchTT
 
 -----------------------------------------------------------------
diff --git a/libgnucash/engine/Recurrence.c b/libgnucash/engine/Recurrence.c
index e0d0210..c9805f4 100644
--- a/libgnucash/engine/Recurrence.c
+++ b/libgnucash/engine/Recurrence.c
@@ -23,12 +23,16 @@
 #include <glib.h>
 #include <glib/gi18n.h>
 #include <string.h>
+#include <stdint.h>
 #include "Recurrence.h"
 #include "gnc-date.h"
 #include "qof.h"
 #include "gnc-engine.h"
 #include "gnc-date.h"
 #include "Account.h"
+#include <stdint.h>
+#include <stdint.h>
+#include <stdint.h>
 
 #define LOG_MOD "gnc.engine.recurrence"
 static QofLogModule log_module = LOG_MOD;
@@ -69,6 +73,12 @@ recurrenceGetDate(const Recurrence *r)
     return r ? r->start : invalid_gdate;
 }
 
+time64
+recurrenceGetTime(const Recurrence *r)
+{
+    return r ? gdate_to_time64(r->start) : INT64_MAX;
+}
+
 WeekendAdjust
 recurrenceGetWeekendAdjust(const Recurrence *r)
 {
diff --git a/libgnucash/engine/Recurrence.h b/libgnucash/engine/Recurrence.h
index 8dae39d..aa375d6 100644
--- a/libgnucash/engine/Recurrence.h
+++ b/libgnucash/engine/Recurrence.h
@@ -108,6 +108,7 @@ void recurrenceSet(Recurrence *r, guint16 mult, PeriodType pt,
 PeriodType recurrenceGetPeriodType(const Recurrence *r);
 guint recurrenceGetMultiplier(const Recurrence *r);
 GDate recurrenceGetDate(const Recurrence *r);
+time64 recurrenceGetTime(const Recurrence *r);
 WeekendAdjust recurrenceGetWeekendAdjust(const Recurrence *r);
 
 /* Get the occurrence immediately after refDate.
diff --git a/libgnucash/engine/SchedXaction.c b/libgnucash/engine/SchedXaction.c
index dc5a2db..fc4ae0e 100644
--- a/libgnucash/engine/SchedXaction.c
+++ b/libgnucash/engine/SchedXaction.c
@@ -26,6 +26,7 @@
 #include <glib.h>
 #include <glib/gi18n.h>
 #include <string.h>
+#include <stdint.h>
 
 #include "qof.h"
 
@@ -599,6 +600,13 @@ xaccSchedXactionGetStartDate(const SchedXaction *sx )
     return &sx->start_date;
 }
 
+time64
+xaccSchedXactionGetStartDateTT(const SchedXaction *sx )
+{
+    g_assert (sx);
+    return gdate_to_time64(sx->start_date);
+}
+
 void
 xaccSchedXactionSetStartDate( SchedXaction *sx, const GDate* newStart )
 {
@@ -618,6 +626,25 @@ xaccSchedXactionSetStartDate( SchedXaction *sx, const GDate* newStart )
     gnc_sx_commit_edit(sx);
 }
 
+void
+xaccSchedXactionSetStartDateTT( SchedXaction *sx, const time64 newStart )
+{
+    if ( newStart == INT64_MAX )
+    {
+        /* XXX: I reject the bad data - is this the right
+         * thing to do <rgmerk>.
+         * This warning is only human readable - the caller
+         * doesn't know the call failed.  This is bad
+         */
+        g_critical("Invalid Start Date");
+        return;
+    }
+    gnc_sx_begin_edit(sx);
+    gnc_gdate_set_time64(&sx->start_date, newStart);
+    qof_instance_set_dirty(&sx->inst);
+    gnc_sx_commit_edit(sx);
+}
+
 gboolean
 xaccSchedXactionHasEndDate( const SchedXaction *sx )
 {
@@ -662,6 +689,12 @@ xaccSchedXactionGetLastOccurDate(const SchedXaction *sx )
     return &sx->last_date;
 }
 
+time64
+xaccSchedXactionGetLastOccurDateTT(const SchedXaction *sx )
+{
+    return gdate_to_time64(sx->last_date);
+}
+
 void
 xaccSchedXactionSetLastOccurDate(SchedXaction *sx, const GDate* new_last_occur)
 {
@@ -675,6 +708,21 @@ xaccSchedXactionSetLastOccurDate(SchedXaction *sx, const GDate* new_last_occur)
     gnc_sx_commit_edit(sx);
 }
 
+void
+xaccSchedXactionSetLastOccurDateTT(SchedXaction *sx, time64 new_last_occur)
+{
+    GDate last_occur;
+    g_return_if_fail (new_last_occur != INT64_MAX);
+    gnc_gdate_set_time64(&last_occur, new_last_occur);
+    if (g_date_valid(&sx->last_date)
+        && g_date_compare(&sx->last_date, &last_occur) == 0)
+        return;
+    gnc_sx_begin_edit(sx);
+    sx->last_date = last_occur;
+    qof_instance_set_dirty(&sx->inst);
+    gnc_sx_commit_edit(sx);
+}
+
 gboolean
 xaccSchedXactionHasOccurDef( const SchedXaction *sx )
 {
@@ -1196,12 +1244,12 @@ SXRegister(void)
             (QofSetterFunc)xaccSchedXactionSetName
         },
         {
-            GNC_SX_START_DATE, QOF_TYPE_DATE, (QofAccessFunc)xaccSchedXactionGetStartDate,
-            (QofSetterFunc)xaccSchedXactionSetStartDate
+            GNC_SX_START_DATE, QOF_TYPE_DATE, (QofAccessFunc)xaccSchedXactionGetStartDateTT,
+            (QofSetterFunc)xaccSchedXactionSetStartDateTT
         },
         {
-            GNC_SX_LAST_DATE, QOF_TYPE_DATE, (QofAccessFunc)xaccSchedXactionGetLastOccurDate,
-            (QofSetterFunc)xaccSchedXactionSetLastOccurDate
+            GNC_SX_LAST_DATE, QOF_TYPE_DATE, (QofAccessFunc)xaccSchedXactionGetLastOccurDateTT,
+            (QofSetterFunc)xaccSchedXactionSetLastOccurDateTT
         },
         {
             GNC_SX_NUM_OCCUR, QOF_TYPE_INT64, (QofAccessFunc)xaccSchedXactionGetNumOccur,
diff --git a/libgnucash/engine/SchedXaction.h b/libgnucash/engine/SchedXaction.h
index 17087a1..abc3ec4 100644
--- a/libgnucash/engine/SchedXaction.h
+++ b/libgnucash/engine/SchedXaction.h
@@ -161,7 +161,9 @@ gchar *xaccSchedXactionGetName( const SchedXaction *sx );
 void xaccSchedXactionSetName( SchedXaction *sx, const gchar *newName );
 
 const GDate* xaccSchedXactionGetStartDate(const SchedXaction *sx );
+time64 xaccSchedXactionGetStartDateTT(const SchedXaction *sx );
 void xaccSchedXactionSetStartDate( SchedXaction *sx, const GDate* newStart );
+void xaccSchedXactionSetStartDateTT( SchedXaction *sx, const time64 newStart );
 
 int xaccSchedXactionHasEndDate( const SchedXaction *sx );
 /**
@@ -174,7 +176,9 @@ const GDate* xaccSchedXactionGetEndDate(const SchedXaction *sx );
 void xaccSchedXactionSetEndDate( SchedXaction *sx, const GDate* newEnd );
 
 const GDate* xaccSchedXactionGetLastOccurDate(const SchedXaction *sx );
+time64 xaccSchedXactionGetLastOccurDateTT(const SchedXaction *sx );
 void xaccSchedXactionSetLastOccurDate( SchedXaction *sx, const GDate* newLastOccur );
+void xaccSchedXactionSetLastOccurDateTT( SchedXaction *sx, const time64 newLastOccur );
 
 /**
  * Returns true if the scheduled transaction has a defined number of
diff --git a/libgnucash/engine/Split.c b/libgnucash/engine/Split.c
index 99da4ee..b10714e 100644
--- a/libgnucash/engine/Split.c
+++ b/libgnucash/engine/Split.c
@@ -2246,8 +2246,8 @@ gboolean xaccSplitRegister (void)
         {
             {
                 SPLIT_DATE_RECONCILED, QOF_TYPE_DATE,
-                (QofAccessFunc)xaccSplitRetDateReconciledTS,
-                (QofSetterFunc)xaccSplitSetDateReconciledTS
+                (QofAccessFunc)xaccSplitGetDateReconciled,
+                (QofSetterFunc)xaccSplitSetDateReconciledSecs
             },
 
             /* d-* are deprecated query params, should not be used in new
diff --git a/libgnucash/engine/Transaction.c b/libgnucash/engine/Transaction.c
index 1598ecb..8f8469b 100644
--- a/libgnucash/engine/Transaction.c
+++ b/libgnucash/engine/Transaction.c
@@ -2990,17 +2990,17 @@ gboolean xaccTransRegister (void)
             },
             {
                 TRANS_DATE_ENTERED, QOF_TYPE_DATE,
-                (QofAccessFunc)xaccTransRetDateEnteredTS,
-                (QofSetterFunc)qofTransSetDateEnteredTS
+                (QofAccessFunc)xaccTransRetDateEntered,
+                (QofSetterFunc)xaccTransSetDateEnteredSecs
             },
             {
                 TRANS_DATE_POSTED, QOF_TYPE_DATE,
-                (QofAccessFunc)xaccTransRetDatePostedTS,
-                (QofSetterFunc)qofTransSetDatePostedTS
+                (QofAccessFunc)xaccTransRetDatePosted,
+                (QofSetterFunc)xaccTransSetDatePostedSecs
             },
             {
                 TRANS_DATE_DUE, QOF_TYPE_DATE,
-                (QofAccessFunc)xaccTransRetDateDueTS, NULL
+                (QofAccessFunc)xaccTransRetDateDue, NULL
             },
             {
                 TRANS_IMBALANCE, QOF_TYPE_NUMERIC,
diff --git a/libgnucash/engine/engine-helpers.c b/libgnucash/engine/engine-helpers.c
index bbbc99b..f646113 100644
--- a/libgnucash/engine/engine-helpers.c
+++ b/libgnucash/engine/engine-helpers.c
@@ -709,7 +709,7 @@ gnc_queryterm2scm (const QofQueryTerm *qt)
         query_date_t pdata = (query_date_t) pd;
 
         qt_scm = scm_cons (scm_from_long  (pdata->options), qt_scm);
-        qt_scm = scm_cons (gnc_timespec2timepair (pdata->date), qt_scm);
+        qt_scm = scm_cons (scm_from_int64 (pdata->date), qt_scm);
 
     }
     else if (!g_strcmp0 (pd->type_name, QOF_TYPE_NUMERIC))
@@ -841,7 +841,7 @@ gnc_scm2query_term_query_v2 (SCM qt_scm)
         else if (!g_strcmp0 (type, QOF_TYPE_DATE))
         {
             QofDateMatch options;
-            Timespec date;
+            time64 date;
 
             scm = SCM_CAR (qt_scm);
             qt_scm = SCM_CDR (qt_scm);
@@ -853,7 +853,7 @@ gnc_scm2query_term_query_v2 (SCM qt_scm)
             qt_scm = SCM_CDR (qt_scm);
             if (scm_is_null (scm))
                 break;
-            date = gnc_timepair2timespec (scm);
+            date = scm_to_int64 (scm);
 
             pd = qof_query_date_predicate (compare_how, options, date);
 
@@ -1039,8 +1039,8 @@ gnc_scm2query_term_query_v1 (SCM query_term_scm)
         {
             gboolean use_start;
             gboolean use_end;
-            Timespec start;
-            Timespec end;
+            time64 start;
+            time64 end;
 
             /* use_start */
             if (scm_is_null (query_term_scm))
@@ -1059,7 +1059,7 @@ gnc_scm2query_term_query_v1 (SCM query_term_scm)
 
             scm = SCM_CAR (query_term_scm);
             query_term_scm = SCM_CDR (query_term_scm);
-            start = gnc_timepair2timespec (scm);
+            start = scm_to_int64 (scm);
 
             /* use_end */
             if (scm_is_null (query_term_scm))
@@ -1075,9 +1075,9 @@ gnc_scm2query_term_query_v1 (SCM query_term_scm)
 
             scm = SCM_CAR (query_term_scm);
             query_term_scm = SCM_CDR (query_term_scm);
-            end = gnc_timepair2timespec (scm);
+            end = scm_to_int64 (scm);
 
-            xaccQueryAddDateMatchTS (q, use_start, start, use_end, end, QOF_QUERY_OR);
+            xaccQueryAddDateMatchTT (q, use_start, start, use_end, end, QOF_QUERY_OR);
 
             ok = TRUE;
 
diff --git a/libgnucash/engine/gnc-budget.c b/libgnucash/engine/gnc-budget.c
index ecd9ca7..a82f299 100644
--- a/libgnucash/engine/gnc-budget.c
+++ b/libgnucash/engine/gnc-budget.c
@@ -720,9 +720,9 @@ static guint gnc_budget_get_rec_mult(const GncBudget *bgt)
 {
     return recurrenceGetMultiplier(&(GET_PRIVATE(bgt)->recurrence));
 }
-static GDate gnc_budget_get_rec_date(const GncBudget *bgt)
+static time64 gnc_budget_get_rec_time(const GncBudget *bgt)
 {
-    return recurrenceGetDate(&(GET_PRIVATE(bgt)->recurrence));
+    return recurrenceGetTime(&(GET_PRIVATE(bgt)->recurrence));
 }
 
 /* Register ourselves with the engine. */
@@ -754,7 +754,7 @@ gboolean gnc_budget_register (void)
            this is wrong. */
         {
             "recurrence_date", QOF_TYPE_DATE,
-            (QofAccessFunc) gnc_budget_get_rec_date, NULL
+            (QofAccessFunc) gnc_budget_get_rec_time, NULL
         },
         /* Signedness problem: Should be unsigned. */
         {
diff --git a/libgnucash/engine/gnc-pricedb.c b/libgnucash/engine/gnc-pricedb.c
index 62e3111..daa0aa7 100644
--- a/libgnucash/engine/gnc-pricedb.c
+++ b/libgnucash/engine/gnc-pricedb.c
@@ -3227,7 +3227,7 @@ gnc_pricedb_register (void)
     {
         { PRICE_COMMODITY, GNC_ID_COMMODITY, (QofAccessFunc)gnc_price_get_commodity, (QofSetterFunc)gnc_price_set_commodity },
         { PRICE_CURRENCY, GNC_ID_COMMODITY, (QofAccessFunc)gnc_price_get_currency, (QofSetterFunc)gnc_price_set_currency },
-        { PRICE_DATE, QOF_TYPE_DATE, (QofAccessFunc)gnc_price_get_time, (QofSetterFunc)gnc_price_set_time },
+        { PRICE_DATE, QOF_TYPE_DATE, (QofAccessFunc)gnc_price_get_time64, (QofSetterFunc)gnc_price_set_time64 },
         { PRICE_SOURCE, QOF_TYPE_STRING, (QofAccessFunc)gnc_price_get_source, (QofSetterFunc)gnc_price_set_source },
         { PRICE_TYPE, QOF_TYPE_STRING, (QofAccessFunc)gnc_price_get_typestr, (QofSetterFunc)gnc_price_set_typestr },
         { PRICE_VALUE, QOF_TYPE_NUMERIC, (QofAccessFunc)gnc_price_get_value, (QofSetterFunc)gnc_price_set_value },
diff --git a/libgnucash/engine/gncOrder.c b/libgnucash/engine/gncOrder.c
index 2d36b54..b80f406 100644
--- a/libgnucash/engine/gncOrder.c
+++ b/libgnucash/engine/gncOrder.c
@@ -30,6 +30,7 @@
 #include <glib.h>
 #include <glib/gi18n.h>
 #include <qofinstance-p.h>
+#include <stdint.h>
 
 #include "gncEntry.h"
 #include "gncEntryP.h"
@@ -50,8 +51,8 @@ struct _gncOrder
     char *	printname;
     GncOwner	owner;
     GList *	entries;
-    Timespec 	opened;
-    Timespec 	closed;
+    time64 	opened;
+    time64 	closed;
 };
 
 struct _gncOrderClass
@@ -101,6 +102,7 @@ G_DEFINE_TYPE(GncOrder, gnc_order, QOF_TYPE_INSTANCE);
 static void
 gnc_order_init(GncOrder* order)
 {
+    order->closed = INT64_MAX;
 }
 
 static void
@@ -177,10 +179,10 @@ gnc_order_set_property (GObject         *object,
         gncOrderSetActive(order, g_value_get_boolean(value));
         break;
     case PROP_DATE_OPENED:
-        gncOrderSetDateOpened(order, *(Timespec*)g_value_get_boxed(value));
+        gncOrderSetDateOpened(order, g_value_get_int64(value));
         break;
     case PROP_DATE_CLOSED:
-        gncOrderSetDateClosed(order, *(Timespec*)g_value_get_boxed(value));
+        gncOrderSetDateClosed(order, g_value_get_int64(value));
         break;
     case PROP_REFERENCE:
         gncOrderSetReference(order, g_value_get_string(value));
@@ -346,20 +348,20 @@ void gncOrderSetOwner (GncOrder *order, GncOwner *owner)
     gncOrderCommitEdit (order);
 }
 
-void gncOrderSetDateOpened (GncOrder *order, Timespec date)
+void gncOrderSetDateOpened (GncOrder *order, time64 date)
 {
     if (!order) return;
-    if (timespec_equal (&order->opened, &date)) return;
+    if (order->opened == date) return;
     gncOrderBeginEdit (order);
     order->opened = date;
     mark_order (order);
     gncOrderCommitEdit (order);
 }
 
-void gncOrderSetDateClosed (GncOrder *order, Timespec date)
+void gncOrderSetDateClosed (GncOrder *order, time64 date)
 {
     if (!order) return;
-    if (timespec_equal (&order->closed, &date)) return;
+    if (order->closed == date) return;
     gncOrderBeginEdit (order);
     order->closed = date;
     mark_order (order);
@@ -439,21 +441,15 @@ GncOwner * gncOrderGetOwner (GncOrder *order)
     return &order->owner;
 }
 
-Timespec gncOrderGetDateOpened (const GncOrder *order)
+time64 gncOrderGetDateOpened (const GncOrder *order)
 {
-    Timespec ts;
-    ts.tv_sec = 0;
-    ts.tv_nsec = 0;
-    if (!order) return ts;
+    if (!order) return INT64_MAX;
     return order->opened;
 }
 
-Timespec gncOrderGetDateClosed (const GncOrder *order)
+time64 gncOrderGetDateClosed (const GncOrder *order)
 {
-    Timespec ts;
-    ts.tv_sec = 0;
-    ts.tv_nsec = 0;
-    if (!order) return ts;
+    if (!order) return INT64_MAX;
     return order->closed;
 }
 
@@ -485,7 +481,7 @@ GList * gncOrderGetEntries (GncOrder *order)
 gboolean gncOrderIsClosed (const GncOrder *order)
 {
     if (!order) return FALSE;
-    if (order->closed.tv_sec || order->closed.tv_nsec) return TRUE;
+    if (order->closed != INT64_MAX) return TRUE;
     return FALSE;
 }
 
@@ -528,11 +524,8 @@ int gncOrderCompare (const GncOrder *a, const GncOrder *b)
     compare = g_strcmp0 (a->id, b->id);
     if (compare) return compare;
 
-    compare = timespec_cmp (&(a->opened), &(b->opened));
-    if (compare) return compare;
-
-    compare = timespec_cmp (&(a->closed), &(b->closed));
-    if (compare) return compare;
+    if (a->opened != b->opened) return a->opened - b->opened;
+    if (a->closed != b->closed) return a->closed - b->closed;
 
     return qof_instance_guid_compare(a, b);
 }
diff --git a/libgnucash/engine/gncOrder.h b/libgnucash/engine/gncOrder.h
index 2d8eb5c..7e77969 100644
--- a/libgnucash/engine/gncOrder.h
+++ b/libgnucash/engine/gncOrder.h
@@ -66,8 +66,8 @@ void gncOrderDestroy (GncOrder *order);
 
 void gncOrderSetID (GncOrder *order, const char *id);
 void gncOrderSetOwner (GncOrder *order, GncOwner *owner);
-void gncOrderSetDateOpened (GncOrder *order, Timespec date);
-void gncOrderSetDateClosed (GncOrder *order, Timespec date);
+void gncOrderSetDateOpened (GncOrder *order, time64 date);
+void gncOrderSetDateClosed (GncOrder *order, time64 date);
 void gncOrderSetNotes (GncOrder *order, const char *notes);
 void gncOrderSetReference (GncOrder *order, const char *reference);
 void gncOrderSetActive (GncOrder *order, gboolean active);
@@ -80,8 +80,8 @@ void gncOrderRemoveEntry (GncOrder *order, GncEntry *entry);
 
 const char * gncOrderGetID (const GncOrder *order);
 GncOwner * gncOrderGetOwner (GncOrder *order);
-Timespec gncOrderGetDateOpened (const GncOrder *order);
-Timespec gncOrderGetDateClosed (const GncOrder *order);
+time64 gncOrderGetDateOpened (const GncOrder *order);
+time64 gncOrderGetDateClosed (const GncOrder *order);
 const char * gncOrderGetNotes (const GncOrder *order);
 const char * gncOrderGetReference (const GncOrder *order);
 gboolean gncOrderGetActive (const GncOrder *order);
diff --git a/libgnucash/engine/qofquery.cpp b/libgnucash/engine/qofquery.cpp
index 7047c39..07278df 100644
--- a/libgnucash/engine/qofquery.cpp
+++ b/libgnucash/engine/qofquery.cpp
@@ -1829,7 +1829,7 @@ qof_query_printValueForParam (QofQueryPredData *pd, GString * gs)
         query_date_t pdata = (query_date_t) pd;
         g_string_append_printf (gs, " Match type %s",
                                 qof_query_printDateMatch (pdata->options));
-        g_string_append_printf (gs, " query_date: %s", gnc_print_date (pdata->date));
+        g_string_append_printf (gs, " query_date: %s", gnc_print_date ({pdata->date, 0}));
         return;
     }
     if (!g_strcmp0 (pd->type_name, QOF_TYPE_CHAR))
diff --git a/libgnucash/engine/qofquerycore-p.h b/libgnucash/engine/qofquerycore-p.h
index 251f716..2c95be2 100644
--- a/libgnucash/engine/qofquerycore-p.h
+++ b/libgnucash/engine/qofquerycore-p.h
@@ -75,7 +75,7 @@ typedef struct
 {
     QofQueryPredData	pd;
     QofDateMatch	options;
-    Timespec	date;
+    time64	date;
 } query_date_def, *query_date_t;
 
 typedef struct
diff --git a/libgnucash/engine/qofquerycore.cpp b/libgnucash/engine/qofquerycore.cpp
index 991fb52..91c5afa 100644
--- a/libgnucash/engine/qofquerycore.cpp
+++ b/libgnucash/engine/qofquerycore.cpp
@@ -57,7 +57,7 @@ static QueryPredDataFree qof_query_predicate_free (QofType type);
 typedef const char * (*query_string_getter) (gpointer, QofParam *);
 static const char * query_string_type = QOF_TYPE_STRING;
 
-typedef Timespec (*query_date_getter) (gpointer, QofParam *);
+typedef time64 (*query_date_getter) (gpointer, QofParam *);
 static const char * query_date_type = QOF_TYPE_DATE;
 
 typedef gnc_numeric (*query_numeric_getter) (gpointer, QofParam *);
@@ -326,23 +326,18 @@ string_to_string (gpointer object, QofParam *getter)
 /* QOF_TYPE_DATE =================================================== */
 
 static int
-date_compare (Timespec ta, Timespec tb, QofDateMatch options)
+date_compare (time64 ta, time64 tb, QofDateMatch options)
 {
 
     if (options == QOF_DATE_MATCH_DAY)
     {
-        ta = timespecCanonicalDayTime (ta);
-        tb = timespecCanonicalDayTime (tb);
+        ta = time64CanonicalDayTime (ta);
+        tb = time64CanonicalDayTime (tb);
     }
 
-    if (ta.tv_sec < tb.tv_sec)
+    if (ta < tb)
         return -1;
-    if (ta.tv_sec > tb.tv_sec)
-        return 1;
-
-    if (ta.tv_nsec < tb.tv_nsec)
-        return -1;
-    if (ta.tv_nsec > tb.tv_nsec)
+    if (ta > tb)
         return 1;
 
     return 0;
@@ -353,7 +348,7 @@ date_match_predicate (gpointer object, QofParam *getter,
                       QofQueryPredData *pd)
 {
     query_date_t pdata = (query_date_t)pd;
-    Timespec objtime;
+    time64 objtime;
     int compare;
 
     VERIFY_PREDICATE (query_date_type);
@@ -384,7 +379,7 @@ date_match_predicate (gpointer object, QofParam *getter,
 static int
 date_compare_func (gpointer a, gpointer b, gint options, QofParam *getter)
 {
-    Timespec ta, tb;
+    time64 ta, tb;
 
     g_return_val_if_fail (a && b && getter && getter->param_getfcn, COMPARE_ERROR);
 
@@ -421,12 +416,12 @@ date_predicate_equal (const QofQueryPredData *p1, const QofQueryPredData *p2)
     const query_date_t pd2 = (const query_date_t) p2;
 
     if (pd1->options != pd2->options) return FALSE;
-    return timespec_equal (&(pd1->date), &(pd2->date));
+    return (pd1->date == pd2->date);
 }
 
 QofQueryPredData *
 qof_query_date_predicate (QofQueryCompare how,
-                          QofDateMatch options, Timespec date)
+                          QofDateMatch options, time64 date)
 {
     query_date_t pdata;
 
@@ -439,7 +434,7 @@ qof_query_date_predicate (QofQueryCompare how,
 }
 
 gboolean
-qof_query_date_predicate_get_date (const QofQueryPredData *pd, Timespec *date)
+qof_query_date_predicate_get_date (const QofQueryPredData *pd, time64 *date)
 {
     const query_date_t pdata = (const query_date_t)pd;
 
@@ -452,10 +447,10 @@ qof_query_date_predicate_get_date (const QofQueryPredData *pd, Timespec *date)
 static char *
 date_to_string (gpointer object, QofParam *getter)
 {
-    Timespec ts = ((query_date_getter)getter->param_getfcn)(object, getter);
+    time64 tt = ((query_date_getter)getter->param_getfcn)(object, getter);
 
-    if (ts.tv_sec != INT64_MAX)
-        return g_strdup (gnc_print_date (ts));
+    if (tt != INT64_MAX)
+        return g_strdup (gnc_print_date ({tt, 0}));
 
     return NULL;
 }
diff --git a/libgnucash/engine/qofquerycore.h b/libgnucash/engine/qofquerycore.h
index f602357..152fb0a 100644
--- a/libgnucash/engine/qofquerycore.h
+++ b/libgnucash/engine/qofquerycore.h
@@ -159,7 +159,7 @@ QofQueryPredData *qof_query_string_predicate (QofQueryCompare how,
 
 QofQueryPredData *qof_query_date_predicate (QofQueryCompare how,
         QofDateMatch options,
-        Timespec date);
+        time64 date);
 
 QofQueryPredData *qof_query_numeric_predicate (QofQueryCompare how,
         QofNumericMatch options,
@@ -183,7 +183,7 @@ QofQueryPredData *qof_query_core_predicate_copy (const QofQueryPredData *pdata);
 void qof_query_core_predicate_free (QofQueryPredData *pdata);
 
 /** Retrieve a predicate. */
-gboolean qof_query_date_predicate_get_date (const QofQueryPredData *pd, Timespec *date);
+gboolean qof_query_date_predicate_get_date (const QofQueryPredData *pd, time64 *date);
 /** Return a printable string for a core data object.  Caller needs
  *  to g_free() the returned string.
  */
diff --git a/libgnucash/engine/test-core/test-engine-stuff.cpp b/libgnucash/engine/test-core/test-engine-stuff.cpp
index 9e65914..9f9d5f9 100644
--- a/libgnucash/engine/test-core/test-engine-stuff.cpp
+++ b/libgnucash/engine/test-core/test-engine-stuff.cpp
@@ -1738,8 +1738,8 @@ get_random_query(void)
     {
         gint pr_type;
         KvpValue *value;
-        Timespec *start;
-        Timespec *end;
+        time64 start;
+        time64 end;
         GList *guids;
         GSList *path;
         char *string;
@@ -1791,16 +1791,14 @@ get_random_query(void)
             break;
 
         case 5: /* PR_DATE */
-            start = get_random_timespec ();
-            end = get_random_timespec ();
-            xaccQueryAddDateMatchTS (q,
+            start = get_random_time ();
+            end = get_random_time ();
+            xaccQueryAddDateMatchTT (q,
                                      get_random_boolean (),
-                                     *start,
+                                     start,
                                      get_random_boolean (),
-                                     *end,
+                                     end,
                                      get_random_queryop ());
-            g_free (start);
-            g_free (end);
             break;
 
         case 6: /* PR_DESC */

commit 4aadfbe636b4f8af2cac4d230fc34f10629ba216
Author: Geert Janssens <geert at kobaltwit.be>
Date:   Tue Apr 24 14:19:00 2018 +0200

    Bug 795040 - GnuCash crashes when searching for a newly created bill

diff --git a/libgnucash/engine/gncInvoice.c b/libgnucash/engine/gncInvoice.c
index 592363f..298a668 100644
--- a/libgnucash/engine/gncInvoice.c
+++ b/libgnucash/engine/gncInvoice.c
@@ -823,9 +823,9 @@ time64 gncInvoiceGetDatePosted (const GncInvoice *invoice)
 time64 gncInvoiceGetDateDue (const GncInvoice *invoice)
 {
     Transaction *txn;
-    if (!invoice) return 0;
+    if (!invoice) return INT64_MAX;
     txn = gncInvoiceGetPostedTxn (invoice);
-    if (!txn) return 0;
+    if (!txn) return INT64_MAX;
     return xaccTransRetDateDue (txn);
 }
 



Summary of changes:
 gnucash/gnome-search/search-date.c                |  16 +-
 gnucash/gnome-search/search-date.h                |   6 +-
 gnucash/gnome/assistant-acct-period.c             |   4 +-
 gnucash/gnome/dialog-invoice.c                    |   5 +-
 gnucash/gnome/dialog-order.c                      |  33 ++--
 libgnucash/backend/sql/gnc-transaction-sql.cpp    |   2 +-
 libgnucash/backend/xml/gnc-order-xml-v2.cpp       |  23 ++-
 libgnucash/engine/Query.c                         |  72 ++------
 libgnucash/engine/Query.h                         |   7 -
 libgnucash/engine/README.query-api                |   1 -
 libgnucash/engine/Recurrence.c                    |  10 ++
 libgnucash/engine/Recurrence.h                    |   1 +
 libgnucash/engine/SchedXaction.c                  |  56 ++++++-
 libgnucash/engine/SchedXaction.h                  |   4 +
 libgnucash/engine/Split.c                         |   4 +-
 libgnucash/engine/Transaction.c                   |  10 +-
 libgnucash/engine/engine-helpers.c                |  16 +-
 libgnucash/engine/gnc-budget.c                    |   6 +-
 libgnucash/engine/gnc-pricedb.c                   |   2 +-
 libgnucash/engine/gncInvoice.c                    |   4 +-
 libgnucash/engine/gncOrder.c                      |  41 ++---
 libgnucash/engine/gncOrder.h                      |   8 +-
 libgnucash/engine/qofquery.cpp                    |   2 +-
 libgnucash/engine/qofquerycore-p.h                |   2 +-
 libgnucash/engine/qofquerycore.cpp                |  33 ++--
 libgnucash/engine/qofquerycore.h                  |   4 +-
 libgnucash/engine/test-core/test-engine-stuff.cpp |  16 +-
 libgnucash/engine/test/CMakeLists.txt             |   6 +
 libgnucash/engine/test/gtest-qofquerycore.cpp     | 196 ++++++++++++++++++++++
 test-templates/make-testfile                      |  16 +-
 30 files changed, 399 insertions(+), 207 deletions(-)
 create mode 100644 libgnucash/engine/test/gtest-qofquerycore.cpp



More information about the gnucash-changes mailing list