Sitelet https://github.com/bachdev/phpredis/commit/fe67324a319aefe57adfa8f003ca95bad77cf202
Skip to content

Commit fe67324

Browse files
Introspection commands
Implemented various introspection/option commands for both Redis and RedisCluster. Commands implemented: * getOption * setOption * _prefix * _serialize * _unserialize With these implemented, we can properly test RedisCluster with things like serialization and prefixing turned on.
1 parent 1f5aa6e commit fe67324

6 files changed

Lines changed: 359 additions & 273 deletions

File tree

‎library.h‎

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,21 +22,13 @@ PHP_REDIS_API int redis_sock_gets(RedisSock *redis_sock, char *buf, int buf_size
2222

2323
typedef void (*SuccessCallback)(RedisSock *redis_sock);
2424

25-
PHP_REDIS_API void redis_boolean_response_impl(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx, SuccessCallback success_callback);
26-
PHP_REDIS_API void redis_boolean_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
27-
PHP_REDIS_API void redis_bulk_double_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
28-
PHP_REDIS_API void redis_string_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
29-
PHP_REDIS_API void redis_ping_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
30-
PHP_REDIS_API void redis_debug_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
31-
PHP_REDIS_API void redis_info_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
32-
PHP_REDIS_API void redis_type_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
33-
PHP_REDIS_API RedisSock* redis_sock_create(char *host, int host_len, unsigned short port, double timeout, int persistent, char *persistent_id, long retry_interval, zend_bool lazy_connect);
34-
PHP_REDIS_API int redis_sock_connect(RedisSock *redis_sock TSRMLS_DC);
35-
PHP_REDIS_API int redis_sock_server_open(RedisSock *redis_sock, int force_connect TSRMLS_DC);
36-
PHP_REDIS_API int redis_sock_disconnect(RedisSock *redis_sock TSRMLS_DC);
37-
PHP_REDIS_API zval *redis_sock_read_multibulk_reply_zval(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock);
38-
PHP_REDIS_API char *redis_sock_read_bulk_reply(RedisSock *redis_sock, int bytes TSRMLS_DC);
39-
PHP_REDIS_API int redis_sock_read_multibulk_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *_z_tab, void *ctx);
25+
PHPAPI int redis_sock_write(RedisSock *redis_sock, char *cmd, size_t sz TSRMLS_DC);
26+
PHPAPI void redis_stream_close(RedisSock *redis_sock TSRMLS_DC);
27+
PHPAPI int redis_check_eof(RedisSock *redis_sock TSRMLS_DC);
28+
PHPAPI int redis_sock_get(zval *id, RedisSock **redis_sock TSRMLS_DC, int nothrow);
29+
PHPAPI void redis_free_socket(RedisSock *redis_sock);
30+
PHPAPI void redis_send_discard(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock);
31+
PHPAPI int redis_sock_set_err(RedisSock *redis_sock, const char *msg, int msg_len);
4032

4133
PHP_REDIS_API void redis_mbulk_reply_loop(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, int count, int unserialize);
4234
PHP_REDIS_API int redis_mbulk_reply_raw(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);

‎redis.c‎

Lines changed: 12 additions & 154 deletions
Original file line numberDiff line numberDiff line change
@@ -2932,105 +2932,24 @@ PHP_METHOD(Redis, object)
29322932
/* {{{ proto string Redis::getOption($option) */
29332933
PHP_METHOD(Redis, getOption) {
29342934
RedisSock *redis_sock;
2935-
zval *object;
2936-
long option;
29372935

2938-
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ol",
2939-
&object, redis_ce, &option) == FAILURE) {
2936+
if (redis_sock_get(getThis(), &redis_sock TSRMLS_CC, 0) < 0) {
29402937
RETURN_FALSE;
29412938
}
29422939

2943-
if (redis_sock_get(object, &redis_sock TSRMLS_CC, 0) < 0) {
2944-
RETURN_FALSE;
2945-
}
2946-
2947-
switch(option) {
2948-
case REDIS_OPT_SERIALIZER:
2949-
RETURN_LONG(redis_sock->serializer);
2950-
case REDIS_OPT_PREFIX:
2951-
if(redis_sock->prefix) {
2952-
RETURN_STRINGL(redis_sock->prefix, redis_sock->prefix_len, 1);
2953-
}
2954-
RETURN_NULL();
2955-
case REDIS_OPT_READ_TIMEOUT:
2956-
RETURN_DOUBLE(redis_sock->read_timeout);
2957-
case REDIS_OPT_SCAN:
2958-
RETURN_LONG(redis_sock->scan);
2959-
default:
2960-
RETURN_FALSE;
2961-
}
2940+
redis_getoption_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock);
29622941
}
29632942
/* }}} */
29642943

