mirror of
https://github.com/fluencelabs/redis
synced 2025-03-20 01:20:50 +00:00
Modules: Hash type API WIP #2.
This commit is contained in:
parent
10993ca0d5
commit
9b0556cf10
51
src/module.c
51
src/module.c
@ -1612,8 +1612,58 @@ int RM_HashSet(RedisModuleKey *key, int flags, ...) {
|
|||||||
*
|
*
|
||||||
* The function returns REDISMODULE_OK on success and REDISMODULE_ERR if
|
* The function returns REDISMODULE_OK on success and REDISMODULE_ERR if
|
||||||
* the key is not an hash value.
|
* the key is not an hash value.
|
||||||
|
*
|
||||||
|
* Memory management:
|
||||||
|
*
|
||||||
|
* The returned RedisModuleString objects should be released with
|
||||||
|
* RedisModule_FreeString(), or by enabling automatic memory management.
|
||||||
*/
|
*/
|
||||||
int RM_HashGet(RedisModuleKey *key, int flags, ...) {
|
int RM_HashGet(RedisModuleKey *key, int flags, ...) {
|
||||||
|
va_list ap;
|
||||||
|
if (key->value && key->value->type != OBJ_HASH) return REDISMODULE_ERR;
|
||||||
|
|
||||||
|
va_start(ap, flags);
|
||||||
|
while(1) {
|
||||||
|
RedisModuleString *field, **valueptr;
|
||||||
|
int *existsptr;
|
||||||
|
/* Get the field object and the value pointer to pointer. */
|
||||||
|
if (flags & REDISMODULE_HGET_CFIELDS) {
|
||||||
|
char *cfield = va_arg(ap,char*);
|
||||||
|
if (cfield == NULL) break;
|
||||||
|
field = createRawStringObject(cfield,strlen(cfield));
|
||||||
|
} else {
|
||||||
|
field = va_arg(ap,RedisModuleString*);
|
||||||
|
if (field == NULL) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Query the hash for existence or value object. */
|
||||||
|
if (flags & REDISMODULE_HGET_EXISTS) {
|
||||||
|
existsptr = va_arg(ap,int*);
|
||||||
|
if (key->value)
|
||||||
|
*existsptr = hashTypeExists(key->value,field->ptr);
|
||||||
|
else
|
||||||
|
*existsptr = 0;
|
||||||
|
} else {
|
||||||
|
valueptr = va_arg(ap,RedisModuleString**);
|
||||||
|
if (key->value) {
|
||||||
|
*valueptr = hashTypeGetValueObject(key->value,field->ptr);
|
||||||
|
if (*valueptr) {
|
||||||
|
robj *decoded = getDecodedObject(*valueptr);
|
||||||
|
decrRefCount(*valueptr);
|
||||||
|
*valueptr = decoded;
|
||||||
|
}
|
||||||
|
if (*valueptr)
|
||||||
|
autoMemoryAdd(key->ctx,REDISMODULE_AM_STRING,*valueptr);
|
||||||
|
} else {
|
||||||
|
*valueptr = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Cleanup */
|
||||||
|
if (flags & REDISMODULE_HSET_CFIELDS) decrRefCount(field);
|
||||||
|
}
|
||||||
|
va_end(ap);
|
||||||
|
return REDISMODULE_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------
|
/* --------------------------------------------------------------------------
|
||||||
@ -2078,6 +2128,7 @@ void moduleRegisterCoreAPI(void) {
|
|||||||
REGISTER_API(ZsetRangePrev);
|
REGISTER_API(ZsetRangePrev);
|
||||||
REGISTER_API(ZsetRangeEndReached);
|
REGISTER_API(ZsetRangeEndReached);
|
||||||
REGISTER_API(HashSet);
|
REGISTER_API(HashSet);
|
||||||
|
REGISTER_API(HashGet);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Global initialization at Redis startup. */
|
/* Global initialization at Redis startup. */
|
||||||
|
@ -438,10 +438,13 @@ int HelloHCopy_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int a
|
|||||||
return RedisModule_ReplyWithError(ctx,REDISMODULE_ERRORMSG_WRONGTYPE);
|
return RedisModule_ReplyWithError(ctx,REDISMODULE_ERRORMSG_WRONGTYPE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* XXX modify me. */
|
/* Get the old field value. */
|
||||||
RedisModule_HashSet(key,REDISMODULE_HSET_NONE,argv[2],argv[3],NULL);
|
RedisModuleString *oldval;
|
||||||
RedisModule_HashSet(key,REDISMODULE_HSET_CFIELDS,"foo",argv[3],NULL);
|
RedisModule_HashGet(key,REDISMODULE_HGET_NONE,argv[2],&oldval,NULL);
|
||||||
RedisModule_ReplyWithLongLong(ctx,0);
|
if (oldval) {
|
||||||
|
RedisModule_HashSet(key,REDISMODULE_HSET_NONE,argv[3],oldval,NULL);
|
||||||
|
}
|
||||||
|
RedisModule_ReplyWithLongLong(ctx,oldval != NULL);
|
||||||
return REDISMODULE_OK;
|
return REDISMODULE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -150,6 +150,7 @@ int REDISMODULE_API_FUNC(RedisModule_ZsetRangeNext)(RedisModuleKey *key);
|
|||||||
int REDISMODULE_API_FUNC(RedisModule_ZsetRangePrev)(RedisModuleKey *key);
|
int REDISMODULE_API_FUNC(RedisModule_ZsetRangePrev)(RedisModuleKey *key);
|
||||||
int REDISMODULE_API_FUNC(RedisModule_ZsetRangeEndReached)(RedisModuleKey *key);
|
int REDISMODULE_API_FUNC(RedisModule_ZsetRangeEndReached)(RedisModuleKey *key);
|
||||||
int REDISMODULE_API_FUNC(RedisModule_HashSet)(RedisModuleKey *key, int flags, ...);
|
int REDISMODULE_API_FUNC(RedisModule_HashSet)(RedisModuleKey *key, int flags, ...);
|
||||||
|
int REDISMODULE_API_FUNC(RedisModule_HashGet)(RedisModuleKey *key, int flags, ...);
|
||||||
|
|
||||||
/* This is included inline inside each Redis module. */
|
/* This is included inline inside each Redis module. */
|
||||||
static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int apiver) {
|
static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int apiver) {
|
||||||
@ -215,6 +216,7 @@ static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int
|
|||||||
REDISMODULE_GET_API(ZsetRangePrev);
|
REDISMODULE_GET_API(ZsetRangePrev);
|
||||||
REDISMODULE_GET_API(ZsetRangeEndReached);
|
REDISMODULE_GET_API(ZsetRangeEndReached);
|
||||||
REDISMODULE_GET_API(HashSet);
|
REDISMODULE_GET_API(HashSet);
|
||||||
|
REDISMODULE_GET_API(HashGet);
|
||||||
|
|
||||||
RedisModule_SetModuleAttribs(ctx,name,ver,apiver);
|
RedisModule_SetModuleAttribs(ctx,name,ver,apiver);
|
||||||
return REDISMODULE_OK;
|
return REDISMODULE_OK;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user