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

Skip to content

Commit 7121aaa

Browse files
Implement LPOS for RedisCluster
See #1894
1 parent 121e9d9 commit 7121aaa

9 files changed

Lines changed: 90 additions & 43 deletions

cluster_library.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1759,6 +1759,23 @@ cluster_pop_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *c, void *ctx)
17591759
}
17601760
}
17611761

1762+
PHP_REDIS_API void
1763+
cluster_lpos_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *c, void *ctx)
1764+
{
1765+
zval zret = {0};
1766+
1767+
c->cmd_sock->null_mbulk_as_null = c->flags->null_mbulk_as_null;
1768+
if (redis_read_lpos_response(&zret, c->cmd_sock, c->reply_type, c->reply_len, ctx) < 0) {
1769+
ZVAL_FALSE(&zret);
1770+
}
1771+
1772+
if (CLUSTER_IS_ATOMIC(c)) {
1773+
RETVAL_ZVAL(&zret, 0, 1);
1774+
} else {
1775+
add_next_index_zval(&c->multi_resp, &zret);
1776+
}
1777+
}
1778+
17621779
PHP_REDIS_API void
17631780
cluster_set_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *c, void *ctx)
17641781
{

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_lpos_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *c,
414+
void *ctx);
413415
PHP_REDIS_API void cluster_set_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *c,
414416
void *ctx);
415417
PHP_REDIS_API void cluster_single_line_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *c,

library.c

Lines changed: 40 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1455,62 +1455,67 @@ redis_pop_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_
14551455
}
14561456

14571457
PHP_REDIS_API int
1458-
redis_lpos_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx)
1458+
redis_read_lpos_response(zval *zdst, RedisSock *redis_sock, char reply_type,
1459+
long long elements, void *ctx)
14591460
{
14601461
char inbuf[4096];
1461-
int i, numElems;
14621462
size_t len;
1463-
zval z_ret;
1464-
long lval;
1465-
1466-
if (redis_sock_gets(redis_sock, inbuf, sizeof(inbuf), &len) < 0) {
1467-
goto failure;
1468-
}
1463+
int i;
14691464

14701465
if (ctx == NULL) {
1471-
if (*inbuf != TYPE_INT && *inbuf != TYPE_BULK) {
1472-
goto failure;
1473-
}
1474-
lval = atol(inbuf + 1);
1475-
if (lval > -1) {
1476-
ZVAL_LONG(&z_ret, lval);
1477-
} else if (redis_sock->null_mbulk_as_null) {
1478-
ZVAL_NULL(&z_ret);
1466+
if (reply_type != TYPE_INT && reply_type != TYPE_BULK)
1467+
return FAILURE;
1468+
1469+
if (elements > -1) {
1470+
ZVAL_LONG(zdst, elements);
14791471
} else {
1480-
ZVAL_FALSE(&z_ret);
1472+
REDIS_ZVAL_NULL(redis_sock, zdst);
14811473
}
14821474
} else if (ctx == PHPREDIS_CTX_PTR) {
1483-
if (*inbuf != TYPE_MULTIBULK) {
1484-
goto failure;
1485-
}
1486-
array_init(&z_ret);
1487-
numElems = atol(inbuf + 1);
1488-
for (i = 0; i < numElems; ++i) {
1475+
if (reply_type != TYPE_MULTIBULK)
1476+
return FAILURE;
1477+
1478+
array_init(zdst);
1479+
1480+
for (i = 0; i < elements; ++i) {
14891481
if (redis_sock_gets(redis_sock, inbuf, sizeof(inbuf), &len) < 0) {
1490-
zval_dtor(&z_ret);
1491-
goto failure;
1482+
zval_dtor(zdst);
1483+
return FAILURE;
14921484
}
1493-
add_next_index_long(&z_ret, atol(inbuf + 1));
1485+
add_next_index_long(zdst, atol(inbuf + 1));
14941486
}
14951487
} else {
14961488
ZEND_ASSERT(!"memory corruption?");
14971489
return FAILURE;
14981490
}
14991491

1500-
if (IS_ATOMIC(redis_sock)) {
1501-
RETVAL_ZVAL(&z_ret, 0, 1);
1502-
} else {
1503-
add_next_index_zval(z_tab, &z_ret);
1504-
}
15051492
return SUCCESS;
1493+
}
1494+
1495+
1496+
PHP_REDIS_API int
1497+
redis_lpos_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx)
1498+
{
1499+
char inbuf[1024] = {0};
1500+
int res = SUCCESS;
1501+
zval zdst = {0};
1502+
size_t len;
1503+
1504+
/* Attempt to read the LPOS response */
1505+
if (redis_sock_gets(redis_sock, inbuf, sizeof(inbuf), &len) < 0 ||
1506+
redis_read_lpos_response(&zdst, redis_sock, *inbuf, atoll(inbuf+1), ctx) < 0)
1507+
{
1508+
ZVAL_FALSE(&zdst);
1509+
res = FAILURE;
1510+
}
15061511

1507-
failure:
15081512
if (IS_ATOMIC(redis_sock)) {
1509-
RETVAL_FALSE;
1513+
RETVAL_ZVAL(&zdst, 0, 0);
15101514
} else {
1511-
add_next_index_bool(z_tab, 0);
1515+
add_next_index_zval(z_tab, &zdst);
15121516
}
1513-
return FAILURE;
1517+
1518+
return res;
15141519
}
15151520

15161521
PHP_REDIS_API int

library.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,10 @@ PHP_REDIS_API int redis_set_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *re
187187
PHP_REDIS_API int redis_geosearch_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
188188
PHP_REDIS_API int redis_hrandfield_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
189189
PHP_REDIS_API int redis_pop_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
190+
190191
PHP_REDIS_API int redis_lpos_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
192+
PHP_REDIS_API int redis_read_lpos_response(zval *zdst, RedisSock *redis_sock, char reply_type, long long elements, void *ctx);
193+
191194
PHP_REDIS_API int redis_client_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
192195
PHP_REDIS_API int redis_command_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
193196

redis_cluster.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -839,6 +839,10 @@ PHP_METHOD(RedisCluster, lpop) {
839839
}
840840
/* }}} */
841841

842+
PHP_METHOD(RedisCluster, lpos) {
843+
CLUSTER_PROCESS_CMD(lpos, cluster_lpos_resp, 1);
844+
}
845+
842846
/* {{{ proto string RedisCluster::rpop(string key, [int count = 0]) */
843847
PHP_METHOD(RedisCluster, rpop) {
844848
CLUSTER_PROCESS_KW_CMD("RPOP", redis_pop_cmd, cluster_pop_resp, 0);

redis_cluster.stub.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -560,6 +560,11 @@ public function llen(string $key): RedisCluster|int|bool;
560560
*/
561561
public function lpop(string $key, int $count = 0): RedisCluster|bool|string|array;
562562

563+
/**
564+
* @see Redis::lpos
565+
*/
566+
public function lpos(string $key, mixed $value, array $options = null): Redis|null|bool|int|array;
567+
563568
/**
564569
* @see Redis::lpush
565570
*/

redis_cluster_arginfo.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* This is a generated file, edit the .stub.php file instead.
2-
* Stub hash: 4746475a398a16ba176367a0fbc1c9f7e2c5241d */
2+
* Stub hash: 048afee969c189861f5ba0b8f8fb8cbeeba9a206 */
33

44
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster___construct, 0, 0, 1)
55
ZEND_ARG_TYPE_INFO(0, name, IS_STRING, 1)
@@ -448,6 +448,12 @@ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_class_RedisCluster_lpop, 0,
448448
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, count, IS_LONG, 0, "0")
449449
ZEND_END_ARG_INFO()
450450

