diff options
author | Matthew Barnes <mbarnes@redhat.com> | 2011-01-18 21:27:37 -0500 |
---|---|---|
committer | Matthew Barnes <mbarnes@redhat.com> | 2011-01-18 21:37:26 -0500 |
commit | ee21a86b6ea8b84962d878924b2daeb5e3d2087b (patch) | |
tree | 08a2816784b117fbfc88e4dae3a4f83c424e09de | |
parent | e1420460dd77ac74e9b71161ade1ba00bc755f1e (diff) | |
download | evolution-data-server-ee21a86b6ea8b84962d878924b2daeb5e3d2087b.tar.gz |
Treat empty cache files as nonexistent.
For some reason, cached mail message files are sometimes winding up as
zero-length files. Still need to figure out how this is happening, but
in the meantime teach Camel to disregard zero-length cache files.
-rw-r--r-- | camel/camel-data-cache.c | 9 | ||||
-rw-r--r-- | camel/providers/imapx/camel-imapx-server.c | 39 |
2 files changed, 23 insertions, 25 deletions
diff --git a/camel/camel-data-cache.c b/camel/camel-data-cache.c index f33b9b06c..a72604ce5 100644 --- a/camel/camel-data-cache.c +++ b/camel/camel-data-cache.c @@ -420,8 +420,13 @@ camel_data_cache_get (CamelDataCache *cdc, real = data_cache_path(cdc, FALSE, path, key); stream = camel_object_bag_reserve(cdc->priv->busy_bag, real); if (!stream) { - stream = camel_stream_fs_new_with_name ( - real, O_RDWR, 0600, error); + struct stat st; + + /* Return NULL if the file is empty. */ + if (g_stat (real, &st) == 0 && st.st_size > 0) + stream = camel_stream_fs_new_with_name ( + real, O_RDWR, 0600, error); + if (stream) camel_object_bag_add(cdc->priv->busy_bag, real, stream); else diff --git a/camel/providers/imapx/camel-imapx-server.c b/camel/providers/imapx/camel-imapx-server.c index bde402675..179252d08 100644 --- a/camel/providers/imapx/camel-imapx-server.c +++ b/camel/providers/imapx/camel-imapx-server.c @@ -5014,19 +5014,11 @@ imapx_server_get_message (CamelIMAPXServer *is, CamelFolder *folder, CamelOperat CamelStream *stream = NULL, *tmp_stream; CamelIMAPXFolder *ifolder = (CamelIMAPXFolder *) folder; CamelIMAPXJob *job; - gchar *cache_file = NULL; CamelMessageInfo *mi; gboolean registered; EFlag *flag = NULL; gboolean success; - cache_file = camel_data_cache_get_filename (ifolder->cache, "cur", uid, NULL); - if (g_file_test (cache_file, G_FILE_TEST_EXISTS)) { - g_free (cache_file); - return NULL; - } - g_free (cache_file); - QUEUE_LOCK (is); if ((job = imapx_is_job_in_queue (is, folder, IMAPX_JOB_GET_MESSAGE, uid))) { @@ -5039,11 +5031,11 @@ imapx_server_get_message (CamelIMAPXServer *is, CamelFolder *folder, CamelOperat e_flag_wait (flag); - stream = camel_data_cache_get (ifolder->cache, "cur", uid, NULL); - if (!stream) - g_set_error ( - error, CAMEL_IMAPX_ERROR, 1, - "Could not retrieve the message"); + stream = camel_data_cache_get ( + ifolder->cache, "cur", uid, error); + if (stream == NULL) + g_prefix_error ( + error, "Could not retrieve the message: "); return stream; } @@ -5116,12 +5108,17 @@ camel_imapx_server_sync_message (CamelIMAPXServer *is, CamelFolder *folder, cons gchar *cache_file = NULL; CamelIMAPXFolder *ifolder = (CamelIMAPXFolder *) folder; CamelStream *stream; + gboolean is_cached; + struct stat st; + + /* Check if the cache file already exists and is non-empty. */ + cache_file = camel_data_cache_get_filename ( + ifolder->cache, "cur", uid, NULL); + is_cached = (g_stat (cache_file, &st) == 0 && st.st_size > 0); + g_free (cache_file); - cache_file = camel_data_cache_get_filename (ifolder->cache, "cur", uid, NULL); - if (g_file_test (cache_file, G_FILE_TEST_EXISTS)) { - g_free (cache_file); + if (is_cached) return TRUE; - } stream = imapx_server_get_message (is, folder, NULL, uid, IMAPX_PRIORITY_SYNC_MESSAGE, error); @@ -5172,13 +5169,9 @@ camel_imapx_server_append_message(CamelIMAPXServer *is, CamelFolder *folder, Cam /* chen cleanup this later */ uid = imapx_get_temp_uid (); - stream = camel_data_cache_add (ifolder->cache, "new", uid, NULL); + stream = camel_data_cache_add (ifolder->cache, "new", uid, error); if (stream == NULL) { - g_set_error ( - error, G_IO_ERROR, - g_io_error_from_errno (errno), - _("Cannot create spool file: %s"), - g_strerror (errno)); + g_prefix_error (error, _("Cannot create spool file: ")); g_free (uid); return FALSE; } |