}
int dbox_map_append_move(struct dbox_map_append_context *ctx,
- ARRAY_TYPE(seq_range) *map_uids,
- ARRAY_TYPE(seq_range) *expunge_map_uids)
+ const ARRAY_TYPE(uint32_t) *map_uids,
+ const ARRAY_TYPE(seq_range) *expunge_map_uids)
{
const struct dbox_map_append *appends;
struct dbox_mail_index_map_record rec;
struct seq_range_iter iter;
- unsigned int i, j, appends_count;
+ const uint32_t *uids;
+ unsigned int i, j, map_uids_count, appends_count;
uint32_t uid, seq;
if (dbox_map_assign_file_ids(ctx) < 0)
memset(&rec, 0, sizeof(rec));
appends = array_get(&ctx->appends, &appends_count);
- seq_range_array_iter_init(&iter, map_uids); i = j = 0;
- while (seq_range_array_iter_nth(&iter, i++, &uid)) {
+ uids = array_get(map_uids, &map_uids_count);
+ for (i = j = 0; i < map_uids_count; i++) {
i_assert(j < appends_count);
rec.file_id = appends[j].file->file_id;
rec.offset = appends[j].offset;
rec.size = appends[j].size;
j++;
- if (!mail_index_lookup_seq(ctx->sync_view, uid, &seq))
+ if (!mail_index_lookup_seq(ctx->sync_view, uids[i], &seq))
i_unreached();
mail_index_update_ext(ctx->trans, seq, ctx->map->map_ext_id,
&rec, NULL);
/* The appends are existing messages that were simply moved to a new file.
map_uids contains the moved messages' map UIDs. */
int dbox_map_append_move(struct dbox_map_append_context *ctx,
- ARRAY_TYPE(seq_range) *map_uids,
- ARRAY_TYPE(seq_range) *expunge_map_uids);
+ const ARRAY_TYPE(uint32_t) *map_uids,
+ const ARRAY_TYPE(seq_range) *expunge_map_uids);
/* Returns 0 if ok, -1 if error. */
void dbox_map_append_commit(struct dbox_map_append_context **ctx);
void dbox_map_append_rollback(struct dbox_map_append_context **ctx);
struct dbox_map_append_context *append_ctx;
ARRAY_TYPE(dbox_map_file_msg) msgs_arr;
struct dbox_map_file_msg *msgs;
- ARRAY_TYPE(seq_range) copied_map_uids, expunged_map_uids;
+ ARRAY_TYPE(seq_range) expunged_map_uids;
+ ARRAY_TYPE(uint32_t) copied_map_uids;
unsigned int i, count;
uoff_t offset, physical_size, msg_size;
bool expunged;
if ((ret = dbox_sync_file_copy_metadata(file, output)) <= 0)
break;
- dbox_map_append_finish_multi_mail(append_ctx);
- seq_range_array_add(&copied_map_uids, 0, msgs[i].map_uid);
+ if (output != NULL) {
+ dbox_map_append_finish_multi_mail(append_ctx);
+ array_append(&copied_map_uids, &msgs[i].map_uid, 1);
+ }
offset = file->input->v_offset;
}
if (offset != (uoff_t)st.st_size && ret > 0) {
"more messages available than in map "
"(%"PRIuUOFF_T" < %"PRIuUOFF_T")", offset, st.st_size);
ret = 0;
- sleep(3600);
}
array_free(&msgs_arr); msgs = NULL;
i_error("dbox error");
dbox_map_append_rollback(&append_ctx);
ret = -1;
- } else if (output == NULL) {
+ } else if (array_count(&copied_map_uids) == 0) {
/* everything expunged in this file, unlink it */
ret = dbox_sync_file_unlink(file);
dbox_map_append_rollback(&append_ctx);
/* no expunges - we want to move it */
dbox_sync_file_move_if_needed(file, entry);
} else if (entry->uid != 0) {
- /* fast path to expunging the whole file */
+ /* single-message file, we can unlink it */
if ((ret = dbox_sync_file_unlink(file)) == 0) {
/* file was lost, delete it */
dbox_sync_mark_expunges(ctx, &entry->expunge_seqs);