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
72187fa8
Unverified
Commit
72187fa8
authored
Jan 12, 2018
by
Salvatore Sanfilippo
Committed by
GitHub
Jan 12, 2018
Browse files
Merge pull request #4581 from dvirsky/module_unlink
Added RM_UnlinkKey - a low level analog to UNLINK command
parents
a5b6bc2b
e76dfc90
Changes
3
Hide whitespace changes
Inline
Side-by-side
src/module.c
View file @
72187fa8
...
@@ -1456,6 +1456,20 @@ int RM_DeleteKey(RedisModuleKey *key) {
...
@@ -1456,6 +1456,20 @@ 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
* 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).
* On success REDISMODULE_OK is returned. If the key is not open for
* writing REDISMODULE_ERR is returned. */
int
RM_UnlinkKey
(
RedisModuleKey
*
key
)
{
if
(
!
(
key
->
mode
&
REDISMODULE_WRITE
))
return
REDISMODULE_ERR
;
if
(
key
->
value
)
{
dbAsyncDelete
(
key
->
db
,
key
->
key
);
key
->
value
=
NULL
;
}
return
REDISMODULE_OK
;
}
/* Return the key expire value, as milliseconds of remaining TTL.
/* Return the key expire value, as milliseconds of remaining TTL.
* If no TTL is associated with the key or if the key is empty,
* If no TTL is associated with the key or if the key is empty,
* REDISMODULE_NO_EXPIRE is returned. */
* REDISMODULE_NO_EXPIRE is returned. */
...
@@ -3960,6 +3974,7 @@ void moduleRegisterCoreAPI(void) {
...
@@ -3960,6 +3974,7 @@ void moduleRegisterCoreAPI(void) {
REGISTER_API
(
Replicate
);
REGISTER_API
(
Replicate
);
REGISTER_API
(
ReplicateVerbatim
);
REGISTER_API
(
ReplicateVerbatim
);
REGISTER_API
(
DeleteKey
);
REGISTER_API
(
DeleteKey
);
REGISTER_API
(
UnlinkKey
);
REGISTER_API
(
StringSet
);
REGISTER_API
(
StringSet
);
REGISTER_API
(
StringDMA
);
REGISTER_API
(
StringDMA
);
REGISTER_API
(
StringTruncate
);
REGISTER_API
(
StringTruncate
);
...
...
src/modules/testmodule.c
View file @
72187fa8
...
@@ -120,6 +120,38 @@ int TestStringPrintf(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
...
@@ -120,6 +120,38 @@ int TestStringPrintf(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
return
REDISMODULE_OK
;
return
REDISMODULE_OK
;
}
}
int
failTest
(
RedisModuleCtx
*
ctx
,
const
char
*
msg
)
{
RedisModule_ReplyWithError
(
ctx
,
msg
);
return
REDISMODULE_ERR
;
}
int
TestUnlink
(
RedisModuleCtx
*
ctx
,
RedisModuleString
**
argv
,
int
argc
)
{
RedisModule_AutoMemory
(
ctx
);
REDISMODULE_NOT_USED
(
argv
);
REDISMODULE_NOT_USED
(
argc
);
RedisModuleKey
*
k
=
RedisModule_OpenKey
(
ctx
,
RedisModule_CreateStringPrintf
(
ctx
,
"unlinked"
),
REDISMODULE_WRITE
|
REDISMODULE_READ
);
if
(
!
k
)
return
failTest
(
ctx
,
"Could not create key"
);
if
(
REDISMODULE_ERR
==
RedisModule_StringSet
(
k
,
RedisModule_CreateStringPrintf
(
ctx
,
"Foobar"
)))
{
return
failTest
(
ctx
,
"Could not set string value"
);
}
RedisModuleCallReply
*
rep
=
RedisModule_Call
(
ctx
,
"EXISTS"
,
"c"
,
"unlinked"
);
if
(
!
rep
||
RedisModule_CallReplyInteger
(
rep
)
!=
1
)
{
return
failTest
(
ctx
,
"Key does not exist before unlink"
);
}
if
(
REDISMODULE_ERR
==
RedisModule_UnlinkKey
(
k
))
{
return
failTest
(
ctx
,
"Could not unlink key"
);
}
rep
=
RedisModule_Call
(
ctx
,
"EXISTS"
,
"c"
,
"unlinked"
);
if
(
!
rep
||
RedisModule_CallReplyInteger
(
rep
)
!=
0
)
{
return
failTest
(
ctx
,
"Could not verify key to be unlinked"
);
}
return
RedisModule_ReplyWithSimpleString
(
ctx
,
"OK"
);
}
/* TEST.CTXFLAGS -- Test GetContextFlags. */
/* TEST.CTXFLAGS -- Test GetContextFlags. */
int
TestCtxFlags
(
RedisModuleCtx
*
ctx
,
RedisModuleString
**
argv
,
int
argc
)
{
int
TestCtxFlags
(
RedisModuleCtx
*
ctx
,
RedisModuleString
**
argv
,
int
argc
)
{
...
@@ -269,6 +301,9 @@ int TestIt(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
...
@@ -269,6 +301,9 @@ int TestIt(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
T
(
"test.string.append"
,
""
);
T
(
"test.string.append"
,
""
);
if
(
!
TestAssertStringReply
(
ctx
,
reply
,
"foobar"
,
6
))
goto
fail
;
if
(
!
TestAssertStringReply
(
ctx
,
reply
,
"foobar"
,
6
))
goto
fail
;
T
(
"test.unlink"
,
""
);
if
(
!
TestAssertStringReply
(
ctx
,
reply
,
"OK"
,
2
))
goto
fail
;
T
(
"test.string.append.am"
,
""
);
T
(
"test.string.append.am"
,
""
);
if
(
!
TestAssertStringReply
(
ctx
,
reply
,
"foobar"
,
6
))
goto
fail
;
if
(
!
TestAssertStringReply
(
ctx
,
reply
,
"foobar"
,
6
))
goto
fail
;
...
@@ -310,6 +345,10 @@ int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
...
@@ -310,6 +345,10 @@ int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
if
(
RedisModule_CreateCommand
(
ctx
,
"test.ctxflags"
,
if
(
RedisModule_CreateCommand
(
ctx
,
"test.ctxflags"
,
TestCtxFlags
,
"readonly"
,
1
,
1
,
1
)
==
REDISMODULE_ERR
)
TestCtxFlags
,
"readonly"
,
1
,
1
,
1
)
==
REDISMODULE_ERR
)
return
REDISMODULE_ERR
;
return
REDISMODULE_ERR
;
if
(
RedisModule_CreateCommand
(
ctx
,
"test.unlink"
,
TestUnlink
,
"write deny-oom"
,
1
,
1
,
1
)
==
REDISMODULE_ERR
)
return
REDISMODULE_ERR
;
if
(
RedisModule_CreateCommand
(
ctx
,
"test.it"
,
if
(
RedisModule_CreateCommand
(
ctx
,
"test.it"
,
TestIt
,
"readonly"
,
1
,
1
,
1
)
==
REDISMODULE_ERR
)
TestIt
,
"readonly"
,
1
,
1
,
1
)
==
REDISMODULE_ERR
)
...
...
src/redismodule.h
View file @
72187fa8
...
@@ -185,6 +185,7 @@ int REDISMODULE_API_FUNC(RedisModule_ReplicateVerbatim)(RedisModuleCtx *ctx);
...
@@ -185,6 +185,7 @@ int REDISMODULE_API_FUNC(RedisModule_ReplicateVerbatim)(RedisModuleCtx *ctx);
const
char
*
REDISMODULE_API_FUNC
(
RedisModule_CallReplyStringPtr
)(
RedisModuleCallReply
*
reply
,
size_t
*
len
);
const
char
*
REDISMODULE_API_FUNC
(
RedisModule_CallReplyStringPtr
)(
RedisModuleCallReply
*
reply
,
size_t
*
len
);
RedisModuleString
*
REDISMODULE_API_FUNC
(
RedisModule_CreateStringFromCallReply
)(
RedisModuleCallReply
*
reply
);
RedisModuleString
*
REDISMODULE_API_FUNC
(
RedisModule_CreateStringFromCallReply
)(
RedisModuleCallReply
*
reply
);
int
REDISMODULE_API_FUNC
(
RedisModule_DeleteKey
)(
RedisModuleKey
*
key
);
int
REDISMODULE_API_FUNC
(
RedisModule_DeleteKey
)(
RedisModuleKey
*
key
);
int
REDISMODULE_API_FUNC
(
RedisModule_UnlinkKey
)(
RedisModuleKey
*
key
);
int
REDISMODULE_API_FUNC
(
RedisModule_StringSet
)(
RedisModuleKey
*
key
,
RedisModuleString
*
str
);
int
REDISMODULE_API_FUNC
(
RedisModule_StringSet
)(
RedisModuleKey
*
key
,
RedisModuleString
*
str
);
char
*
REDISMODULE_API_FUNC
(
RedisModule_StringDMA
)(
RedisModuleKey
*
key
,
size_t
*
len
,
int
mode
);
char
*
REDISMODULE_API_FUNC
(
RedisModule_StringDMA
)(
RedisModuleKey
*
key
,
size_t
*
len
,
int
mode
);
int
REDISMODULE_API_FUNC
(
RedisModule_StringTruncate
)(
RedisModuleKey
*
key
,
size_t
newlen
);
int
REDISMODULE_API_FUNC
(
RedisModule_StringTruncate
)(
RedisModuleKey
*
key
,
size_t
newlen
);
...
@@ -306,6 +307,7 @@ static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int
...
@@ -306,6 +307,7 @@ static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int
REDISMODULE_GET_API
(
Replicate
);
REDISMODULE_GET_API
(
Replicate
);
REDISMODULE_GET_API
(
ReplicateVerbatim
);
REDISMODULE_GET_API
(
ReplicateVerbatim
);
REDISMODULE_GET_API
(
DeleteKey
);
REDISMODULE_GET_API
(
DeleteKey
);
REDISMODULE_GET_API
(
UnlinkKey
);
REDISMODULE_GET_API
(
StringSet
);
REDISMODULE_GET_API
(
StringSet
);
REDISMODULE_GET_API
(
StringDMA
);
REDISMODULE_GET_API
(
StringDMA
);
REDISMODULE_GET_API
(
StringTruncate
);
REDISMODULE_GET_API
(
StringTruncate
);
...
...
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