29652944
/* {{{ proto string Redis::setOption(string $option, mixed $value) */
29662945
PHP_METHOD(Redis, setOption) {
29672946
RedisSock *redis_sock;
2968-
zval *object;
2969-
long option, val_long;
2970-
char *val_str;
2971-
int val_len;
2972-
struct timeval read_tv;
29732947

2974-
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(),
2975-
"Ols", &object, redis_ce, &option,
2976-
&val_str, &val_len) == FAILURE)
2977-
{
2978-
RETURN_FALSE;
2979-
}
2980-
2981-
if (redis_sock_get(object, &redis_sock TSRMLS_CC, 0) < 0) {
2948+
if(redis_sock_get(getThis(), &redis_sock TSRMLS_CC, 0)<0) {
29822949
RETURN_FALSE;
29832950
}
29842951

2985-
switch(option) {
2986-
case REDIS_OPT_SERIALIZER:
2987-
val_long = atol(val_str);
2988-
if(val_long == REDIS_SERIALIZER_NONE
2989-
#ifdef HAVE_REDIS_IGBINARY
2990-
|| val_long == REDIS_SERIALIZER_IGBINARY
2991-
#endif
2992-
|| val_long == REDIS_SERIALIZER_PHP) {
2993-
redis_sock->serializer = val_long;
2994-
RETURN_TRUE;
2995-
} else {
2996-
RETURN_FALSE;
2997-
}
2998-
break;
2999-
case REDIS_OPT_PREFIX:
3000-
if(redis_sock->prefix) {
3001-
efree(redis_sock->prefix);
3002-
}
3003-
if(val_len == 0) {
3004-
redis_sock->prefix = NULL;
3005-
redis_sock->prefix_len = 0;
3006-
} else {
3007-
redis_sock->prefix_len = val_len;
3008-
redis_sock->prefix = ecalloc(1+val_len, 1);
3009-
memcpy(redis_sock->prefix, val_str, val_len);
3010-
}
3011-
RETURN_TRUE;
3012-
case REDIS_OPT_READ_TIMEOUT:
3013-
redis_sock->read_timeout = atof(val_str);
3014-
if(redis_sock->stream) {
3015-
read_tv.tv_sec = (time_t)redis_sock->read_timeout;
3016-
read_tv.tv_usec = (int)((redis_sock->read_timeout -
3017-
read_tv.tv_sec) * 1000000);
3018-
php_stream_set_option(redis_sock->stream,
3019-
PHP_STREAM_OPTION_READ_TIMEOUT, 0,
3020-
&read_tv);
3021-
}
3022-
RETURN_TRUE;
3023-
case REDIS_OPT_SCAN:
3024-
val_long = atol(val_str);
3025-
if(val_long==REDIS_SCAN_NORETRY || val_long==REDIS_SCAN_RETRY) {
3026-
redis_sock->scan = val_long;
3027-
RETURN_TRUE;
3028-
}
3029-
RETURN_FALSE;
3030-
break;
3031-
default:
3032-
RETURN_FALSE;
3033-
}
2952+
redis_setoption_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock);
30342953
}
30352954
/* }}} */
30362955

