[Xfce4-commits] <postler:master> Index sender names in a separate table

Christian Dywan noreply at xfce.org
Sat Jul 2 17:08:11 CEST 2011


Updating branch refs/heads/master
         to bfcaa3f9ddbe266b0f418506d64fe85fa68723fe (commit)
       from f70f44801a1fa182ea86b33323c35b6534a61f2a (commit)

commit bfcaa3f9ddbe266b0f418506d64fe85fa68723fe
Author: Christian Dywan <christian at twotoasts.de>
Date:   Fri Jul 1 03:32:11 2011 +0200

    Index sender names in a separate table

 postler/postler-index.vala |   33 +++++++++++++++++++++++++++++----
 1 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/postler/postler-index.vala b/postler/postler-index.vala
index ba963ba..e659ab3 100644
--- a/postler/postler-index.vala
+++ b/postler/postler-index.vala
@@ -13,6 +13,7 @@ namespace Postler {
     public class Index : GLib.Object, GLib.Initable {
         static Sqlite.Database? database = null;
         static Sqlite.Statement? statement_insert = null;
+        static Sqlite.Statement? statement_insert_sender = null;
         static Sqlite.Statement? statement_get = null;
         static Sqlite.Statement? statement_thread = null;
         static Sqlite.Statement? statement_list = null;
@@ -103,6 +104,8 @@ namespace Postler {
             string[] indices = {
                 "CREATE INDEX IF NOT EXISTS id_index ON messages (id);",
                 "CREATE INDEX IF NOT EXISTS threads_index ON messages (threads);",
+                "CREATE TABLE IF NOT EXISTS senders (address TEXT, name TEXT)",
+                "CREATE INDEX IF NOT EXISTS senders_index ON senders (address);"
             };
             foreach (string index_statement in indices) {
                 if (database.exec (index_statement) != Sqlite.OK)
@@ -110,6 +113,27 @@ namespace Postler {
             }
         }
 
+        public void insert_sender (string address) throws GLib.Error {
+            if (statement_insert_sender == null) {
+                if (database.prepare_v2 ("""
+                    INSERT INTO senders (address, name) VALUES (?1, ?2)
+                    """,
+                    -1, out statement_insert_sender) != Sqlite.OK)
+                    throw new GLib.FileError.FAILED (_("Failed to index message: %s"), database.errmsg ());
+            }
+            string[] parts = Contact.parse (address);
+            /* Don't collect address <address> which is not useful */
+            if (parts[0] == parts[1])
+                return;
+            bool success =
+                statement_insert_sender.bind_text (1, parts[1], -1) == Sqlite.OK
+             && statement_insert_sender.bind_text (2, parts[0], -1) == Sqlite.OK
+             && statement_insert_sender.step () == Sqlite.DONE;
+            statement_insert_sender.reset ();
+            if (!success)
+                throw new GLib.FileError.FAILED (_("Failed to index message: %s"), database.errmsg ());
+        }
+
         public void insert_received_message (Message message) throws GLib.Error {
             if (statement_insert == null) {
                 if (database.prepare_v2 ("""
@@ -143,6 +167,7 @@ namespace Postler {
             statement_insert.reset ();
             if (!success)
                 throw new GLib.FileError.FAILED (_("Failed to index message: %s"), database.errmsg ());
+            insert_sender (message.sender);
 #if HAVE_ZEITGEIST
             var log = new Zeitgeist.Log ();
             var event = new Zeitgeist.Event.full (Zeitgeist.ZG_RECEIVE_EVENT,
@@ -376,22 +401,22 @@ namespace Postler {
 
             if (statement_guess == null) {
                 if (database.prepare_v2 ("""
-                    SELECT sender FROM messages WHERE sender LIKE ?1
-                    GROUP BY sender ORDER BY COUNT (sender) DESC LIMIT 1
+                    SELECT name FROM senders WHERE address = ?1
+                    GROUP BY name ORDER BY COUNT (name) DESC LIMIT 1
                     """,
                     -1, out statement_guess) != Sqlite.OK)
                     throw new GLib.FileError.FAILED (_("Failed to guess name: %s"), database.errmsg ());
             }
             int result = Sqlite.ERROR;
             bool success =
-                statement_guess.bind_text (1, "%<" + address + ">", -1) == Sqlite.OK
+                statement_guess.bind_text (1, address, -1) == Sqlite.OK
              && row_or_done (((result = statement_guess.step ())));
             if (!success) {
                 statement_guess.reset ();
                 throw new GLib.FileError.FAILED (_("Failed to guess name: %s"), database.errmsg ());
             }
             if (result == Sqlite.ROW) {
-                string display_name = Postler.Contact.name_from_string (statement_guess.column_text (0));
+                string display_name = statement_guess.column_text (0);
                 statement_guess.reset ();
                 return new Postler.Contact (display_name, null);
             }



More information about the Xfce4-commits mailing list