From e28b4fc2b62be020156a857485b61842b3b5d791 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Mon, 9 Jan 2017 16:55:45 +0200 Subject: [PATCH] lib-dict: Add dict_transaction_set_timestamp() --- src/lib-dict/dict-private.h | 5 +++++ src/lib-dict/dict.c | 16 ++++++++++++++++ src/lib-dict/dict.h | 5 +++++ 3 files changed, 26 insertions(+) diff --git a/src/lib-dict/dict-private.h b/src/lib-dict/dict-private.h index 8194d93285..ff2bd9055e 100644 --- a/src/lib-dict/dict-private.h +++ b/src/lib-dict/dict-private.h @@ -1,6 +1,7 @@ #ifndef DICT_PRIVATE_H #define DICT_PRIVATE_H +#include #include "dict.h" struct dict_vfuncs { @@ -40,6 +41,8 @@ struct dict_vfuncs { void (*lookup_async)(struct dict *dict, const char *key, dict_lookup_callback_t *callback, void *context); bool (*switch_ioloop)(struct dict *dict); + void (*set_timestamp)(struct dict_transaction_context *ctx, + const struct timespec *ts); }; struct dict { @@ -62,6 +65,8 @@ struct dict_iterate_context { struct dict_transaction_context { struct dict *dict; + struct timespec timestamp; + bool changed:1; bool no_slowness_warning:1; }; diff --git a/src/lib-dict/dict.c b/src/lib-dict/dict.c index 73dd4e0d7f..5e660454ef 100644 --- a/src/lib-dict/dict.c +++ b/src/lib-dict/dict.c @@ -222,6 +222,22 @@ void dict_transaction_no_slowness_warning(struct dict_transaction_context *ctx) ctx->no_slowness_warning = TRUE; } +void dict_transaction_set_timestamp(struct dict_transaction_context *ctx, + const struct timespec *ts) +{ + /* These asserts are mainly here to guarantee a possibility in future + to change the API to support multiple timestamps within the same + transaction, so this call would apply only to the following + changes. */ + i_assert(!ctx->changed); + i_assert(ctx->timestamp.tv_sec == 0); + i_assert(ts->tv_sec > 0); + + ctx->timestamp = *ts; + if (ctx->dict->v.set_timestamp != NULL) + ctx->dict->v.set_timestamp(ctx, ts); +} + struct dict_commit_sync_result { int ret; char *error; diff --git a/src/lib-dict/dict.h b/src/lib-dict/dict.h index c7c53816b8..05d1bfea2a 100644 --- a/src/lib-dict/dict.h +++ b/src/lib-dict/dict.h @@ -129,6 +129,11 @@ struct dict_transaction_context *dict_transaction_begin(struct dict *dict); finish up anytime soon. Mainly useful for transactions which aren't especially important whether they finish or not. */ void dict_transaction_no_slowness_warning(struct dict_transaction_context *ctx); +/* Set write timestamp for the entire transaction. This must be set before + any changes are done and can't be changed afterwards. Currently only + dict-sql with Cassandra backend does anything with this. */ +void dict_transaction_set_timestamp(struct dict_transaction_context *ctx, + const struct timespec *ts); /* Commit the transaction. Returns 1 if ok, 0 if dict_atomic_inc() was used on a nonexistent key, -1 if failed. */ int dict_transaction_commit(struct dict_transaction_context **ctx,