Modules: Hash type API WIP #2.

This commit is contained in:
antirez 2016-04-25 17:09:26 +02:00
parent 10993ca0d5
commit 9b0556cf10
3 changed files with 60 additions and 4 deletions

View File

@ -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. */

View File

@ -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;
} }

View File

@ -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;