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

Skip to content

Commit 687a5c7

Browse files
committed
Issue #1943
Add lPos command.
1 parent 8159048 commit 687a5c7

10 files changed

Lines changed: 170 additions & 14 deletions

library.c

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1334,6 +1334,56 @@ redis_pop_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_
13341334
}
13351335
}
13361336

1337+
PHP_REDIS_API int
1338+
redis_lpos_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx)
1339+
{
1340+
char inbuf[4096];
1341+
int i, numElems;
1342+
size_t len;
1343+
zval z_ret;
1344+
1345+
if (redis_sock_gets(redis_sock, inbuf, sizeof(inbuf), &len) < 0) {
1346+
goto failure;
1347+
}
1348+
1349+
if (ctx == NULL) {
1350+
if (*inbuf != TYPE_INT && *inbuf != TYPE_BULK) {
1351+
goto failure;
1352+
}
1353+
ZVAL_LONG(&z_ret, atol(inbuf + 1));
1354+
} else if (ctx == PHPREDIS_CTX_PTR) {
1355+
if (*inbuf != TYPE_MULTIBULK) {
1356+
goto failure;
1357+
}
1358+
array_init(&z_ret);
1359+
numElems = atol(inbuf + 1);
1360+
for (i = 0; i < numElems; ++i) {
1361+
if (redis_sock_gets(redis_sock, inbuf, sizeof(inbuf), &len) < 0) {
1362+
zval_dtor(&z_ret);
1363+
goto failure;
1364+
}
1365+
add_next_index_long(&z_ret, atol(inbuf + 1));
1366+
}
1367+
} else {
1368+
ZEND_ASSERT(!"memory corruption?");
1369+
}
1370+
1371+
if (IS_ATOMIC(redis_sock)) {
1372+
RETVAL_ZVAL(&z_ret, 0, 1);
1373+
} else {
1374+
add_next_index_zval(z_tab, &z_ret);
1375+
}
1376+
return SUCCESS;
1377+
1378+
failure:
1379+
if (IS_ATOMIC(redis_sock)) {
1380+
RETVAL_FALSE;
1381+
} else {
1382+
add_next_index_bool(z_tab, 0);
1383+
}
1384+
return FAILURE;
1385+
}
1386+
13371387
PHP_REDIS_API int
13381388
redis_boolean_response_impl(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
13391389
zval *z_tab, void *ctx,

library.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ PHP_REDIS_API int redis_set_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *re
168168
PHP_REDIS_API int redis_geosearch_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
169169
PHP_REDIS_API int redis_hrandfield_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
170170
PHP_REDIS_API int redis_pop_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
171+
PHP_REDIS_API int redis_lpos_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
171172

172173
/* Helper methods to get configuration values from a HashTable. */
173174

redis.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1253,6 +1253,13 @@ PHP_METHOD(Redis, lPop)
12531253
}
12541254
/* }}} */
12551255

1256+
/* {{{ proto string Redis::lPos(string key, mixed value, [array options = null]) */
1257+
PHP_METHOD(Redis, lPos)
1258+
{
1259+
REDIS_PROCESS_CMD(lpos, redis_lpos_response);
1260+
}
1261+
/* }}} */
1262+
12561263
/* {{{ proto string Redis::rPop(string key, [int count = 0]) */
12571264
PHP_METHOD(Redis, rPop)
12581265
{

redis.stub.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ class Redis {
1010

1111
public function __construct(array $options = null);
1212

13-
public function _compress(string $value): string;
14-
1513
public function __destruct();
1614

15+
public function _compress(string $value): string;
16+
1717
public function _pack(mixed $value): string;
1818

1919
public function _prefix(string $key): string;
@@ -241,6 +241,8 @@ public function lMove(string $src, string $dst, string $wherefrom, string $where
241241

242242
public function lPop(string $key, int $count = 0): bool|string|array;
243243

244+
public function lPos(string $key, mixed $value, array $options = null): bool|int|array;
245+
244246
/**
245247
* @param mixed $elements
246248
* @return int|Redis

redis_arginfo.h

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
/* This is a generated file, edit the .stub.php file instead.
2-
* Stub hash: 954ed131a20d6939f9653dbc384e6244a0862b6e */
2+
* Stub hash: 7fc0b991dc8404945a0081aef8a422c9c670eab9 */
33

44
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis___construct, 0, 0, 0)
55
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_ARRAY, 0, "null")
66
ZEND_END_ARG_INFO()
77

8-
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Redis__compress, 0, 1, IS_STRING, 0)
9-
ZEND_ARG_TYPE_INFO(0, value, IS_STRING, 0)
8+
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis___destruct, 0, 0, 0)
109
ZEND_END_ARG_INFO()
1110

