summaryrefslogtreecommitdiffabout
path: root/kmicromail/libetpan/generic/mhdriver_cached.c
Unidiff
Diffstat (limited to 'kmicromail/libetpan/generic/mhdriver_cached.c') (more/less context) (ignore whitespace changes)
-rw-r--r--kmicromail/libetpan/generic/mhdriver_cached.c93
1 files changed, 88 insertions, 5 deletions
diff --git a/kmicromail/libetpan/generic/mhdriver_cached.c b/kmicromail/libetpan/generic/mhdriver_cached.c
index 5c35089..04aa523 100644
--- a/kmicromail/libetpan/generic/mhdriver_cached.c
+++ b/kmicromail/libetpan/generic/mhdriver_cached.c
@@ -110,2 +110,4 @@ static int mhdriver_cached_append_message(mailsession * session,
110 char * message, size_t size); 110 char * message, size_t size);
111static int mhdriver_cached_append_message_flags(mailsession * session,
112 char * message, size_t size, struct mail_flags * flags);
111static int mhdriver_cached_copy_message(mailsession * session, 113static int mhdriver_cached_copy_message(mailsession * session,
@@ -167,2 +169,3 @@ static mailsession_driver local_mh_cached_session_driver = {
167 .sess_append_message = mhdriver_cached_append_message, 169 .sess_append_message = mhdriver_cached_append_message,
170 .sess_append_message_flags = mhdriver_cached_append_message_flags,
168 .sess_copy_message = mhdriver_cached_copy_message, 171 .sess_copy_message = mhdriver_cached_copy_message,
@@ -885,3 +888,81 @@ static int mhdriver_cached_append_message(mailsession * session,
885{ 888{
886 return mailsession_append_message(get_ancestor(session), message, size); 889 return mhdriver_cached_append_message_flags(session,
890 message, size, NULL);
891}
892
893static int mhdriver_cached_append_message_flags(mailsession * session,
894 char * message, size_t size, struct mail_flags * flags)
895{
896 int r;
897 struct mailmh_folder * folder;
898 struct mailmh_msg_info * msg_info;
899 chashdatum key;
900 chashdatum value;
901 uint32_t uid;
902 struct mh_cached_session_state_data * data;
903 char filename_flags[PATH_MAX];
904 struct mail_cache_db * cache_db_flags;
905 MMAPString * mmapstr;
906 char keyname[PATH_MAX];
907
908 folder = get_mh_cur_folder(session);
909 if (folder == NULL)
910 return MAIL_ERROR_BAD_STATE;
911
912 r = mailmh_folder_add_message_uid(folder,
913 message, size, &uid);
914
915 switch (r) {
916 case MAILMH_ERROR_FILE:
917 return MAIL_ERROR_DISKSPACE;
918
919 case MAILMH_NO_ERROR:
920 break;
921
922 default:
923 return mhdriver_mh_error_to_mail_error(r);
924 }
925
926 if (flags == NULL)
927 goto exit;
928
929 key.data = &uid;
930 key.len = sizeof(uid);
931 r = chash_get(folder->fl_msgs_hash, &key, &value);
932 if (r < 0)
933 return MAIL_ERROR_CACHE_MISS;
934
935 msg_info = value.data;
936
937 data = get_cached_data(session);
938
939 snprintf(filename_flags, PATH_MAX, "%s/%s/%s",
940 data->mh_flags_directory, data->mh_quoted_mb, FLAGS_NAME);
941
942 r = mail_cache_db_open_lock(filename_flags, &cache_db_flags);
943 if (r < 0)
944 goto exit;
945
946 mmapstr = mmap_string_new("");
947 if (mmapstr == NULL)
948 goto close_db_flags;
949
950 snprintf(keyname, PATH_MAX, "%u-%lu-%lu-flags",
951 uid, (unsigned long) msg_info->msg_mtime,
952 (unsigned long) msg_info->msg_size);
953
954 r = mhdriver_write_cached_flags(cache_db_flags, mmapstr, keyname, flags);
955
956 mmap_string_free(mmapstr);
957 mail_cache_db_close_unlock(filename_flags, cache_db_flags);
958
959 if (r != MAIL_NO_ERROR)
960 goto exit;
961
962 return MAIL_NO_ERROR;
963
964 close_db_flags:
965 mail_cache_db_close_unlock(filename_flags, cache_db_flags);
966 exit:
967 return MAIL_NO_ERROR;
887} 968}
@@ -955,4 +1036,5 @@ get_cached_envelope(struct mail_cache_db * cache_db, MMAPString * mmapstr,
955 1036
956 snprintf(keyname, PATH_MAX, "%u-%u-%u-envelope", 1037 snprintf(keyname, PATH_MAX, "%u-%lu-%lu-envelope",
957 num, (uint32_t) msg_info->msg_mtime, msg_info->msg_size); 1038 num, (unsigned long) msg_info->msg_mtime,
1039 (unsigned long) msg_info->msg_size);
958 1040
@@ -1000,4 +1082,5 @@ write_cached_envelope(struct mail_cache_db * cache_db, MMAPString * mmapstr,
1000 1082
1001 snprintf(keyname, PATH_MAX, "%u-%u-%u-envelope", 1083 snprintf(keyname, PATH_MAX, "%u-%lu-%lu-envelope",
1002 num, (uint32_t) msg_info->msg_mtime, msg_info->msg_size); 1084 num, (unsigned long) msg_info->msg_mtime,
1085 (unsigned long) msg_info->msg_size);
1003 1086