diff options
author | Not Zed <NotZed@HelixCode.com> | 2000-12-24 08:46:20 +0800 |
---|---|---|
committer | Michael Zucci <zucchi@src.gnome.org> | 2000-12-24 08:46:20 +0800 |
commit | 6de256c2a2b23f30d35e4a2213ad5839bf141d06 (patch) | |
tree | a34d8be64c0718070c4e1ea9548282912f37b387 /camel/providers/imap/camel-imap-search.c | |
parent | 6183d89039ba67a7f3869f460c13aff09a548471 (diff) | |
download | gsoc2013-evolution-6de256c2a2b23f30d35e4a2213ad5839bf141d06.tar gsoc2013-evolution-6de256c2a2b23f30d35e4a2213ad5839bf141d06.tar.gz gsoc2013-evolution-6de256c2a2b23f30d35e4a2213ad5839bf141d06.tar.bz2 gsoc2013-evolution-6de256c2a2b23f30d35e4a2213ad5839bf141d06.tar.lz gsoc2013-evolution-6de256c2a2b23f30d35e4a2213ad5839bf141d06.tar.xz gsoc2013-evolution-6de256c2a2b23f30d35e4a2213ad5839bf141d06.tar.zst gsoc2013-evolution-6de256c2a2b23f30d35e4a2213ad5839bf141d06.zip |
Lock the command channel while searching. (imap_body_contains): If
2000-12-24 Not Zed <NotZed@HelixCode.com>
* providers/imap/camel-imap-search.c (imap_body_contains): Lock
the command channel while searching.
(imap_body_contains): If performing a whole uid search, then add
references to our own summary items, dont look it up in the
folder. This way they can't vanish unexpectedly.
* providers/imap/camel-imap-folder.h (CamelImapFolder): Added a
private field.
* providers/imap/camel-imap-private.h: Added lock for imap
searches.
* Merge from camel-mt-branch.
* providers/imap/camel-imap-folder.c (imap_update_summary): Merge
fix, use the folder->summary.
(imap_get_message_flags, imap_set_message_flags,
imap_get_message_user_flag, imap_set_message_user_flag): Removed
again.
(camel_imap_folder_init): Setup private data/lock.
(imap_finalize): Free private data/search lock.
(imap_search_free): Lock the search_lock.
(imap_search_by_expression): Lock the search lock when using the
search object. Also copy/ref hte summary, rather than getting it
directly.
(imap_refresh_info): Free any info lookups. Use folder->summary
not imap_folder->summary. And lock around commands.
svn path=/trunk/; revision=7150
Diffstat (limited to 'camel/providers/imap/camel-imap-search.c')
-rw-r--r-- | camel/providers/imap/camel-imap-search.c | 32 |
1 files changed, 26 insertions, 6 deletions
diff --git a/camel/providers/imap/camel-imap-search.c b/camel/providers/imap/camel-imap-search.c index 1aa6b55bc5..cec0ee1f89 100644 --- a/camel/providers/imap/camel-imap-search.c +++ b/camel/providers/imap/camel-imap-search.c @@ -31,6 +31,7 @@ #include "camel-imap-command.h" #include "camel-imap-folder.h" #include "camel-imap-search.h" +#include "camel-imap-private.h" static ESExpResult * imap_body_contains (struct _ESExp *f, int argc, struct _ESExpResult **argv, @@ -72,10 +73,13 @@ imap_body_contains (struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (s->folder); char *value = argv[0]->value.string; CamelImapResponse *response; - char *result, *p, *lasts = NULL; + char *result, *p, *lasts = NULL, *real_uid; const char *uid; ESExpResult *r; CamelMessageInfo *info; + GHashTable *uid_hash = NULL; + + CAMEL_IMAP_STORE_LOCK(store, command_lock); if (s->current) { uid = camel_message_info_uid (s->current); @@ -91,6 +95,9 @@ imap_body_contains (struct _ESExp *f, int argc, struct _ESExpResult **argv, "UID SEARCH BODY \"%s\"", value); } + + CAMEL_IMAP_STORE_UNLOCK(store, command_lock); + if (!response) return r; result = camel_imap_response_extract (response, "SEARCH", NULL); @@ -105,14 +112,27 @@ imap_body_contains (struct _ESExp *f, int argc, struct _ESExpResult **argv, break; } } else { - /* FIXME: The strings added to the array must be - * static... - */ - info = camel_folder_summary_uid (imap_folder->summary, p); - g_ptr_array_add (r->value.ptrarray, (char *)camel_message_info_uid (info)); + /* if we need to setup a hash of summary items, this way we get + access to the summary memory which is locked for the duration of + the search, and wont vanish on us */ + if (uid_hash == NULL) { + int i; + + uid_hash = g_hash_table_new(g_str_hash, g_str_equal); + for (i=0;i<s->summary->len;i++) { + info = s->summary->pdata[i]; + g_hash_table_insert(uid_hash, camel_message_info_uid(info), info); + } + } + if (g_hash_table_lookup_extended(uid_hash, p, &real_uid, &info)) + g_ptr_array_add (r->value.ptrarray, real_uid); } } + /* we could probably cache this globally, but its probably not worth it */ + if (uid_hash) + g_hash_table_destroy(uid_hash); + return r; } |