12-
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis___destruct, 0, 0, 0)
11+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Redis__compress, 0, 1, IS_STRING, 0)
12+
ZEND_ARG_TYPE_INFO(0, value, IS_STRING, 0)
1313
ZEND_END_ARG_INFO()
1414

1515
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Redis__pack, 0, 1, IS_STRING, 0)
@@ -416,6 +416,12 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_class_Redis_lPop, 0, 1, MAY_BE_B
416416
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, count, IS_LONG, 0, "0")
417417
ZEND_END_ARG_INFO()
418418

419+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_class_Redis_lPos, 0, 2, MAY_BE_BOOL|MAY_BE_LONG|MAY_BE_ARRAY)
420+
ZEND_ARG_TYPE_INFO(0, key, IS_STRING, 0)
421+
ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0)
422+
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_ARRAY, 0, "null")
423+
ZEND_END_ARG_INFO()
424+
419425
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis_lPush, 0, 0, 1)
420426
ZEND_ARG_TYPE_INFO(0, key, IS_STRING, 0)
421427
ZEND_ARG_VARIADIC_INFO(0, elements)
@@ -975,8 +981,8 @@ ZEND_END_ARG_INFO()
975981

976982

977983
ZEND_METHOD(Redis, __construct);
978-
ZEND_METHOD(Redis, _compress);
979984
ZEND_METHOD(Redis, __destruct);
985+
ZEND_METHOD(Redis, _compress);
980986
ZEND_METHOD(Redis, _pack);
981987
ZEND_METHOD(Redis, _prefix);
982988
ZEND_METHOD(Redis, _serialize);
@@ -1072,6 +1078,7 @@ ZEND_METHOD(Redis, lInsert);
10721078
ZEND_METHOD(Redis, lLen);
10731079
ZEND_METHOD(Redis, lMove);
10741080
ZEND_METHOD(Redis, lPop);
1081+
ZEND_METHOD(Redis, lPos);
10751082
ZEND_METHOD(Redis, lPush);
10761083
ZEND_METHOD(Redis, rPush);
10771084
ZEND_METHOD(Redis, lPushx);
@@ -1205,8 +1212,8 @@ ZEND_METHOD(Redis, zunionstore);
12051212

