[tracker: 2/3] libtracker-sparql: Add datetime helpers for statements and cursor




commit ca7a76e87959e694321d3dae1b731417b2af82db
Author: nis130 <nishitlimbani130 gmail com>
Date:   Sun Mar 21 12:13:35 2021 +0530

    libtracker-sparql: Add datetime helpers for statements and cursor
    
    Currently one needs to convert the datetime manually to a string
    now GDateTime value can be easily binded to a statement
    
    Fixes #270

 .../libtracker-sparql-sections.txt                 |  5 +++
 .../bus/tracker-bus-statement.vala                 |  5 +++
 src/libtracker-sparql/tracker-cursor.c             | 36 ++++++++++++++++++++++
 src/libtracker-sparql/tracker-cursor.h             |  3 ++
 src/libtracker-sparql/tracker-private.h            |  5 +++
 src/libtracker-sparql/tracker-sparql.vapi          |  2 ++
 src/libtracker-sparql/tracker-statement.c          | 24 +++++++++++++++
 src/libtracker-sparql/tracker-statement.h          |  4 +++
 tests/libtracker-sparql/statement/datetime.out     |  1 +
 tests/libtracker-sparql/statement/datetime.rq      |  1 +
 tests/libtracker-sparql/tracker-statement-test.c   | 18 +++++++++--
 11 files changed, 101 insertions(+), 3 deletions(-)
---
diff --git a/docs/reference/libtracker-sparql/libtracker-sparql-sections.txt 
b/docs/reference/libtracker-sparql/libtracker-sparql-sections.txt
index 8dce837dd..ffbcfb8cf 100644
--- a/docs/reference/libtracker-sparql/libtracker-sparql-sections.txt
+++ b/docs/reference/libtracker-sparql/libtracker-sparql-sections.txt
@@ -24,6 +24,7 @@ tracker_resource_set_gvalue
 tracker_resource_set_identifier
 tracker_resource_set_int
 tracker_resource_set_int64
+tracker_resource_set_datetime
 tracker_resource_set_relation
 tracker_resource_set_take_relation
 tracker_resource_set_string
@@ -33,6 +34,7 @@ tracker_resource_add_double
 tracker_resource_add_gvalue
 tracker_resource_add_int
 tracker_resource_add_int64
+tracker_resource_add_datetime
 tracker_resource_add_relation
 tracker_resource_add_take_relation
 tracker_resource_add_string
@@ -43,6 +45,7 @@ tracker_resource_get_first_int
 tracker_resource_get_first_int64
 tracker_resource_get_first_relation
 tracker_resource_get_first_string
+tracker_resource_get_first_datetime
 tracker_resource_get_first_uri
 tracker_resource_get_identifier
 tracker_resource_get_values
@@ -168,6 +171,7 @@ tracker_sparql_statement_bind_int
 tracker_sparql_statement_bind_double
 tracker_sparql_statement_bind_string
 tracker_sparql_statement_bind_boolean
+tracker_sparql_statement_bind_datetime
 tracker_sparql_statement_clear_bindings
 tracker_sparql_statement_get_connection
 tracker_sparql_statement_get_sparql
@@ -197,6 +201,7 @@ tracker_sparql_cursor_get_string
 tracker_sparql_cursor_get_boolean
 tracker_sparql_cursor_get_double
 tracker_sparql_cursor_get_integer
+tracker_sparql_cursor_get_datetime
 tracker_sparql_cursor_get_value_type
 tracker_sparql_cursor_get_variable_name
 tracker_sparql_cursor_close
diff --git a/src/libtracker-sparql/bus/tracker-bus-statement.vala 
b/src/libtracker-sparql/bus/tracker-bus-statement.vala
index b14143901..39af7c766 100644
--- a/src/libtracker-sparql/bus/tracker-bus-statement.vala
+++ b/src/libtracker-sparql/bus/tracker-bus-statement.vala
@@ -51,6 +51,11 @@ public class Tracker.Bus.Statement : Tracker.Sparql.Statement {
                this.arguments.insert (name, new GLib.Variant.string (value));
        }
 
