static void cmd_dict_unset(int argc, char *argv[]) { struct dict *dict; struct dict_transaction_context *trans; dict = cmd_dict_init(&argc, &argv, 1, 0, cmd_dict_unset); trans = dict_transaction_begin(dict); dict_unset(trans, argv[0]); if (dict_transaction_commit(&trans) <= 0) { i_error("dict_transaction_commit() failed"); doveadm_exit_code = EX_TEMPFAIL; } dict_deinit(&dict); }
static void cmd_dict_inc(int argc, char *argv[]) { struct dict *dict; struct dict_transaction_context *trans; long long diff; int ret; dict = cmd_dict_init(&argc, &argv, 2, 0, cmd_dict_inc); if (str_to_llong(argv[1], &diff) < 0) i_fatal("Invalid diff: %s", argv[1]); trans = dict_transaction_begin(dict); dict_atomic_inc(trans, argv[0], diff); ret = dict_transaction_commit(&trans); if (ret < 0) { i_error("dict_transaction_commit() failed"); doveadm_exit_code = EX_TEMPFAIL; } else if (ret == 0) { i_error("%s doesn't exist", argv[0]); doveadm_exit_code = DOVEADM_EX_NOTFOUND; } dict_deinit(&dict); }
static int index_transaction_index_commit(struct mail_index_transaction *index_trans, struct mail_index_transaction_commit_result *result_r) { struct mailbox_transaction_context *t = MAIL_STORAGE_CONTEXT(index_trans); struct index_mailbox_sync_pvt_context *pvt_sync_ctx = NULL; int ret = 0; if (t->nontransactional_changes) t->changes->changed = TRUE; if (t->attr_pvt_trans != NULL) { if (dict_transaction_commit(&t->attr_pvt_trans) < 0) { mail_storage_set_internal_error(t->box->storage); ret = -1; } } if (t->attr_shared_trans != NULL) { if (dict_transaction_commit(&t->attr_shared_trans) < 0) { mail_storage_set_internal_error(t->box->storage); ret = -1; } } if (t->save_ctx != NULL) { if (ret < 0) { t->box->v.transaction_save_rollback(t->save_ctx); t->save_ctx = NULL; } else if (t->box->v.transaction_save_commit_pre(t->save_ctx) < 0) { t->save_ctx = NULL; ret = -1; } else { t->changes->changed = TRUE; } } if (array_is_created(&t->pvt_saves)) { if (index_mailbox_sync_pvt_init(t->box, TRUE, &pvt_sync_ctx) < 0) ret = -1; } i_assert(t->mail_ref_count == 0); if (ret < 0) t->super.rollback(index_trans); else { if (t->super.commit(index_trans, result_r) < 0) { mailbox_set_index_error(t->box); ret = -1; } else if (result_r->commit_size > 0) { /* something was written to the transaction log */ t->changes->changed = TRUE; } } if (t->save_ctx != NULL) t->box->v.transaction_save_commit_post(t->save_ctx, result_r); if (pvt_sync_ctx != NULL) { if (index_mailbox_sync_pvt_newmails(pvt_sync_ctx, t) < 0) { /* failed to add private flags. a bit too late to return failure though, so just ignore silently */ } index_mailbox_sync_pvt_deinit(&pvt_sync_ctx); } index_transaction_free(t); return ret; }