@@ -3691,99 +3610,38 @@ PHP_METHOD(Redis, migrate) {
36913610

36923611
/* {{{ proto Redis::_prefix(key) */
36933612
PHP_METHOD(Redis, _prefix) {
3694-
zval *object;
36953613
RedisSock *redis_sock;
3696-
char *key;
3697-
int key_len;
36983614

3699-
// Parse our arguments
3700-
if(zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os",
3701-
&object, redis_ce, &key, &key_len)
3702-
== FAILURE)
3703-
{
3704-
RETURN_FALSE;
3705-
}
3706-
3707-
// Grab socket
3708-
if(redis_sock_get(object, &redis_sock TSRMLS_CC, 0) < 0) {
3615+
if(redis_sock_get(getThis(), &redis_sock TSRMLS_CC, 0)<0) {
37093616
RETURN_FALSE;
37103617
}
37113618

3712-
/* Prefix our key if we need to */
3713-
if(redis_sock->prefix != NULL && redis_sock->prefix_len > 0) {
3714-
redis_key_prefix(redis_sock, &key, &key_len);
3715-
RETURN_STRINGL(key, key_len, 0);
3716-
} else {
3717-
RETURN_STRINGL(key, key_len, 1);
3718-
}
3619+
redis_prefix_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock);
37193620
}
37203621

37213622
/* {{{ proto Redis::_serialize(value) */
37223623
PHP_METHOD(Redis, _serialize) {
3723-
zval *object;
37243624
RedisSock *redis_sock;
3725-
zval *z_val;
3726-
char *val;
3727-
int val_len, val_free;
3728-
3729-
/* Parse arguments */
3730-
if(zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oz",
3731-
&object, redis_ce, &z_val) == FAILURE)
3732-
{
3733-
RETURN_FALSE;
3734-
}
37353625

3736-
/* Grab socket */
3737-
if(redis_sock_get(object, &redis_sock TSRMLS_CC, 0) < 0) {
3626+
// Grab socket
3627+
if(redis_sock_get(getThis(), &redis_sock TSRMLS_CC, 0) < 0) {
37383628
RETURN_FALSE;
37393629
}
37403630

3741-
// Serialize, which will return a value even if no serializer is set
3742-
redis_serialize(redis_sock, z_val, &val, &val_len TSRMLS_CC);
3743-
3744-
// Return serialized value. Tell PHP to make a copy as some can be
3745-
// interned.
3746-
RETVAL_STRINGL(val, val_len, 1);
3747-
if(val_free) STR_FREE(val);
3631+
redis_serialize_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock);
37483632
}
37493633

37503634
/* {{{ proto Redis::_unserialize(value) */
37513635
PHP_METHOD(Redis, _unserialize) {
3752-
zval *object;
37533636
RedisSock *redis_sock;
3754-
char *value;
3755-
int value_len;
3756-
3757-
// Parse our arguments
3758-
if(zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os",
3759-
&object, redis_ce, &value, &value_len)
3760-
== FAILURE)
3761-
{
3762-
RETURN_FALSE;
3763-
}
37643637

37653638
// Grab socket
3766-
if(redis_sock_get(object, &redis_sock TSRMLS_CC, 0) < 0) {
3639+
if(redis_sock_get(getThis(), &redis_sock TSRMLS_CC, 0) < 0) {
37673640
RETURN_FALSE;
37683641
}
37693642

3770-
/* We only need to attempt unserialization if we have a serializer running */
3771-
if(redis_sock->serializer != REDIS_SERIALIZER_NONE) {
3772-
zval *z_ret = NULL;
3773-
if(redis_unserialize(redis_sock, value, value_len, &z_ret
3774-
TSRMLS_CC) == 0)
3775-
{
3776-
// Badly formed input, throw an execption
3777-
zend_throw_exception(redis_exception_ce,
3778-
"Invalid serialized data, or unserialization error",
3779-
0 TSRMLS_CC);
3780-
RETURN_FALSE;
3781-
}
3782-
RETURN_ZVAL(z_ret, 0, 1);
3783-
} else {
3784-
// Just return the value that was passed to us
3785-
RETURN_STRINGL(value, value_len, 1);
3786-
}
3643+
redis_unserialize_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock,
3644+
redis_exception_ce);
37873645
}
37883646

37893647
/* {{{ proto Redis::getLastError() */

0 commit comments

Comments
 (0)