Merge pull request #4076 from yossigo/add_mt_replacevalue
Add RM_ModuleTypeReplaceValue.
This commit is contained in:
commit
32a8301073
29
src/module.c
29
src/module.c
@ -1949,7 +1949,7 @@ int RM_DeleteKey(RedisModuleKey *key) {
|
|||||||
return REDISMODULE_OK;
|
return REDISMODULE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If the key is open for writing, unlink it (that is delete it in a
|
/* If the key is open for writing, unlink it (that is delete it in a
|
||||||
* non-blocking way, not reclaiming memory immediately) and setup the key to
|
* non-blocking way, not reclaiming memory immediately) and setup the key to
|
||||||
* accept new writes as an empty key (that will be created on demand).
|
* accept new writes as an empty key (that will be created on demand).
|
||||||
* On success REDISMODULE_OK is returned. If the key is not open for
|
* On success REDISMODULE_OK is returned. If the key is not open for
|
||||||
@ -6820,6 +6820,32 @@ int RM_GetLRUOrLFU(RedisModuleKey *key, long long *lfu_freq, long long *lru_idle
|
|||||||
return REDISMODULE_OK;
|
return REDISMODULE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Replace the value assigned to a module type.
|
||||||
|
*
|
||||||
|
* The key must be open for writing, have an existing value, and have a moduleType
|
||||||
|
* that matches the one specified by the caller.
|
||||||
|
*
|
||||||
|
* Unlike RM_ModuleTypeSetValue() which will free the old value, this function
|
||||||
|
* simply swaps the old value with the new value.
|
||||||
|
*
|
||||||
|
* The function returns the old value, or NULL if any of the above conditions is
|
||||||
|
* not met.
|
||||||
|
*/
|
||||||
|
void *RM_ModuleTypeReplaceValue(RedisModuleKey *key, moduleType *mt, void *new_value) {
|
||||||
|
if (!(key->mode & REDISMODULE_WRITE) || key->iter)
|
||||||
|
return NULL;
|
||||||
|
if (!key->value || key->value->type != OBJ_MODULE)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
moduleValue *mv = key->value->ptr;
|
||||||
|
if (mv->type != mt)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
void *old_val = mv->value;
|
||||||
|
mv->value = new_value;
|
||||||
|
return old_val;
|
||||||
|
}
|
||||||
|
|
||||||
/* Register all the APIs we export. Keep this function at the end of the
|
/* Register all the APIs we export. Keep this function at the end of the
|
||||||
* file so that's easy to seek it to add new entries. */
|
* file so that's easy to seek it to add new entries. */
|
||||||
void moduleRegisterCoreAPI(void) {
|
void moduleRegisterCoreAPI(void) {
|
||||||
@ -6909,6 +6935,7 @@ void moduleRegisterCoreAPI(void) {
|
|||||||
REGISTER_API(PoolAlloc);
|
REGISTER_API(PoolAlloc);
|
||||||
REGISTER_API(CreateDataType);
|
REGISTER_API(CreateDataType);
|
||||||
REGISTER_API(ModuleTypeSetValue);
|
REGISTER_API(ModuleTypeSetValue);
|
||||||
|
REGISTER_API(ModuleTypeReplaceValue);
|
||||||
REGISTER_API(ModuleTypeGetType);
|
REGISTER_API(ModuleTypeGetType);
|
||||||
REGISTER_API(ModuleTypeGetValue);
|
REGISTER_API(ModuleTypeGetValue);
|
||||||
REGISTER_API(IsIOError);
|
REGISTER_API(IsIOError);
|
||||||
|
@ -517,6 +517,7 @@ int REDISMODULE_API_FUNC(RedisModule_GetContextFlags)(RedisModuleCtx *ctx);
|
|||||||
void *REDISMODULE_API_FUNC(RedisModule_PoolAlloc)(RedisModuleCtx *ctx, size_t bytes);
|
void *REDISMODULE_API_FUNC(RedisModule_PoolAlloc)(RedisModuleCtx *ctx, size_t bytes);
|
||||||
RedisModuleType *REDISMODULE_API_FUNC(RedisModule_CreateDataType)(RedisModuleCtx *ctx, const char *name, int encver, RedisModuleTypeMethods *typemethods);
|
RedisModuleType *REDISMODULE_API_FUNC(RedisModule_CreateDataType)(RedisModuleCtx *ctx, const char *name, int encver, RedisModuleTypeMethods *typemethods);
|
||||||
int REDISMODULE_API_FUNC(RedisModule_ModuleTypeSetValue)(RedisModuleKey *key, RedisModuleType *mt, void *value);
|
int REDISMODULE_API_FUNC(RedisModule_ModuleTypeSetValue)(RedisModuleKey *key, RedisModuleType *mt, void *value);
|
||||||
|
void *REDISMODULE_API_FUNC(RedisModule_ModuleTypeReplaceValue)(RedisModuleKey *key, RedisModuleType *mt, void *new_value);
|
||||||
RedisModuleType *REDISMODULE_API_FUNC(RedisModule_ModuleTypeGetType)(RedisModuleKey *key);
|
RedisModuleType *REDISMODULE_API_FUNC(RedisModule_ModuleTypeGetType)(RedisModuleKey *key);
|
||||||
void *REDISMODULE_API_FUNC(RedisModule_ModuleTypeGetValue)(RedisModuleKey *key);
|
void *REDISMODULE_API_FUNC(RedisModule_ModuleTypeGetValue)(RedisModuleKey *key);
|
||||||
int REDISMODULE_API_FUNC(RedisModule_IsIOError)(RedisModuleIO *io);
|
int REDISMODULE_API_FUNC(RedisModule_IsIOError)(RedisModuleIO *io);
|
||||||
@ -728,6 +729,7 @@ static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int
|
|||||||
REDISMODULE_GET_API(PoolAlloc);
|
REDISMODULE_GET_API(PoolAlloc);
|
||||||
REDISMODULE_GET_API(CreateDataType);
|
REDISMODULE_GET_API(CreateDataType);
|
||||||
REDISMODULE_GET_API(ModuleTypeSetValue);
|
REDISMODULE_GET_API(ModuleTypeSetValue);
|
||||||
|
REDISMODULE_GET_API(ModuleTypeReplaceValue);
|
||||||
REDISMODULE_GET_API(ModuleTypeGetType);
|
REDISMODULE_GET_API(ModuleTypeGetType);
|
||||||
REDISMODULE_GET_API(ModuleTypeGetValue);
|
REDISMODULE_GET_API(ModuleTypeGetValue);
|
||||||
REDISMODULE_GET_API(IsIOError);
|
REDISMODULE_GET_API(IsIOError);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user