mirror of
https://github.com/phpredis/phpredis.git
synced 2026-06-19 07:35:31 +00:00
committed by
Michael Grunder
parent
121e9d9c29
commit
7121aaae5c
@@ -1759,6 +1759,23 @@ cluster_pop_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *c, void *ctx)
|
||||
}
|
||||
}
|
||||
|
||||
PHP_REDIS_API void
|
||||
cluster_lpos_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *c, void *ctx)
|
||||
{
|
||||
zval zret = {0};
|
||||
|
||||
c->cmd_sock->null_mbulk_as_null = c->flags->null_mbulk_as_null;
|
||||
if (redis_read_lpos_response(&zret, c->cmd_sock, c->reply_type, c->reply_len, ctx) < 0) {
|
||||
ZVAL_FALSE(&zret);
|
||||
}
|
||||
|
||||
if (CLUSTER_IS_ATOMIC(c)) {
|
||||
RETVAL_ZVAL(&zret, 0, 1);
|
||||
} else {
|
||||
add_next_index_zval(&c->multi_resp, &zret);
|
||||
}
|
||||
}
|
||||
|
||||
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_lpos_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *c,
|
||||
void *ctx);
|
||||
PHP_REDIS_API void cluster_set_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *c,
|
||||
void *ctx);
|
||||
PHP_REDIS_API void cluster_single_line_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *c,
|
||||
|
||||
@@ -1455,62 +1455,67 @@ redis_pop_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_
|
||||
}
|
||||
|
||||
PHP_REDIS_API int
|
||||
redis_lpos_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx)
|
||||
redis_read_lpos_response(zval *zdst, RedisSock *redis_sock, char reply_type,
|
||||
long long elements, void *ctx)
|
||||
{
|
||||
char inbuf[4096];
|
||||
int i, numElems;
|
||||
size_t len;
|
||||
zval z_ret;
|
||||
long lval;
|
||||
|
||||
if (redis_sock_gets(redis_sock, inbuf, sizeof(inbuf), &len) < 0) {
|
||||
goto failure;
|
||||
}
|
||||
int i;
|
||||
|
||||
if (ctx == NULL) {
|
||||
if (*inbuf != TYPE_INT && *inbuf != TYPE_BULK) {
|
||||
goto failure;
|
||||
}
|
||||
lval = atol(inbuf + 1);
|
||||
if (lval > -1) {
|
||||
ZVAL_LONG(&z_ret, lval);
|
||||
} else if (redis_sock->null_mbulk_as_null) {
|
||||
ZVAL_NULL(&z_ret);
|
||||
if (reply_type != TYPE_INT && reply_type != TYPE_BULK)
|
||||
return FAILURE;
|
||||
|
||||
if (elements > -1) {
|
||||
ZVAL_LONG(zdst, elements);
|
||||
} else {
|
||||
ZVAL_FALSE(&z_ret);
|
||||
REDIS_ZVAL_NULL(redis_sock, zdst);
|
||||
}
|
||||
} else if (ctx == PHPREDIS_CTX_PTR) {
|
||||
if (*inbuf != TYPE_MULTIBULK) {
|
||||
goto failure;
|
||||
}
|
||||
array_init(&z_ret);
|
||||
numElems = atol(inbuf + 1);
|
||||
for (i = 0; i < numElems; ++i) {
|
||||
if (reply_type != TYPE_MULTIBULK)
|
||||
return FAILURE;
|
||||
|
||||
array_init(zdst);
|
||||
|
||||
for (i = 0; i < elements; ++i) {
|
||||
if (redis_sock_gets(redis_sock, inbuf, sizeof(inbuf), &len) < 0) {
|
||||
zval_dtor(&z_ret);
|
||||
goto failure;
|
||||
zval_dtor(zdst);
|
||||
return FAILURE;
|
||||
}
|
||||
add_next_index_long(&z_ret, atol(inbuf + 1));
|
||||
add_next_index_long(zdst, atol(inbuf + 1));
|
||||
}
|
||||
} else {
|
||||
ZEND_ASSERT(!"memory corruption?");
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
if (IS_ATOMIC(redis_sock)) {
|
||||
RETVAL_ZVAL(&z_ret, 0, 1);
|
||||
} else {
|
||||
add_next_index_zval(z_tab, &z_ret);
|
||||
}
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
failure:
|
||||
if (IS_ATOMIC(redis_sock)) {
|
||||
RETVAL_FALSE;
|
||||
} else {
|
||||
add_next_index_bool(z_tab, 0);
|
||||
|
||||
PHP_REDIS_API int
|
||||
redis_lpos_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx)
|
||||
{
|
||||
char inbuf[1024] = {0};
|
||||
int res = SUCCESS;
|
||||
zval zdst = {0};
|
||||
size_t len;
|
||||
|
||||
/* Attempt to read the LPOS response */
|
||||
if (redis_sock_gets(redis_sock, inbuf, sizeof(inbuf), &len) < 0 ||
|
||||
redis_read_lpos_response(&zdst, redis_sock, *inbuf, atoll(inbuf+1), ctx) < 0)
|
||||
{
|
||||
ZVAL_FALSE(&zdst);
|
||||
res = FAILURE;
|
||||
}
|
||||
return FAILURE;
|
||||
|
||||
if (IS_ATOMIC(redis_sock)) {
|
||||
RETVAL_ZVAL(&zdst, 0, 0);
|
||||
} else {
|
||||
add_next_index_zval(z_tab, &zdst);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
PHP_REDIS_API int
|
||||
|
||||
@@ -187,7 +187,10 @@ PHP_REDIS_API int redis_set_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *re
|
||||
PHP_REDIS_API int redis_geosearch_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
|
||||
PHP_REDIS_API int redis_hrandfield_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
|
||||
PHP_REDIS_API int redis_pop_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_read_lpos_response(zval *zdst, RedisSock *redis_sock, char reply_type, long long elements, void *ctx);
|
||||
|
||||
PHP_REDIS_API int redis_client_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
|
||||
PHP_REDIS_API int redis_command_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
|
||||
|
||||
|
||||
@@ -839,6 +839,10 @@ PHP_METHOD(RedisCluster, lpop) {
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
PHP_METHOD(RedisCluster, lpos) {
|
||||
CLUSTER_PROCESS_CMD(lpos, cluster_lpos_resp, 1);
|
||||
}
|
||||
|
||||
/* {{{ proto string RedisCluster::rpop(string key, [int count = 0]) */
|
||||
PHP_METHOD(RedisCluster, rpop) {
|
||||
CLUSTER_PROCESS_KW_CMD("RPOP", redis_pop_cmd, cluster_pop_resp, 0);
|
||||
|
||||
@@ -560,6 +560,11 @@ class RedisCluster {
|
||||
*/
|
||||
public function lpop(string $key, int $count = 0): RedisCluster|bool|string|array;
|
||||
|
||||
/**
|
||||
* @see Redis::lpos
|
||||
*/
|
||||
public function lpos(string $key, mixed $value, array $options = null): Redis|null|bool|int|array;
|
||||
|
||||
/**
|
||||
* @see Redis::lpush
|
||||
*/
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* This is a generated file, edit the .stub.php file instead.
|
||||
* Stub hash: 4746475a398a16ba176367a0fbc1c9f7e2c5241d */
|
||||
* Stub hash: 048afee969c189861f5ba0b8f8fb8cbeeba9a206 */
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster___construct, 0, 0, 1)
|
||||
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,
|
||||
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, count, IS_LONG, 0, "0")
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
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)
|
||||
ZEND_ARG_TYPE_INFO(0, key, IS_STRING, 0)
|
||||
ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0)
|
||||
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_ARRAY, 0, "null")
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_class_RedisCluster_lpush, 0, 2, RedisCluster, MAY_BE_LONG|MAY_BE_BOOL)
|
||||
ZEND_ARG_TYPE_INFO(0, key, IS_STRING, 0)
|
||||
ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0)
|
||||
@@ -1078,6 +1084,7 @@ ZEND_METHOD(RedisCluster, lindex);
|
||||
ZEND_METHOD(RedisCluster, linsert);
|
||||
ZEND_METHOD(RedisCluster, llen);
|
||||
ZEND_METHOD(RedisCluster, lpop);
|
||||
ZEND_METHOD(RedisCluster, lpos);
|
||||
ZEND_METHOD(RedisCluster, lpush);
|
||||
ZEND_METHOD(RedisCluster, lpushx);
|
||||
ZEND_METHOD(RedisCluster, lrange);
|
||||
@@ -1292,6 +1299,7 @@ static const zend_function_entry class_RedisCluster_methods[] = {
|
||||
ZEND_ME(RedisCluster, linsert, arginfo_class_RedisCluster_linsert, ZEND_ACC_PUBLIC)
|
||||
ZEND_ME(RedisCluster, llen, arginfo_class_RedisCluster_llen, ZEND_ACC_PUBLIC)
|
||||
ZEND_ME(RedisCluster, lpop, arginfo_class_RedisCluster_lpop, ZEND_ACC_PUBLIC)
|
||||
ZEND_ME(RedisCluster, lpos, arginfo_class_RedisCluster_lpos, ZEND_ACC_PUBLIC)
|
||||
ZEND_ME(RedisCluster, lpush, arginfo_class_RedisCluster_lpush, ZEND_ACC_PUBLIC)
|
||||
ZEND_ME(RedisCluster, lpushx, arginfo_class_RedisCluster_lpushx, ZEND_ACC_PUBLIC)
|
||||
ZEND_ME(RedisCluster, lrange, arginfo_class_RedisCluster_lrange, ZEND_ACC_PUBLIC)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* This is a generated file, edit the .stub.php file instead.
|
||||
* Stub hash: 4746475a398a16ba176367a0fbc1c9f7e2c5241d */
|
||||
* Stub hash: 048afee969c189861f5ba0b8f8fb8cbeeba9a206 */
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster___construct, 0, 0, 1)
|
||||
ZEND_ARG_INFO(0, name)
|
||||
@@ -382,6 +382,12 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster_lpop, 0, 0, 1)
|
||||
ZEND_ARG_INFO(0, count)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster_lpos, 0, 0, 2)
|
||||
ZEND_ARG_INFO(0, key)
|
||||
ZEND_ARG_INFO(0, value)
|
||||
ZEND_ARG_INFO(0, options)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster_lpush, 0, 0, 2)
|
||||
ZEND_ARG_INFO(0, key)
|
||||
ZEND_ARG_INFO(0, value)
|
||||
@@ -545,11 +551,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster_sdiffstore, 0, 0, 2)
|
||||
ZEND_ARG_VARIADIC_INFO(0, other_keys)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster_set, 0, 0, 2)
|
||||
ZEND_ARG_INFO(0, key)
|
||||
ZEND_ARG_INFO(0, value)
|
||||
ZEND_ARG_INFO(0, options)
|
||||
ZEND_END_ARG_INFO()
|
||||
#define arginfo_class_RedisCluster_set arginfo_class_RedisCluster_lpos
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster_setbit, 0, 0, 3)
|
||||
ZEND_ARG_INFO(0, key)
|
||||
@@ -929,6 +931,7 @@ ZEND_METHOD(RedisCluster, lindex);
|
||||
ZEND_METHOD(RedisCluster, linsert);
|
||||
ZEND_METHOD(RedisCluster, llen);
|
||||
ZEND_METHOD(RedisCluster, lpop);
|
||||
ZEND_METHOD(RedisCluster, lpos);
|
||||
ZEND_METHOD(RedisCluster, lpush);
|
||||
ZEND_METHOD(RedisCluster, lpushx);
|
||||
ZEND_METHOD(RedisCluster, lrange);
|
||||
@@ -1143,6 +1146,7 @@ static const zend_function_entry class_RedisCluster_methods[] = {
|
||||
ZEND_ME(RedisCluster, linsert, arginfo_class_RedisCluster_linsert, ZEND_ACC_PUBLIC)
|
||||
ZEND_ME(RedisCluster, llen, arginfo_class_RedisCluster_llen, ZEND_ACC_PUBLIC)
|
||||
ZEND_ME(RedisCluster, lpop, arginfo_class_RedisCluster_lpop, ZEND_ACC_PUBLIC)
|
||||
ZEND_ME(RedisCluster, lpos, arginfo_class_RedisCluster_lpos, ZEND_ACC_PUBLIC)
|
||||
ZEND_ME(RedisCluster, lpush, arginfo_class_RedisCluster_lpush, ZEND_ACC_PUBLIC)
|
||||
ZEND_ME(RedisCluster, lpushx, arginfo_class_RedisCluster_lpushx, ZEND_ACC_PUBLIC)
|
||||
ZEND_ME(RedisCluster, lrange, arginfo_class_RedisCluster_lrange, ZEND_ACC_PUBLIC)
|
||||
|
||||
@@ -51,7 +51,6 @@ class Redis_Cluster_Test extends Redis_Test {
|
||||
public function testInvalidAuthArgs() { return $this->markTestSkipped(); }
|
||||
public function testScanErrors() { return $this->markTestSkipped(); }
|
||||
|
||||
public function testlPos() { return $this->marktestSkipped(); }
|
||||
public function testzDiff() { return $this->markTestSkipped(); }
|
||||
public function testzInter() { return $this->markTestSkipped(); }
|
||||
public function testzUnion() { return $this->markTestSkipped(); }
|
||||
|
||||
Reference in New Issue
Block a user