diff options
author | Sam Thursfield <sam@afuera.me.uk> | 2020-10-12 16:11:10 +0000 |
---|---|---|
committer | Sam Thursfield <sam@afuera.me.uk> | 2020-10-12 16:11:10 +0000 |
commit | 1a93e1c183958f4d431dc8a92d248cf921c377e1 (patch) | |
tree | fede6ff1d97c683f230f43990596eb59ee365bc9 | |
parent | d8711d5c3e5e6345daf06a9d5052176df57dd8c8 (diff) | |
parent | d48fb81d7a557d3facb241622a8298cd709115ec (diff) | |
download | tracker-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.c | 2 | ||||
-rw-r--r-- | src/libtracker-data/tracker-db-interface-sqlite.c | 2 | ||||
-rw-r--r-- | src/libtracker-data/tracker-sparql.c | 24 | ||||
-rw-r--r-- | tests/libtracker-data/datetime/data-4.rq | 4 | ||||
-rw-r--r-- | tests/libtracker-data/datetime/direct-1.out | 1 | ||||
-rw-r--r-- | tests/libtracker-data/datetime/direct-1.rq | 1 | ||||
-rw-r--r-- | tests/libtracker-data/datetime/insert-1.out | 1 | ||||
-rw-r--r-- | tests/libtracker-data/datetime/insert-1.rq | 4 | ||||
-rw-r--r-- | tests/libtracker-data/tracker-sparql-test.c | 2 |
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 }, |