static int cmd_deduplicate_uidlist(struct mailbox *box, struct uidlist *uidlist) { struct mailbox_transaction_context *trans; struct mail_search_context *search_ctx; struct mail_search_args *search_args; struct mail_search_arg *arg; struct mail *mail; ARRAY_TYPE(seq_range) uids; int ret = 0; /* the uidlist is reversed with oldest mails at the end. we'll delete everything but the oldest mail. */ if (uidlist->next == NULL) return 0; t_array_init(&uids, 8); for (; uidlist->next != NULL; uidlist = uidlist->next) seq_range_array_add(&uids, uidlist->uid); search_args = mail_search_build_init(); arg = mail_search_build_add(search_args, SEARCH_UIDSET); arg->value.seqset = uids; trans = mailbox_transaction_begin(box, 0); search_ctx = mailbox_search_init(trans, search_args, NULL, 0, NULL); mail_search_args_unref(&search_args); while (mailbox_search_next(search_ctx, &mail)) mail_expunge(mail); if (mailbox_search_deinit(&search_ctx) < 0) ret = -1; if (mailbox_transaction_commit(&trans) < 0) ret = -1; return ret; }
void mail_search_build_add_seqset(struct mail_search_args *args, uint32_t seq1, uint32_t seq2) { struct mail_search_arg *arg; arg = mail_search_build_add(args, SEARCH_SEQSET); p_array_init(&arg->value.seqset, args->pool, 1); seq_range_array_add_range(&arg->value.seqset, seq1, seq2); }
void mail_search_build_add_all(struct mail_search_args *args) { (void)mail_search_build_add(args, SEARCH_ALL); }