Diffstat (limited to 'kmicromail/libetpan/generic/mhdriver_cached.c') (more/less context) (ignore whitespace changes)
-rw-r--r-- | kmicromail/libetpan/generic/mhdriver_cached.c | 93 |
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 | |||
@@ -63,153 +63,156 @@ static int mhdriver_cached_initialize(mailsession * session); | |||
63 | 63 | ||
64 | static void mhdriver_cached_uninitialize(mailsession * session); | 64 | static void mhdriver_cached_uninitialize(mailsession * session); |
65 | 65 | ||
66 | static int mhdriver_cached_parameters(mailsession * session, | 66 | static int mhdriver_cached_parameters(mailsession * session, |
67 | int id, void * value); | 67 | int id, void * value); |
68 | 68 | ||
69 | static int mhdriver_cached_connect_path(mailsession * session, char * path); | 69 | static int mhdriver_cached_connect_path(mailsession * session, char * path); |
70 | static int mhdriver_cached_logout(mailsession * session); | 70 | static int mhdriver_cached_logout(mailsession * session); |
71 | 71 | ||
72 | static int mhdriver_cached_build_folder_name(mailsession * session, char * mb, | 72 | static int mhdriver_cached_build_folder_name(mailsession * session, char * mb, |
73 | char * name, char ** result); | 73 | char * name, char ** result); |
74 | static int mhdriver_cached_create_folder(mailsession * session, char * mb); | 74 | static int mhdriver_cached_create_folder(mailsession * session, char * mb); |
75 | 75 | ||
76 | static int mhdriver_cached_delete_folder(mailsession * session, char * mb); | 76 | static int mhdriver_cached_delete_folder(mailsession * session, char * mb); |
77 | 77 | ||
78 | static int mhdriver_cached_rename_folder(mailsession * session, char * mb, | 78 | static int mhdriver_cached_rename_folder(mailsession * session, char * mb, |
79 | char * new_name); | 79 | char * new_name); |
80 | 80 | ||
81 | static int mhdriver_cached_check_folder(mailsession * session); | 81 | static int mhdriver_cached_check_folder(mailsession * session); |
82 | 82 | ||
83 | static int mhdriver_cached_select_folder(mailsession * session, char * mb); | 83 | static int mhdriver_cached_select_folder(mailsession * session, char * mb); |
84 | 84 | ||
85 | static int mhdriver_cached_expunge_folder(mailsession * session); | 85 | static int mhdriver_cached_expunge_folder(mailsession * session); |
86 | 86 | ||
87 | static int mhdriver_cached_status_folder(mailsession * session, char * mb, | 87 | static int mhdriver_cached_status_folder(mailsession * session, char * mb, |
88 | uint32_t * result_messages, uint32_t * result_recent, | 88 | uint32_t * result_messages, uint32_t * result_recent, |
89 | uint32_t * result_unseen); | 89 | uint32_t * result_unseen); |
90 | 90 | ||
91 | static int mhdriver_cached_messages_number(mailsession * session, char * mb, | 91 | static int mhdriver_cached_messages_number(mailsession * session, char * mb, |
92 | uint32_t * result); | 92 | uint32_t * result); |
93 | static int mhdriver_cached_recent_number(mailsession * session, char * mb, | 93 | static int mhdriver_cached_recent_number(mailsession * session, char * mb, |
94 | uint32_t * result); | 94 | uint32_t * result); |
95 | static int mhdriver_cached_unseen_number(mailsession * session, char * mb, | 95 | static int mhdriver_cached_unseen_number(mailsession * session, char * mb, |
96 | uint32_t * result); | 96 | uint32_t * result); |
97 | 97 | ||
98 | static int mhdriver_cached_list_folders(mailsession * session, char * mb, | 98 | static int mhdriver_cached_list_folders(mailsession * session, char * mb, |
99 | struct mail_list ** result); | 99 | struct mail_list ** result); |
100 | 100 | ||
101 | static int mhdriver_cached_lsub_folders(mailsession * session, char * mb, | 101 | static int mhdriver_cached_lsub_folders(mailsession * session, char * mb, |
102 | struct mail_list ** result); | 102 | struct mail_list ** result); |
103 | 103 | ||
104 | static int mhdriver_cached_subscribe_folder(mailsession * session, char * mb); | 104 | static int mhdriver_cached_subscribe_folder(mailsession * session, char * mb); |
105 | 105 | ||
106 | static int mhdriver_cached_unsubscribe_folder(mailsession * session, | 106 | static int mhdriver_cached_unsubscribe_folder(mailsession * session, |
107 | char * mb); | 107 | char * mb); |
108 | 108 | ||
109 | static int mhdriver_cached_append_message(mailsession * session, | 109 | static int mhdriver_cached_append_message(mailsession * session, |
110 | char * message, size_t size); | 110 | char * message, size_t size); |
111 | static int mhdriver_cached_append_message_flags(mailsession * session, | ||
112 | char * message, size_t size, struct mail_flags * flags); | ||
111 | static int mhdriver_cached_copy_message(mailsession * session, | 113 | static int mhdriver_cached_copy_message(mailsession * session, |
112 | uint32_t num, char * mb); | 114 | uint32_t num, char * mb); |
113 | 115 | ||
114 | static int mhdriver_cached_remove_message(mailsession * session, | 116 | static int mhdriver_cached_remove_message(mailsession * session, |
115 | uint32_t num); | 117 | uint32_t num); |
116 | 118 | ||
117 | static int mhdriver_cached_move_message(mailsession * session, | 119 | static int mhdriver_cached_move_message(mailsession * session, |
118 | uint32_t num, char * mb); | 120 | uint32_t num, char * mb); |
119 | 121 | ||
120 | static int | 122 | static int |
121 | mhdriver_cached_get_messages_list(mailsession * session, | 123 | mhdriver_cached_get_messages_list(mailsession * session, |
122 | struct mailmessage_list ** result); | 124 | struct mailmessage_list ** result); |
123 | 125 | ||
124 | static int | 126 | static int |
125 | mhdriver_cached_get_envelopes_list(mailsession * session, | 127 | mhdriver_cached_get_envelopes_list(mailsession * session, |
126 | struct mailmessage_list * env_list); | 128 | struct mailmessage_list * env_list); |
127 | 129 | ||
128 | static int mhdriver_cached_get_message(mailsession * session, | 130 | static int mhdriver_cached_get_message(mailsession * session, |
129 | uint32_t num, mailmessage ** result); | 131 | uint32_t num, mailmessage ** result); |
130 | 132 | ||
131 | static int mhdriver_cached_get_message_by_uid(mailsession * session, | 133 | static int mhdriver_cached_get_message_by_uid(mailsession * session, |
132 | const char * uid, | 134 | const char * uid, |
133 | mailmessage ** result); | 135 | mailmessage ** result); |
134 | 136 | ||
135 | static mailsession_driver local_mh_cached_session_driver = { | 137 | static mailsession_driver local_mh_cached_session_driver = { |
136 | .sess_name = "mh-cached", | 138 | .sess_name = "mh-cached", |
137 | 139 | ||
138 | .sess_initialize = mhdriver_cached_initialize, | 140 | .sess_initialize = mhdriver_cached_initialize, |
139 | .sess_uninitialize = mhdriver_cached_uninitialize, | 141 | .sess_uninitialize = mhdriver_cached_uninitialize, |
140 | 142 | ||
141 | .sess_parameters = mhdriver_cached_parameters, | 143 | .sess_parameters = mhdriver_cached_parameters, |
142 | 144 | ||
143 | .sess_connect_stream = NULL, | 145 | .sess_connect_stream = NULL, |
144 | .sess_connect_path = mhdriver_cached_connect_path, | 146 | .sess_connect_path = mhdriver_cached_connect_path, |
145 | .sess_starttls = NULL, | 147 | .sess_starttls = NULL, |
146 | .sess_login = NULL, | 148 | .sess_login = NULL, |
147 | .sess_logout = mhdriver_cached_logout, | 149 | .sess_logout = mhdriver_cached_logout, |
148 | .sess_noop = NULL, | 150 | .sess_noop = NULL, |
149 | 151 | ||
150 | .sess_build_folder_name = mhdriver_cached_build_folder_name, | 152 | .sess_build_folder_name = mhdriver_cached_build_folder_name, |
151 | .sess_create_folder = mhdriver_cached_create_folder, | 153 | .sess_create_folder = mhdriver_cached_create_folder, |
152 | .sess_delete_folder = mhdriver_cached_delete_folder, | 154 | .sess_delete_folder = mhdriver_cached_delete_folder, |
153 | .sess_rename_folder = mhdriver_cached_rename_folder, | 155 | .sess_rename_folder = mhdriver_cached_rename_folder, |
154 | .sess_check_folder = mhdriver_cached_check_folder, | 156 | .sess_check_folder = mhdriver_cached_check_folder, |
155 | .sess_examine_folder = NULL, | 157 | .sess_examine_folder = NULL, |
156 | .sess_select_folder = mhdriver_cached_select_folder, | 158 | .sess_select_folder = mhdriver_cached_select_folder, |
157 | .sess_expunge_folder = mhdriver_cached_expunge_folder, | 159 | .sess_expunge_folder = mhdriver_cached_expunge_folder, |
158 | .sess_status_folder = mhdriver_cached_status_folder, | 160 | .sess_status_folder = mhdriver_cached_status_folder, |
159 | .sess_messages_number = mhdriver_cached_messages_number, | 161 | .sess_messages_number = mhdriver_cached_messages_number, |
160 | .sess_recent_number = mhdriver_cached_recent_number, | 162 | .sess_recent_number = mhdriver_cached_recent_number, |
161 | .sess_unseen_number = mhdriver_cached_unseen_number, | 163 | .sess_unseen_number = mhdriver_cached_unseen_number, |
162 | .sess_list_folders = mhdriver_cached_list_folders, | 164 | .sess_list_folders = mhdriver_cached_list_folders, |
163 | .sess_lsub_folders = mhdriver_cached_lsub_folders, | 165 | .sess_lsub_folders = mhdriver_cached_lsub_folders, |
164 | .sess_subscribe_folder = mhdriver_cached_subscribe_folder, | 166 | .sess_subscribe_folder = mhdriver_cached_subscribe_folder, |
165 | .sess_unsubscribe_folder = mhdriver_cached_unsubscribe_folder, | 167 | .sess_unsubscribe_folder = mhdriver_cached_unsubscribe_folder, |
166 | 168 | ||
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, |
169 | .sess_move_message = mhdriver_cached_move_message, | 172 | .sess_move_message = mhdriver_cached_move_message, |
170 | 173 | ||
171 | .sess_get_messages_list = mhdriver_cached_get_messages_list, | 174 | .sess_get_messages_list = mhdriver_cached_get_messages_list, |
172 | .sess_get_envelopes_list = mhdriver_cached_get_envelopes_list, | 175 | .sess_get_envelopes_list = mhdriver_cached_get_envelopes_list, |
173 | .sess_remove_message = mhdriver_cached_remove_message, | 176 | .sess_remove_message = mhdriver_cached_remove_message, |
174 | #if 0 | 177 | #if 0 |
175 | .sess_search_messages = maildriver_generic_search_messages, | 178 | .sess_search_messages = maildriver_generic_search_messages, |
176 | #endif | 179 | #endif |
177 | 180 | ||
178 | .sess_get_message = mhdriver_cached_get_message, | 181 | .sess_get_message = mhdriver_cached_get_message, |
179 | .sess_get_message_by_uid = mhdriver_cached_get_message_by_uid, | 182 | .sess_get_message_by_uid = mhdriver_cached_get_message_by_uid, |
180 | }; | 183 | }; |
181 | 184 | ||
182 | mailsession_driver * mh_cached_session_driver = | 185 | mailsession_driver * mh_cached_session_driver = |
183 | &local_mh_cached_session_driver; | 186 | &local_mh_cached_session_driver; |
184 | 187 | ||
185 | #define ENV_NAME "env.db" | 188 | #define ENV_NAME "env.db" |
186 | #define FLAGS_NAME "flags.db" | 189 | #define FLAGS_NAME "flags.db" |
187 | 190 | ||
188 | 191 | ||
189 | static inline struct mh_cached_session_state_data * | 192 | static inline struct mh_cached_session_state_data * |
190 | get_cached_data(mailsession * session) | 193 | get_cached_data(mailsession * session) |
191 | { | 194 | { |
192 | return session->sess_data; | 195 | return session->sess_data; |
193 | } | 196 | } |
194 | 197 | ||
195 | static inline mailsession * get_ancestor(mailsession * session) | 198 | static inline mailsession * get_ancestor(mailsession * session) |
196 | { | 199 | { |
197 | return get_cached_data(session)->mh_ancestor; | 200 | return get_cached_data(session)->mh_ancestor; |
198 | } | 201 | } |
199 | 202 | ||
200 | static inline struct mh_session_state_data * | 203 | static inline struct mh_session_state_data * |
201 | get_ancestor_data(mailsession * session) | 204 | get_ancestor_data(mailsession * session) |
202 | { | 205 | { |
203 | return get_ancestor(session)->sess_data; | 206 | return get_ancestor(session)->sess_data; |
204 | } | 207 | } |
205 | 208 | ||
206 | static inline struct mailmh * | 209 | static inline struct mailmh * |
207 | get_mh_session(mailsession * session) | 210 | get_mh_session(mailsession * session) |
208 | { | 211 | { |
209 | return get_ancestor_data(session)->mh_session; | 212 | return get_ancestor_data(session)->mh_session; |
210 | } | 213 | } |
211 | 214 | ||
212 | static inline struct mailmh_folder * | 215 | static inline struct mailmh_folder * |
213 | get_mh_cur_folder(mailsession * session) | 216 | get_mh_cur_folder(mailsession * session) |
214 | { | 217 | { |
215 | return get_ancestor_data(session)->mh_cur_folder; | 218 | return get_ancestor_data(session)->mh_cur_folder; |
@@ -838,213 +841,293 @@ static int mhdriver_cached_recent_number(mailsession * session, char * mb, | |||
838 | 841 | ||
839 | 842 | ||
840 | static int mhdriver_cached_unseen_number(mailsession * session, char * mb, | 843 | static int mhdriver_cached_unseen_number(mailsession * session, char * mb, |
841 | uint32_t * result) | 844 | uint32_t * result) |
842 | { | 845 | { |
843 | uint32_t messages; | 846 | uint32_t messages; |
844 | uint32_t recent; | 847 | uint32_t recent; |
845 | uint32_t unseen; | 848 | uint32_t unseen; |
846 | int r; | 849 | int r; |
847 | 850 | ||
848 | r = mhdriver_cached_status_folder(session, mb, &messages, &recent, &unseen); | 851 | r = mhdriver_cached_status_folder(session, mb, &messages, &recent, &unseen); |
849 | if (r != MAIL_NO_ERROR) | 852 | if (r != MAIL_NO_ERROR) |
850 | return r; | 853 | return r; |
851 | 854 | ||
852 | * result = recent; | 855 | * result = recent; |
853 | 856 | ||
854 | return MAIL_NO_ERROR; | 857 | return MAIL_NO_ERROR; |
855 | } | 858 | } |
856 | 859 | ||
857 | 860 | ||
858 | static int mhdriver_cached_list_folders(mailsession * session, char * mb, | 861 | static int mhdriver_cached_list_folders(mailsession * session, char * mb, |
859 | struct mail_list ** result) | 862 | struct mail_list ** result) |
860 | { | 863 | { |
861 | return mailsession_list_folders(get_ancestor(session), mb, result); | 864 | return mailsession_list_folders(get_ancestor(session), mb, result); |
862 | } | 865 | } |
863 | 866 | ||
864 | static int mhdriver_cached_lsub_folders(mailsession * session, char * mb, | 867 | static int mhdriver_cached_lsub_folders(mailsession * session, char * mb, |
865 | struct mail_list ** result) | 868 | struct mail_list ** result) |
866 | { | 869 | { |
867 | return mailsession_lsub_folders(get_ancestor(session), mb, result); | 870 | return mailsession_lsub_folders(get_ancestor(session), mb, result); |
868 | } | 871 | } |
869 | 872 | ||
870 | static int mhdriver_cached_subscribe_folder(mailsession * session, char * mb) | 873 | static int mhdriver_cached_subscribe_folder(mailsession * session, char * mb) |
871 | { | 874 | { |
872 | return mailsession_subscribe_folder(get_ancestor(session), mb); | 875 | return mailsession_subscribe_folder(get_ancestor(session), mb); |
873 | } | 876 | } |
874 | 877 | ||
875 | static int mhdriver_cached_unsubscribe_folder(mailsession * session, | 878 | static int mhdriver_cached_unsubscribe_folder(mailsession * session, |
876 | char * mb) | 879 | char * mb) |
877 | { | 880 | { |
878 | return mailsession_unsubscribe_folder(get_ancestor(session), mb); | 881 | return mailsession_unsubscribe_folder(get_ancestor(session), mb); |
879 | } | 882 | } |
880 | 883 | ||
881 | /* messages operations */ | 884 | /* messages operations */ |
882 | 885 | ||
883 | static int mhdriver_cached_append_message(mailsession * session, | 886 | static int mhdriver_cached_append_message(mailsession * session, |
884 | char * message, size_t size) | 887 | char * message, size_t size) |
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 | |||
893 | static 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 | } |
888 | 969 | ||
889 | static int mhdriver_cached_copy_message(mailsession * session, | 970 | static int mhdriver_cached_copy_message(mailsession * session, |
890 | uint32_t num, char * mb) | 971 | uint32_t num, char * mb) |
891 | { | 972 | { |
892 | return mailsession_copy_message(get_ancestor(session), num, mb); | 973 | return mailsession_copy_message(get_ancestor(session), num, mb); |
893 | } | 974 | } |
894 | 975 | ||
895 | static int mhdriver_cached_remove_message(mailsession * session, uint32_t num) | 976 | static int mhdriver_cached_remove_message(mailsession * session, uint32_t num) |
896 | { | 977 | { |
897 | return mailsession_remove_message(get_ancestor(session), num); | 978 | return mailsession_remove_message(get_ancestor(session), num); |
898 | } | 979 | } |
899 | 980 | ||
900 | static int mhdriver_cached_move_message(mailsession * session, | 981 | static int mhdriver_cached_move_message(mailsession * session, |
901 | uint32_t num, char * mb) | 982 | uint32_t num, char * mb) |
902 | { | 983 | { |
903 | return mailsession_move_message(get_ancestor(session), num, mb); | 984 | return mailsession_move_message(get_ancestor(session), num, mb); |
904 | } | 985 | } |
905 | 986 | ||
906 | static int | 987 | static int |
907 | mhdriver_cached_get_messages_list(mailsession * session, | 988 | mhdriver_cached_get_messages_list(mailsession * session, |
908 | struct mailmessage_list ** result) | 989 | struct mailmessage_list ** result) |
909 | { | 990 | { |
910 | struct mailmh_folder * folder; | 991 | struct mailmh_folder * folder; |
911 | int res; | 992 | int res; |
912 | 993 | ||
913 | folder = get_mh_cur_folder(session); | 994 | folder = get_mh_cur_folder(session); |
914 | if (folder == NULL) { | 995 | if (folder == NULL) { |
915 | res = MAIL_ERROR_BAD_STATE; | 996 | res = MAIL_ERROR_BAD_STATE; |
916 | goto err; | 997 | goto err; |
917 | } | 998 | } |
918 | 999 | ||
919 | return mh_get_messages_list(folder, session, | 1000 | return mh_get_messages_list(folder, session, |
920 | mh_cached_message_driver, result); | 1001 | mh_cached_message_driver, result); |
921 | 1002 | ||
922 | err: | 1003 | err: |
923 | return res; | 1004 | return res; |
924 | } | 1005 | } |
925 | 1006 | ||
926 | 1007 | ||
927 | 1008 | ||
928 | static int | 1009 | static int |
929 | get_cached_envelope(struct mail_cache_db * cache_db, MMAPString * mmapstr, | 1010 | get_cached_envelope(struct mail_cache_db * cache_db, MMAPString * mmapstr, |
930 | mailsession * session, uint32_t num, | 1011 | mailsession * session, uint32_t num, |
931 | struct mailimf_fields ** result) | 1012 | struct mailimf_fields ** result) |
932 | { | 1013 | { |
933 | int r; | 1014 | int r; |
934 | char keyname[PATH_MAX]; | 1015 | char keyname[PATH_MAX]; |
935 | struct mailimf_fields * fields; | 1016 | struct mailimf_fields * fields; |
936 | int res; | 1017 | int res; |
937 | struct mailmh_folder * folder; | 1018 | struct mailmh_folder * folder; |
938 | struct mailmh_msg_info * msg_info; | 1019 | struct mailmh_msg_info * msg_info; |
939 | chashdatum key; | 1020 | chashdatum key; |
940 | chashdatum data; | 1021 | chashdatum data; |
941 | 1022 | ||
942 | folder = get_mh_cur_folder(session); | 1023 | folder = get_mh_cur_folder(session); |
943 | 1024 | ||
944 | #if 0 | 1025 | #if 0 |
945 | msg_info = cinthash_find(mh_data->mh_cur_folder->fl_msgs_hash, num); | 1026 | msg_info = cinthash_find(mh_data->mh_cur_folder->fl_msgs_hash, num); |
946 | if (msg_info == NULL) | 1027 | if (msg_info == NULL) |
947 | return MAIL_ERROR_CACHE_MISS; | 1028 | return MAIL_ERROR_CACHE_MISS; |
948 | #endif | 1029 | #endif |
949 | key.data = # | 1030 | key.data = # |
950 | key.len = sizeof(num); | 1031 | key.len = sizeof(num); |
951 | r = chash_get(folder->fl_msgs_hash, &key, &data); | 1032 | r = chash_get(folder->fl_msgs_hash, &key, &data); |
952 | if (r < 0) | 1033 | if (r < 0) |
953 | return MAIL_ERROR_CACHE_MISS; | 1034 | return MAIL_ERROR_CACHE_MISS; |
954 | msg_info = data.data; | 1035 | msg_info = data.data; |
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 | ||
959 | r = generic_cache_fields_read(cache_db, mmapstr, keyname, &fields); | 1041 | r = generic_cache_fields_read(cache_db, mmapstr, keyname, &fields); |
960 | if (r != MAIL_NO_ERROR) { | 1042 | if (r != MAIL_NO_ERROR) { |
961 | res = r; | 1043 | res = r; |
962 | goto err; | 1044 | goto err; |
963 | } | 1045 | } |
964 | 1046 | ||
965 | * result = fields; | 1047 | * result = fields; |
966 | 1048 | ||
967 | return MAIL_NO_ERROR; | 1049 | return MAIL_NO_ERROR; |
968 | 1050 | ||
969 | err: | 1051 | err: |
970 | return res; | 1052 | return res; |
971 | } | 1053 | } |
972 | 1054 | ||
973 | static int | 1055 | static int |
974 | write_cached_envelope(struct mail_cache_db * cache_db, MMAPString * mmapstr, | 1056 | write_cached_envelope(struct mail_cache_db * cache_db, MMAPString * mmapstr, |
975 | mailsession * session, uint32_t num, | 1057 | mailsession * session, uint32_t num, |
976 | struct mailimf_fields * fields) | 1058 | struct mailimf_fields * fields) |
977 | { | 1059 | { |
978 | int r; | 1060 | int r; |
979 | char keyname[PATH_MAX]; | 1061 | char keyname[PATH_MAX]; |
980 | int res; | 1062 | int res; |
981 | struct mailmh_folder * folder; | 1063 | struct mailmh_folder * folder; |
982 | chashdatum key; | 1064 | chashdatum key; |
983 | chashdatum data; | 1065 | chashdatum data; |
984 | struct mailmh_msg_info * msg_info; | 1066 | struct mailmh_msg_info * msg_info; |
985 | 1067 | ||
986 | folder = get_mh_cur_folder(session); | 1068 | folder = get_mh_cur_folder(session); |
987 | #if 0 | 1069 | #if 0 |
988 | msg_info = cinthash_find(mh_data->mh_cur_folder->fl_msgs_hash, num); | 1070 | msg_info = cinthash_find(mh_data->mh_cur_folder->fl_msgs_hash, num); |
989 | if (msg_info == NULL) { | 1071 | if (msg_info == NULL) { |
990 | res = MAIL_ERROR_CACHE_MISS; | 1072 | res = MAIL_ERROR_CACHE_MISS; |
991 | goto err; | 1073 | goto err; |
992 | } | 1074 | } |
993 | #endif | 1075 | #endif |
994 | key.data = # | 1076 | key.data = # |
995 | key.len = sizeof(num); | 1077 | key.len = sizeof(num); |
996 | r = chash_get(folder->fl_msgs_hash, &key, &data); | 1078 | r = chash_get(folder->fl_msgs_hash, &key, &data); |
997 | if (r < 0) | 1079 | if (r < 0) |
998 | return MAIL_ERROR_CACHE_MISS; | 1080 | return MAIL_ERROR_CACHE_MISS; |
999 | msg_info = data.data; | 1081 | msg_info = data.data; |
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 | ||
1004 | r = generic_cache_fields_write(cache_db, mmapstr, keyname, fields); | 1087 | r = generic_cache_fields_write(cache_db, mmapstr, keyname, fields); |
1005 | if (r != MAIL_NO_ERROR) { | 1088 | if (r != MAIL_NO_ERROR) { |
1006 | res = r; | 1089 | res = r; |
1007 | goto err; | 1090 | goto err; |
1008 | } | 1091 | } |
1009 | 1092 | ||
1010 | return MAIL_NO_ERROR; | 1093 | return MAIL_NO_ERROR; |
1011 | 1094 | ||
1012 | err: | 1095 | err: |
1013 | return res; | 1096 | return res; |
1014 | } | 1097 | } |
1015 | 1098 | ||
1016 | static int | 1099 | static int |
1017 | mhdriver_cached_get_envelopes_list(mailsession * session, | 1100 | mhdriver_cached_get_envelopes_list(mailsession * session, |
1018 | struct mailmessage_list * env_list) | 1101 | struct mailmessage_list * env_list) |
1019 | { | 1102 | { |
1020 | int r; | 1103 | int r; |
1021 | unsigned int i; | 1104 | unsigned int i; |
1022 | char filename_env[PATH_MAX]; | 1105 | char filename_env[PATH_MAX]; |
1023 | char filename_flags[PATH_MAX]; | 1106 | char filename_flags[PATH_MAX]; |
1024 | struct mail_cache_db * cache_db_env; | 1107 | struct mail_cache_db * cache_db_env; |
1025 | struct mail_cache_db * cache_db_flags; | 1108 | struct mail_cache_db * cache_db_flags; |
1026 | MMAPString * mmapstr; | 1109 | MMAPString * mmapstr; |
1027 | int res; | 1110 | int res; |
1028 | struct mh_cached_session_state_data * cached_data; | 1111 | struct mh_cached_session_state_data * cached_data; |
1029 | 1112 | ||
1030 | cached_data = get_cached_data(session); | 1113 | cached_data = get_cached_data(session); |
1031 | if (cached_data->mh_quoted_mb == NULL) { | 1114 | if (cached_data->mh_quoted_mb == NULL) { |
1032 | res = MAIL_ERROR_BAD_STATE; | 1115 | res = MAIL_ERROR_BAD_STATE; |
1033 | goto err; | 1116 | goto err; |
1034 | } | 1117 | } |
1035 | 1118 | ||
1036 | mh_flags_store_process(cached_data->mh_flags_directory, | 1119 | mh_flags_store_process(cached_data->mh_flags_directory, |
1037 | cached_data->mh_quoted_mb, | 1120 | cached_data->mh_quoted_mb, |
1038 | cached_data->mh_flags_store); | 1121 | cached_data->mh_flags_store); |
1039 | 1122 | ||
1040 | mmapstr = mmap_string_new(""); | 1123 | mmapstr = mmap_string_new(""); |
1041 | if (mmapstr == NULL) { | 1124 | if (mmapstr == NULL) { |
1042 | res = MAIL_ERROR_MEMORY; | 1125 | res = MAIL_ERROR_MEMORY; |
1043 | goto err; | 1126 | goto err; |
1044 | } | 1127 | } |
1045 | 1128 | ||
1046 | snprintf(filename_env, PATH_MAX, "%s/%s/%s", | 1129 | snprintf(filename_env, PATH_MAX, "%s/%s/%s", |
1047 | cached_data->mh_cache_directory, | 1130 | cached_data->mh_cache_directory, |
1048 | cached_data->mh_quoted_mb, ENV_NAME); | 1131 | cached_data->mh_quoted_mb, ENV_NAME); |
1049 | 1132 | ||
1050 | r = mail_cache_db_open_lock(filename_env, &cache_db_env); | 1133 | r = mail_cache_db_open_lock(filename_env, &cache_db_env); |