aboutsummaryrefslogtreecommitdiff
path: root/jim-redis.c
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2022-05-17 08:33:49 +1000
committerSteve Bennett <steveb@workware.net.au>2022-05-17 08:34:16 +1000
commit34d0e14824c2491002fe5763c11b66c196a0f109 (patch)
tree4ce1cb5a2d166414be9c195b139dca2a67ae8246 /jim-redis.c
parent7f75234e8e68394271ecb8b56a0a117a1d6066a7 (diff)
downloadjimtcl-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.c65
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;
}