woops, forget attach patch last time.
On Fri, 2008-01-18 at 10:37 +0800, Halton Huo wrote:
> Hi Jamie and All,
>
> I spent several days to find a good way to fix bug
> http://bugzilla.gnome.org/show_bug.cgi?id=503376. Since this patch is
> big, so I'd like to ask you to review first before I commit.
>
> My aim is to find a better way to let trackerd update indexing without
> restart/reindex trackerd when user change options through
> tracker-preferences.
>
> Let me explain this patch in more details.
>
> [1] src/trackerd/tracker-dbus-methods.c
> Set tracker->index_status = INDEX_EMAILS, this will cause email
> indexing starts in process_files_thread ().
> If evolution index is enabled, do almost same thing as before.
> Otherwise, do two things here:
> (1) call tracker_email_remove_service_directories to remove
> evolution related watch_directory from tracker->service_directory_list
> and tracker->service_directory_table.
> (2) tracker_db_email_delete_email_app to remove evolution related
> from database.
>
> [2] src/trackerd/tracker-db-email.c|h
> Add function declaration and definition of
> tracker_db_email_delete_email_app ()
>
> [3] src/trackerd/tracker-email-utils.c|h
> Add function declaration and definition of
> email_remove_watch_directory ()
> email_remove_watch_directories ()
>
> [4] src/trackerd/tracker-email.c|h
> Add function declaration and definition of
> tracker_email_remove_service_directories()
>
> [5] src/trackerd/tracker-email-evolution.c|h
> Add function declaration and definition of
> evolution_remove_watch_emails ()
>
> [6] src/trackerd/tracker-db-sqlite.c, src/trackerd/tracker-db.h
> Add function declaration and definition of
> tracker_db_cleanup_service_stat ()
>
> [7] src/trackerd/tracker-utils.c|h
> Add function declaration and definition of
> tracker_remove_service_path ()
> Rewrite function tracker_add_service_path () to not add duplicated
> services.
>
> [8] src/tracker-preferences/tracker-preferences.c
> Not restart trackerd when evolution widget changed.
>
> [9] data/sqlite-stored-procs.sql
> Add new proc DeleteServiceByType, DeleteMboxByApp, DecStatNum
>
> NOTE:
> [1]. For thunderbird bug 503977, will be a separate and similar patch,
> but more simple. For Kmail, need we do it?
>
> [2]. tracker-preferences will send out the key changes D-BUS message
> when user click the widget, that will cause trackerd get the change and
> take effect directly. I'd like to change t-p to send out the changes
> only after use click "Close" button. What do you think?
>
> Jamie, Welcome back!
>
> Thanks,
> Halton.
>
>
> _______________________________________________
> tracker-list mailing list
> [email protected]
> http://mail.gnome.org/mailman/listinfo/tracker-list
Index: trunk/src/trackerd/tracker-utils.h
===================================================================
--- trunk/src/trackerd/tracker-utils.h (revision 1097)
+++ trunk/src/trackerd/tracker-utils.h (working copy)
@@ -564,6 +564,7 @@
GSList * tracker_get_service_dirs (const char *service);
void tracker_add_service_path (const char *service, const char *path);
+void tracker_remove_service_path (const char *path);
char * tracker_get_service_for_uri (const char *uri);
gboolean tracker_is_service_file (const char *uri);
Index: trunk/src/trackerd/tracker-db-email.c
===================================================================
--- trunk/src/trackerd/tracker-db-email.c (revision 1097)
+++ trunk/src/trackerd/tracker-db-email.c (working copy)
@@ -795,7 +795,55 @@
return TRUE;
}
+gboolean
+tracker_db_email_delete_email_app (DBConnection *db_con, MailApplication mail_app)
+{
+ char *service_id = NULL;
+ char *service = get_service_name (mail_app);
+ tracker_log ("Delete %s emails", service);
+ char ***res = tracker_exec_proc (db_con->common, "GetRelatedServiceIDs", 2, service, service);
+ g_free (service);
+
+ char *str_mail_app = tracker_int_to_str (mail_app);
+ tracker_exec_proc (db_con->emails, "DeleteMboxByApp", 1, str_mail_app);
+ g_free (str_mail_app);
+
+ if (res) {
+ if (res[0] && res[0][0]) {
+ service_id = res[0][0];
+ } else {
+ tracker_db_free_result (res);
+ g_free (service);
+ return FALSE;
+ }
+
+ tracker_db_cleanup_service_stat (db_con, atoi (service_id));
+ tracker_exec_proc (db_con->emails, "DeleteServiceByType", 1, service_id);
+ tracker_db_free_result (res);
+ }
+
+ /* Delete email watch folders */
+ char *sql = NULL;
+ switch (mail_app) {
+ case MAIL_APP_EVOLUTION:
+ sql = g_strdup_printf ("DELETE FROM Services where path like '%s/.evolution/%s'", g_get_home_dir (), "%");
+ break;
+ case MAIL_APP_KMAIL:
+ break;
+ case MAIL_APP_THUNDERBIRD:
+ break;
+ default:
+ break;
+ }
+ if (sql) {
+ tracker_exec_sql (db_con, sql);
+ g_free (sql);
+ }
+
+ return TRUE;
+}
+
gboolean
tracker_db_email_lookup_junk (DBConnection *db_con, const gchar *mbox_id, gint uid)
{
Index: trunk/src/trackerd/tracker-db-email.h
===================================================================
--- trunk/src/trackerd/tracker-db-email.h (revision 1097)
+++ trunk/src/trackerd/tracker-db-email.h (working copy)
@@ -34,6 +34,7 @@
gboolean tracker_db_email_delete_email_file (DBConnection *db_con, const gchar *uri);
gboolean tracker_db_email_delete_emails_of_mbox (DBConnection *db_con, const gchar *mbox_file_path);
gboolean tracker_db_email_delete_email (DBConnection *db_con, const gchar *uri);
+gboolean tracker_db_email_delete_email_app (DBConnection *db_con, MailApplication mail_app);
gint tracker_db_email_get_mbox_id (DBConnection *db_con, const gchar *mbox_uri);
void tracker_db_email_insert_junk (DBConnection *db_con, const gchar *mbox_uri, guint32 uid);
gchar *** tracker_db_email_get_mbox_junk (DBConnection *db_con);
Index: trunk/src/trackerd/tracker-email-utils.c
===================================================================
--- trunk/src/trackerd/tracker-email-utils.c (revision 1097)
+++ trunk/src/trackerd/tracker-email-utils.c (working copy)
@@ -65,6 +65,13 @@
void
+email_remove_watch_directory (const gchar *dir)
+{
+ tracker_log ("Unregistering path %s", dir);
+ tracker_remove_service_path (dir);
+}
+
+void
email_watch_directories (const GSList *dirs, const gchar *service)
{
const GSList *tmp;
@@ -75,7 +82,17 @@
}
}
+void
+email_remove_watch_directories (const GSList *dirs)
+{
+ const GSList *tmp;
+ for (tmp = dirs; tmp; tmp = tmp->next) {
+ const gchar *dir = tmp->data;
+ email_remove_watch_directory (dir);
+ }
+}
+
gboolean
email_parse_and_save_mail_message (DBConnection *db_con, MailApplication mail_app, const char *path,
ReadMailHelperFct read_mail_helper, gpointer read_mail_user_data)
Index: trunk/src/trackerd/tracker-email.c
===================================================================
--- trunk/src/trackerd/tracker-email.c (revision 1097)
+++ trunk/src/trackerd/tracker-email.c (working copy)
@@ -59,6 +59,20 @@
void
+tracker_email_remove_service_directories (DBConnection *db_con)
+{
+
+ g_mime_init (0);
+
+ if (!tracker->index_evolution_emails) {
+ if (evolution_init_module ()) {
+ evolution_remove_watch_emails (db_con);
+ evolution_finalize_module ();
+ }
+ }
+}
+
+void
tracker_email_end_email_watching (void)
{
//email_free_root_path_for_attachments ();
Index: trunk/src/trackerd/tracker-email-utils.h
===================================================================
--- trunk/src/trackerd/tracker-email-utils.h (revision 1097)
+++ trunk/src/trackerd/tracker-email-utils.h (working copy)
@@ -124,7 +124,9 @@
void email_watch_directory (const gchar *dir, const gchar *service);
+void email_remove_watch_directory (const gchar *dir);
void email_watch_directories (const GSList *dirs, const gchar *service);
+void email_remove_watch_directories (const GSList *dirs);
typedef void (* ReadMailHelperFct) (GMimeMessage *g_m_message, MailMessage *msg, gpointer read_mail_user_data);
typedef gchar* (* MakeURIHelperFct) (MailMessage *msg, gpointer read_mail_user_data);
Index: trunk/src/trackerd/tracker-email.h
===================================================================
--- trunk/src/trackerd/tracker-email.h (revision 1097)
+++ trunk/src/trackerd/tracker-email.h (working copy)
@@ -28,6 +28,7 @@
#include "tracker-db-sqlite.h"
void tracker_email_add_service_directories (DBConnection *db_con);
+void tracker_email_remove_service_directories (DBConnection *db_con);
void tracker_email_end_email_watching (void);
gboolean tracker_email_file_is_interesting (FileInfo *info, const char *service);
gboolean tracker_email_index_file (DBConnection *db_con, FileInfo *info, const char *service);
Index: trunk/src/trackerd/tracker-dbus-methods.c
===================================================================
--- trunk/src/trackerd/tracker-dbus-methods.c (revision 1097)
+++ trunk/src/trackerd/tracker-dbus-methods.c (working copy)
@@ -496,6 +496,7 @@
} else if (strcasecmp (option, "EnableEvolution") == 0) {
tracker->index_evolution_emails = value;
tracker_log ("evolution support set to %d", value);
+ tracker->index_status = INDEX_EMAILS;
} else if (strcasecmp (option, "FastMerges") == 0) {
tracker->fast_merges = value;
tracker_log ("Fast merges set to %d", value);
Index: trunk/src/trackerd/trackerd.c
===================================================================
--- trunk/src/trackerd/trackerd.c (revision 1097)
+++ trunk/src/trackerd/trackerd.c (working copy)
@@ -1258,51 +1258,55 @@
tracker_db_start_index_transaction (db_con);
- if (tracker->index_evolution_emails || tracker->index_kmail_emails
- || tracker->index_thunderbird_emails) {
+ tracker_log ("Starting email indexing...");
+ tracker_db_start_transaction (db_con->cache);
+ if (tracker->index_evolution_emails) {
tracker_email_add_service_directories (db_con->emails);
- tracker_log ("Starting email indexing...");
+ GSList *list = tracker_get_service_dirs ("EvolutionEmails");
+ tracker_add_root_directories (list);
+ process_directory_list (db_con, list, TRUE);
+ g_slist_free (list);
- tracker_db_start_transaction (db_con->cache);
+ /* if initial indexing has not finished reset mtime on all email stuff so they are rechecked */
- if (tracker->index_evolution_emails) {
- GSList *list = tracker_get_service_dirs ("EvolutionEmails");
- tracker_add_root_directories (list);
- process_directory_list (db_con, list, TRUE);
- g_slist_free (list);
+ if (tracker_db_get_option_int (db_con->common, "InitialIndex") == 1) {
- /* if initial indexing has not finished reset mtime on all email stuff so they are rechecked */
+ char *sql = g_strdup_printf ("update Services set mtime = 0 where path like '%s/.evolution/%s'", g_get_home_dir (), "%");
- if (tracker_db_get_option_int (db_con->common, "InitialIndex") == 1) {
+ tracker_exec_sql (db_con, sql);
- char *sql = g_strdup_printf ("update Services set mtime = 0 where path like '%s/.evolution/%s'", g_get_home_dir (), "%");
-
- tracker_exec_sql (db_con, sql);
-
- g_free (sql);
- }
-
+ g_free (sql);
}
+ } else {
+ tracker_email_remove_service_directories (db_con->emails);
+ tracker_db_email_delete_email_app (db_con, MAIL_APP_EVOLUTION);
+ }
- if (tracker->index_kmail_emails) {
- GSList *list = tracker_get_service_dirs ("KMailEmails");
- tracker_add_root_directories (list);
- process_directory_list (db_con, list, TRUE);
- g_slist_free (list);
- }
-
- if (tracker->index_thunderbird_emails) {
- GSList *list = tracker_get_service_dirs ("ThunderbirdEmails");
- tracker_add_root_directories (list);
- process_directory_list (db_con, list, TRUE);
- g_slist_free (list);
- }
+ if (tracker->index_kmail_emails) {
+ tracker_email_add_service_directories (db_con->emails);
+ GSList *list = tracker_get_service_dirs ("KMailEmails");
+ tracker_add_root_directories (list);
+ process_directory_list (db_con, list, TRUE);
+ g_slist_free (list);
+ } else {
+ tracker_email_remove_service_directories (db_con->emails);
+ tracker_db_email_delete_email_app (db_con, MAIL_APP_KMAIL);
+ }
- tracker_db_end_transaction (db_con->cache);
-
+ if (tracker->index_thunderbird_emails) {
+ tracker_email_add_service_directories (db_con->emails);
+ GSList *list = tracker_get_service_dirs ("ThunderbirdEmails");
+ tracker_add_root_directories (list);
+ process_directory_list (db_con, list, TRUE);
+ g_slist_free (list);
+ } else {
+ tracker_email_remove_service_directories (db_con->emails);
+ tracker_db_email_delete_email_app (db_con, MAIL_APP_THUNDERBIRD);
}
+ tracker_db_end_transaction (db_con->cache);
+
}
break;
Index: trunk/src/trackerd/tracker-email-evolution.c
===================================================================
--- trunk/src/trackerd/tracker-email-evolution.c (revision 1097)
+++ trunk/src/trackerd/tracker-email-evolution.c (working copy)
@@ -293,6 +293,16 @@
}
+void
+evolution_remove_watch_emails (DBConnection *db_con)
+{
+ email_remove_watch_directory (evolution_config->dir_local);
+
+ g_slist_foreach (evolution_config->imap_dirs, (GFunc) email_remove_watch_directory, NULL);
+ g_slist_foreach (evolution_config->mh_dirs, (GFunc) email_remove_watch_directory, NULL);
+ g_slist_foreach (evolution_config->maildir_dirs, (GFunc) email_remove_watch_directory, NULL);
+}
+
gboolean
evolution_file_is_interesting (FileInfo *info, const gchar *service)
{
@@ -2392,7 +2402,9 @@
m = g_queue_pop_head (mail_parts);
- if (strcmp (m->mime_infos->type, "multipart") == 0) {
+ if (m->mime_infos &&
+ m->mime_infos->type &&
+ strcmp (m->mime_infos->type, "multipart") == 0) {
gint j;
for (j = 1; ; j++) {
Index: trunk/src/trackerd/tracker-email-evolution.h
===================================================================
--- trunk/src/trackerd/tracker-email-evolution.h (revision 1097)
+++ trunk/src/trackerd/tracker-email-evolution.h (working copy)
@@ -38,6 +38,7 @@
gboolean evolution_module_is_running (void);
gboolean evolution_finalize_module (void);
void evolution_watch_emails (DBConnection *db_con);
+void evolution_remove_watch_emails (DBConnection *db_con);
gboolean evolution_file_is_interesting (FileInfo *info, const char *service);
void evolution_index_file (DBConnection *db_con, FileInfo *info);
Index: trunk/src/trackerd/tracker-db-sqlite.c
===================================================================
--- trunk/src/trackerd/tracker-db-sqlite.c (revision 1097)
+++ trunk/src/trackerd/tracker-db-sqlite.c (working copy)
@@ -4632,7 +4632,39 @@
}
+void
+tracker_db_cleanup_service_stat (DBConnection *db_con, int id)
+{
+ char *service = tracker_get_service_by_id (id);
+ char *stat = NULL;
+ if (service) {
+ char ***res = tracker_exec_proc (db_con->common, "selectStats", 2, service, service);
+ if (res[0] && res[0][0]) {
+ stat = res[0][0];
+ } else {
+ tracker_db_free_result (res);
+ return;
+ }
+
+ tracker_exec_proc (db_con->common, "DecStatNum", 2, stat, service);
+
+ char *parent = tracker_get_parent_service (service);
+ if (parent) {
+ tracker_exec_proc (db_con->common, "DecStatNum", 2, stat, parent);
+ g_free (parent);
+ }
+
+ tracker_db_free_result (res);
+ g_free (service);
+
+ } else {
+ tracker_debug ("could not dec stat for service ID %d", id);
+ }
+
+}
+
+
char *
tracker_db_get_id (DBConnection *db_con, const char *service, const char *uri)
{
Index: trunk/src/trackerd/tracker-db.h
===================================================================
--- trunk/src/trackerd/tracker-db.h (revision 1097)
+++ trunk/src/trackerd/tracker-db.h (working copy)
@@ -31,6 +31,7 @@
gboolean tracker_db_is_file_up_to_date (DBConnection *db_con, const char *uri, guint32 *id);
FileInfo * tracker_db_get_file_info (DBConnection *db_con, FileInfo *info);
gboolean tracker_is_valid_service (DBConnection *db_con, const char *service);
+void tracker_db_cleanup_service_stat (DBConnection *db_con, int id);
char * tracker_db_get_id (DBConnection *db_con, const char *service, const char *uri);
GHashTable * tracker_db_save_metadata (DBConnection *db_con, GHashTable *table, GHashTable *index_table, const char *service, guint32 file_id, gboolean new_file);
void tracker_db_save_thumbs (DBConnection *db_con, const char *small_thumb, const char *large_thumb, guint32 file_id);
Index: trunk/src/trackerd/tracker-utils.c
===================================================================
--- trunk/src/trackerd/tracker-utils.c (revision 1097)
+++ trunk/src/trackerd/tracker-utils.c (working copy)
@@ -1567,7 +1567,7 @@
char *path = (char *) tmp->data;
char *path_service = g_hash_table_lookup (tracker->service_directory_table, path);
- if (strcasecmp (service, path_service) ==0) {
+ if (path && path_service && strcasecmp (service, path_service) ==0) {
list = g_slist_prepend (list, path);
}
}
@@ -1583,15 +1583,41 @@
return;
}
- char *dir_path = g_strdup (path);
- char *service_type = g_strdup (service);
+ char *dir_path = NULL;
+ char *service_type = NULL;
+ GSList *find = g_slist_find_custom (tracker->service_directory_list, path, strcmp);
- tracker->service_directory_list = g_slist_prepend (tracker->service_directory_list, dir_path);
+ if (!find) {
+ dir_path = g_strdup (path);
+ tracker->service_directory_list = g_slist_prepend (tracker->service_directory_list, dir_path);
+ }
- g_hash_table_insert (tracker->service_directory_table, dir_path, service_type);
+ if (!g_hash_table_lookup (tracker->service_directory_table, path)) {
+ if (!dir_path)
+ dir_path = g_strdup (path);
+ service_type = g_strdup (service);
+ g_hash_table_insert (tracker->service_directory_table, dir_path, service_type);
+ }
}
+void
+tracker_remove_service_path (const char *path)
+{
+ if (!path) {
+ return;
+ }
+
+ GSList *find = g_slist_find_custom (tracker->service_directory_list, path, strcmp);
+
+ if (find) {
+ tracker->service_directory_list = g_slist_delete_link (tracker->service_directory_list, find);
+ g_free ((char *)find->data);
+ }
+
+ g_hash_table_remove (tracker->service_directory_table, path);
+}
+
char *
tracker_get_service_for_uri (const char *uri)
{
Index: trunk/src/tracker-preferences/tracker-preferences.c
===================================================================
--- trunk/src/tracker-preferences/tracker-preferences.c (revision 1097)
+++ trunk/src/tracker-preferences/tracker-preferences.c (working copy)
@@ -363,7 +363,6 @@
"/Emails/IndexEvolutionEmails",
value);
- flag_restart = TRUE;
} else if (g_str_equal (name, "chkIndexContents")) {
Index: trunk/data/sqlite-stored-procs.sql
===================================================================
--- trunk/data/sqlite-stored-procs.sql (revision 1097)
+++ trunk/data/sqlite-stored-procs.sql (working copy)
@@ -59,6 +59,8 @@
DeleteService9 Delete FROM ServiceLinks Where (DestPath = ? and DestName = ?);
DeleteService10 Delete FROM ServiceLinks Where (DestPath = ?) or (DestPath glob ?);
DeleteService11 DELETE FROM ServiceContents where ServiceID = ?;
+DeleteServiceByType DELETE FROM Services where ServiceTypeID = ?;
+DeleteMboxByApp DELETE FROM MailSummary where MailApp = ?;
DeleteEmbeddedServiceMetadata1 DELETE FROM ServiceMetaData WHERE ServiceID = ? and MetaDataID in (select ID from MetaDataTypes where Embedded = 1);
DeleteEmbeddedServiceMetadata2 DELETE FROM ServiceKeywordMetaData WHERE ServiceID = ? and MetaDataID in (select ID from MetaDataTypes where Embedded = 1);
@@ -156,6 +158,7 @@
selectStats Select Sum(TypeCount) from ServiceTypes where TypeName = ? or TypeName in (select TypeName from ServiceTypes where Parent = ?);
IncStat UPDATE ServiceTypes set TypeCount = (TypeCount + 1) where TypeName = ?;
DecStat UPDATE ServiceTypes set TypeCount = (TypeCount - 1) where TypeName = ?;
+DecStatNum UPDATE ServiceTypes set TypeCount = (TypeCount - ?) where TypeName = ?;
GetStats Select TypeName, TypeCount from ServiceTypes Group By TypeName order by TypeID asc;
InsertBackupService INSERT INTO BackupServices (Path, Name) select S.Path, S.Name from Services S where S.ID = ?;
_______________________________________________
tracker-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/tracker-list