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
71e8d15e
Commit
71e8d15e
authored
Nov 30, 2016
by
antirez
Browse files
Modules: change type registration API to use a struct of methods.
parent
ce1f9cf8
Changes
4
Show whitespace changes
Inline
Side-by-side
src/module.c
View file @
71e8d15e
...
@@ -2666,7 +2666,7 @@ void moduleTypeNameByID(char *name, uint64_t moduleid) {
...
@@ -2666,7 +2666,7 @@ void moduleTypeNameByID(char *name, uint64_t moduleid) {
/* Register a new data type exported by the module. The parameters are the
/* Register a new data type exported by the module. The parameters are the
* following. Please for in depth documentation check the modules API
* following. Please for in depth documentation check the modules API
* documentation, especially the
INTRO
.md file.
* documentation, especially the
TYPES
.md file.
*
*
* * **name**: A 9 characters data type name that MUST be unique in the Redis
* * **name**: A 9 characters data type name that MUST be unique in the Redis
* Modules ecosystem. Be creative... and there will be no collisions. Use
* Modules ecosystem. Be creative... and there will be no collisions. Use
...
@@ -2685,12 +2685,31 @@ void moduleTypeNameByID(char *name, uint64_t moduleid) {
...
@@ -2685,12 +2685,31 @@ void moduleTypeNameByID(char *name, uint64_t moduleid) {
* still load old data produced by an older version if the rdb_load
* still load old data produced by an older version if the rdb_load
* callback is able to check the encver value and act accordingly.
* callback is able to check the encver value and act accordingly.
* The encver must be a positive value between 0 and 1023.
* The encver must be a positive value between 0 and 1023.
* * **typemethods_ptr** is a pointer to a RedisModuleTypeMethods structure
* that should be populated with the methods callbacks and structure
* version, like in the following example:
*
* RedisModuleTypeMethods tm = {
* .version = REDISMODULE_TYPE_METHOD_VERSION,
* .rdb_load = myType_RDBLoadCallBack,
* .rdb_save = myType_RDBSaveCallBack,
* .aof_rewrite = myType_AOFRewriteCallBack,
* .free = myType_FreeCallBack,
*
* // Optional fields
* .digest = myType_DigestCallBack,
* .mem_usage = myType_MemUsageCallBack,
* }
*
* * **rdb_load**: A callback function pointer that loads data from RDB files.
* * **rdb_load**: A callback function pointer that loads data from RDB files.
* * **rdb_save**: A callback function pointer that saves data to RDB files.
* * **rdb_save**: A callback function pointer that saves data to RDB files.
* * **aof_rewrite**: A callback function pointer that rewrites data as commands.
* * **aof_rewrite**: A callback function pointer that rewrites data as commands.
* * **digest**: A callback function pointer that is used for `DEBUG DIGEST`.
* * **digest**: A callback function pointer that is used for `DEBUG DIGEST`.
* * **free**: A callback function pointer that can free a type value.
* * **free**: A callback function pointer that can free a type value.
*
*
* The **digest* and **mem_usage** methods should currently be omitted since
* they are not yet implemented inside the Redis modules core.
*
* Note: the module name "AAAAAAAAA" is reserved and produces an error, it
* Note: the module name "AAAAAAAAA" is reserved and produces an error, it
* happens to be pretty lame as well.
* happens to be pretty lame as well.
*
*
...
@@ -2709,19 +2728,33 @@ void moduleTypeNameByID(char *name, uint64_t moduleid) {
...
@@ -2709,19 +2728,33 @@ void moduleTypeNameByID(char *name, uint64_t moduleid) {
* BalancedTreeType = RM_CreateDataType(...);
* BalancedTreeType = RM_CreateDataType(...);
* }
* }
*/
*/
moduleType
*
RM_CreateDataType
(
RedisModuleCtx
*
ctx
,
const
char
*
name
,
int
encver
,
moduleTypeLoadFunc
rdb_load
,
moduleTypeSaveFunc
rdb_save
,
moduleTypeRewriteFunc
aof_rewrite
,
moduleTypeDigestFunc
digest
,
moduleTypeFreeFunc
free
)
{
moduleType
*
RM_CreateDataType
(
RedisModuleCtx
*
ctx
,
const
char
*
name
,
int
encver
,
void
*
typemethods_ptr
)
{
uint64_t
id
=
moduleTypeEncodeId
(
name
,
encver
);
uint64_t
id
=
moduleTypeEncodeId
(
name
,
encver
);
if
(
id
==
0
)
return
NULL
;
if
(
id
==
0
)
return
NULL
;
if
(
moduleTypeLookupModuleByName
(
name
)
!=
NULL
)
return
NULL
;
if
(
moduleTypeLookupModuleByName
(
name
)
!=
NULL
)
return
NULL
;
moduleType
*
mt
=
zmalloc
(
sizeof
(
*
mt
));
long
typemethods_version
=
((
long
*
)
typemethods_ptr
)[
0
];
if
(
typemethods_version
==
0
)
return
NULL
;
struct
typemethods
{
uint64_t
version
;
moduleTypeLoadFunc
rdb_load
;
moduleTypeSaveFunc
rdb_save
;
moduleTypeRewriteFunc
aof_rewrite
;
moduleTypeDigestFunc
digest
;
moduleTypeMemUsageFunc
mem_usage
;
moduleTypeFreeFunc
free
;
}
*
tms
=
(
struct
typemethods
*
)
typemethods_ptr
;
moduleType
*
mt
=
zcalloc
(
sizeof
(
*
mt
));
mt
->
id
=
id
;
mt
->
id
=
id
;
mt
->
module
=
ctx
->
module
;
mt
->
module
=
ctx
->
module
;
mt
->
rdb_load
=
rdb_load
;
mt
->
rdb_load
=
tms
->
rdb_load
;
mt
->
rdb_save
=
rdb_save
;
mt
->
rdb_save
=
tms
->
rdb_save
;
mt
->
aof_rewrite
=
aof_rewrite
;
mt
->
aof_rewrite
=
tms
->
aof_rewrite
;
mt
->
digest
=
digest
;
mt
->
mem_usage
=
tms
->
mem_usage
;
mt
->
free
=
free
;
mt
->
digest
=
tms
->
digest
;
mt
->
free
=
tms
->
free
;
memcpy
(
mt
->
name
,
name
,
sizeof
(
mt
->
name
));
memcpy
(
mt
->
name
,
name
,
sizeof
(
mt
->
name
));
listAddNodeTail
(
ctx
->
module
->
types
,
mt
);
listAddNodeTail
(
ctx
->
module
->
types
,
mt
);
return
mt
;
return
mt
;
...
...
src/modules/hellotype.c
View file @
71e8d15e
...
@@ -245,7 +245,15 @@ int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
...
@@ -245,7 +245,15 @@ int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
if
(
RedisModule_Init
(
ctx
,
"hellotype"
,
1
,
REDISMODULE_APIVER_1
)
if
(
RedisModule_Init
(
ctx
,
"hellotype"
,
1
,
REDISMODULE_APIVER_1
)
==
REDISMODULE_ERR
)
return
REDISMODULE_ERR
;
==
REDISMODULE_ERR
)
return
REDISMODULE_ERR
;
HelloType
=
RedisModule_CreateDataType
(
ctx
,
"hellotype"
,
0
,
HelloTypeRdbLoad
,
HelloTypeRdbSave
,
HelloTypeAofRewrite
,
HelloTypeDigest
,
HelloTypeFree
);
RedisModuleTypeMethods
tm
=
{
.
version
=
REDISMODULE_TYPE_METHOD_VERSION
,
.
rdb_load
=
HelloTypeRdbLoad
,
.
rdb_save
=
HelloTypeRdbSave
,
.
aof_rewrite
=
HelloTypeAofRewrite
,
.
free
=
HelloTypeFree
};
HelloType
=
RedisModule_CreateDataType
(
ctx
,
"hellotype"
,
0
,
&
tm
);
if
(
HelloType
==
NULL
)
return
REDISMODULE_ERR
;
if
(
HelloType
==
NULL
)
return
REDISMODULE_ERR
;
if
(
RedisModule_CreateCommand
(
ctx
,
"hellotype.insert"
,
if
(
RedisModule_CreateCommand
(
ctx
,
"hellotype.insert"
,
...
...
src/redismodule.h
View file @
71e8d15e
...
@@ -91,9 +91,21 @@ typedef int (*RedisModuleCmdFunc) (RedisModuleCtx *ctx, RedisModuleString **argv
...
@@ -91,9 +91,21 @@ typedef int (*RedisModuleCmdFunc) (RedisModuleCtx *ctx, RedisModuleString **argv
typedef
void
*
(
*
RedisModuleTypeLoadFunc
)(
RedisModuleIO
*
rdb
,
int
encver
);
typedef
void
*
(
*
RedisModuleTypeLoadFunc
)(
RedisModuleIO
*
rdb
,
int
encver
);
typedef
void
(
*
RedisModuleTypeSaveFunc
)(
RedisModuleIO
*
rdb
,
void
*
value
);
typedef
void
(
*
RedisModuleTypeSaveFunc
)(
RedisModuleIO
*
rdb
,
void
*
value
);
typedef
void
(
*
RedisModuleTypeRewriteFunc
)(
RedisModuleIO
*
aof
,
RedisModuleString
*
key
,
void
*
value
);
typedef
void
(
*
RedisModuleTypeRewriteFunc
)(
RedisModuleIO
*
aof
,
RedisModuleString
*
key
,
void
*
value
);
typedef
size_t
(
*
RedisModuleTypeMemUsageFunc
)(
void
*
value
);
typedef
void
(
*
RedisModuleTypeDigestFunc
)(
RedisModuleDigest
*
digest
,
void
*
value
);
typedef
void
(
*
RedisModuleTypeDigestFunc
)(
RedisModuleDigest
*
digest
,
void
*
value
);
typedef
void
(
*
RedisModuleTypeFreeFunc
)(
void
*
value
);
typedef
void
(
*
RedisModuleTypeFreeFunc
)(
void
*
value
);
#define REDISMODULE_TYPE_METHOD_VERSION 1
typedef
struct
RedisModuleTypeMethods
{
uint64_t
version
;
RedisModuleTypeLoadFunc
rdb_load
;
RedisModuleTypeSaveFunc
rdb_save
;
RedisModuleTypeRewriteFunc
aof_rewrite
;
RedisModuleTypeMemUsageFunc
mem_usage
;
RedisModuleTypeRewriteFunc
digest
;
RedisModuleTypeFreeFunc
free
;
}
RedisModuleTypeMethods
;
#define REDISMODULE_GET_API(name) \
#define REDISMODULE_GET_API(name) \
RedisModule_GetApi("RedisModule_" #name, ((void **)&RedisModule_ ## name))
RedisModule_GetApi("RedisModule_" #name, ((void **)&RedisModule_ ## name))
...
@@ -172,7 +184,7 @@ int REDISMODULE_API_FUNC(RedisModule_IsKeysPositionRequest)(RedisModuleCtx *ctx)
...
@@ -172,7 +184,7 @@ int REDISMODULE_API_FUNC(RedisModule_IsKeysPositionRequest)(RedisModuleCtx *ctx)
void
REDISMODULE_API_FUNC
(
RedisModule_KeyAtPos
)(
RedisModuleCtx
*
ctx
,
int
pos
);
void
REDISMODULE_API_FUNC
(
RedisModule_KeyAtPos
)(
RedisModuleCtx
*
ctx
,
int
pos
);
unsigned
long
long
REDISMODULE_API_FUNC
(
RedisModule_GetClientId
)(
RedisModuleCtx
*
ctx
);
unsigned
long
long
REDISMODULE_API_FUNC
(
RedisModule_GetClientId
)(
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
,
RedisModuleType
LoadFunc
rdb_load
,
RedisModuleTypeSaveFunc
rdb_save
,
RedisModuleTypeRewriteFunc
aof_rewrite
,
RedisModuleTypeDigestFunc
digest
,
RedisModuleTypeFreeFunc
free
);
RedisModuleType
*
REDISMODULE_API_FUNC
(
RedisModule_CreateDataType
)(
RedisModuleCtx
*
ctx
,
const
char
*
name
,
int
encver
,
RedisModuleType
Methods
*
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
);
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
);
...
...
src/server.h
View file @
71e8d15e
...
@@ -476,6 +476,7 @@ typedef void *(*moduleTypeLoadFunc)(struct RedisModuleIO *io, int encver);
...
@@ -476,6 +476,7 @@ typedef void *(*moduleTypeLoadFunc)(struct RedisModuleIO *io, int encver);
typedef
void
(
*
moduleTypeSaveFunc
)(
struct
RedisModuleIO
*
io
,
void
*
value
);
typedef
void
(
*
moduleTypeSaveFunc
)(
struct
RedisModuleIO
*
io
,
void
*
value
);
typedef
void
(
*
moduleTypeRewriteFunc
)(
struct
RedisModuleIO
*
io
,
struct
redisObject
*
key
,
void
*
value
);
typedef
void
(
*
moduleTypeRewriteFunc
)(
struct
RedisModuleIO
*
io
,
struct
redisObject
*
key
,
void
*
value
);
typedef
void
(
*
moduleTypeDigestFunc
)(
struct
RedisModuleDigest
*
digest
,
void
*
value
);
typedef
void
(
*
moduleTypeDigestFunc
)(
struct
RedisModuleDigest
*
digest
,
void
*
value
);
typedef
size_t
(
*
moduleTypeMemUsageFunc
)(
void
*
value
);
typedef
void
(
*
moduleTypeFreeFunc
)(
void
*
value
);
typedef
void
(
*
moduleTypeFreeFunc
)(
void
*
value
);
/* The module type, which is referenced in each value of a given type, defines
/* The module type, which is referenced in each value of a given type, defines
...
@@ -486,6 +487,7 @@ typedef struct RedisModuleType {
...
@@ -486,6 +487,7 @@ typedef struct RedisModuleType {
moduleTypeLoadFunc
rdb_load
;
moduleTypeLoadFunc
rdb_load
;
moduleTypeSaveFunc
rdb_save
;
moduleTypeSaveFunc
rdb_save
;
moduleTypeRewriteFunc
aof_rewrite
;
moduleTypeRewriteFunc
aof_rewrite
;
moduleTypeMemUsageFunc
mem_usage
;
moduleTypeDigestFunc
digest
;
moduleTypeDigestFunc
digest
;
moduleTypeFreeFunc
free
;
moduleTypeFreeFunc
free
;
char
name
[
10
];
/* 9 bytes name + null term. Charset: A-Z a-z 0-9 _- */
char
name
[
10
];
/* 9 bytes name + null term. Charset: A-Z a-z 0-9 _- */
...
...
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