Updating branch refs/heads/master to 0ebe7a4d493ee7b863138ae4360a0f0d34b15ba8 (commit) from 72659e85c0c69ab877a017f1d521d3a6b8f6cc52 (commit)
commit 0ebe7a4d493ee7b863138ae4360a0f0d34b15ba8 Author: Christian Dywan <christ...@twotoasts.de> Date: Wed May 25 18:34:38 2011 +0200 Message queries and indexing should be asynchronous postler/postler-client.vala | 10 +++++----- postler/postler-folders.vala | 5 +++-- postler/postler-index.vala | 24 ++++++++++++++++++++++-- postler/postler-service.vala | 40 +++++++++++++++++++++++++++------------- 4 files changed, 57 insertions(+), 22 deletions(-) diff --git a/postler/postler-client.vala b/postler/postler-client.vala index af356f4..ef026f0 100644 --- a/postler/postler-client.vala +++ b/postler/postler-client.vala @@ -13,9 +13,9 @@ namespace Postler { [DBus (name = "org.elementary.Postler")] interface PostlerClient : Object { - public abstract int64 unread_messages (string uri) throws IOError; + public async abstract int64 unread_messages (string uri) throws IOError; public async abstract GLib.HashTable<string,Variant> get_message (string uri) throws IOError; - public abstract string[] get_messages (string uri) throws IOError; + public async abstract string[] get_messages (string uri) throws IOError; public signal void progress (string account, string text, double fraction); public abstract void receive (string account) throws IOError; public signal void received (string account, string error_message); @@ -52,8 +52,8 @@ namespace Postler { } catch (GLib.Error error) { } } - public int64 unread_messages (string uri) throws GLib.Error { - return client.unread_messages (uri); + public async int64 unread_messages (string uri) throws GLib.Error { + return yield client.unread_messages (uri); } public async void get_message (Message message, Gtk.TreeRowReference row) throws GLib.Error { @@ -65,7 +65,7 @@ namespace Postler { public async GLib.List<Message> get_messages (string uri) throws GLib.Error { var messages = new GLib.List<Message> (); - string[] uris = client.get_messages (uri); + string[] uris = yield client.get_messages (uri); foreach (string message_uri in uris) messages.append (new Message.from_uri (message_uri)); return messages; diff --git a/postler/postler-folders.vala b/postler/postler-folders.vala index 6d5175b..c737e85 100644 --- a/postler/postler-folders.vala +++ b/postler/postler-folders.vala @@ -210,9 +210,10 @@ public class Postler.Folders : Gtk.TreeView { assert_not_reached (); } - void unread_count_update (Gtk.TreeIter iter, File msg_dir, string label) { + async void unread_count_update (Gtk.TreeIter iter, File msg_dir, string label) { try { - int64 unread = new Postler.Client ().unread_messages (msg_dir.get_uri () + "%"); + var client = new Client (); + int64 unread = yield client.unread_messages (msg_dir.get_uri () + "%"); string escaped = GLib.Markup.escape_text (label); if (unread == 0) store.set (iter, Columns.DISPLAY_NAME, "%s".printf (escaped)); diff --git a/postler/postler-index.vala b/postler/postler-index.vala index cc97241..a611ed3 100644 --- a/postler/postler-index.vala +++ b/postler/postler-index.vala @@ -15,6 +15,7 @@ namespace Postler { static Sqlite.Statement? statement_insert = null; static Sqlite.Statement? statement_get = null; static Sqlite.Statement? statement_list = null; + static Sqlite.Statement? statement_count = null; static Sqlite.Statement? statement_unread = null; bool init (GLib.Cancellable? cancellable = null) throws GLib.Error { @@ -46,9 +47,8 @@ namespace Postler { public void insert_received_message (Message message) throws GLib.Error { if (statement_insert == null) { - /* TODO: REPLACE or IGNORE? */ if (database.prepare_v2 (""" - INSERT OR REPLACE INTO messages + INSERT OR IGNORE INTO messages (uri, subject, sender, recipients, unread, flagged, priority, date) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8) """, @@ -82,6 +82,26 @@ namespace Postler { #endif } + public int64 count_messages (string uri) throws GLib.Error { + if (statement_count == null) { + if (database.prepare_v2 (""" + SELECT COUNT (*) FROM messages WHERE uri LIKE ?1 + """, + -1, out statement_count) != Sqlite.OK) + throw new GLib.FileError.FAILED (_("Failed to open database: %s"), database.errmsg ()); + } + bool success = + statement_count.bind_text (1, uri, -1) == Sqlite.OK + && statement_count.step () == Sqlite.ROW; + if (!success) { + statement_count.reset (); + throw new GLib.FileError.FAILED (_("Failed to open database: %s"), database.errmsg ()); + } + int64 count = statement_count.column_int64 (0); + statement_count.reset (); + return count; + } + public int64 unread_messages (string folder) throws GLib.Error { if (statement_unread == null) { if (database.prepare_v2 (""" diff --git a/postler/postler-service.vala b/postler/postler-service.vala index 0efc401..5ae5c0a 100644 --- a/postler/postler-service.vala +++ b/postler/postler-service.vala @@ -175,7 +175,24 @@ namespace Postler { return true; } - void setup_index (Index index, Accounts accounts) { + async void index_folder (File folder) throws GLib.Error { + var enumerator = yield folder.enumerate_children_async ( + FILE_ATTRIBUTE_STANDARD_NAME, 0, Priority.DEFAULT); + while (true) { + var files = yield enumerator.next_files_async (10, Priority.DEFAULT); + if (files == null) + break; + foreach (var info in files) { + var file = folder.resolve_relative_path (info.get_name ()); + if (index.count_messages (file.get_uri ()) < 1) { + var message = new Message.from_file (file); + index.insert_received_message (message); + } + } + } + } + + async void setup_index (Index index, Accounts accounts) { stdout.printf (_("Updating index...\n")); foreach (var account_info in accounts.get_infos ()) { if (account_info.type == AccountType.SEARCH) @@ -186,18 +203,15 @@ namespace Postler { monitor.changed.connect ((monitor, file, other, event) => { /* TODO */ }); - var enumerator = folder.enumerate_children ( - FILE_ATTRIBUTE_STANDARD_NAME, 0, null); - FileInfo info; - while ((info = enumerator.next_file (null)) != null) { - var cur = folder.resolve_relative_path (info.get_name () + "/new"); - var file_enumerator = cur.enumerate_children ( - FILE_ATTRIBUTE_STANDARD_NAME, 0, null); - FileInfo file_info; - while ((file_info = file_enumerator.next_file (null)) != null) { - var file = cur.resolve_relative_path (file_info.get_name ()); - var message = new Message.from_file (file); - index.insert_received_message (message); + var enumerator = yield folder.enumerate_children_async ( + FILE_ATTRIBUTE_STANDARD_NAME, 0, Priority.DEFAULT); + while (true) { + var files = yield enumerator.next_files_async (10, Priority.DEFAULT); + if (files == null) + break; + foreach (var info in files) { + yield index_folder (folder.resolve_relative_path (info.get_name () + "/new")); + yield index_folder (folder.resolve_relative_path (info.get_name () + "/cur")); } } stdout.printf (" ✓ %s\n", account_info.name); _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits