o_stream_send_str(conn->output, reply);
} T_END;
}
- dict_iterate_deinit(ctx);
+ dict_iterate_deinit(&ctx);
o_stream_send_str(conn->output, "\n");
o_stream_uncork(conn->output);
if (dict_server_transaction_lookup_parse(conn, line, &trans) < 0)
return -1;
- ret = dict_transaction_commit(trans->ctx);
+ ret = dict_transaction_commit(&trans->ctx);
reply = t_strdup_printf("%c\n", ret == 0 ? DICT_PROTOCOL_REPLY_OK :
DICT_PROTOCOL_REPLY_FAIL);
o_stream_send_str(conn->output, reply);
if (dict_server_transaction_lookup_parse(conn, line, &trans) < 0)
return -1;
- dict_transaction_rollback(trans->ctx);
+ dict_transaction_rollback(&trans->ctx);
dict_server_transaction_array_remove(conn, trans);
return 0;
}
static void dict_client_connection_deinit(struct dict_client_connection *conn)
{
- const struct dict_server_transaction *transactions;
+ struct dict_server_transaction *transactions;
unsigned int i, count;
if (conn->prev == NULL)
conn->next->prev = conn->prev;
if (array_is_created(&conn->transactions)) {
- transactions = array_get(&conn->transactions, &count);
+ transactions = array_get_modifiable(&conn->transactions, &count);
for (i = 0; i < count; i++)
- dict_transaction_rollback(transactions[i].ctx);
+ dict_transaction_rollback(&transactions[i].ctx);
array_free(&conn->transactions);
}
return ctx->dict->v.iterate(ctx, key_r, value_r);
}
-void dict_iterate_deinit(struct dict_iterate_context *ctx)
+void dict_iterate_deinit(struct dict_iterate_context **_ctx)
{
+ struct dict_iterate_context *ctx = *_ctx;
+
+ *_ctx = NULL;
ctx->dict->v.iterate_deinit(ctx);
}
return dict->v.transaction_init(dict);
}
-int dict_transaction_commit(struct dict_transaction_context *ctx)
+int dict_transaction_commit(struct dict_transaction_context **_ctx)
{
+ struct dict_transaction_context *ctx = *_ctx;
+
+ *_ctx = NULL;
return ctx->dict->v.transaction_commit(ctx);
}
-void dict_transaction_rollback(struct dict_transaction_context *ctx)
+void dict_transaction_rollback(struct dict_transaction_context **_ctx)
{
+ struct dict_transaction_context *ctx = *_ctx;
+
+ *_ctx = NULL;
ctx->dict->v.transaction_rollback(ctx);
}
/* Returns -1 = error, 0 = finished, 1 = key/value set */
int dict_iterate(struct dict_iterate_context *ctx,
const char **key_r, const char **value_r);
-void dict_iterate_deinit(struct dict_iterate_context *ctx);
+void dict_iterate_deinit(struct dict_iterate_context **ctx);
/* Start a new dictionary transaction. */
struct dict_transaction_context *dict_transaction_begin(struct dict *dict);
/* Commit the transaction. Returns 0 if ok, -1 if failed. */
-int dict_transaction_commit(struct dict_transaction_context *ctx);
+int dict_transaction_commit(struct dict_transaction_context **ctx);
/* Rollback all changes made in transaction. */
-void dict_transaction_rollback(struct dict_transaction_context *ctx);
+void dict_transaction_rollback(struct dict_transaction_context **ctx);
/* Set key=value in dictionary. */
void dict_set(struct dict_transaction_context *ctx,
new_stamp += xpr_box->expire_secs;
dict_set(dctx, key, dec2str(new_stamp));
}
- dict_transaction_commit(dctx);
+ dict_transaction_commit(&dctx);
}
} T_END;
i_free(xt);
}
}
}
- dict_iterate_deinit(iter);
+ dict_iterate_deinit(&iter);
if (!testrun)
- dict_transaction_commit(trans);
+ dict_transaction_commit(&trans);
else
- dict_transaction_rollback(trans);
+ dict_transaction_rollback(&trans);
dict_deinit(&dict);
if (ctx.user != NULL)
dict_set(dt, DICT_QUOTA_CURRENT_COUNT_PATH, dec2str(count));
} T_END;
- if (dict_transaction_commit(dt) < 0)
+ if (dict_transaction_commit(&dt) < 0)
i_error("dict_quota: Couldn't update quota");
*value_r = want_bytes ? bytes : count;
}
}
- if (dict_transaction_commit(dt) < 0)
+ if (dict_transaction_commit(&dt) < 0)
return -1;
return 0;
}