Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit acb5db7

Browse files
Refactor OBJECT command.
1 parent e90557c commit acb5db7

8 files changed

Lines changed: 47 additions & 76 deletions

File tree

cluster_library.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1843,6 +1843,17 @@ cluster_srandmember_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *c, void *ct
18431843
}
18441844
}
18451845

1846+
PHP_REDIS_API void
1847+
cluster_object_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *c, void *ctx) {
1848+
ZEND_ASSERT(ctx == PHPREDIS_CTX_PTR || ctx == PHPREDIS_CTX_PTR + 1);
1849+
1850+
if (ctx == PHPREDIS_CTX_PTR) {
1851+
cluster_long_resp(INTERNAL_FUNCTION_PARAM_PASSTHRU, c, NULL);
1852+
} else {
1853+
cluster_bulk_resp(INTERNAL_FUNCTION_PARAM_PASSTHRU, c, NULL);
1854+
}
1855+
}
1856+
18461857
PHP_REDIS_API void
18471858
cluster_set_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *c, void *ctx)
18481859
{

cluster_library.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,8 @@ PHP_REDIS_API void cluster_ping_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster
410410
void *ctx);
411411
PHP_REDIS_API void cluster_pop_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *c,
412412
void *ctx);
413+
PHP_REDIS_API void cluster_object_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *c,
414+
void *ctx);
413415
PHP_REDIS_API void cluster_lpos_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *c,
414416
void *ctx);
415417
PHP_REDIS_API void cluster_hrandfield_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *c,

library.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1477,6 +1477,17 @@ redis_pop_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_
14771477
}
14781478
}
14791479

1480+
PHP_REDIS_API int
1481+
redis_object_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx) {
1482+
ZEND_ASSERT(ctx == PHPREDIS_CTX_PTR || ctx == PHPREDIS_CTX_PTR + 1);
1483+
1484+
if (ctx == PHPREDIS_CTX_PTR) {
1485+
return redis_long_response(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL);
1486+
} else {
1487+
return redis_string_response(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL);
1488+
}
1489+
}
1490+
14801491
PHP_REDIS_API int
14811492
redis_read_lpos_response(zval *zdst, RedisSock *redis_sock, char reply_type,
14821493
long long elements, void *ctx)

library.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,7 @@ PHP_REDIS_API int redis_pop_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *re
192192

193193
PHP_REDIS_API int redis_srandmember_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
194194
PHP_REDIS_API int redis_lpos_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
195+
PHP_REDIS_API int redis_object_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
195196
PHP_REDIS_API int redis_read_lpos_response(zval *zdst, RedisSock *redis_sock, char reply_type, long long elements, void *ctx);
196197

197198

redis.c

Lines changed: 1 addition & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2396,35 +2396,7 @@ PHP_METHOD(Redis, replicaof) {
23962396
/* {{{ proto string Redis::object(key) */
23972397
PHP_METHOD(Redis, object)
23982398
{
2399-
RedisSock *redis_sock;
2400-
char *cmd; int cmd_len;
2401-
REDIS_REPLY_TYPE rtype;
2402-
2403-
if ((redis_sock = redis_sock_get(getThis(), 0)) == NULL) {
2404-
RETURN_FALSE;
2405-
}
2406-
2407-
if(redis_object_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, &rtype,
2408-
&cmd, &cmd_len, NULL, NULL)==FAILURE)
2409-
{
2410-
RETURN_FALSE;
2411-
}
2412-
2413-
REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
2414-
2415-
if(rtype == TYPE_INT) {
2416-
if (IS_ATOMIC(redis_sock)) {
2417-
redis_long_response(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock,
2418-
NULL, NULL);
2419-
}
2420-
REDIS_PROCESS_RESPONSE(redis_long_response);
2421-
} else {
2422-
if (IS_ATOMIC(redis_sock)) {
2423-
redis_string_response(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock,
2424-
NULL, NULL);
2425-
}
2426-
REDIS_PROCESS_RESPONSE(redis_string_response);
2427-
}
2399+
REDIS_PROCESS_CMD(object, redis_object_response);
24282400
}
24292401
/* }}} */
24302402