+       public override void bind_datetime (string name, DateTime value) {
+               string date_time = value.to_string ();
+               this.arguments.insert (name, new GLib.Variant.string (date_time));
+       }
+
        public override void clear_bindings () {
                this.arguments.remove_all ();
        }
diff --git a/src/libtracker-sparql/tracker-cursor.c b/src/libtracker-sparql/tracker-cursor.c
index a97767474..4f2e9a5ae 100644
--- a/src/libtracker-sparql/tracker-cursor.c
+++ b/src/libtracker-sparql/tracker-cursor.c
@@ -100,6 +100,21 @@ tracker_sparql_cursor_real_get_boolean (TrackerSparqlCursor *cursor,
        return g_ascii_strcasecmp (text, "true") == 0;
 }
 
+static GDateTime *
+tracker_sparql_cursor_real_get_datetime (TrackerSparqlCursor *cursor,
+                                         gint                 column)
+{
+       const gchar *text;
+       GDateTime *date_time;
+
+       g_return_val_if_fail (tracker_sparql_cursor_real_is_bound (cursor, column), NULL);
+
+       text = tracker_sparql_cursor_get_string (cursor, column, NULL);
+       date_time = g_date_time_new_from_iso8601 (text, NULL);
+
+       return date_time;
+}
+
 static void
 tracker_sparql_cursor_finalize (GObject *object)
 {
@@ -164,6 +179,7 @@ tracker_sparql_cursor_class_init (TrackerSparqlCursorClass *klass)
        klass->get_integer = tracker_sparql_cursor_real_get_integer;
        klass->get_double = tracker_sparql_cursor_real_get_double;
        klass->get_boolean = tracker_sparql_cursor_real_get_boolean;
+       klass->get_datetime = tracker_sparql_cursor_real_get_datetime;
        klass->is_bound = tracker_sparql_cursor_real_is_bound;
 
        /**
@@ -367,6 +383,26 @@ tracker_sparql_cursor_get_variable_name (TrackerSparqlCursor *cursor,
                                                                            column);
 }
 
+/**
+ * tracker_sparql_cursor_get_datetime:
+ * @cursor: a #TrackerSparqlCursor
+ * @column: column number to retrieve (first one is 0)
+ *
+ * Retrieve an GDateTime pointer for the current row in @column.
+ *
+ * Returns: (transfer full) (nullable): #GDateTime object, or %NULL if the given column does not contain a 
xsd:date or xsd:dateTime
+ * Since: 3.2
+ */
+GDateTime *
+tracker_sparql_cursor_get_datetime (TrackerSparqlCursor *cursor,
+                                    gint                 column)
+{
+       g_return_val_if_fail (TRACKER_IS_SPARQL_CURSOR (cursor), NULL);
+
+       return TRACKER_SPARQL_CURSOR_GET_CLASS (cursor)->get_datetime (cursor,
+                                                                      column);
+}
+
 /**
  * tracker_sparql_cursor_close:
  * @cursor: a #TrackerSparqlCursor
diff --git a/src/libtracker-sparql/tracker-cursor.h b/src/libtracker-sparql/tracker-cursor.h
index ac4bc6355..92e8f5d3c 100644
--- a/src/libtracker-sparql/tracker-cursor.h
+++ b/src/libtracker-sparql/tracker-cursor.h
@@ -90,6 +90,9 @@ TrackerSparqlValueType tracker_sparql_cursor_get_value_type (TrackerSparqlCursor
 TRACKER_AVAILABLE_IN_ALL
 const gchar * tracker_sparql_cursor_get_variable_name (TrackerSparqlCursor *cursor,
                                                        gint                 column);
+TRACKER_AVAILABLE_IN_3_2
+GDateTime * tracker_sparql_cursor_get_datetime (TrackerSparqlCursor *cursor,
+                                                gint                 column);
 TRACKER_AVAILABLE_IN_ALL
 void tracker_sparql_cursor_close (TrackerSparqlCursor *cursor);
 
diff --git a/src/libtracker-sparql/tracker-private.h b/src/libtracker-sparql/tracker-private.h
index b8c6381ec..4712476ad 100644
--- a/src/libtracker-sparql/tracker-private.h
+++ b/src/libtracker-sparql/tracker-private.h
@@ -145,6 +145,8 @@ struct _TrackerSparqlCursorClass
                                 gint                 column);
         gboolean (* get_boolean) (TrackerSparqlCursor *cursor,
                                   gint                 column);
+        GDateTime* (* get_datetime) (TrackerSparqlCursor *cursor,
+                                     gint                 column);
         gboolean (* is_bound) (TrackerSparqlCursor *cursor,
                                gint                 column);
         gint (* get_n_columns) (TrackerSparqlCursor *cursor);
@@ -217,6 +219,9 @@ struct _TrackerSparqlStatementClass
         void (* bind_double) (TrackerSparqlStatement *stmt,
                               const gchar            *name,
                               gdouble                 value);
+        void (* bind_datetime) (TrackerSparqlStatement *stmt,
+                                const gchar            *name,
+                                GDateTime              *value);
 
         TrackerSparqlCursor * (* execute) (TrackerSparqlStatement  *stmt,
                                            GCancellable            *cancellable,
diff --git a/src/libtracker-sparql/tracker-sparql.vapi b/src/libtracker-sparql/tracker-sparql.vapi
index cb02da3d8..558c5c469 100644
--- a/src/libtracker-sparql/tracker-sparql.vapi
+++ b/src/libtracker-sparql/tracker-sparql.vapi
@@ -112,6 +112,7 @@ namespace Tracker {
                public abstract void bind_boolean (string name, bool value);
                public abstract void bind_string (string name, string value);
                public abstract void bind_double (string name, double value);
+               public abstract void bind_datetime (string name, GLib.DateTime value);
                public abstract void clear_bindings ();
 
                public abstract Cursor execute (GLib.Cancellable? cancellable) throws Sparql.Error, 
GLib.Error, GLib.IOError, GLib.DBusError;
@@ -142,6 +143,7 @@ namespace Tracker {
                public virtual int64 get_integer (int column);
                public virtual double get_double (int column);
                public virtual bool get_boolean (int column);
+               public virtual GLib.DateTime get_datetime (int column);
                public virtual bool is_bound (int column);
        }
 
diff --git a/src/libtracker-sparql/tracker-statement.c b/src/libtracker-sparql/tracker-statement.c
index 8fbd63534..54cce281c 100644
--- a/src/libtracker-sparql/tracker-statement.c
+++ b/src/libtracker-sparql/tracker-statement.c
@@ -283,6 +283,30 @@ tracker_sparql_statement_bind_string (TrackerSparqlStatement *stmt,
                                                                       value);
 }
 
+/**
+ * tracker_sparql_statement_bind_datetime:
+ * @stmt: a #TrackerSparqlStatement
+ * @name: variable name
+ * @value: value
+ *
+ * Binds the GDateTime @value to variable @name.
+ * Since: 3.2
+ */
+
+void
+tracker_sparql_statement_bind_datetime (TrackerSparqlStatement *stmt,
+                                        const gchar            *name,
+                                        GDateTime              *value)
+{
+       g_return_if_fail (TRACKER_IS_SPARQL_STATEMENT (stmt));
+       g_return_if_fail (name != NULL);
+       g_return_if_fail (value != NULL);
+
+       return TRACKER_SPARQL_STATEMENT_GET_CLASS (stmt)->bind_datetime (stmt,
+                                                                        name,
+                                                                        value);
+}
+
 /**
  * tracker_sparql_statement_execute:
  * @stmt: a #TrackerSparqlStatement
diff --git a/src/libtracker-sparql/tracker-statement.h b/src/libtracker-sparql/tracker-statement.h
index a25a593a0..ead440c78 100644
--- a/src/libtracker-sparql/tracker-statement.h
+++ b/src/libtracker-sparql/tracker-statement.h
@@ -70,6 +70,10 @@ TRACKER_AVAILABLE_IN_ALL
 void tracker_sparql_statement_bind_string (TrackerSparqlStatement *stmt,
                                            const gchar            *name,
                                            const gchar            *value);
+TRACKER_AVAILABLE_IN_3_2
+void tracker_sparql_statement_bind_datetime (TrackerSparqlStatement *stmt,
+                                             const gchar            *name,
+                                             GDateTime              *value);
 
 TRACKER_AVAILABLE_IN_ALL
 TrackerSparqlCursor * tracker_sparql_statement_execute (TrackerSparqlStatement  *stmt,
diff --git a/tests/libtracker-sparql/statement/datetime.out b/tests/libtracker-sparql/statement/datetime.out
new file mode 100644
index 000000000..7879dea39
--- /dev/null
+++ b/tests/libtracker-sparql/statement/datetime.out
@@ -0,0 +1 @@
+"2020-12-04T04:10:03Z"
diff --git a/tests/libtracker-sparql/statement/datetime.rq b/tests/libtracker-sparql/statement/datetime.rq
new file mode 100644
index 000000000..0effaf26c
--- /dev/null
+++ b/tests/libtracker-sparql/statement/datetime.rq
@@ -0,0 +1 @@
+SELECT ~arg3 { }
\ No newline at end of file
diff --git a/tests/libtracker-sparql/tracker-statement-test.c 
b/tests/libtracker-sparql/tracker-statement-test.c
index a66bb1281..6ddbc6114 100644
--- a/tests/libtracker-sparql/tracker-statement-test.c
+++ b/tests/libtracker-sparql/tracker-statement-test.c
@@ -49,6 +49,7 @@ TestInfo tests[] = {
        { "limit-2", "statement/limit.rq", "statement/limit-2.out", "2" },
        { "offset", "statement/offset.rq", "statement/offset.out", "0" },
        { "offset-2", "statement/offset.rq", "statement/offset-2.out", "1" },
+       { "datetime", "statement/datetime.rq", "statement/datetime.out", NULL, NULL, "2020-12-04T04:10:03Z" },
 };
 
 typedef struct {
@@ -82,12 +83,19 @@ check_result (TrackerSparqlCursor *cursor,
 
                for (col = 0; col < tracker_sparql_cursor_get_n_columns (cursor); col++) {
                        const gchar *str;
+                       GDateTime *date_time;
 
                        if (col > 0) {
                                g_string_append (row_str, "\t");
                        }
+                       if (g_strcmp0 (g_path_get_basename (results_filename), "datetime.out") == 0) {
 
-                       str = tracker_sparql_cursor_get_string (cursor, col, NULL);
+                               date_time = tracker_sparql_cursor_get_datetime (cursor, col);
+                               str = g_date_time_format_iso8601 (date_time);
+                               g_date_time_unref (date_time);
+
+                       } else
+                               str = tracker_sparql_cursor_get_string (cursor, col, NULL);
 
                        /* Hack to avoid misc properties that might tamper with
                         * test reproduceability in DESCRIBE and other unrestricted
@@ -160,6 +168,7 @@ query_statement (TestInfo      *test_info,
        TrackerSparqlCursor *cursor;
        GError *error = NULL;
        gchar *path, *query;
+       GDateTime *date_time;
 
        path = g_build_filename (TOP_SRCDIR, "tests", "libtracker-sparql",
                                 test_info->query_file, NULL);
@@ -184,8 +193,11 @@ query_statement (TestInfo      *test_info,
                tracker_sparql_statement_bind_string (stmt, "arg1", test_info->arg1);
        if (test_info->arg2)
                tracker_sparql_statement_bind_string (stmt, "arg2", test_info->arg2);
-       if (test_info->arg3)
-               tracker_sparql_statement_bind_string (stmt, "arg3", test_info->arg3);
+       if (test_info->arg3) {
+               date_time = g_date_time_new_from_iso8601 (test_info->arg3, NULL);
+               tracker_sparql_statement_bind_datetime (stmt, "arg3", date_time);
+               g_date_time_unref (date_time);
+       }
 
        cursor = tracker_sparql_statement_execute (stmt, NULL, &error);
 


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