mail-index-transaction.c revision f84ef9754f697526ee11a2fb0e99fc6d390e0619
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen/* Copyright (C) 2003-2004 Timo Sirainen */
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen/* Inside transaction we keep messages stored in sequences in uid fields.
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen Before they're written to transaction log the sequences are changed to
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen UIDs. This is because we're able to compress sequence ranges better. */
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenmail_index_transaction_begin(struct mail_index_view *view,
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen /* don't allow syncing view while there's ongoing transactions */
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen t->first_new_seq = mail_index_view_get_messages_count(t->view)+1;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen /* transaction view cannot work if new records are being added
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen in two places. make sure it doesn't happen. */
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenstatic void mail_keyword_transaction_free(struct mail_keyword_transaction *kt)
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen for (p = &kt->keywords->kt; *p != NULL; p = &(*p)->next) {
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen if (*p == kt) {
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen /* no transactions left, free mail_keywords */
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenstatic void mail_index_transaction_free(struct mail_index_transaction *t)
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen recs = buffer_get_modifyable_data(t->ext_rec_updates, &size);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen for (i = 0; i < size; i++) {
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen kt = buffer_get_modifyable_data(t->keyword_updates, &size);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen for (i = 0; i < size; i++)
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenvoid mail_index_transaction_ref(struct mail_index_transaction *t)
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenvoid mail_index_transaction_unref(struct mail_index_transaction *t)
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen if (--t->refcount == 0)
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenmail_index_buffer_convert_to_uids(struct mail_index_transaction *t,
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen unsigned char *data;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen /* @UNSAFE */
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen data = buffer_get_modifyable_data(buf, &size);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenmail_index_transaction_convert_to_uids(struct mail_index_transaction *t)
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen extensions = buffer_get_data(index->extensions, NULL);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen updates = buffer_get_modifyable_data(t->ext_rec_updates, &size);
6564208826b0f46a00f010d1b5711d85944c3c88Timo Sirainen for (i = 0; i < size; i++) {
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen mail_index_buffer_convert_to_uids(t, updates[i],
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen kt = buffer_get_modifyable_data(t->keyword_updates, &size);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen for (i = 0; i < size; i++) {
6564208826b0f46a00f010d1b5711d85944c3c88Timo Sirainen mail_index_buffer_convert_to_uids(t, kt[i]->messages,
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen mail_index_buffer_convert_to_uids(t, t->expunges,
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen sizeof(struct mail_transaction_expunge), TRUE);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen mail_index_buffer_convert_to_uids(t, t->updates,
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen sizeof(struct mail_transaction_flag_update), TRUE);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenint mail_index_transaction_commit(struct mail_index_transaction *t,
6564208826b0f46a00f010d1b5711d85944c3c88Timo Sirainen if (mail_index_view_is_inconsistent(t->view)) {
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen mail_cache_transaction_commit(t->cache_trans_ctx);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen if (mail_index_transaction_convert_to_uids(t) < 0)
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen ret = mail_transaction_log_append(t, log_file_seq_r,
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenvoid mail_index_transaction_rollback(struct mail_index_transaction *t)
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen mail_cache_transaction_rollback(t->cache_trans_ctx);
struct mail_index_record *
sizeof(struct mail_index_record));
if (t->last_new_seq != 0)
struct seq_range {
idx++;
sizeof(*data));
sizeof(*data));
struct mail_transaction_flag_update u,
idx++;
tmp_update = u;
move = 0;
size++;
~u.remove_flags;
~u.add_flags;
switch (modify_type) {
case MODIFY_REPLACE:
case MODIFY_ADD:
case MODIFY_REMOVE:
memset(&u, 0, sizeof(u));
switch (modify_type) {
case MODIFY_REPLACE:
case MODIFY_ADD:
case MODIFY_REMOVE:
t->last_update_idx++;
last_update++;
size);
void *data;
if (size == 0)
idx = 0;
return TRUE;
return FALSE;
void *old_record)
return FALSE;
return TRUE;
return FALSE;
size = 0;
sizeof(buffer_t *));
old_data_r)) {
static struct mail_keyword_transaction *
return kt;
static struct mail_keywords *
struct mail_keywords k;
uint8_t *b;
if (count == 0)
t_push();
memset(&k, 0, sizeof(k));
for (i = 0; i < count; i++) {
k.start = j;
} else if (j < k.start) {
k.start = j;
k.end = j;
k.count++;
if (missing_count > 0) {
j = size / sizeof(const char *);
k.end = j;
k.count++;
t_pop();
struct mail_keywords *
const char *const keywords[])
struct mail_keywords *k;
(void)mail_keyword_transaction_new(t, k);