mirror of
https://github.com/php-win-ext/phpredis.git
synced 2026-03-24 00:52:16 +01:00
Refactor OBJECT command.
This commit is contained in:
committed by
Michael Grunder
parent
e90557c832
commit
acb5db7661
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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,
|
||||
|
||||
11
library.c
11
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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
|
||||
30
redis.c
30
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);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
@@ -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) */
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user