451+
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_class_RedisCluster_lpos, 0, 2, Redis, MAY_BE_NULL|MAY_BE_BOOL|MAY_BE_LONG|MAY_BE_ARRAY)
452+
ZEND_ARG_TYPE_INFO(0, key, IS_STRING, 0)
453+
ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0)
454+
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_ARRAY, 0, "null")
455+
ZEND_END_ARG_INFO()
456+
451457
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_class_RedisCluster_lpush, 0, 2, RedisCluster, MAY_BE_LONG|MAY_BE_BOOL)
452458
ZEND_ARG_TYPE_INFO(0, key, IS_STRING, 0)
453459
ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0)
@@ -1078,6 +1084,7 @@ ZEND_METHOD(RedisCluster, lindex);
10781084
ZEND_METHOD(RedisCluster, linsert);
10791085
ZEND_METHOD(RedisCluster, llen);
10801086
ZEND_METHOD(RedisCluster, lpop);
1087+
ZEND_METHOD(RedisCluster, lpos);
10811088
ZEND_METHOD(RedisCluster, lpush);
10821089
ZEND_METHOD(RedisCluster, lpushx);
10831090
ZEND_METHOD(RedisCluster, lrange);
@@ -1292,6 +1299,7 @@ static const zend_function_entry class_RedisCluster_methods[] = {
12921299
ZEND_ME(RedisCluster, linsert, arginfo_class_RedisCluster_linsert, ZEND_ACC_PUBLIC)
12931300
ZEND_ME(RedisCluster, llen, arginfo_class_RedisCluster_llen, ZEND_ACC_PUBLIC)
12941301
ZEND_ME(RedisCluster, lpop, arginfo_class_RedisCluster_lpop, ZEND_ACC_PUBLIC)
1302+
ZEND_ME(RedisCluster, lpos, arginfo_class_RedisCluster_lpos, ZEND_ACC_PUBLIC)
12951303
ZEND_ME(RedisCluster, lpush, arginfo_class_RedisCluster_lpush, ZEND_ACC_PUBLIC)
12961304
ZEND_ME(RedisCluster, lpushx, arginfo_class_RedisCluster_lpushx, ZEND_ACC_PUBLIC)
12971305
ZEND_ME(RedisCluster, lrange, arginfo_class_RedisCluster_lrange, ZEND_ACC_PUBLIC)

redis_cluster_legacy_arginfo.h

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* This is a generated file, edit the .stub.php file instead.
2-
* Stub hash: 4746475a398a16ba176367a0fbc1c9f7e2c5241d */
2+
* Stub hash: 048afee969c189861f5ba0b8f8fb8cbeeba9a206 */
33

44
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster___construct, 0, 0, 1)
55
ZEND_ARG_INFO(0, name)
@@ -382,6 +382,12 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster_lpop, 0, 0, 1)
382382
ZEND_ARG_INFO(0, count)
383383
ZEND_END_ARG_INFO()
384384

