summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Thursfield <sam@afuera.me.uk>2022-02-11 09:49:58 +0000
committerSam Thursfield <sam@afuera.me.uk>2022-02-11 09:49:58 +0000
commit43bc01da70589568fcbf4be4400dd53290205787 (patch)
tree4c11b1f06a8f1b34d5874ba07d3b04a788cb8a32
parent8249b6786197087f4476db7af21625a5e3430fb9 (diff)
parent077fe2f4f8f2f19e871d5f181ca4d4dde6f66c11 (diff)
downloadtracker-43bc01da70589568fcbf4be4400dd53290205787.tar.gz
Merge branch 'wip/carlosg/local-connection-mapping' into 'master'
libtracker-sparql: Add tracker_sparql_connection_map_connection() See merge request GNOME/tracker!395
-rw-r--r--src/libtracker-data/tracker-data-manager.c24
-rw-r--r--src/libtracker-data/tracker-data-manager.h3
-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
-rw-r--r--tests/libtracker-data/service/service-after-triples-1.rq2
-rw-r--r--tests/libtracker-data/service/service-before-triples-1.rq2
-rw-r--r--tests/libtracker-data/service/service-empty-1.rq2
-rw-r--r--tests/libtracker-data/service/service-empty-2.rq2
-rw-r--r--tests/libtracker-data/service/service-local-filter-1.rq2
-rw-r--r--tests/libtracker-data/service/service-query-1.rq2
-rw-r--r--tests/libtracker-data/service/service-union-with-local-1.rq2
-rw-r--r--tests/libtracker-data/service/service-union-with-local-2.rq2
-rw-r--r--tests/libtracker-data/service/service-union-with-local-3.rq2
-rw-r--r--tests/libtracker-data/service/service-var-1.rq2
-rw-r--r--tests/libtracker-data/service/service-var-2.rq2
-rw-r--r--tests/libtracker-data/tracker-service-test.c41
19 files changed, 138 insertions, 22 deletions
diff --git a/src/libtracker-data/tracker-data-manager.c b/src/libtracker-data/tracker-data-manager.c
index 1fbd45bac..266a732b1 100644
--- a/src/libtracker-data/tracker-data-manager.c
+++ b/src/libtracker-data/tracker-data-manager.c
@@ -150,6 +150,9 @@ static void
tracker_data_manager_init (TrackerDataManager *manager)
{
manager->generation = 1;
+ manager->cached_connections =
+ g_hash_table_new_full (g_str_hash, g_str_equal,
+ g_free, g_object_unref);
g_mutex_init (&manager->connections_lock);
g_mutex_init (&manager->graphs_lock);
}
@@ -5426,12 +5429,6 @@ tracker_data_manager_get_remote_connection (TrackerDataManager *data_manager,
g_mutex_lock (&data_manager->connections_lock);
- if (!data_manager->cached_connections) {
- data_manager->cached_connections =
- g_hash_table_new_full (g_str_hash, g_str_equal,
- g_free, g_object_unref);
- }
-
connection = g_hash_table_lookup (data_manager->cached_connections, uri);
if (!connection) {
@@ -5500,3 +5497,18 @@ fail:
return connection;
}
+
+void
+tracker_data_manager_map_connection (TrackerDataManager *data_manager,
+ const gchar *handle_name,
+ TrackerSparqlConnection *connection)
+{
+ gchar *uri;
+
+ uri = g_strdup_printf ("private:%s", handle_name);
+
+ g_mutex_lock (&data_manager->connections_lock);
+ g_hash_table_insert (data_manager->cached_connections,
+ uri, g_object_ref (connection));
+ g_mutex_unlock (&data_manager->connections_lock);
+}
diff --git a/src/libtracker-data/tracker-data-manager.h b/src/libtracker-data/tracker-data-manager.h
index c132f2b0c..6a85c49ab 100644
--- a/src/libtracker-data/tracker-data-manager.h
+++ b/src/libtracker-data/tracker-data-manager.h
@@ -117,6 +117,9 @@ gboolean tracker_data_manager_expand_prefix (TrackerDataManager *ma
TrackerSparqlConnection * tracker_data_manager_get_remote_connection (TrackerDataManager *data_manager,
const gchar *uri,
GError **error);
+void tracker_data_manager_map_connection (TrackerDataManager *data_manager,
+ const gchar *handle_name,
+ TrackerSparqlConnection *connection);
G_END_DECLS
diff --git a/src/libtracker-sparql/direct/tracker-direct.c b/src/libtracker-sparql/direct/tracker-direct.c
index 4487749bb..891f5f68a 100644
--- a/src/libtracker-sparql/direct/tracker-direct.c
+++ b/src/libtracker-sparql/direct/tracker-direct.c
@@ -1370,6 +1370,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;
@@ -1406,6 +1422,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 8c7de81e6..382492532 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")]
diff --git a/tests/libtracker-data/service/service-after-triples-1.rq b/tests/libtracker-data/service/service-after-triples-1.rq
index c458ef306..fb06e12ed 100644
--- a/tests/libtracker-data/service/service-after-triples-1.rq
+++ b/tests/libtracker-data/service/service-after-triples-1.rq
@@ -1,6 +1,6 @@
SELECT ?u {
?u a rdfs:Resource .
- SERVICE <dbus:%s> {
+ SERVICE <%s> {
?u nrl:indexed true
}
}
diff --git a/tests/libtracker-data/service/service-before-triples-1.rq b/tests/libtracker-data/service/service-before-triples-1.rq
index f41171537..f867e97f9 100644
--- a/tests/libtracker-data/service/service-before-triples-1.rq
+++ b/tests/libtracker-data/service/service-before-triples-1.rq
@@ -1,5 +1,5 @@
SELECT ?u {
- SERVICE <dbus:%s> {
+ SERVICE <%s> {
?u a rdfs:Resource
}
?u nrl:indexed true
diff --git a/tests/libtracker-data/service/service-empty-1.rq b/tests/libtracker-data/service/service-empty-1.rq
index 476290070..23136fa1f 100644
--- a/tests/libtracker-data/service/service-empty-1.rq
+++ b/tests/libtracker-data/service/service-empty-1.rq
@@ -1,4 +1,4 @@
SELECT ?u {
- SERVICE <dbus:%s> {
+ SERVICE <%s> {
}
}
diff --git a/tests/libtracker-data/service/service-empty-2.rq b/tests/libtracker-data/service/service-empty-2.rq
index 688f584b9..3bd6a5f13 100644
--- a/tests/libtracker-data/service/service-empty-2.rq
+++ b/tests/libtracker-data/service/service-empty-2.rq
@@ -1,5 +1,5 @@
SELECT ?u {
- SERVICE <dbus:%s> {
+ SERVICE <%s> {
SELECT 42 { }
}
}
diff --git a/tests/libtracker-data/service/service-local-filter-1.rq b/tests/libtracker-data/service/service-local-filter-1.rq
index d8db5c57e..5c8f8c1b9 100644
--- a/tests/libtracker-data/service/service-local-filter-1.rq
+++ b/tests/libtracker-data/service/service-local-filter-1.rq
@@ -1,5 +1,5 @@
SELECT ?u {
- SERVICE <dbus:%s> {
+ SERVICE <%s> {
?u nrl:indexed true;
rdfs:label ?l
}
diff --git a/tests/libtracker-data/service/service-query-1.rq b/tests/libtracker-data/service/service-query-1.rq
index 310a72d25..6ca52b186 100644
--- a/tests/libtracker-data/service/service-query-1.rq
+++ b/tests/libtracker-data/service/service-query-1.rq
@@ -1,5 +1,5 @@
SELECT ?u {
- SERVICE <dbus:%s> {
+ SERVICE <%s> {
?u nrl:indexed true
}
}
diff --git a/tests/libtracker-data/service/service-union-with-local-1.rq b/tests/libtracker-data/service/service-union-with-local-1.rq
index 83a4eb5d7..098604a54 100644
--- a/tests/libtracker-data/service/service-union-with-local-1.rq
+++ b/tests/libtracker-data/service/service-union-with-local-1.rq
@@ -2,7 +2,7 @@ SELECT ?u {
{
?u nrl:indexed true;
} UNION {
- SERVICE <dbus:%s> {
+ SERVICE <%s> {
?u nrl:indexed true;
}
}
diff --git a/tests/libtracker-data/service/service-union-with-local-2.rq b/tests/libtracker-data/service/service-union-with-local-2.rq
index 0566ec42e..1d3df0d69 100644
--- a/tests/libtracker-data/service/service-union-with-local-2.rq
+++ b/tests/libtracker-data/service/service-union-with-local-2.rq
@@ -10,7 +10,7 @@ SELECT ?u ?s {
{
SELECT ?u ?s {
?u a rdfs:Resource .
- SERVICE <dbus:%s> {
+ SERVICE <%s> {
SELECT ?u ('b' AS ?s) {
?u nrl:indexed true
}
diff --git a/tests/libtracker-data/service/service-union-with-local-3.rq b/tests/libtracker-data/service/service-union-with-local-3.rq
index 67eaf6293..45105baf4 100644
--- a/tests/libtracker-data/service/service-union-with-local-3.rq
+++ b/tests/libtracker-data/service/service-union-with-local-3.rq
@@ -9,7 +9,7 @@ SELECT ?u ?s {
UNION
{
SELECT ?u ?s {
- SERVICE <dbus:%s> {
+ SERVICE <%s> {
SELECT ?u ('b' AS ?s) {
?u nrl:indexed true
}
diff --git a/tests/libtracker-data/service/service-var-1.rq b/tests/libtracker-data/service/service-var-1.rq
index 8a5ea245a..cc5342dbd 100644
--- a/tests/libtracker-data/service/service-var-1.rq
+++ b/tests/libtracker-data/service/service-var-1.rq
@@ -1,5 +1,5 @@
SELECT ?u {
- VALUES ?s { 'dbus:%s' } .
+ VALUES ?s { '%s' } .
SERVICE ?s {
?u nrl:indexed true
}
diff --git a/tests/libtracker-data/service/service-var-2.rq b/tests/libtracker-data/service/service-var-2.rq
index 38cfcb753..5e8bca2dd 100644
--- a/tests/libtracker-data/service/service-var-2.rq
+++ b/tests/libtracker-data/service/service-var-2.rq
@@ -3,4 +3,4 @@ SELECT ?u {
?u nrl:indexed true
}
}
-VALUES ?s { 'dbus:%s' }
+VALUES ?s { '%s' }
diff --git a/tests/libtracker-data/tracker-service-test.c b/tests/libtracker-data/tracker-service-test.c
index ee2fb60ae..ba4d60150 100644
--- a/tests/libtracker-data/tracker-service-test.c
+++ b/tests/libtracker-data/tracker-service-test.c
@@ -32,6 +32,7 @@ typedef struct _TestInfo TestInfo;
struct _TestInfo {
const gchar *test_name;
gboolean expect_query_error;
+ gboolean local_connection;
};
const TestInfo tests[] = {
@@ -183,7 +184,7 @@ test_sparql_query (TestInfo *test_info,
GError *error = NULL;
gchar *query, *query_filename, *service_query;
gchar *results_filename;
- gchar *prefix, *test_prefix;
+ gchar *prefix, *test_prefix, *uri;
GFile *ontology;
GThread *thread;
@@ -205,6 +206,10 @@ test_sparql_query (TestInfo *test_info,
g_usleep (100);
}
+ tracker_sparql_connection_map_connection (local,
+ "other-connection",
+ remote);
+
query_filename = g_strconcat (test_prefix, ".rq", NULL);
g_file_get_contents (query_filename, &query, NULL, &error);
g_assert_no_error (error);
@@ -213,12 +218,19 @@ test_sparql_query (TestInfo *test_info,
results_filename = g_strconcat (test_prefix, ".out", NULL);
g_free (test_prefix);
+ if (test_info->local_connection) {
+ uri = g_strdup_printf ("private:other-connection");
+ } else {
+ uri = g_strdup_printf ("dbus:%s",
+ g_dbus_connection_get_unique_name (dbus_conn));
+ }
+
/* perform actual query */
- service_query = g_strdup_printf (query,
- g_dbus_connection_get_unique_name (dbus_conn));
+ service_query = g_strdup_printf (query, uri);
cursor = tracker_sparql_connection_query (local, service_query, NULL, &error);
g_free (service_query);
g_free (query);
+ g_free (uri);
check_result (cursor, test_info, results_filename, error);
g_free (results_filename);
@@ -245,6 +257,16 @@ setup (TestInfo *info,
}
static void
+setup_local (TestInfo *info,
+ gconstpointer context)
+{
+ const TestInfo *test = context;
+
+ *info = *test;
+ info->local_connection = TRUE;
+}
+
+static void
teardown (TestInfo *info,
gconstpointer context)
{
@@ -264,15 +286,24 @@ main (int argc, char **argv)
dbus_conn = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
g_assert_no_error (error);
- /* add test cases */
+ /* add DBus test cases */
for (i = 0; i < G_N_ELEMENTS (tests); i++) {
gchar *testpath;
- testpath = g_strconcat ("/libtracker-data/", tests[i].test_name, NULL);
+ testpath = g_strconcat ("/libtracker-data/dbus/", tests[i].test_name, NULL);
g_test_add (testpath, TestInfo, &tests[i], setup, test_sparql_query, teardown);
g_free (testpath);
}
+ /* add local test cases */
+ for (i = 0; i < G_N_ELEMENTS (tests); i++) {
+ gchar *testpath;
+
+ testpath = g_strconcat ("/libtracker-data/local/", tests[i].test_name, NULL);
+ g_test_add (testpath, TestInfo, &tests[i], setup_local, test_sparql_query, teardown);
+ g_free (testpath);
+ }
+
/* run tests */
result = g_test_run ();