diff options
author | Martyn Russell <martyn@lanedo.com> | 2010-09-10 18:07:34 +0100 |
---|---|---|
committer | Martyn Russell <martyn@lanedo.com> | 2010-09-29 16:36:17 +0100 |
commit | 4b430f7657d0630e31e49535395e2ec6bdc76892 (patch) | |
tree | 277cbff49d17effc7030ce311af68e4233d0ddd7 | |
parent | b85d7509894de9a77e5837a5f676e4b40fdca808 (diff) | |
download | tracker-4b430f7657d0630e31e49535395e2ec6bdc76892.tar.gz |
libtracker-sparql: Added get_async() and get_direct_async() for Connection
Currently everythign is async and working down to the Backend which
needs some way of calling the module_init() can waiting for the store
asynchronously. This needs a bit more thought.
-rw-r--r-- | examples/class-signal/class-signal.c | 2 | ||||
-rw-r--r-- | src/libtracker-direct/tracker-direct.vala | 3 | ||||
-rw-r--r-- | src/libtracker-miner/tracker-miner-object.c | 2 | ||||
-rw-r--r-- | src/libtracker-sparql/tracker-backend.vala | 36 | ||||
-rw-r--r-- | src/libtracker-sparql/tracker-connection.vala | 117 | ||||
-rw-r--r-- | src/miners/fs/tracker-miner-files-index.c | 2 | ||||
-rw-r--r-- | src/tracker-utils/tracker-import.c | 2 | ||||
-rw-r--r-- | src/tracker-utils/tracker-info.c | 2 | ||||
-rw-r--r-- | src/tracker-utils/tracker-search.c | 2 | ||||
-rw-r--r-- | src/tracker-utils/tracker-sparql.c | 2 | ||||
-rw-r--r-- | src/tracker-utils/tracker-stats.c | 2 | ||||
-rw-r--r-- | src/tracker-utils/tracker-tag.c | 2 | ||||
-rw-r--r-- | src/tracker-writeback/tracker-writeback-consumer.c | 2 | ||||
-rw-r--r-- | tests/functional-tests/default-update-test.vala | 52 | ||||
-rw-r--r-- | tests/tracker-steroids/tracker-test.c | 2 |
15 files changed, 183 insertions, 47 deletions
diff --git a/examples/class-signal/class-signal.c b/examples/class-signal/class-signal.c index eedb974b8..e2263a896 100644 --- a/examples/class-signal/class-signal.c +++ b/examples/class-signal/class-signal.c @@ -111,7 +111,7 @@ main (gint argc, gchar *argv[]) g_type_init (); loop = g_main_loop_new (NULL, FALSE); - con = tracker_sparql_connection_get (&error); + con = tracker_sparql_connection_get (NULL, &error); connection = dbus_bus_get_private (DBUS_BUS_SESSION, NULL); dbus_bus_request_name (connection, TRACKER_SERVICE, 0, NULL); dbus_connection_add_filter (connection, message_filter, NULL, NULL); diff --git a/src/libtracker-direct/tracker-direct.vala b/src/libtracker-direct/tracker-direct.vala index 10fee09b9..b00cca312 100644 --- a/src/libtracker-direct/tracker-direct.vala +++ b/src/libtracker-direct/tracker-direct.vala @@ -20,6 +20,7 @@ [DBus (name = "org.freedesktop.Tracker1.Status", timeout = 2147483647 /* INT_MAX */)] interface Tracker.Direct.Status : GLib.Object { public abstract void wait () throws DBus.Error; + public abstract async void wait_async () throws DBus.Error; } public class Tracker.Direct.Connection : Tracker.Sparql.Connection { @@ -32,10 +33,10 @@ public class Tracker.Direct.Connection : Tracker.Sparql.Connection { try { var connection = DBus.Bus.get (DBus.BusType.SESSION); - var status = (Status) connection.get_object (TRACKER_DBUS_SERVICE, TRACKER_DBUS_OBJECT_STATUS, TRACKER_DBUS_INTERFACE_STATUS); + status.wait (); } catch (DBus.Error e) { throw new Sparql.Error.INTERNAL ("Unable to initialize database"); diff --git a/src/libtracker-miner/tracker-miner-object.c b/src/libtracker-miner/tracker-miner-object.c index ad586d7e4..782b7550d 100644 --- a/src/libtracker-miner/tracker-miner-object.c +++ b/src/libtracker-miner/tracker-miner-object.c @@ -255,7 +255,7 @@ tracker_miner_init (TrackerMiner *miner) miner->private = priv = TRACKER_MINER_GET_PRIVATE (miner); - priv->connection = tracker_sparql_connection_get (&error); + priv->connection = tracker_sparql_connection_get (NULL, &error); g_assert_no_error (error); priv->pauses = g_hash_table_new_full (g_direct_hash, diff --git a/src/libtracker-sparql/tracker-backend.vala b/src/libtracker-sparql/tracker-backend.vala index 8c8e19edc..1dc924573 100644 --- a/src/libtracker-sparql/tracker-backend.vala +++ b/src/libtracker-sparql/tracker-backend.vala @@ -29,13 +29,40 @@ class Tracker.Sparql.Backend : Connection { private delegate Tracker.Sparql.Connection ModuleInitFunc (); - public Backend (bool direct_only = false) throws Sparql.Error - requires (!initialized) { - if (!Module.supported ()) { - return; + public Backend () throws Sparql.Error + requires (Module.supported ()) { + } + + public override void init (bool direct_only = false, Cancellable? cancellable = null) throws Sparql.Error, IOError { + if (initialized) { + // Don't error or require this, > 1 new Tracker.Sparql.Connection + // objects can be created and if they are, then we don't need to do + // anything on subsequent init() calls. We just return the already + // created direct or bus objects + return; + } + + try { + debug ("%s(): direct_only=%s", Log.METHOD, direct_only ? "true" : "false"); + load_plugins (direct_only); + } catch (GLib.Error e) { + throw new Sparql.Error.INTERNAL (e.message); + } + + initialized = true; + } + + public async override void init_async (bool direct_only = false, Cancellable? cancellable = null) throws Sparql.Error, IOError { + if (initialized) { + // Don't error or require this, > 1 new Tracker.Sparql.Connection + // objects can be created and if they are, then we don't need to do + // anything on subsequent init() calls. We just return the already + // created direct or bus objects + return; } try { + debug ("%s(): direct_only=%s", Log.METHOD, direct_only ? "true" : "false"); load_plugins (direct_only); } catch (GLib.Error e) { throw new Sparql.Error.INTERNAL (e.message); @@ -232,6 +259,7 @@ class Tracker.Sparql.Backend : Connection { } ModuleInitFunc module_init = (ModuleInitFunc) function; + assert (module_init != null); // We don't want our modules to ever unload diff --git a/src/libtracker-sparql/tracker-connection.vala b/src/libtracker-sparql/tracker-connection.vala index edabdb9cb..393a49ba6 100644 --- a/src/libtracker-sparql/tracker-connection.vala +++ b/src/libtracker-sparql/tracker-connection.vala @@ -84,8 +84,75 @@ public abstract class Tracker.Sparql.Connection : Object { static weak Connection? singleton; static bool log_initialized; + private static new Connection get_internal (bool is_direct_only = false, Cancellable? cancellable = null) throws Sparql.Error, IOError { + if (singleton != null) { + assert (direct_only == is_direct_only); + return singleton; + } + + log_init (); + + if (cancellable != null && cancellable.is_cancelled ()) { + throw new IOError.CANCELLED ("Operation was cancelled"); + } + + /* the True is to assert that direct only is required */ + Connection result = new Backend (); + result.init (is_direct_only, cancellable); + + if (cancellable != null && cancellable.is_cancelled ()) { + throw new IOError.CANCELLED ("Operation was cancelled"); + } + + direct_only = is_direct_only; + singleton = result; + result.add_weak_pointer ((void**) (&singleton)); + return singleton; + } + + private async static new Connection get_internal_async (bool is_direct_only = false, Cancellable? cancellable = null) throws Sparql.Error, IOError { + if (singleton != null) { + assert (direct_only == is_direct_only); + return singleton; + } + + log_init (); + + if (cancellable != null && cancellable.is_cancelled ()) { + throw new IOError.CANCELLED ("Operation was cancelled"); + } + + /* the True is to assert that direct only is required */ + Connection result = new Backend (); + yield result.init_async (is_direct_only, cancellable); + + if (cancellable != null && cancellable.is_cancelled ()) { + throw new IOError.CANCELLED ("Operation was cancelled"); + } + + direct_only = true; + singleton = result; + result.add_weak_pointer ((void**) (&singleton)); + return singleton; + } + + /** + * tracker_sparql_connection_get_direct_async: + * @cancellable: a #GCancellable used to cancel the operation + * @error: #GError for error reporting. + * + * See tracker_sparql_connection_get(). + * + * Returns: a new #TrackerSparqlConnection. Call g_object_unref() on the + * object when no longer used. + */ + public async static new Connection get_async (Cancellable? cancellable = null) throws Sparql.Error, IOError { + return yield get_internal_async (false, cancellable); + } + /** * tracker_sparql_connection_get: + * @cancellable: a #GCancellable used to cancel the operation * @error: #GError for error reporting. * * Returns a new #TrackerSparqlConnection, which will use the best method @@ -105,22 +172,27 @@ public abstract class Tracker.Sparql.Connection : Object { * Returns: a new #TrackerSparqlConnection. Call g_object_unref() on the * object when no longer used. */ - public static new Connection get () throws Sparql.Error { - if (singleton != null) { - assert (!direct_only); - return singleton; - } else { - log_init (); + public static new Connection get (Cancellable? cancellable = null) throws Sparql.Error, IOError { + return get_internal (false, cancellable); + } - var result = new Backend (); - singleton = result; - result.add_weak_pointer ((void**) (&singleton)); - return result; - } + /** + * tracker_sparql_connection_get_direct_async: + * @cancellable: a #GCancellable used to cancel the operation + * @error: #GError for error reporting. + * + * See tracker_sparql_connection_get_direct(). + * + * Returns: a new #TrackerSparqlConnection. Call g_object_unref() on the + * object when no longer used. + */ + public async static Connection get_direct_async (Cancellable? cancellable = null) throws Sparql.Error, IOError { + return yield get_internal_async (true, cancellable); } /** * tracker_sparql_connection_get_direct: + * @cancellable: a #GCancellable used to cancel the operation * @error: #GError for error reporting. * * Returns a new #TrackerSparqlConnection, which uses direct-access method @@ -134,19 +206,8 @@ public abstract class Tracker.Sparql.Connection : Object { * Returns: a new #TrackerSparqlConnection. Call g_object_unref() on the * object when no longer used. */ - public static Connection get_direct () throws Sparql.Error { - if (singleton != null) { - assert (direct_only); - return singleton; - } else { - log_init (); - - var result = new Backend (true /* direct_only */); - direct_only = true; - singleton = result; - result.add_weak_pointer ((void**) (&singleton)); - return result; - } + public static new Connection get_direct (Cancellable? cancellable = null) throws Sparql.Error, IOError { + return get_internal (true, cancellable); } private static void log_init () { @@ -198,6 +259,14 @@ public abstract class Tracker.Sparql.Connection : Object { /* do nothing */ } + public virtual void init (bool direct_only = false, Cancellable? cancellable = null) throws Sparql.Error, IOError { + warning ("Interface 'init' not implemented"); + } + + public async virtual void init_async (bool direct_only = false, Cancellable? cancellable = null) throws Sparql.Error, IOError { + warning ("Interface 'init_async' not implemented"); + } + /** * tracker_sparql_connection_query: * @self: a #TrackerSparqlConnection diff --git a/src/miners/fs/tracker-miner-files-index.c b/src/miners/fs/tracker-miner-files-index.c index 27d79cd49..ef724a397 100644 --- a/src/miners/fs/tracker-miner-files-index.c +++ b/src/miners/fs/tracker-miner-files-index.c @@ -242,7 +242,7 @@ tracker_miner_files_index_reindex_mime_types (TrackerMinerFilesIndex *object, __FUNCTION__, len); - connection = tracker_sparql_connection_get (&inner_error); + connection = tracker_sparql_connection_get (NULL, &inner_error); if (!connection) { tracker_dbus_request_failed (request_id, diff --git a/src/tracker-utils/tracker-import.c b/src/tracker-utils/tracker-import.c index 682ced4df..918e05197 100644 --- a/src/tracker-utils/tracker-import.c +++ b/src/tracker-utils/tracker-import.c @@ -108,7 +108,7 @@ main (int argc, char **argv) g_thread_init (NULL); } - connection = tracker_sparql_connection_get (&error); + connection = tracker_sparql_connection_get (NULL, &error); if (!connection) { g_printerr ("%s: %s\n", diff --git a/src/tracker-utils/tracker-info.c b/src/tracker-utils/tracker-info.c index 78927529a..5c397243e 100644 --- a/src/tracker-utils/tracker-info.c +++ b/src/tracker-utils/tracker-info.c @@ -201,7 +201,7 @@ main (int argc, char **argv) g_thread_init (NULL); } - connection = tracker_sparql_connection_get (&error); + connection = tracker_sparql_connection_get (NULL, &error); if (!connection) { g_printerr ("%s: %s\n", diff --git a/src/tracker-utils/tracker-search.c b/src/tracker-utils/tracker-search.c index 4c1183e58..36651d00d 100644 --- a/src/tracker-utils/tracker-search.c +++ b/src/tracker-utils/tracker-search.c @@ -1262,7 +1262,7 @@ main (int argc, char **argv) g_option_context_free (context); - connection = tracker_sparql_connection_get (&error); + connection = tracker_sparql_connection_get (NULL, &error); if (!connection) { g_printerr ("%s: %s\n", diff --git a/src/tracker-utils/tracker-sparql.c b/src/tracker-utils/tracker-sparql.c index f48995164..5ff79110a 100644 --- a/src/tracker-utils/tracker-sparql.c +++ b/src/tracker-utils/tracker-sparql.c @@ -260,7 +260,7 @@ main (int argc, char **argv) g_thread_init (NULL); } - connection = tracker_sparql_connection_get (&error); + connection = tracker_sparql_connection_get (NULL, &error); if (!connection) { g_printerr ("%s: %s\n", diff --git a/src/tracker-utils/tracker-stats.c b/src/tracker-utils/tracker-stats.c index f6c9ecbe1..64d33de78 100644 --- a/src/tracker-utils/tracker-stats.c +++ b/src/tracker-utils/tracker-stats.c @@ -85,7 +85,7 @@ main (int argc, char **argv) g_thread_init (NULL); } - connection = tracker_sparql_connection_get (&error); + connection = tracker_sparql_connection_get (NULL, &error); if (!connection) { g_printerr ("%s: %s\n", diff --git a/src/tracker-utils/tracker-tag.c b/src/tracker-utils/tracker-tag.c index 200daf2f0..b3a9a8c57 100644 --- a/src/tracker-utils/tracker-tag.c +++ b/src/tracker-utils/tracker-tag.c @@ -937,7 +937,7 @@ main (int argc, char **argv) g_thread_init (NULL); } - connection = tracker_sparql_connection_get (&error); + connection = tracker_sparql_connection_get (NULL, &error); if (!connection) { g_printerr ("%s: %s\n", diff --git a/src/tracker-writeback/tracker-writeback-consumer.c b/src/tracker-writeback/tracker-writeback-consumer.c index d141bff07..2c67f0a0e 100644 --- a/src/tracker-writeback/tracker-writeback-consumer.c +++ b/src/tracker-writeback/tracker-writeback-consumer.c @@ -82,7 +82,7 @@ tracker_writeback_consumer_init (TrackerWritebackConsumer *consumer) priv = TRACKER_WRITEBACK_CONSUMER_GET_PRIVATE (consumer); - priv->connection = tracker_sparql_connection_get (&error); + priv->connection = tracker_sparql_connection_get (NULL, &error); if (!priv->connection) { g_printerr ("%s: %s\n", diff --git a/tests/functional-tests/default-update-test.vala b/tests/functional-tests/default-update-test.vala index 59ec0e82f..acf93ccd9 100644 --- a/tests/functional-tests/default-update-test.vala +++ b/tests/functional-tests/default-update-test.vala @@ -1,14 +1,52 @@ -int -main( string[] args ) -{ - int res = -1; +using Tracker.Sparql; +private static int res; +private static MainLoop loop; + +private async void get_connection (bool? direct_only = false) { try { - TestApp app = new TestApp (Tracker.Sparql.Connection.get()); + Connection c; + + // Test async + print ("Getting connection async (direct=%s)\n", direct_only ? "yes" : "no"); + if (direct_only) { + c = yield Connection.get_direct_async (); + } else { + c = yield Connection.get_async (); + } + + print ("Got it %p\n", c); + + // Quite this loo because we start another one in app.run () + loop.quit (); + + print ("Creating app with connection\n"); + TestApp app = new TestApp (c); + + print ("Running app\n"); res = app.run(); - } catch (Tracker.Sparql.Error e) { - warning ("Couldn't perform test: %s", e.message); + } catch (GLib.IOError e1) { + warning ("Couldn't perform test: %s", e1.message); + } catch (Tracker.Sparql.Error e2) { + warning ("Couldn't perform test: %s", e2.message); } +} + +int +main( string[] args ) +{ + print ("Starting...\n"); + loop = new MainLoop (null, false); + + // Test non-direct first + get_connection.begin (false); + + loop.run (); + + // Test direct first + get_connection.begin (true); + + loop.run (); return res; } diff --git a/tests/tracker-steroids/tracker-test.c b/tests/tracker-steroids/tracker-test.c index 39f46801c..7a2ddfb21 100644 --- a/tests/tracker-steroids/tracker-test.c +++ b/tests/tracker-steroids/tracker-test.c @@ -617,7 +617,7 @@ main (gint argc, gchar **argv) /* do not require prior installation */ g_setenv ("TRACKER_SPARQL_MODULE_PATH", "../../src/libtracker-bus/.libs", TRUE); - connection = tracker_sparql_connection_get (NULL); + connection = tracker_sparql_connection_get (NULL, NULL); insert_test_data (); |