Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
9b0556cf
Commit
9b0556cf
authored
Apr 25, 2016
by
antirez
Browse files
Modules: Hash type API WIP #2.
parent
10993ca0
Changes
3
Show whitespace changes
Inline
Side-by-side
src/module.c
View file @
9b0556cf
...
@@ -1612,8 +1612,58 @@ int RM_HashSet(RedisModuleKey *key, int flags, ...) {
...
@@ -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) {
...
@@ -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. */
...
...
src/modules/helloworld.c
View file @
9b0556cf
...
@@ -438,10 +438,13 @@ int HelloHCopy_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int a
...
@@ -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
;
}
}
...
...
src/redismodule.h
View file @
9b0556cf
...
@@ -150,6 +150,7 @@ int REDISMODULE_API_FUNC(RedisModule_ZsetRangeNext)(RedisModuleKey *key);
...
@@ -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
...
@@ -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
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment