static int index_storage_attribute_get_dict_trans(struct mailbox_transaction_context *t, enum mail_attribute_type type, struct dict_transaction_context **dtrans_r, const char **mailbox_prefix_r) { struct dict_transaction_context **dtransp = NULL; struct dict *dict; struct mailbox_metadata metadata; switch (type) { case MAIL_ATTRIBUTE_TYPE_PRIVATE: dtransp = &t->attr_pvt_trans; break; case MAIL_ATTRIBUTE_TYPE_SHARED: dtransp = &t->attr_shared_trans; break; } i_assert(dtransp != NULL); if (*dtransp != NULL) { /* transaction already created */ if (mailbox_get_metadata(t->box, MAILBOX_METADATA_GUID, &metadata) < 0) return -1; *mailbox_prefix_r = guid_128_to_string(metadata.guid); *dtrans_r = *dtransp; return 0; } if (index_storage_get_dict(t->box, type, &dict, mailbox_prefix_r) < 0) return -1; *dtransp = *dtrans_r = dict_transaction_begin(dict); return 0; }
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_storage_attribute_get_dict_trans(struct mailbox_transaction_context *t, enum mail_attribute_type type, struct dict_transaction_context **dtrans_r, const char **mailbox_prefix_r) { struct dict_transaction_context **dtransp = NULL; struct dict *dict; switch (type) { case MAIL_ATTRIBUTE_TYPE_PRIVATE: dtransp = &t->attr_pvt_trans; break; case MAIL_ATTRIBUTE_TYPE_SHARED: dtransp = &t->attr_shared_trans; break; } i_assert(dtransp != NULL); if (index_storage_get_dict(t->box, type, &dict, mailbox_prefix_r) < 0) return -1; *dtransp = *dtrans_r = dict_transaction_begin(dict); return 0; }
static void last_login_mail_user_created(struct mail_user *user) { struct mail_user_vfuncs *v = user->vlast; struct last_login_user *luser; struct dict *dict; struct dict_settings set; struct dict_transaction_context *trans; const char *dict_value, *key_name, *precision, *error; if (user->autocreated) { /* we want to handle only logged in users, not lda's raw user or accessed shared users */ return; } dict_value = mail_user_plugin_getenv(user, "last_login_dict"); if (dict_value == NULL || dict_value[0] == '\0') return; memset(&set, 0, sizeof(set)); set.username = user->username; set.base_dir = user->set->base_dir; if (mail_user_get_home(user, &set.home_dir) <= 0) set.home_dir = NULL; if (dict_init(dict_value, &set, &dict, &error) < 0) { i_error("last_login_dict: dict_init(%s) failed: %s", dict_value, error); return; } luser = p_new(user->pool, struct last_login_user, 1); luser->module_ctx.super = *v; user->vlast = &luser->module_ctx.super; v->deinit = last_login_user_deinit; luser->dict = dict; MODULE_CONTEXT_SET(user, last_login_user_module, luser); key_name = mail_user_plugin_getenv(user, "last_login_key"); if (key_name == NULL) { key_name = t_strdup_printf(LAST_LOGIN_DEFAULT_KEY_PREFIX"%s", user->username); } key_name = t_strconcat(DICT_PATH_SHARED, key_name, NULL); precision = mail_user_plugin_getenv(user, "last_login_precision"); trans = dict_transaction_begin(dict); if (precision == NULL || strcmp(precision, "s") == 0) dict_set(trans, key_name, dec2str(ioloop_time)); else if (strcmp(precision, "ms") == 0) { dict_set(trans, key_name, t_strdup_printf( "%ld%03u", (long)ioloop_timeval.tv_sec, (unsigned int)(ioloop_timeval.tv_usec/1000))); } else if (strcmp(precision, "us") == 0) { dict_set(trans, key_name, t_strdup_printf( "%ld%06u", (long)ioloop_timeval.tv_sec, (unsigned int)ioloop_timeval.tv_usec)); } else if (strcmp(precision, "ns") == 0) { dict_set(trans, key_name, t_strdup_printf( "%ld%06u000", (long)ioloop_timeval.tv_sec, (unsigned int)ioloop_timeval.tv_usec)); } else { i_error("last_login_dict: Invalid last_login_precision '%s'", precision); } dict_transaction_no_slowness_warning(trans); dict_transaction_commit_async(&trans, last_login_dict_commit, user); }