/* HELLO.PUSH.CALL2 * This is exaxctly as HELLO.PUSH.CALL, but shows how we can reply to the * client using directly a reply object that Call() returned. */ int HelloPushCall2_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { if (argc != 3) return RedisModule_WrongArity(ctx); RedisModuleCallReply *reply; reply = RedisModule_Call(ctx,"RPUSH","ss",argv[1],argv[2]); RedisModule_ReplyWithCallReply(ctx,reply); RedisModule_FreeCallReply(reply); return REDISMODULE_OK; }
static int router_simple_command(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { RedisModule_AutoMemory(ctx); if (argc < 2) { RedisModule_WrongArity(ctx); return REDISMODULE_OK; } RedisModuleCallReply *reply; size_t len; const char *realCmd = RedisModule_StringPtrLen(argv[1], &len); if (argc == 2) { reply = RedisModule_Call(ctx, realCmd, ""); } else { char *fmt = (char *) malloc(argc-1); memset(fmt, 's', argc-2); fmt[argc-2] = '\0'; ffi_cif cif; ffi_type **ffi_argv = (ffi_type **)malloc(sizeof(ffi_type *) * (argc + 1)); void *result; int i; for (i = 0; i < argc+1; i++) { ffi_argv[i] = &ffi_type_pointer; } void **values = (void **) malloc(sizeof(void *) * (argc + 1)); values[0] = &ctx; values[1] = &realCmd; values[2] = &fmt; for (i = 3; i < argc + 1; i++) { values[i] = &argv[i-1]; } if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, (argc + 1), &ffi_type_pointer, ffi_argv) == FFI_OK) { ffi_call(&cif, FFI_FN(RedisModule_Call), &result, values); } reply = (RedisModuleCallReply *) result; } if (reply == NULL) { const char *err = "command error"; RedisModule_ReplyWithError(ctx, err); } else { RedisModule_ReplyWithCallReply(ctx, reply); } return REDISMODULE_OK; }
static int cmd_password_hset(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { RedisModuleCallReply *reply; size_t len; char crypt_buf[64]; char *hash; if (argc != 4) { RedisModule_WrongArity(ctx); return REDISMODULE_OK; } hash = do_crypt(RedisModule_StringPtrLen(argv[3], &len), crypt_buf, sizeof(crypt_buf)); if (!hash) { RedisModule_ReplyWithError(ctx, "ERR hash error"); return REDISMODULE_ERR; } reply = RedisModule_Call(ctx, "HSET", "ssc!", argv[1], argv[2], hash); RedisModule_ReplyWithCallReply(ctx, reply); return REDISMODULE_OK; }