12061213
static const zend_function_entry class_Redis_methods[] = {
12071214
ZEND_ME(Redis, __construct, arginfo_class_Redis___construct, ZEND_ACC_PUBLIC)
1208-
ZEND_ME(Redis, _compress, arginfo_class_Redis__compress, ZEND_ACC_PUBLIC)
12091215
ZEND_ME(Redis, __destruct, arginfo_class_Redis___destruct, ZEND_ACC_PUBLIC)
1216+
ZEND_ME(Redis, _compress, arginfo_class_Redis__compress, ZEND_ACC_PUBLIC)
12101217
ZEND_ME(Redis, _pack, arginfo_class_Redis__pack, ZEND_ACC_PUBLIC)
12111218
ZEND_ME(Redis, _prefix, arginfo_class_Redis__prefix, ZEND_ACC_PUBLIC)
12121219
ZEND_ME(Redis, _serialize, arginfo_class_Redis__serialize, ZEND_ACC_PUBLIC)
@@ -1303,6 +1310,7 @@ static const zend_function_entry class_Redis_methods[] = {
13031310
ZEND_ME(Redis, lLen, arginfo_class_Redis_lLen, ZEND_ACC_PUBLIC)
13041311
ZEND_ME(Redis, lMove, arginfo_class_Redis_lMove, ZEND_ACC_PUBLIC)
13051312
ZEND_ME(Redis, lPop, arginfo_class_Redis_lPop, ZEND_ACC_PUBLIC)
1313+
ZEND_ME(Redis, lPos, arginfo_class_Redis_lPos, ZEND_ACC_PUBLIC)
13061314
ZEND_ME(Redis, lPush, arginfo_class_Redis_lPush, ZEND_ACC_PUBLIC)
13071315
ZEND_ME(Redis, rPush, arginfo_class_Redis_rPush, ZEND_ACC_PUBLIC)
13081316
ZEND_ME(Redis, lPushx, arginfo_class_Redis_lPushx, ZEND_ACC_PUBLIC)

redis_commands.c

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2626,6 +2626,69 @@ int redis_lrem_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
26262626
return SUCCESS;
26272627
}
26282628

2629+
int
2630+
redis_lpos_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
2631+
char **cmd, int *cmd_len, short *slot, void **ctx)
2632+
{
2633+
char *key;
2634+
int argc = 2;
2635+
size_t key_len;
2636+
smart_string cmdstr = {0};
2637+
zend_bool withrank = 0;
2638+
zend_long rank = 0, count = -1, maxlen = -1;
2639+
zend_string *zkey;
2640+
zval *z_val, *z_ele, *z_opts = NULL;
2641+
2642+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz|a",
2643+
&key, &key_len, &z_val, &z_opts) == FAILURE)
2644+
{
2645+
return FAILURE;
2646+
}
2647+
2648+
if (z_opts != NULL) {
2649+
ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(z_opts), zkey, z_ele) {
2650+
if (zkey != NULL) {
2651+
ZVAL_DEREF(z_ele);
2652+
if (zend_string_equals_literal_ci(zkey, "count")) {
2653+
count = zval_get_long(z_ele);
2654+
} else if (zend_string_equals_literal_ci(zkey, "maxlen")) {
2655+
maxlen = zval_get_long(z_ele);
2656+
} else if (zend_string_equals_literal_ci(zkey, "rank")) {
2657+
rank = zval_get_long(z_ele);
2658+
withrank = 1;
2659+
}
2660+
}
2661+
} ZEND_HASH_FOREACH_END();
2662+
}
2663+
2664+
argc += (withrank ? 2 : 0) + (count >= 0 ? 2 : 0) + (maxlen >= 0 ? 2 : 0);
2665+
REDIS_CMD_INIT_SSTR_STATIC(&cmdstr, argc, "LPOS");
2666+
2667+
redis_cmd_append_sstr_key(&cmdstr, key, key_len, redis_sock, slot);
2668+
redis_cmd_append_sstr_zval(&cmdstr, z_val, redis_sock);
2669+
2670+
if (withrank) {
2671+
REDIS_CMD_APPEND_SSTR_STATIC(&cmdstr, "RANK");
2672+
redis_cmd_append_sstr_long(&cmdstr, rank);
2673+
}
2674+
2675+
if (count >= 0) {
2676+
REDIS_CMD_APPEND_SSTR_STATIC(&cmdstr, "COUNT");
2677+
redis_cmd_append_sstr_long(&cmdstr, count);
2678+
*ctx = PHPREDIS_CTX_PTR;
2679+
}
2680+
2681+
if (maxlen >= 0) {
2682+
REDIS_CMD_APPEND_SSTR_STATIC(&cmdstr, "MAXLEN");
2683+
redis_cmd_append_sstr_long(&cmdstr, maxlen);
2684+
}
2685+
2686+
*cmd = cmdstr.c;
2687+
*cmd_len = cmdstr.len;
2688+
2689+
return SUCCESS;
2690+
}
2691+
26292692
int redis_smove_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
26302693
char **cmd, int *cmd_len, short *slot, void **ctx)
26312694
{

redis_commands.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,9 @@ int redis_linsert_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
229229
int redis_lrem_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
230230
char **cmd, int *cmd_len, short *slot, void **ctx);
231231

232+
int redis_lpos_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
233+
char **cmd, int *cmd_len, short *slot, void **ctx);
234+
232235
int redis_smove_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
233236
char **cmd, int *cmd_len, short *slot, void **ctx);
234237

redis_legacy_arginfo.h

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
/* This is a generated file, edit the .stub.php file instead.
2-
* Stub hash: 954ed131a20d6939f9653dbc384e6244a0862b6e */
2+
* Stub hash: 7fc0b991dc8404945a0081aef8a422c9c670eab9 */
33

44
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis___construct, 0, 0, 0)
55
ZEND_ARG_INFO(0, options)
66
ZEND_END_ARG_INFO()
77

8-
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis__compress, 0, 0, 1)
9-
ZEND_ARG_INFO(0, value)
8+
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis___destruct, 0, 0, 0)
109
ZEND_END_ARG_INFO()
1110

12-
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis___destruct, 0, 0, 0)
11+
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis__compress, 0, 0, 1)
12+
ZEND_ARG_INFO(0, value)
1313
ZEND_END_ARG_INFO()
1414

1515
#define arginfo_class_Redis__pack arginfo_class_Redis__compress
@@ -371,6 +371,12 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis_lPop, 0, 0, 1)
371371
ZEND_ARG_INFO(0, count)
372372
ZEND_END_ARG_INFO()
373373

374+
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis_lPos, 0, 0, 2)
375+
ZEND_ARG_INFO(0, key)
376+
ZEND_ARG_INFO(0, value)
377+
ZEND_ARG_INFO(0, options)
378+
ZEND_END_ARG_INFO()
379+
374380
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis_lPush, 0, 0, 1)
375381
ZEND_ARG_INFO(0, key)
376382
ZEND_ARG_VARIADIC_INFO(0, elements)
@@ -871,8 +877,8 @@ ZEND_END_ARG_INFO()
871877

