diff options
author | Steve Bennett <steveb@workware.net.au> | 2022-05-17 08:33:49 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2022-05-17 08:34:16 +1000 |
commit | 34d0e14824c2491002fe5763c11b66c196a0f109 (patch) | |
tree | 4ce1cb5a2d166414be9c195b139dca2a67ae8246 /jim-redis.c | |
parent | 7f75234e8e68394271ecb8b56a0a117a1d6066a7 (diff) | |
download | jimtcl-34d0e14824c2491002fe5763c11b66c196a0f109.zip jimtcl-34d0e14824c2491002fe5763c11b66c196a0f109.tar.gz jimtcl-34d0e14824c2491002fe5763c11b66c196a0f109.tar.bz2 |
jim-redis: Add support for -type
For retrieving type information of return values.
Signed-off-by: Steve Bennett <steveb@workware.net.au>
Diffstat (limited to 'jim-redis.c')
-rw-r--r-- | jim-redis.c | 65 |
1 files changed, 50 insertions, 15 deletions
diff --git a/jim-redis.c b/jim-redis.c index 72f55eb..2534347 100644 --- a/jim-redis.c +++ b/jim-redis.c @@ -13,30 +13,63 @@ /** * Recursively decode a redis reply as Tcl data structure. */ -static Jim_Obj *jim_redis_get_result(Jim_Interp *interp, redisReply *reply) +static Jim_Obj *jim_redis_get_result(Jim_Interp *interp, redisReply *reply, int addtype) { int i; + Jim_Obj *obj; + switch (reply->type) { case REDIS_REPLY_INTEGER: - return Jim_NewIntObj(interp, reply->integer); + obj = Jim_NewIntObj(interp, reply->integer); + break; case REDIS_REPLY_STATUS: case REDIS_REPLY_ERROR: case REDIS_REPLY_STRING: - return Jim_NewStringObj(interp, reply->str, reply->len); + obj = Jim_NewStringObj(interp, reply->str, reply->len); break; case REDIS_REPLY_ARRAY: - { - Jim_Obj *obj = Jim_NewListObj(interp, NULL, 0); - for (i = 0; i < reply->elements; i++) { - Jim_ListAppendElement(interp, obj, jim_redis_get_result(interp, reply->element[i])); - } - return obj; + obj = Jim_NewListObj(interp, NULL, 0); + for (i = 0; i < reply->elements; i++) { + Jim_ListAppendElement(interp, obj, jim_redis_get_result(interp, reply->element[i], addtype)); } + break; case REDIS_REPLY_NIL: - return Jim_NewStringObj(interp, NULL, 0); + obj = Jim_NewStringObj(interp, NULL, 0); + break; default: - return Jim_NewStringObj(interp, "badtype", -1); + obj = Jim_NewStringObj(interp, "badtype", -1); + break; } + if (addtype) { + const char *type; + + switch (reply->type) { + case REDIS_REPLY_INTEGER: + type = "int"; + break; + case REDIS_REPLY_STATUS: + type = "status"; + break; + case REDIS_REPLY_ERROR: + type = "error"; + break; + case REDIS_REPLY_STRING: + type = "str"; + break; + case REDIS_REPLY_ARRAY: + type = "array"; + break; + case REDIS_REPLY_NIL: + type = "nil"; + break; + default: + type = "invalid"; + break; + } + obj = Jim_NewListObj(interp, &obj, 1); + Jim_ListAppendElement(interp, obj, Jim_NewStringObj(interp, type, -1)); + } + return obj; } /** @@ -56,12 +89,14 @@ static int jim_redis_subcmd(Jim_Interp *interp, int argc, Jim_Obj *const *argv) const char **args; size_t *arglens; int ret = JIM_OK; + int addtype = 0; redisReply *reply; - if (argc < 2) { - Jim_WrongNumArgs(interp, 1, argv, "cmd ?args ...?"); - return JIM_ERR; + if (argc >= 3 && Jim_CompareStringImmediate(interp, argv[1], "-type")) { + addtype = 1; + argc--; + argv++; } if (Jim_CompareStringImmediate(interp, argv[1], "readable")) { @@ -94,7 +129,7 @@ static int jim_redis_subcmd(Jim_Interp *interp, int argc, Jim_Obj *const *argv) } /* sometimes commands return NULL */ if (reply) { - Jim_SetResult(interp, jim_redis_get_result(interp, reply)); + Jim_SetResult(interp, jim_redis_get_result(interp, reply, addtype)); if (reply->type == REDIS_REPLY_ERROR) { ret = JIM_ERR; } |