[tracker: 2/3] libtracker-sparql: Add datetime helpers for statements and cursor
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker: 2/3] libtracker-sparql: Add datetime helpers for statements and cursor
- Date: Sat, 8 May 2021 08:59:21 +0000 (UTC)
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]