}
static const char *
-redis_dict_get_full_key(struct redis_dict *dict, const char *key)
+redis_dict_get_full_key(struct redis_dict *dict, const char *username,
+ const char *key)
{
+ const char *username_sp = strchr(username, DICT_USERNAME_SEPARATOR);
+
if (str_begins(key, DICT_PATH_SHARED))
key += strlen(DICT_PATH_SHARED);
else if (str_begins(key, DICT_PATH_PRIVATE)) {
- key = t_strdup_printf("%s%c%s", dict->username,
+ key = t_strdup_printf("%s%c%s",
+ username_sp == NULL ? username :
+ redis_escape_username(username),
DICT_USERNAME_SEPARATOR,
key + strlen(DICT_PATH_PRIVATE));
} else {
}
static int redis_dict_lookup(struct dict *_dict,
- const struct dict_op_settings *set ATTR_UNUSED,
+ const struct dict_op_settings *set,
pool_t pool, const char *key,
const char **value_r, const char **error_r)
{
struct timeout *to;
const char *cmd;
- key = redis_dict_get_full_key(dict, key);
+ key = redis_dict_get_full_key(dict, set->username, key);
dict->conn.value_received = FALSE;
dict->conn.value_not_found = FALSE;
struct redis_dict_transaction_context *ctx =
(struct redis_dict_transaction_context *)_ctx;
struct redis_dict *dict = (struct redis_dict *)_ctx->dict;
+ const struct dict_op_settings_private *set = &_ctx->set;
string_t *cmd;
if (redis_check_transaction(ctx) < 0)
return;
- key = redis_dict_get_full_key(dict, key);
+ key = redis_dict_get_full_key(dict, set->username, key);
cmd = t_str_new(128);
str_printfa(cmd, "*3\r\n$3\r\nSET\r\n$%u\r\n%s\r\n$%u\r\n%s\r\n",
(unsigned int)strlen(key), key,
struct redis_dict_transaction_context *ctx =
(struct redis_dict_transaction_context *)_ctx;
struct redis_dict *dict = (struct redis_dict *)_ctx->dict;
+ const struct dict_op_settings_private *set = &_ctx->set;
const char *cmd;
if (redis_check_transaction(ctx) < 0)
return;
- key = redis_dict_get_full_key(dict, key);
+ key = redis_dict_get_full_key(dict, set->username, key);
cmd = t_strdup_printf("*2\r\n$3\r\nDEL\r\n$%u\r\n%s\r\n",
(unsigned int)strlen(key), key);
if (o_stream_send_str(dict->conn.conn.output, cmd) < 0) {
struct redis_dict_transaction_context *ctx =
(struct redis_dict_transaction_context *)_ctx;
struct redis_dict *dict = (struct redis_dict *)_ctx->dict;
+ const struct dict_op_settings_private *set = &_ctx->set;
const char *diffstr;
string_t *cmd;
if (redis_check_transaction(ctx) < 0)
return;
- key = redis_dict_get_full_key(dict, key);
+ key = redis_dict_get_full_key(dict, set->username, key);
diffstr = t_strdup_printf("%lld", diff);
cmd = t_str_new(128);
str_printfa(cmd, "*3\r\n$6\r\nINCRBY\r\n$%u\r\n%s\r\n$%u\r\n%s\r\n",