[tracker/wip/carlosg/local-connection-mapping: 82/84] libtracker-sparql: Add tracker_sparql_connection_map_connection()




commit e4c3a5bc154c7003250501cc7d51740a975304ad
Author: Carlos Garnacho <carlosg gnome org>
Date:   Sat Apr 3 15:43:49 2021 +0200

    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.

 src/libtracker-sparql/direct/tracker-direct.c | 17 +++++++++++
 src/libtracker-sparql/tracker-connection.c    | 44 +++++++++++++++++++++++++++
 src/libtracker-sparql/tracker-connection.h    |  5 +++
 src/libtracker-sparql/tracker-private.h       |  3 ++
 src/libtracker-sparql/tracker-sparql.vapi     |  1 +
 5 files changed, 70 insertions(+)
---
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
@@ -1367,6 +1367,22 @@ tracker_direct_connection_serialize_finish (TrackerSparqlConnection  *connection
        return g_task_propagate_pointer (G_TASK (res), error);
 }
 
+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)
 {
@@ -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")]


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