return 0;
}
-static int cmd_append(struct dict_connection_cmd *cmd, const char *line)
-{
- struct dict_connection_transaction *trans;
- const char *const *args;
-
- /* <id> <key> <value> */
- args = t_strsplit_tabescaped(line);
- if (str_array_length(args) != 3) {
- i_error("dict client: APPEND: broken input");
- return -1;
- }
-
- if (dict_connection_transaction_lookup_parse(cmd->conn, args[0], &trans) < 0)
- return -1;
-
- dict_append(trans->ctx, args[1], args[2]);
- return 0;
-}
-
static int cmd_atomic_inc(struct dict_connection_cmd *cmd, const char *line)
{
struct dict_connection_transaction *trans;
{ DICT_PROTOCOL_CMD_ROLLBACK, cmd_rollback },
{ DICT_PROTOCOL_CMD_SET, cmd_set },
{ DICT_PROTOCOL_CMD_UNSET, cmd_unset },
- { DICT_PROTOCOL_CMD_APPEND, cmd_append },
{ DICT_PROTOCOL_CMD_ATOMIC_INC, cmd_atomic_inc },
{ 0, NULL }
} T_END;
}
-static void client_dict_append(struct dict_transaction_context *_ctx,
- const char *key, const char *value)
-{
- struct client_dict_transaction_context *ctx =
- (struct client_dict_transaction_context *)_ctx;
-
- T_BEGIN {
- const char *query;
-
- query = t_strdup_printf("%c%u\t%s\t%s\n",
- DICT_PROTOCOL_CMD_APPEND, ctx->id,
- dict_client_escape(key),
- dict_client_escape(value));
- client_dict_send_transaction_query(ctx, query);
- } T_END;
-}
-
static void client_dict_atomic_inc(struct dict_transaction_context *_ctx,
const char *key, long long diff)
{
client_dict_transaction_rollback,
client_dict_set,
client_dict_unset,
- client_dict_append,
client_dict_atomic_inc,
NULL
}
dict_transaction_memory_rollback,
dict_transaction_memory_set,
dict_transaction_memory_unset,
- dict_transaction_memory_append,
dict_transaction_memory_atomic_inc,
NULL
}
void ldap_dict_unset(struct dict_transaction_context *ctx,
const char *key);
static
-void ldap_dict_append(struct dict_transaction_context *ctx,
- const char *key, const char *value);
-static
void ldap_dict_atomic_inc(struct dict_transaction_context *ctx,
const char *key, long long diff);
*/
NULL, /*ldap_transaction_rollback,*/
NULL, /*ldap_set,*/
NULL, /*ldap_unset,*/
- NULL, /*ldap_append,*/
NULL, /*ldap_atomic_inc,*/
ldap_dict_lookup_async
}
dict_transaction_memory_rollback,
dict_transaction_memory_set,
dict_transaction_memory_unset,
- dict_transaction_memory_append,
dict_transaction_memory_atomic_inc,
NULL
}
const char *key, const char *value);
void (*unset)(struct dict_transaction_context *ctx,
const char *key);
- void (*append)(struct dict_transaction_context *ctx,
- const char *key, const char *value);
void (*atomic_inc)(struct dict_transaction_context *ctx,
const char *key, long long diff);
ctx->cmd_count++;
}
-static void redis_append(struct dict_transaction_context *_ctx,
- const char *key, const char *value)
-{
- struct redis_dict_transaction_context *ctx =
- (struct redis_dict_transaction_context *)_ctx;
- struct redis_dict *dict = (struct redis_dict *)_ctx->dict;
- const char *cmd;
-
- if (redis_check_transaction(ctx) < 0)
- return;
-
- key = redis_dict_get_full_key(dict, key);
- cmd = t_strdup_printf("*3\r\n$6\r\nAPPEND\r\n$%u\r\n%s\r\n$%u\r\n%s\r\n",
- (unsigned int)strlen(key), key,
- (unsigned int)strlen(value), value);
- if (o_stream_send_str(dict->conn.conn.output, cmd) < 0)
- ctx->failed = TRUE;
- redis_input_state_add(dict, REDIS_INPUT_STATE_MULTI);
- ctx->cmd_count++;
-}
-
static void redis_atomic_inc(struct dict_transaction_context *_ctx,
const char *key, long long diff)
{
redis_transaction_rollback,
redis_set,
redis_unset,
- redis_append,
redis_atomic_inc,
NULL
}
} T_END;
}
-static void
-sql_dict_append(struct dict_transaction_context *_ctx,
- const char *key ATTR_UNUSED, const char *value ATTR_UNUSED)
-{
- struct sql_dict_transaction_context *ctx =
- (struct sql_dict_transaction_context *)_ctx;
-
- i_error("sql dict: Append command not implemented currently");
- ctx->failed = TRUE;
-}
-
static unsigned int *
sql_dict_next_inc_row(struct sql_dict_transaction_context *ctx)
{
sql_dict_transaction_rollback,
sql_dict_set,
sql_dict_unset,
- sql_dict_append,
sql_dict_atomic_inc,
sql_dict_lookup_async
}
ctx->changed = TRUE;
}
-void dict_append(struct dict_transaction_context *ctx,
- const char *key, const char *value)
-{
- i_assert(dict_key_prefix_is_valid(key));
-
- ctx->dict->v.append(ctx, key, value);
- ctx->changed = TRUE;
-}
-
void dict_atomic_inc(struct dict_transaction_context *ctx,
const char *key, long long diff)
{
/* Unset a record in dictionary, identified by key*/
void dict_unset(struct dict_transaction_context *ctx,
const char *key);
-/* Append to an existing key in dictionary. Preferably an atomic operation. */
-void dict_append(struct dict_transaction_context *ctx,
- const char *key, const char *value);
/* Increase/decrease a numeric value in dictionary. Note that the value is
changed when transaction is being committed, so you can't know beforehand
what the value will become. The value is updated only if it already exists,