[tracker/wip/carlosg/sparql1.1: 97/201] libtracker-data: Implement TZ sparql function



commit 3b62be8882518463d3333aa76d3b6e7836f03351
Author: Carlos Garnacho <carlosg gnome org>
Date:   Tue Jun 4 12:30:01 2019 +0200

    libtracker-data: Implement TZ sparql function

 src/libtracker-data/tracker-db-interface-sqlite.c | 45 +++++++++++++++++++++++
 src/libtracker-data/tracker-sparql.c              |  8 +++-
 2 files changed, 52 insertions(+), 1 deletion(-)
---
diff --git a/src/libtracker-data/tracker-db-interface-sqlite.c 
b/src/libtracker-data/tracker-db-interface-sqlite.c
index ca3642013..802ea97e2 100644
--- a/src/libtracker-data/tracker-db-interface-sqlite.c
+++ b/src/libtracker-data/tracker-db-interface-sqlite.c
@@ -558,6 +558,49 @@ function_sparql_time_zone_duration (sqlite3_context *context,
        }
 }
 
+static void
+function_sparql_time_zone_substr (sqlite3_context *context,
+                                  int              argc,
+                                  sqlite3_value   *argv[])
+{
+       if (argc != 1) {
+               sqlite3_result_error (context, "Invalid argument count", -1);
+               return;
+       }
+
+       if (sqlite3_value_type (argv[0]) == SQLITE_NULL) {
+               sqlite3_result_null (context);
+               return;
+       } else if (sqlite3_value_numeric_type (argv[0]) == SQLITE_INTEGER) {
+               sqlite3_result_text (context, "", -1, NULL);
+       } else if (sqlite3_value_type (argv[0]) == SQLITE_TEXT) {
+               const gchar *str;
+               gint len;
+
+               str = sqlite3_value_text (argv[0]);
+               len = strlen (str);
+
+               if (g_str_has_suffix (str, "Z")) {
+                       sqlite3_result_text (context, "Z", -1, NULL);
+               } else if (len > strlen ("0000-00-00T00:00:00Z")) {
+                       const gchar *tz = "";
+
+                       /* [+-]HHMM */
+                       if (str[len - 5] == '+' || str[len - 5] == '-')
+                               tz = &str[len - 5];
+                       /* [+-]HH:MM */
+                       else if (str[len - 6] == '+' || str[len - 6] == '-')
+                               tz = &str[len - 6];
+
+                       sqlite3_result_text (context, g_strdup (tz), -1, g_free);
+               } else {
+                       sqlite3_result_text (context, "", -1, NULL);
+               }
+       } else {
+               sqlite3_result_error (context, "Invalid argument type", -1);
+       }
+}
+
 static void
 function_sparql_cartesian_distance (sqlite3_context *context,
                                     int              argc,
@@ -1569,6 +1612,8 @@ initialize_functions (TrackerDBInterface *db_interface)
                  function_sparql_time_sort },
                { "SparqlTimezoneDuration", 1, SQLITE_ANY | SQLITE_DETERMINISTIC,
                  function_sparql_time_zone_duration },
+               { "SparqlTimezoneString", 1, SQLITE_ANY | SQLITE_DETERMINISTIC,
+                 function_sparql_time_zone_substr },
                /* Paths and filenames */
                { "SparqlStringFromFilename", 1, SQLITE_ANY | SQLITE_DETERMINISTIC,
                  function_sparql_string_from_filename },
diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c
index b0665bff3..a09b4c62c 100644
--- a/src/libtracker-data/tracker-sparql.c
+++ b/src/libtracker-data/tracker-sparql.c
@@ -5970,7 +5970,13 @@ translate_BuiltInCall (TrackerSparql  *sparql,
        } else if (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_TIMEZONE)) {
                _unimplemented ("TIMEZONE");
        } else if (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_TZ)) {
-               _unimplemented ("TZ");
+               sparql->current_state.convert_to_string = TRUE;
+               _expect (sparql, RULE_TYPE_LITERAL, LITERAL_OPEN_PARENS);
+               _append_string (sparql, "SparqlTimezoneString (");
+               _call_rule (sparql, NAMED_RULE_Expression, error);
+               _expect (sparql, RULE_TYPE_LITERAL, LITERAL_CLOSE_PARENS);
+               _append_string (sparql, ") ");
+               sparql->current_state.expression_type = TRACKER_PROPERTY_TYPE_STRING;
        } else if (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_MD5)) {
                sparql->current_state.convert_to_string = TRUE;
                _expect (sparql, RULE_TYPE_LITERAL, LITERAL_OPEN_PARENS);


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