summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libtracker-data/tracker-sparql.c14
1 files 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 &&