redis_cluster.c

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1591,29 +1591,7 @@ PHP_METHOD(RedisCluster, sort_ro) {
15911591

15921592
/* {{{ proto RedisCluster::object(string subcmd, string key) */
15931593
PHP_METHOD(RedisCluster, object) {
1594-
redisCluster *c = GET_CONTEXT();
1595-
char *cmd; int cmd_len; short slot;
1596-
REDIS_REPLY_TYPE rtype;
1597-
1598-
if (redis_object_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, c->flags, &rtype,
1599-
&cmd, &cmd_len, &slot, NULL) == FAILURE)
1600-
{
1601-
RETURN_FALSE;
1602-
}
1603-
1604-
if (cluster_send_command(c,slot,cmd,cmd_len) < 0 || c->err != NULL) {
1605-
efree(cmd);
1606-
RETURN_FALSE;
1607-
}
1608-
1609-
efree(cmd);
1610-
1611-
// Use the correct response type
1612-
if (rtype == TYPE_INT) {
1613-
cluster_long_resp(INTERNAL_FUNCTION_PARAM_PASSTHRU, c, NULL);
1614-
} else {
1615-
cluster_bulk_resp(INTERNAL_FUNCTION_PARAM_PASSTHRU, c, NULL);
1616-
}
1594+
CLUSTER_PROCESS_CMD(object, cluster_object_resp, 1);
16171595
}
16181596

16191597
/* {{{ proto null RedisCluster::subscribe(array chans, callable cb) */

redis_commands.c

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4102,36 +4102,33 @@ int redis_zadd_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
41024102

41034103
/* OBJECT */
41044104
int redis_object_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
4105-
REDIS_REPLY_TYPE *rtype, char **cmd, int *cmd_len,
4106-
short *slot, void **ctx)
4105+
char **cmd, int *cmd_len, short *slot, void **ctx)
41074106
{
4108-
char *key, *subcmd;
4109-
size_t key_len, subcmd_len;
4110-
4111-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss", &subcmd,
4112-
&subcmd_len, &key, &key_len) == FAILURE)
4113-
{
4114-
return FAILURE;
4115-
}
4107+
zend_string *subcmd = NULL, *key = NULL;
4108+
smart_string cmdstr = {0};
41164109

4117-
// Format our command
4118-
*cmd_len = REDIS_CMD_SPPRINTF(cmd, "OBJECT", "sk", subcmd, subcmd_len, key, key_len);
4110+
ZEND_PARSE_PARAMETERS_START(2, 2)
4111+
Z_PARAM_STR(subcmd)
4112+
Z_PARAM_STR(key)
4113+
ZEND_PARSE_PARAMETERS_END_EX(return FAILURE);
41194114

4120-
// Push the reply type to our caller
4121-
if (subcmd_len == 8 && (!strncasecmp(subcmd,"refcount",8) ||
4122-
!strncasecmp(subcmd,"idletime",8)))
4115+
if (zend_string_equals_literal_ci(subcmd, "REFCOUNT") ||
4116+
zend_string_equals_literal_ci(subcmd, "IDLETIME"))
41234117
{
4124-
*rtype = TYPE_INT;
4125-
} else if (subcmd_len == 8 && !strncasecmp(subcmd, "encoding", 8)) {
4126-
*rtype = TYPE_BULK;
4118+
*ctx = PHPREDIS_CTX_PTR;
4119+
} else if (zend_string_equals_literal_ci(subcmd, "ENCODING")) {
4120+
*ctx = PHPREDIS_CTX_PTR + 1;
41274121
} else {
4128-
php_error_docref(NULL, E_WARNING,
4129-
"Invalid subcommand sent to OBJECT");
4130-
efree(*cmd);
4122+
php_error_docref(NULL, E_WARNING, "Invalid subcommand sent to OBJECT");
41314123
return FAILURE;
41324124
}
41334125

4134-
// Success
4126+
REDIS_CMD_INIT_SSTR_STATIC(&cmdstr, 2, "OBJECT");
4127+
redis_cmd_append_sstr_zstr(&cmdstr, subcmd);
4128+
redis_cmd_append_sstr_key_zstr(&cmdstr, key, redis_sock, slot);
4129+
4130+
*cmd = cmdstr.c;
4131+
*cmd_len = cmdstr.len;
41354132
return SUCCESS;
41364133
}
41374134

redis_commands.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -279,8 +279,7 @@ int redis_zadd_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
279279
char **cmd, int *cmd_len, short *slot, void **ctx);
280280

281281
int redis_object_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
282-
REDIS_REPLY_TYPE *rtype, char **cmd, int *cmd_len, short *slot,
283-
void **ctx);
282+
char **cmd, int *cmd_len, short *slot, void **ctx);
284283

285284
int redis_client_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
286285
char **cmd, int *cmd_len, short *slot, void **ctx);

0 commit comments

Comments
 (0)