872878

873879
ZEND_METHOD(Redis, __construct);
874-
ZEND_METHOD(Redis, _compress);
875880
ZEND_METHOD(Redis, __destruct);
881+
ZEND_METHOD(Redis, _compress);
876882
ZEND_METHOD(Redis, _pack);
877883
ZEND_METHOD(Redis, _prefix);
878884
ZEND_METHOD(Redis, _serialize);
@@ -968,6 +974,7 @@ ZEND_METHOD(Redis, lInsert);
968974
ZEND_METHOD(Redis, lLen);
969975
ZEND_METHOD(Redis, lMove);
970976
ZEND_METHOD(Redis, lPop);
977+
ZEND_METHOD(Redis, lPos);
971978
ZEND_METHOD(Redis, lPush);
972979
ZEND_METHOD(Redis, rPush);
973980
ZEND_METHOD(Redis, lPushx);
@@ -1101,8 +1108,8 @@ ZEND_METHOD(Redis, zunionstore);
11011108

11021109
static const zend_function_entry class_Redis_methods[] = {
11031110
ZEND_ME(Redis, __construct, arginfo_class_Redis___construct, ZEND_ACC_PUBLIC)
1104-
ZEND_ME(Redis, _compress, arginfo_class_Redis__compress, ZEND_ACC_PUBLIC)
11051111
ZEND_ME(Redis, __destruct, arginfo_class_Redis___destruct, ZEND_ACC_PUBLIC)
1112+
ZEND_ME(Redis, _compress, arginfo_class_Redis__compress, ZEND_ACC_PUBLIC)
11061113
ZEND_ME(Redis, _pack, arginfo_class_Redis__pack, ZEND_ACC_PUBLIC)
11071114
ZEND_ME(Redis, _prefix, arginfo_class_Redis__prefix, ZEND_ACC_PUBLIC)
11081115
ZEND_ME(Redis, _serialize, arginfo_class_Redis__serialize, ZEND_ACC_PUBLIC)
@@ -1199,6 +1206,7 @@ static const zend_function_entry class_Redis_methods[] = {
11991206
ZEND_ME(Redis, lLen, arginfo_class_Redis_lLen, ZEND_ACC_PUBLIC)
12001207
ZEND_ME(Redis, lMove, arginfo_class_Redis_lMove, ZEND_ACC_PUBLIC)
12011208
ZEND_ME(Redis, lPop, arginfo_class_Redis_lPop, ZEND_ACC_PUBLIC)
1209+
ZEND_ME(Redis, lPos, arginfo_class_Redis_lPos, ZEND_ACC_PUBLIC)
12021210
ZEND_ME(Redis, lPush, arginfo_class_Redis_lPush, ZEND_ACC_PUBLIC)
12031211
ZEND_ME(Redis, rPush, arginfo_class_Redis_rPush, ZEND_ACC_PUBLIC)
12041212
ZEND_ME(Redis, lPushx, arginfo_class_Redis_lPushx, ZEND_ACC_PUBLIC)

tests/RedisClusterTest.php

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

5353
public function testlMove() { return $this->markTestSkipped(); }
54+
public function testlPos() { return $this->marktestSkipped(); }
5455
public function testsMisMember() { return $this->markTestSkipped(); }
5556
public function testzDiff() { return $this->markTestSkipped(); }
5657
public function testzInter() { return $this->markTestSkipped(); }

tests/RedisTest.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1015,6 +1015,19 @@ public function testlPopx() {
10151015
$this->assertTrue($this->redis->lrange('key', 0, -1) === ['val2', 'val0', 'val1']);
10161016
}
10171017

1018+
public function testlPos()
1019+
{
1020+
$this->redis->del('key');
1021+
$this->redis->lPush('key', 'val0', 'val1', 'val1');
1022+
$this->assertEquals(2, $this->redis->lPos('key', 'val0'));
1023+
$this->assertEquals(0, $this->redis->lPos('key', 'val1'));
1024+
$this->assertEquals(1, $this->redis->lPos('key', 'val1', ['rank' => 2]));
1025+
$this->assertEquals([0, 1], $this->redis->lPos('key', 'val1', ['count' => 2]));
1026+
$this->assertEquals([0], $this->redis->lPos('key', 'val1', ['count' => 2, 'maxlen' => 1]));
1027+
$this->assertEquals([], $this->redis->lPos('key', 'val2', ['count' => 1]));
1028+
$this->assertEquals(-1, $this->redis->lPos('key', 'val2'));
1029+
}
1030+
10181031
// ltrim, lsize, lpop
10191032
public function testltrim()
10201033
{

0 commit comments

Comments
 (0)