[tracker/wip/carlosg/datetime-fixes: 1/5] libtracker-data: Use correct binding types for datetimes




commit 702d56f62a61807b71f85881e959f4f72a28d725
Author: Carlos Garnacho <carlosg gnome org>
Date:   Sat Oct 10 12:53:10 2020 +0200

    libtracker-data: Use correct binding types for datetimes
    
    When creating a binding from a literal datetime value, we mistakenly
    use doubles (as used to be the common thing in Tracker 2.x). We now
    store datetimes as either iso8601 strings or int64 timestamps, so
    forward these types.
    
    This code is in consistence with the update bits at tracker-data-update.c.
    
    Fixes select queries like:
    SELECT ("2020-01-01T01:01:01Z"^^xsd:dateTime AS ?date) { }

 src/libtracker-data/tracker-sparql.c | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)
---
diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c
index 2ff43d045..cf023cbb8 100644
--- a/src/libtracker-data/tracker-sparql.c
+++ b/src/libtracker-data/tracker-sparql.c
@@ -21,6 +21,8 @@
 #include "config.h"
 
 #include <glib-object.h>
+#include <math.h>
+
 #include "tracker-data-query.h"
 #include "tracker-string-builder.h"
 #include "tracker-sparql.h"
@@ -9384,14 +9386,22 @@ prepare_query (TrackerSparql         *sparql,
                        tracker_db_statement_bind_int (stmt, i, (int) datetime);
                } else if (prop_type == TRACKER_PROPERTY_TYPE_DATETIME) {
                        gdouble datetime;
+                       gint offset = 0;
 
-                       datetime = tracker_string_to_date (binding->literal, NULL, error);
+                       datetime = tracker_string_to_date (binding->literal, offset, error);
                        if (datetime < 0) {
                                g_object_unref (stmt);
                                return NULL;
                        }
 
-                       tracker_db_statement_bind_double (stmt, i, datetime);
+                       /* If we have anything that prevents a unix timestamp to be
+                        * lossless, we use the ISO8601 string.
+                        */
+                       if (offset != 0 || floor (datetime) != datetime) {
+                               tracker_db_statement_bind_text (stmt, i, binding->literal);
+                       } else {
+                               tracker_db_statement_bind_int (stmt, i, datetime);
+                       }
                } else if (prop_type == TRACKER_PROPERTY_TYPE_INTEGER) {
                        tracker_db_statement_bind_int (stmt, i, atoi (binding->literal));
                } else if (prop_type == TRACKER_PROPERTY_TYPE_LANGSTRING &&


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]