385+
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster_lpos, 0, 0, 2)
386+
ZEND_ARG_INFO(0, key)
387+
ZEND_ARG_INFO(0, value)
388+
ZEND_ARG_INFO(0, options)
389+
ZEND_END_ARG_INFO()
390+
385391
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster_lpush, 0, 0, 2)
386392
ZEND_ARG_INFO(0, key)
387393
ZEND_ARG_INFO(0, value)
@@ -545,11 +551,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster_sdiffstore, 0, 0, 2)
545551
ZEND_ARG_VARIADIC_INFO(0, other_keys)
546552
ZEND_END_ARG_INFO()
547553

548-
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster_set, 0, 0, 2)
549-
ZEND_ARG_INFO(0, key)
550-
ZEND_ARG_INFO(0, value)
551-
ZEND_ARG_INFO(0, options)
552-
ZEND_END_ARG_INFO()
554+
#define arginfo_class_RedisCluster_set arginfo_class_RedisCluster_lpos
553555

554556
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster_setbit, 0, 0, 3)
555557
ZEND_ARG_INFO(0, key)
@@ -929,6 +931,7 @@ ZEND_METHOD(RedisCluster, lindex);
929931
ZEND_METHOD(RedisCluster, linsert);
930932
ZEND_METHOD(RedisCluster, llen);
931933
ZEND_METHOD(RedisCluster, lpop);
934+
ZEND_METHOD(RedisCluster, lpos);
932935
ZEND_METHOD(RedisCluster, lpush);
933936
ZEND_METHOD(RedisCluster, lpushx);
934937
ZEND_METHOD(RedisCluster, lrange);
@@ -1143,6 +1146,7 @@ static const zend_function_entry class_RedisCluster_methods[] = {
11431146
ZEND_ME(RedisCluster, linsert, arginfo_class_RedisCluster_linsert, ZEND_ACC_PUBLIC)
11441147
ZEND_ME(RedisCluster, llen, arginfo_class_RedisCluster_llen, ZEND_ACC_PUBLIC)
11451148
ZEND_ME(RedisCluster, lpop, arginfo_class_RedisCluster_lpop, ZEND_ACC_PUBLIC)
1149+
ZEND_ME(RedisCluster, lpos, arginfo_class_RedisCluster_lpos, ZEND_ACC_PUBLIC)
11461150
ZEND_ME(RedisCluster, lpush, arginfo_class_RedisCluster_lpush, ZEND_ACC_PUBLIC)
11471151
ZEND_ME(RedisCluster, lpushx, arginfo_class_RedisCluster_lpushx, ZEND_ACC_PUBLIC)
11481152
ZEND_ME(RedisCluster, lrange, arginfo_class_RedisCluster_lrange, ZEND_ACC_PUBLIC)

tests/RedisClusterTest.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ public function testReset() { return $this->markTestSkipped(); }
5151
public function testInvalidAuthArgs() { return $this->markTestSkipped(); }
5252
public function testScanErrors() { return $this->markTestSkipped(); }
5353

54-
public function testlPos() { return $this->marktestSkipped(); }
5554
public function testzDiff() { return $this->markTestSkipped(); }
5655
public function testzInter() { return $this->markTestSkipped(); }
5756
public function testzUnion() { return $this->markTestSkipped(); }

0 commit comments

Comments
 (0)