summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Thursfield <sam@afuera.me.uk>2020-10-12 16:11:10 +0000
committerSam Thursfield <sam@afuera.me.uk>2020-10-12 16:11:10 +0000
commit1a93e1c183958f4d431dc8a92d248cf921c377e1 (patch)
treefede6ff1d97c683f230f43990596eb59ee365bc9
parentd8711d5c3e5e6345daf06a9d5052176df57dd8c8 (diff)
parentd48fb81d7a557d3facb241622a8298cd709115ec (diff)
downloadtracker-1a93e1c183958f4d431dc8a92d248cf921c377e1.tar.gz
Merge branch 'wip/carlosg/datetime-fixes' into 'master'
Fixes to date/time parsing Closes tracker-miners#146 See merge request GNOME/tracker!324
-rw-r--r--src/libtracker-common/tracker-date-time.c2
-rw-r--r--src/libtracker-data/tracker-db-interface-sqlite.c2
-rw-r--r--src/libtracker-data/tracker-sparql.c24
-rw-r--r--tests/libtracker-data/datetime/data-4.rq4
-rw-r--r--tests/libtracker-data/datetime/direct-1.out1
-rw-r--r--tests/libtracker-data/datetime/direct-1.rq1
-rw-r--r--tests/libtracker-data/datetime/insert-1.out1
-rw-r--r--tests/libtracker-data/datetime/insert-1.rq4
-rw-r--r--tests/libtracker-data/tracker-sparql-test.c2
9 files changed, 34 insertions, 7 deletions
diff --git a/src/libtracker-common/tracker-date-time.c b/src/libtracker-common/tracker-date-time.c
index 03ee078d5..003239f6a 100644
--- a/src/libtracker-common/tracker-date-time.c
+++ b/src/libtracker-common/tracker-date-time.c
@@ -222,7 +222,7 @@ tracker_date_to_string (gdouble date_time,
gmtime_r (&seconds, &utc_time);
/* Output is ISO 8601 format : "YYYY-MM-DDThh:mm:ss" */
- count = strftime (buffer, sizeof (buffer), "%FT%T", &utc_time);
+ count = strftime (buffer, sizeof (buffer), "%4Y-%m-%dT%T", &utc_time);
/* Append milliseconds (if non-zero) and time zone */
if (milliseconds > 0) {
diff --git a/src/libtracker-data/tracker-db-interface-sqlite.c b/src/libtracker-data/tracker-db-interface-sqlite.c
index 23b7b7967..c6a20a84c 100644
--- a/src/libtracker-data/tracker-db-interface-sqlite.c
+++ b/src/libtracker-data/tracker-db-interface-sqlite.c
@@ -530,7 +530,7 @@ function_sparql_time_sort (sqlite3_context *context,
time = tracker_string_to_date (value, NULL, &error);
if (error) {
- result_context_function_error (context, fn, "Failed time string conversion");
+ result_context_function_error (context, fn, error->message);
g_error_free (error);
return;
}
diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c
index 3bee2b34f..7beedd0a0 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"
@@ -9358,29 +9360,41 @@ prepare_query (TrackerSparql *sparql,
return NULL;
}
} else if (prop_type == TRACKER_PROPERTY_TYPE_DATE) {
+ GError *inner_error = NULL;
gchar *full_str;
gdouble datetime;
full_str = g_strdup_printf ("%sT00:00:00Z", binding->literal);
- datetime = tracker_string_to_date (full_str, NULL, error);
+ datetime = tracker_string_to_date (full_str, NULL, &inner_error);
g_free (full_str);
- if (datetime < 0) {
+ if (inner_error) {
+ g_propagate_error (error, inner_error);
g_object_unref (stmt);
return NULL;
}
tracker_db_statement_bind_int (stmt, i, (int) datetime);
} else if (prop_type == TRACKER_PROPERTY_TYPE_DATETIME) {
+ GError *inner_error = NULL;
gdouble datetime;
+ gint offset = 0;
- datetime = tracker_string_to_date (binding->literal, NULL, error);
- if (datetime < 0) {
+ datetime = tracker_string_to_date (binding->literal, offset, &inner_error);
+ if (inner_error) {
+ g_propagate_error (error, inner_error);
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 &&
diff --git a/tests/libtracker-data/datetime/data-4.rq b/tests/libtracker-data/datetime/data-4.rq
new file mode 100644
index 000000000..0cd6f339b
--- /dev/null
+++ b/tests/libtracker-data/datetime/data-4.rq
@@ -0,0 +1,4 @@
+INSERT {
+ example:x a example:A ;
+ example:p "0100-12-31T21:00:00-03:00"
+}
diff --git a/tests/libtracker-data/datetime/direct-1.out b/tests/libtracker-data/datetime/direct-1.out
new file mode 100644
index 000000000..566938b9d
--- /dev/null
+++ b/tests/libtracker-data/datetime/direct-1.out
@@ -0,0 +1 @@
+"0000-01-01T00:00:00Z" "2020-01-01T00:00:00Z" "9999-01-01T00:00:00Z"
diff --git a/tests/libtracker-data/datetime/direct-1.rq b/tests/libtracker-data/datetime/direct-1.rq
new file mode 100644
index 000000000..51de51070
--- /dev/null
+++ b/tests/libtracker-data/datetime/direct-1.rq
@@ -0,0 +1 @@
+SELECT ("0000-01-01T00:00:00Z"^^xsd:dateTime AS ?d1) ("2020-01-01T00:00:00Z"^^xsd:dateTime AS ?d2) ("9999-01-01T00:00:00Z"^^xsd:dateTime AS ?d3) {} \ No newline at end of file
diff --git a/tests/libtracker-data/datetime/insert-1.out b/tests/libtracker-data/datetime/insert-1.out
new file mode 100644
index 000000000..7dcd21192
--- /dev/null
+++ b/tests/libtracker-data/datetime/insert-1.out
@@ -0,0 +1 @@
+"http://example/x" "0100-12-31T21:00:00-03:00"
diff --git a/tests/libtracker-data/datetime/insert-1.rq b/tests/libtracker-data/datetime/insert-1.rq
new file mode 100644
index 000000000..6c2e0a01c
--- /dev/null
+++ b/tests/libtracker-data/datetime/insert-1.rq
@@ -0,0 +1,4 @@
+SELECT ?s ?v
+WHERE {
+ ?s example:p ?v
+}
diff --git a/tests/libtracker-data/tracker-sparql-test.c b/tests/libtracker-data/tracker-sparql-test.c
index 4024e105a..9f4d68fc9 100644
--- a/tests/libtracker-data/tracker-sparql-test.c
+++ b/tests/libtracker-data/tracker-sparql-test.c
@@ -92,7 +92,9 @@ const TestInfo tests[] = {
{ "construct/construct-where", "construct/data", FALSE },
{ "construct/construct-pattern", "construct/data", FALSE },
{ "construct/construct-with-modifiers", "construct/data", FALSE },
+ { "datetime/direct-1", "datetime/data-1", FALSE },
{ "datetime/delete-1", "datetime/data-3", FALSE },
+ { "datetime/insert-1", "datetime/data-4", FALSE },
{ "datetime/functions-localtime-1", "datetime/data-1", FALSE },
{ "datetime/functions-timezone-1", "datetime/data-2", FALSE },
{ "datetime/functions-timezone-2", "datetime/data-2", FALSE },