From acb5db76617fafa8317e8805132224b2ca905c58 Mon Sep 17 00:00:00 2001 From: michael-grunder Date: Tue, 6 Dec 2022 11:46:53 -0800 Subject: [PATCH] Refactor OBJECT command. --- cluster_library.c | 11 +++++++++++ cluster_library.h | 2 ++ library.c | 11 +++++++++++ library.h | 1 + redis.c | 30 +----------------------------- redis_cluster.c | 24 +----------------------- redis_commands.c | 43 ++++++++++++++++++++----------------------- redis_commands.h | 3 +-- 8 files changed, 48 insertions(+), 77 deletions(-) diff --git a/cluster_library.c b/cluster_library.c index f411f89..520a228 100644 --- a/cluster_library.c +++ b/cluster_library.c @@ -1843,6 +1843,17 @@ cluster_srandmember_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *c, void *ct } } +PHP_REDIS_API void +cluster_object_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *c, void *ctx) { + ZEND_ASSERT(ctx == PHPREDIS_CTX_PTR || ctx == PHPREDIS_CTX_PTR + 1); + + if (ctx == PHPREDIS_CTX_PTR) { + cluster_long_resp(INTERNAL_FUNCTION_PARAM_PASSTHRU, c, NULL); + } else { + cluster_bulk_resp(INTERNAL_FUNCTION_PARAM_PASSTHRU, c, NULL); + } +} + PHP_REDIS_API void cluster_set_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *c, void *ctx) { diff --git a/cluster_library.h b/cluster_library.h index d81a2e4..0ed588c 100644 --- a/cluster_library.h +++ b/cluster_library.h @@ -410,6 +410,8 @@ PHP_REDIS_API void cluster_ping_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster void *ctx); PHP_REDIS_API void cluster_pop_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *c, void *ctx); +PHP_REDIS_API void cluster_object_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *c, + void *ctx); PHP_REDIS_API void cluster_lpos_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *c, void *ctx); PHP_REDIS_API void cluster_hrandfield_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *c, diff --git a/library.c b/library.c index 26bf1d6..302cf8c 100644 --- a/library.c +++ b/library.c @@ -1477,6 +1477,17 @@ redis_pop_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_ } } +PHP_REDIS_API int +redis_object_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx) { + ZEND_ASSERT(ctx == PHPREDIS_CTX_PTR || ctx == PHPREDIS_CTX_PTR + 1); + + if (ctx == PHPREDIS_CTX_PTR) { + return redis_long_response(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL); + } else { + return redis_string_response(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL); + } +} + PHP_REDIS_API int redis_read_lpos_response(zval *zdst, RedisSock *redis_sock, char reply_type, long long elements, void *ctx) diff --git a/library.h b/library.h index 0a0c0ad..c5246d0 100644 --- a/library.h +++ b/library.h @@ -192,6 +192,7 @@ PHP_REDIS_API int redis_pop_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *re PHP_REDIS_API int redis_srandmember_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx); PHP_REDIS_API int redis_lpos_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx); +PHP_REDIS_API int redis_object_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx); PHP_REDIS_API int redis_read_lpos_response(zval *zdst, RedisSock *redis_sock, char reply_type, long long elements, void *ctx); diff --git a/redis.c b/redis.c index 5396204..186d327 100644 --- a/redis.c +++ b/redis.c @@ -2396,35 +2396,7 @@ PHP_METHOD(Redis, replicaof) { /* {{{ proto string Redis::object(key) */ PHP_METHOD(Redis, object) { - RedisSock *redis_sock; - char *cmd; int cmd_len; - REDIS_REPLY_TYPE rtype; - - if ((redis_sock = redis_sock_get(getThis(), 0)) == NULL) { - RETURN_FALSE; - } - - if(redis_object_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, &rtype, - &cmd, &cmd_len, NULL, NULL)==FAILURE) - { - RETURN_FALSE; - } - - REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len); - - if(rtype == TYPE_INT) { - if (IS_ATOMIC(redis_sock)) { - redis_long_response(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, - NULL, NULL); - } - REDIS_PROCESS_RESPONSE(redis_long_response); - } else { - if (IS_ATOMIC(redis_sock)) { - redis_string_response(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, - NULL, NULL); - } - REDIS_PROCESS_RESPONSE(redis_string_response); - } + REDIS_PROCESS_CMD(object, redis_object_response); } /* }}} */ diff --git a/redis_cluster.c b/redis_cluster.c index 886ba36..fa9cb07 100644 --- a/redis_cluster.c +++ b/redis_cluster.c @@ -1591,29 +1591,7 @@ PHP_METHOD(RedisCluster, sort_ro) { /* {{{ proto RedisCluster::object(string subcmd, string key) */ PHP_METHOD(RedisCluster, object) { - redisCluster *c = GET_CONTEXT(); - char *cmd; int cmd_len; short slot; - REDIS_REPLY_TYPE rtype; - - if (redis_object_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, c->flags, &rtype, - &cmd, &cmd_len, &slot, NULL) == FAILURE) - { - RETURN_FALSE; - } - - if (cluster_send_command(c,slot,cmd,cmd_len) < 0 || c->err != NULL) { - efree(cmd); - RETURN_FALSE; - } - - efree(cmd); - - // Use the correct response type - if (rtype == TYPE_INT) { - cluster_long_resp(INTERNAL_FUNCTION_PARAM_PASSTHRU, c, NULL); - } else { - cluster_bulk_resp(INTERNAL_FUNCTION_PARAM_PASSTHRU, c, NULL); - } + CLUSTER_PROCESS_CMD(object, cluster_object_resp, 1); } /* {{{ proto null RedisCluster::subscribe(array chans, callable cb) */ diff --git a/redis_commands.c b/redis_commands.c index be61007..ecdce3d 100644 --- a/redis_commands.c +++ b/redis_commands.c @@ -4102,36 +4102,33 @@ int redis_zadd_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, /* OBJECT */ int redis_object_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, - REDIS_REPLY_TYPE *rtype, char **cmd, int *cmd_len, - short *slot, void **ctx) + char **cmd, int *cmd_len, short *slot, void **ctx) { - char *key, *subcmd; - size_t key_len, subcmd_len; + zend_string *subcmd = NULL, *key = NULL; + smart_string cmdstr = {0}; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss", &subcmd, - &subcmd_len, &key, &key_len) == FAILURE) + ZEND_PARSE_PARAMETERS_START(2, 2) + Z_PARAM_STR(subcmd) + Z_PARAM_STR(key) + ZEND_PARSE_PARAMETERS_END_EX(return FAILURE); + + if (zend_string_equals_literal_ci(subcmd, "REFCOUNT") || + zend_string_equals_literal_ci(subcmd, "IDLETIME")) { - return FAILURE; - } - - // Format our command - *cmd_len = REDIS_CMD_SPPRINTF(cmd, "OBJECT", "sk", subcmd, subcmd_len, key, key_len); - - // Push the reply type to our caller - if (subcmd_len == 8 && (!strncasecmp(subcmd,"refcount",8) || - !strncasecmp(subcmd,"idletime",8))) - { - *rtype = TYPE_INT; - } else if (subcmd_len == 8 && !strncasecmp(subcmd, "encoding", 8)) { - *rtype = TYPE_BULK; + *ctx = PHPREDIS_CTX_PTR; + } else if (zend_string_equals_literal_ci(subcmd, "ENCODING")) { + *ctx = PHPREDIS_CTX_PTR + 1; } else { - php_error_docref(NULL, E_WARNING, - "Invalid subcommand sent to OBJECT"); - efree(*cmd); + php_error_docref(NULL, E_WARNING, "Invalid subcommand sent to OBJECT"); return FAILURE; } - // Success + REDIS_CMD_INIT_SSTR_STATIC(&cmdstr, 2, "OBJECT"); + redis_cmd_append_sstr_zstr(&cmdstr, subcmd); + redis_cmd_append_sstr_key_zstr(&cmdstr, key, redis_sock, slot); + + *cmd = cmdstr.c; + *cmd_len = cmdstr.len; return SUCCESS; } diff --git a/redis_commands.h b/redis_commands.h index 81e2c26..5e3e6a3 100644 --- a/redis_commands.h +++ b/redis_commands.h @@ -279,8 +279,7 @@ int redis_zadd_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, char **cmd, int *cmd_len, short *slot, void **ctx); int redis_object_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, - REDIS_REPLY_TYPE *rtype, char **cmd, int *cmd_len, short *slot, - void **ctx); + char **cmd, int *cmd_len, short *slot, void **ctx); int redis_client_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, char **cmd, int *cmd_len, short *slot, void **ctx);