diff options
Diffstat (limited to 'redis.c')
-rw-r--r-- | redis.c | 70 |
1 files changed, 65 insertions, 5 deletions
@@ -16,6 +16,7 @@ | Original author: Alfonso Jimenez <yo@alfonsojimenez.com> | | Maintainer: Nicolas Favre-Felix <n.favre-felix@owlient.eu> | | Maintainer: Nasreddine Bouafif <n.bouafif@owlient.eu> | + | Maintainer: Michael Grunder <michael.grunder@gmail.com | +----------------------------------------------------------------------+ */ @@ -227,6 +228,7 @@ static zend_function_entry redis_functions[] = { PHP_ME(Redis, _prefix, NULL, ZEND_ACC_PUBLIC) PHP_ME(Redis, _unserialize, NULL, ZEND_ACC_PUBLIC) + PHP_ME(Redis, client, NULL, ZEND_ACC_PUBLIC) /* options */ PHP_ME(Redis, getOption, NULL, ZEND_ACC_PUBLIC) @@ -554,7 +556,7 @@ PHP_METHOD(Redis,__destruct) { } } -/* {{{ proto boolean Redis::connect(string host, int port [, double timeout]) +/* {{{ proto boolean Redis::connect(string host, int port [, double timeout [, long retry_interval]]) */ PHP_METHOD(Redis, connect) { @@ -590,6 +592,7 @@ PHPAPI int redis_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) { int host_len, id; char *host = NULL; long port = -1; + long retry_interval = 0; char *persistent_id = NULL; int persistent_id_len = -1; @@ -602,9 +605,10 @@ PHPAPI int redis_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) { persistent = 0; #endif - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os|lds", + if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os|ldsl", &object, redis_ce, &host, &host_len, &port, - &timeout, &persistent_id, &persistent_id_len) == FAILURE) { + &timeout, &persistent_id, &persistent_id_len, + &retry_interval) == FAILURE) { return FAILURE; } @@ -613,6 +617,11 @@ PHPAPI int redis_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) { return FAILURE; } + if (retry_interval < 0L || retry_interval > INT_MAX) { + zend_throw_exception(redis_exception_ce, "Invalid retry interval", 0 TSRMLS_CC); + return FAILURE; + } + if(port == -1 && host_len && host[0] != '/') { /* not unix socket, set to default value */ port = 6379; } @@ -629,7 +638,7 @@ PHPAPI int redis_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) { zend_clear_exception(TSRMLS_C); /* clear exception triggered by non-existent socket during connect(). */ } - redis_sock = redis_sock_create(host, host_len, port, timeout, persistent, persistent_id); + redis_sock = redis_sock_create(host, host_len, port, timeout, persistent, persistent_id, retry_interval); if (redis_sock_server_open(redis_sock, 1 TSRMLS_CC) < 0) { redis_free_socket(redis_sock); @@ -6456,5 +6465,56 @@ PHP_METHOD(Redis, getAuth) { } } -/* vim: set tabstop=4 softtabstop=4 noexpandtab shiftwidth=4: */ +/* + * $redis->client('list'); + * $redis->client('kill', <ip:port>); + * $redis->client('setname', <name>); + * $redis->client('getname'); + */ +PHP_METHOD(Redis, client) { + zval *object; + RedisSock *redis_sock; + char *cmd, *opt=NULL, *arg=NULL; + int cmd_len, opt_len, arg_len; + + // Parse our method parameters + if(zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os|s", + &object, redis_ce, &opt, &opt_len, &arg, &arg_len) == FAILURE) + { + RETURN_FALSE; + } + + // Grab our socket + if(redis_sock_get(object, &redis_sock TSRMLS_CC, 0) < 0) { + RETURN_FALSE; + } + + // Build our CLIENT command + if(ZEND_NUM_ARGS() == 2) { + cmd_len = redis_cmd_format_static(&cmd, "CLIENT", "ss", opt, opt_len, + arg, arg_len); + } else { + cmd_len = redis_cmd_format_static(&cmd, "CLIENT", "s", opt, opt_len); + } + + // Handle CLIENT LIST specifically + int is_list = !strncasecmp(opt, "list", 4); + + // Execute our queue command + REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len); + + // We handle CLIENT LIST with a custom response function + if(!strncasecmp(opt, "list", 4)) { + IF_ATOMIC() { + redis_client_list_reply(INTERNAL_FUNCTION_PARAM_PASSTHRU,redis_sock,NULL); + } + REDIS_PROCESS_RESPONSE(redis_client_list_reply); + } else { + IF_ATOMIC() { + redis_read_variant_reply(INTERNAL_FUNCTION_PARAM_PASSTHRU,redis_sock,NULL); + } + REDIS_PROCESS_RESPONSE(redis_read_variant_reply); + } +} +/* vim: set tabstop=4 softtabstops=4 noexpandtab shiftwidth=4: */ |