diff options
author | Brendan Cully <brendan@kublai.com> | 2007-04-10 20:22:06 -0700 |
---|---|---|
committer | Brendan Cully <brendan@kublai.com> | 2007-04-10 20:22:06 -0700 |
commit | be1cd098cd6d304ce60afeda3af4ebd29fc4bc3f (patch) | |
tree | 435b98ac7047c8a5bd3a6bfbc2243fe886fdcbfa /imap | |
parent | 99d61db9a0e00c3df767a97b16d6977d59e50fa4 (diff) |
Add $message_cache_clean option to prune message cache on sync
Diffstat (limited to 'imap')
-rw-r--r-- | imap/imap.c | 4 | ||||
-rw-r--r-- | imap/imap_private.h | 1 | ||||
-rw-r--r-- | imap/message.c | 31 |
3 files changed, 36 insertions, 0 deletions
diff --git a/imap/imap.c b/imap/imap.c index 4030c913..29c5f8f1 100644 --- a/imap/imap.c +++ b/imap/imap.c @@ -1261,7 +1261,11 @@ int imap_sync_mailbox (CONTEXT* ctx, int expunge, int* index_hint) idata->state = IMAP_AUTHENTICATED; } + if (option (OPTMESSAGECACHECLEAN)) + imap_cache_clean (idata); + rc = 0; + out: if (cmd.data) FREE (&cmd.data); diff --git a/imap/imap_private.h b/imap/imap_private.h index 98adc8b2..75f1429f 100644 --- a/imap/imap_private.h +++ b/imap/imap_private.h @@ -256,6 +256,7 @@ void imap_free_header_data (void** data); int imap_read_headers (IMAP_DATA* idata, int msgbegin, int msgend); char* imap_set_flags (IMAP_DATA* idata, HEADER* h, char* s); int imap_cache_del (IMAP_DATA* idata, HEADER* h); +int imap_cache_clean (IMAP_DATA* idata); /* util.c */ #ifdef USE_HCACHE diff --git a/imap/message.c b/imap/message.c index 0cd3e50e..10ebd0fb 100644 --- a/imap/message.c +++ b/imap/message.c @@ -906,6 +906,37 @@ int imap_cache_del (IMAP_DATA* idata, HEADER* h) return mutt_bcache_del (idata->bcache, id); } +static int msg_cache_clean_cb (const char* id, body_cache_t* bcache, void* data) +{ + unsigned int uv, uid, n; + IMAP_DATA* idata = (IMAP_DATA*)data; + + if (sscanf (id, "%u-%u", &uv, &uid) != 2) + return 0; + + /* bad UID */ + if (uv != idata->uid_validity) + mutt_bcache_del (bcache, id); + + /* TODO: presort UIDs, walk in order */ + for (n = 0; n < idata->ctx->msgcount; n++) + { + if (uid == HEADER_DATA(idata->ctx->hdrs[n])->uid) + return 0; + } + mutt_bcache_del (bcache, id); + + return 0; +} + +int imap_cache_clean (IMAP_DATA* idata) +{ + idata->bcache = msg_cache_open (idata); + mutt_bcache_list (idata->bcache, msg_cache_clean_cb, idata); + + return 0; +} + /* imap_add_keywords: concatenate custom IMAP tags to list, if they * appear in the folder flags list. Why wouldn't they? */ void imap_add_keywords (char* s, HEADER* h, LIST* mailbox_flags, size_t slen) |