mirror of
https://github.com/php-win-ext/phpredis.git
synced 2026-03-24 09:02:07 +01:00
* fix bug: the pipeline mode socket return an unexpected result after reconnecting * fix typos: pipeline is right --------- Co-authored-by: marcofu <marcofu@tencent.com>
67 lines
1.9 KiB
C
67 lines
1.9 KiB
C
#include "sentinel_library.h"
|
|
|
|
static zend_object_handlers redis_sentinel_object_handlers;
|
|
|
|
static void
|
|
free_redis_sentinel_object(zend_object *object)
|
|
{
|
|
redis_sentinel_object *obj = PHPREDIS_GET_OBJECT(redis_sentinel_object, object);
|
|
|
|
if (obj->sock) {
|
|
redis_sock_disconnect(obj->sock, 0, 1);
|
|
redis_free_socket(obj->sock);
|
|
}
|
|
zend_object_std_dtor(&obj->std);
|
|
}
|
|
|
|
zend_object *
|
|
create_sentinel_object(zend_class_entry *ce)
|
|
{
|
|
redis_sentinel_object *obj = ecalloc(1, sizeof(*obj) + zend_object_properties_size(ce));
|
|
|
|
zend_object_std_init(&obj->std, ce);
|
|
object_properties_init(&obj->std, ce);
|
|
|
|
memcpy(&redis_sentinel_object_handlers, zend_get_std_object_handlers(), sizeof(redis_sentinel_object_handlers));
|
|
redis_sentinel_object_handlers.offset = XtOffsetOf(redis_sentinel_object, std);
|
|
redis_sentinel_object_handlers.free_obj = free_redis_sentinel_object;
|
|
obj->std.handlers = &redis_sentinel_object_handlers;
|
|
|
|
return &obj->std;
|
|
}
|
|
|
|
PHP_REDIS_API int
|
|
sentinel_mbulk_reply_zipped_assoc(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx)
|
|
{
|
|
char inbuf[4096];
|
|
int i, nelem;
|
|
size_t len;
|
|
zval z_ret;
|
|
|
|
/* Throws exception on failure */
|
|
if (redis_sock_gets(redis_sock, inbuf, sizeof(inbuf) - 1, &len) < 0) {
|
|
RETVAL_FALSE;
|
|
return FAILURE;
|
|
}
|
|
|
|
if (*inbuf != TYPE_MULTIBULK) {
|
|
if (*inbuf == TYPE_ERR) {
|
|
redis_sock_set_err(redis_sock, inbuf + 1, len - 1);
|
|
}
|
|
|
|
RETVAL_FALSE;
|
|
return FAILURE;
|
|
}
|
|
array_init(&z_ret);
|
|
nelem = atoi(inbuf + 1);
|
|
for (i = 0; i < nelem; ++i) {
|
|
/* redis_mbulk_reply_zipped_raw calls redis_mbulk_reply_zipped
|
|
* which puts result into return_value via RETVAL_ZVAL */
|
|
redis_mbulk_reply_zipped_raw(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, z_tab, ctx);
|
|
add_next_index_zval(&z_ret, return_value);
|
|
}
|
|
|
|
RETVAL_ZVAL(&z_ret, 0, 1);
|
|
return SUCCESS;
|
|
}
|