summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2021-04-03 15:43:49 +0200
committerCarlos Garnacho <carlosg@gnome.org>2022-02-10 23:32:00 +0100
commite4c3a5bc154c7003250501cc7d51740a975304ad (patch)
treed6ae2845af86dabe1ea357f15cf2a0b265d845e2
parent0186235b66aedf6401d24c5263415bbb6409335f (diff)
downloadtracker-e4c3a5bc154c7003250501cc7d51740a975304ad.tar.gz
libtracker-sparql: Add tracker_sparql_connection_map_connection()
This API call allows hooking up a local TrackerSparqlConnection into another, so it is possible to access other local connections from one of them. This happens via the SERVICE SPARQL syntax, using special local:$handle_name URIs. This may be useful if there is data with different relevance (e.g. cache vs persistent) that the application is interested in maintaining separately, but query altogether.
-rw-r--r--src/libtracker-sparql/direct/tracker-direct.c17
-rw-r--r--src/libtracker-sparql/tracker-connection.c44
-rw-r--r--src/libtracker-sparql/tracker-connection.h5
-rw-r--r--src/libtracker-sparql/tracker-private.h3
-rw-r--r--src/libtracker-sparql/tracker-sparql.vapi1
5 files changed, 70 insertions, 0 deletions
diff --git a/src/libtracker-sparql/direct/tracker-direct.c b/src/libtracker-sparql/direct/tracker-direct.c
index 8317f40d3..cc6445fcc 100644
--- a/src/libtracker-sparql/direct/tracker-direct.c
+++ b/src/libtracker-sparql/direct/tracker-direct.c
@@ -1368,6 +1368,22 @@ tracker_direct_connection_serialize_finish (TrackerSparqlConnection *connection
}
static void
+tracker_direct_connection_map_connection (TrackerSparqlConnection *connection,
+ const gchar *handle_name,
+ TrackerSparqlConnection *service_connection)
+{
+ TrackerDirectConnectionPrivate *priv;
+ TrackerDirectConnection *conn;
+
+ conn = TRACKER_DIRECT_CONNECTION (connection);
+ priv = tracker_direct_connection_get_instance_private (conn);
+
+ tracker_data_manager_map_connection (priv->data_manager,
+ handle_name,
+ service_connection);
+}
+
+static void
tracker_direct_connection_class_init (TrackerDirectConnectionClass *klass)
{
TrackerSparqlConnectionClass *sparql_connection_class;
@@ -1404,6 +1420,7 @@ tracker_direct_connection_class_init (TrackerDirectConnectionClass *klass)
sparql_connection_class->lookup_dbus_service = tracker_direct_connection_lookup_dbus_service;
sparql_connection_class->serialize_async = tracker_direct_connection_serialize_async;
sparql_connection_class->serialize_finish = tracker_direct_connection_serialize_finish;
+ sparql_connection_class->map_connection = tracker_direct_connection_map_connection;
props[PROP_FLAGS] =
g_param_spec_flags ("flags",
diff --git a/src/libtracker-sparql/tracker-connection.c b/src/libtracker-sparql/tracker-connection.c
index 33042b0f9..d93eaf1a8 100644
--- a/src/libtracker-sparql/tracker-connection.c
+++ b/src/libtracker-sparql/tracker-connection.c
@@ -944,3 +944,47 @@ tracker_sparql_connection_serialize_finish (TrackerSparqlConnection *connection
result,
error);
}
+
+/**
+ * tracker_sparql_connection_map_connection:
+ * @connection: a #TrackerSparqlConnection
+ * @handle_name: handle name for @service_connection
+ * @service_connection: a #TrackerSparqlConnection to use from @connection
+ *
+ * Maps @service_connection so it is available as a "private:@handle_name" URI
+ * in @connection. This can be accessed via the SERVICE SPARQL syntax in
+ * queries from @connection. E.g.:
+ *
+ * ```sparql
+ * SELECT ?u {
+ * SERVICE <private:other-connection> {
+ * ?u a rdfs:Resource
+ * }
+ * }
+ * ```
+ *
+ * This is useful to interrelate data from multiple
+ * #TrackerSparqlConnection instances maintained by the same process,
+ * without creating a public endpoint for @service_connection.
+ *
+ * @connection may only be a #TrackerSparqlConnection created via
+ * tracker_sparql_connection_new() and tracker_sparql_connection_new_async().
+ *
+ * Since: 3.3
+ **/
+void
+tracker_sparql_connection_map_connection (TrackerSparqlConnection *connection,
+ const gchar *handle_name,
+ TrackerSparqlConnection *service_connection)
+{
+ g_return_if_fail (TRACKER_IS_SPARQL_CONNECTION (connection));
+ g_return_if_fail (TRACKER_IS_SPARQL_CONNECTION (service_connection));
+ g_return_if_fail (handle_name && *handle_name);
+
+ if (!TRACKER_SPARQL_CONNECTION_GET_CLASS (connection)->map_connection)
+ return;
+
+ TRACKER_SPARQL_CONNECTION_GET_CLASS (connection)->map_connection (connection,
+ handle_name,
+ service_connection);
+}
diff --git a/src/libtracker-sparql/tracker-connection.h b/src/libtracker-sparql/tracker-connection.h
index edb185c84..86e4339ee 100644
--- a/src/libtracker-sparql/tracker-connection.h
+++ b/src/libtracker-sparql/tracker-connection.h
@@ -244,6 +244,11 @@ TrackerSparqlStatement * tracker_sparql_connection_load_statement_from_gresource
GCancellable *cancellable,
GError **error);
+TRACKER_AVAILABLE_IN_3_3
+void tracker_sparql_connection_map_connection (TrackerSparqlConnection *connection,
+ const gchar *handle_name,
+ TrackerSparqlConnection *service_connection);
+
G_END_DECLS
#endif /* __TRACKER_SPARQL_CONNECTION_H__ */
diff --git a/src/libtracker-sparql/tracker-private.h b/src/libtracker-sparql/tracker-private.h
index bad99bd47..d91f5dae3 100644
--- a/src/libtracker-sparql/tracker-private.h
+++ b/src/libtracker-sparql/tracker-private.h
@@ -121,6 +121,9 @@ struct _TrackerSparqlConnectionClass
GInputStream * (* serialize_finish) (TrackerSparqlConnection *connection,
GAsyncResult *res,
GError **error);
+ void (* map_connection) (TrackerSparqlConnection *connection,
+ const gchar *handle_name,
+ TrackerSparqlConnection *service_connection);
};
struct _TrackerSparqlCursorClass
diff --git a/src/libtracker-sparql/tracker-sparql.vapi b/src/libtracker-sparql/tracker-sparql.vapi
index 74a0f66df..ac246e2e1 100644
--- a/src/libtracker-sparql/tracker-sparql.vapi
+++ b/src/libtracker-sparql/tracker-sparql.vapi
@@ -114,6 +114,7 @@ namespace Tracker {
public async virtual bool close_async () throws GLib.IOError;
public async virtual GLib.InputStream serialize_async (SerializeFlags flags, RdfFormat format, string sparql, GLib.Cancellable? cancellable = null) throws Sparql.Error, GLib.Error, GLib.IOError, GLib.DBusError;
+ public virtual void map_connection (string handle_name, Sparql.Connection service_connection);
}
[CCode (cheader_filename = "libtracker-sparql/tracker-sparql.h")]