diff options
author | Sam Thursfield <sam@afuera.me.uk> | 2022-02-11 09:49:58 +0000 |
---|---|---|
committer | Sam Thursfield <sam@afuera.me.uk> | 2022-02-11 09:49:58 +0000 |
commit | 43bc01da70589568fcbf4be4400dd53290205787 (patch) | |
tree | 4c11b1f06a8f1b34d5874ba07d3b04a788cb8a32 | |
parent | 8249b6786197087f4476db7af21625a5e3430fb9 (diff) | |
parent | 077fe2f4f8f2f19e871d5f181ca4d4dde6f66c11 (diff) | |
download | tracker-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
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 (); |