diff options
author | Salvatore Sanfilippo <antirez@gmail.com> | 2016-06-23 16:16:28 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-06-23 16:16:28 +0200 |
commit | 28ea585fce601613500f0e36215851d8d88c6228 (patch) | |
tree | 03741eaa55e215e01e19146f2c110a529f746b90 | |
parent | c0ca87dcc09212053e4718d9f78a2127ce33ef85 (diff) | |
parent | 61172ed01ef3b888d499e191df6bc6408313ae68 (diff) | |
download | redis-28ea585fce601613500f0e36215851d8d88c6228.tar.gz |
Merge pull request #3336 from yossigo/create_string_from_string
Add RedisModule_CreateStringFromString().
-rw-r--r-- | src/module.c | 12 | ||||
-rw-r--r-- | src/modules/API.md | 10 | ||||
-rw-r--r-- | src/object.c | 2 | ||||
-rw-r--r-- | src/redismodule.h | 2 | ||||
-rw-r--r-- | src/server.h | 2 |
5 files changed, 26 insertions, 2 deletions
diff --git a/src/module.c b/src/module.c index f5921d8f2..d0df65488 100644 --- a/src/module.c +++ b/src/module.c @@ -687,6 +687,17 @@ RedisModuleString *RM_CreateStringFromLongLong(RedisModuleCtx *ctx, long long ll return RM_CreateString(ctx,buf,len); } +/* Like RedisModule_CreatString(), but creates a string starting from another + * RedisModuleString. + * + * The returned string must be released with RedisModule_FreeString() or by + * enabling automatic memory management. */ +RedisModuleString *RM_CreateStringFromString(RedisModuleCtx *ctx, const RedisModuleString *str) { + RedisModuleString *o = dupStringObject(str); + autoMemoryAdd(ctx,REDISMODULE_AM_STRING,o); + return o; +} + /* Free a module string object obtained with one of the Redis modules API calls * that return new string objects. * @@ -2888,6 +2899,7 @@ void moduleRegisterCoreAPI(void) { REGISTER_API(CreateStringFromCallReply); REGISTER_API(CreateString); REGISTER_API(CreateStringFromLongLong); + REGISTER_API(CreateStringFromString); REGISTER_API(FreeString); REGISTER_API(StringPtrLen); REGISTER_API(AutoMemory); diff --git a/src/modules/API.md b/src/modules/API.md index 021b2aa10..9c7ada9dd 100644 --- a/src/modules/API.md +++ b/src/modules/API.md @@ -179,6 +179,16 @@ integer instead of taking a buffer and its length. The returned string must be released with `RedisModule_FreeString()` or by enabling automatic memory management. +## `RM_CreateStringFromString` + + RedisModuleString *RM_CreateStringFromString(RedisModuleCtx *ctx, const RedisModuleString *str); + +Like `RedisModule_CreatString()`, but creates a string starting from an existing +RedisModuleString. + +The returned string must be released with `RedisModule_FreeString()` or by +enabling automatic memory management. + ## `RM_FreeString` void RM_FreeString(RedisModuleCtx *ctx, RedisModuleString *str); diff --git a/src/object.c b/src/object.c index ab927688b..447e5fc30 100644 --- a/src/object.c +++ b/src/object.c @@ -147,7 +147,7 @@ robj *createStringObjectFromLongDouble(long double value, int humanfriendly) { * will always result in a fresh object that is unshared (refcount == 1). * * The resulting object always has refcount set to 1. */ -robj *dupStringObject(robj *o) { +robj *dupStringObject(const robj *o) { robj *d; serverAssert(o->type == OBJ_STRING); diff --git a/src/redismodule.h b/src/redismodule.h index 985cbafc0..fae0f3d09 100644 --- a/src/redismodule.h +++ b/src/redismodule.h @@ -122,6 +122,7 @@ size_t REDISMODULE_API_FUNC(RedisModule_CallReplyLength)(RedisModuleCallReply *r RedisModuleCallReply *REDISMODULE_API_FUNC(RedisModule_CallReplyArrayElement)(RedisModuleCallReply *reply, size_t idx); RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateString)(RedisModuleCtx *ctx, const char *ptr, size_t len); RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateStringFromLongLong)(RedisModuleCtx *ctx, long long ll); +RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateStringFromString)(RedisModuleCtx *ctx, const RedisModuleString *str); void REDISMODULE_API_FUNC(RedisModule_FreeString)(RedisModuleCtx *ctx, RedisModuleString *str); const char *REDISMODULE_API_FUNC(RedisModule_StringPtrLen)(const RedisModuleString *str, size_t *len); int REDISMODULE_API_FUNC(RedisModule_ReplyWithError)(RedisModuleCtx *ctx, const char *err); @@ -226,6 +227,7 @@ static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int REDISMODULE_GET_API(CreateStringFromCallReply); REDISMODULE_GET_API(CreateString); REDISMODULE_GET_API(CreateStringFromLongLong); + REDISMODULE_GET_API(CreateStringFromString); REDISMODULE_GET_API(FreeString); REDISMODULE_GET_API(StringPtrLen); REDISMODULE_GET_API(AutoMemory); diff --git a/src/server.h b/src/server.h index cd5ac77f3..c1963bf21 100644 --- a/src/server.h +++ b/src/server.h @@ -1285,7 +1285,7 @@ robj *createObject(int type, void *ptr); robj *createStringObject(const char *ptr, size_t len); robj *createRawStringObject(const char *ptr, size_t len); robj *createEmbeddedStringObject(const char *ptr, size_t len); -robj *dupStringObject(robj *o); +robj *dupStringObject(const robj *o); int isSdsRepresentableAsLongLong(sds s, long long *llval); int isObjectRepresentableAsLongLong(robj *o, long long *llongval); robj *tryObjectEncoding(robj *o); |