diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2021-04-03 15:43:49 +0200 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2022-02-10 23:32:00 +0100 |
commit | e4c3a5bc154c7003250501cc7d51740a975304ad (patch) | |
tree | d6ae2845af86dabe1ea357f15cf2a0b265d845e2 | |
parent | 0186235b66aedf6401d24c5263415bbb6409335f (diff) | |
download | tracker-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.c | 17 | ||||
-rw-r--r-- | src/libtracker-sparql/tracker-connection.c | 44 | ||||
-rw-r--r-- | src/libtracker-sparql/tracker-connection.h | 5 | ||||
-rw-r--r-- | src/libtracker-sparql/tracker-private.h | 3 | ||||
-rw-r--r-- | src/libtracker-sparql/tracker-sparql.vapi | 1 |
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")] |