Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added RM_CreateStringVaprintf() and tests #6628

Open
wants to merge 1 commit into
base: unstable
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
13 changes: 13 additions & 0 deletions src/module.c
Original file line number Diff line number Diff line change
Expand Up @@ -1006,6 +1006,18 @@ RedisModuleString *RM_CreateStringPrintf(RedisModuleCtx *ctx, const char *fmt, .
}


/* Like RM_CreateStringPrintf, but with va_list. */
RedisModuleString *RM_CreateStringVaprintf(RedisModuleCtx *ctx, const char *fmt, va_list ap) {
sds s = sdsempty();
s = sdscatvprintf(s, fmt, ap);

RedisModuleString *o = createObject(OBJ_STRING, s);
if (ctx != NULL) autoMemoryAdd(ctx,REDISMODULE_AM_STRING,o);

return o;
}


/* Like RedisModule_CreatString(), but creates a string starting from a long long
* integer instead of taking a buffer and its length.
*
Expand Down Expand Up @@ -7358,6 +7370,7 @@ void moduleRegisterCoreAPI(void) {
REGISTER_API(CreateStringFromLongDouble);
REGISTER_API(CreateStringFromString);
REGISTER_API(CreateStringPrintf);
REGISTER_API(CreateStringVaprintf);
REGISTER_API(FreeString);
REGISTER_API(StringPtrLen);
REGISTER_API(AutoMemory);
Expand Down
30 changes: 30 additions & 0 deletions src/modules/testmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,32 @@ int TestStringPrintf(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
return REDISMODULE_OK;
}

/* TEST.STRING.VAPRINTF -- Test string formatting. */
static RedisModuleString *_TestStringVaprintf(RedisModuleCtx *ctx, const char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
RedisModuleString *s = RedisModule_CreateStringPrintf(ctx, fmt, ap);
va_end(ap);
return s;
}

int TestStringVaprintf(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
RedisModule_AutoMemory(ctx);
if (argc < 3) {
return RedisModule_WrongArity(ctx);
}
RedisModuleString *s = _TestStringVaprintf(ctx,
"Got %d args. argv[1]: %s, argv[2]: %s",
argc,
RedisModule_StringPtrLen(argv[1], NULL),
RedisModule_StringPtrLen(argv[2], NULL)
);

RedisModule_ReplyWithString(ctx,s);

return REDISMODULE_OK;
}

int failTest(RedisModuleCtx *ctx, const char *msg) {
RedisModule_ReplyWithError(ctx, msg);
return REDISMODULE_ERR;
Expand Down Expand Up @@ -434,6 +460,10 @@ int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
TestStringPrintf,"write deny-oom",1,1,1) == REDISMODULE_ERR)
return REDISMODULE_ERR;

if (RedisModule_CreateCommand(ctx,"test.string.vaprintf",
TestStringVaprintf,"write deny-oom",1,1,1) == REDISMODULE_ERR)
return REDISMODULE_ERR;

if (RedisModule_CreateCommand(ctx,"test.ctxflags",
TestCtxFlags,"readonly",1,1,1) == REDISMODULE_ERR)
return REDISMODULE_ERR;
Expand Down
3 changes: 3 additions & 0 deletions src/redismodule.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#include <sys/types.h>
#include <stdint.h>
#include <stdio.h>
#include <stdarg.h>

/* ---------------- Defines common between core and modules --------------- */

Expand Down Expand Up @@ -466,6 +467,7 @@ RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateStringFromLongLong)(Re
RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateStringFromLongDouble)(RedisModuleCtx *ctx, long double ld, int humanfriendly);
RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateStringFromString)(RedisModuleCtx *ctx, const RedisModuleString *str);
RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateStringPrintf)(RedisModuleCtx *ctx, const char *fmt, ...);
RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateStringVaprintf)(RedisModuleCtx *ctx, const char *fmt, va_list ap);
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);
Expand Down Expand Up @@ -719,6 +721,7 @@ static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int
REDISMODULE_GET_API(CreateStringFromLongDouble);
REDISMODULE_GET_API(CreateStringFromString);
REDISMODULE_GET_API(CreateStringPrintf);
REDISMODULE_GET_API(CreateStringVaprintf);
REDISMODULE_GET_API(FreeString);
REDISMODULE_GET_API(StringPtrLen);
REDISMODULE_GET_API(AutoMemory);
Expand Down
29 changes: 28 additions & 1 deletion tests/modules/misc.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <assert.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>

#define UNUSED(x) (void)(x)

Expand Down Expand Up @@ -42,6 +43,30 @@ int test_call_info(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
return REDISMODULE_OK;
}

static RedisModuleString *_test_varpintf(RedisModuleCtx *ctx, const char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
RedisModuleString *s = RedisModule_CreateStringVaprintf(ctx, fmt, ap);
va_end(ap);
return s;
}

int test_call_vaprintf(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
RedisModule_AutoMemory(ctx);
if (argc < 3) {
return RedisModule_WrongArity(ctx);
}
RedisModuleString *s = _test_varpintf(ctx,
"Got %d args. argv[1]: %s, argv[2]: %d",
argc - 1,
RedisModule_StringPtrLen(argv[1], NULL),
atoi(RedisModule_StringPtrLen(argv[2], NULL))
);

RedisModule_ReplyWithString(ctx, s);
return REDISMODULE_OK;
}

int test_ld_conv(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
UNUSED(argv);
UNUSED(argc);
Expand Down Expand Up @@ -185,13 +210,15 @@ int test_setlfu(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
REDISMODULE_NOT_USED(argv);
REDISMODULE_NOT_USED(argc);
if (RedisModule_Init(ctx,"misc",1,REDISMODULE_APIVER_1)== REDISMODULE_ERR)
if (RedisModule_Init(ctx, "misc", 1, REDISMODULE_APIVER_1) == REDISMODULE_ERR)
return REDISMODULE_ERR;

if (RedisModule_CreateCommand(ctx,"test.call_generic", test_call_generic,"",0,0,0) == REDISMODULE_ERR)
return REDISMODULE_ERR;
if (RedisModule_CreateCommand(ctx,"test.call_info", test_call_info,"",0,0,0) == REDISMODULE_ERR)
return REDISMODULE_ERR;
if (RedisModule_CreateCommand(ctx,"test.call_vaprintf", test_call_vaprintf, "",0,0,0) == REDISMODULE_ERR)
return REDISMODULE_ERR;
if (RedisModule_CreateCommand(ctx,"test.ld_conversion", test_ld_conv, "",0,0,0) == REDISMODULE_ERR)
return REDISMODULE_ERR;
if (RedisModule_CreateCommand(ctx,"test.flushall", test_flushall,"",0,0,0) == REDISMODULE_ERR)
Expand Down
5 changes: 5 additions & 0 deletions tests/unit/moduleapi/misc.tcl
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,11 @@ start_server {tags {"modules"}} {
assert { [string match "*cmdstat_module*" $info] }
}

test {test RM_CreateStringVaprintf} {
set str [r test.call_vaprintf text 42]
assert { $str eq {Got 2 args. argv[1]: text, argv[2]: 42} }
}

test {test long double conversions} {
set ld [r test.ld_conversion]
assert {[string match $ld "0.00000000000000001"]}
Expand Down