Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/phpredis/phpredis.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'redis.c')
-rw-r--r--redis.c152
1 files changed, 152 insertions, 0 deletions
diff --git a/redis.c b/redis.c
index bf92513e..d274e678 100644
--- a/redis.c
+++ b/redis.c
@@ -235,6 +235,16 @@ static zend_function_entry redis_functions[] = {
/* config */
PHP_ME(Redis, config, NULL, ZEND_ACC_PUBLIC)
+ /* introspection */
+ PHP_ME(Redis, getHost, NULL, ZEND_ACC_PUBLIC)
+ PHP_ME(Redis, getPort, NULL, ZEND_ACC_PUBLIC)
+ PHP_ME(Redis, getDBNum, NULL, ZEND_ACC_PUBLIC)
+ PHP_ME(Redis, getTimeout, NULL, ZEND_ACC_PUBLIC)
+ PHP_ME(Redis, getReadTimeout, NULL, ZEND_ACC_PUBLIC)
+ PHP_ME(Redis, getPersistentID, NULL, ZEND_ACC_PUBLIC)
+ PHP_ME(Redis, getAuth, NULL, ZEND_ACC_PUBLIC)
+ PHP_ME(Redis, isConnected, NULL, ZEND_ACC_PUBLIC)
+
/* aliases */
PHP_MALIAS(Redis, open, connect, NULL, ZEND_ACC_PUBLIC)
PHP_MALIAS(Redis, popen, pconnect, NULL, ZEND_ACC_PUBLIC)
@@ -385,6 +395,26 @@ PHPAPI int redis_sock_get(zval *id, RedisSock **redis_sock TSRMLS_DC, int no_thr
}
/**
+ * redis_sock_get_direct
+ * Returns our attached RedisSock pointer if we're connected
+ */
+PHPAPI RedisSock *redis_sock_get_connected(INTERNAL_FUNCTION_PARAMETERS TSRMLS_DC) {
+ zval *object;
+ RedisSock *redis_sock;
+
+ // If we can't grab our object, or get a socket, or we're not connected, return NULL
+ if((zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &object, redis_ce) == FAILURE) ||
+ (redis_sock_get(object, &redis_sock TSRMLS_CC, 1) < 0) || redis_sock->status != REDIS_SOCK_STATUS_CONNECTED)
+ {
+ return NULL;
+ }
+
+ // Return our socket
+ return redis_sock;
+}
+
+
+/**
* PHP_MINIT_FUNCTION
*/
PHP_MINIT_FUNCTION(redis)
@@ -3289,6 +3319,10 @@ PHP_METHOD(Redis, auth) {
cmd_len = redis_cmd_format_static(&cmd, "AUTH", "s", password, password_len);
+ // Free previously stored auth if we have one, and store this password
+ if(redis_sock->auth) efree(redis_sock->auth);
+ redis_sock->auth = estrndup(password, password_len);
+
REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
IF_ATOMIC() {
redis_boolean_response(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL);
@@ -6304,5 +6338,123 @@ PHP_METHOD(Redis, time) {
REDIS_PROCESS_RESPONSE(redis_sock_read_multibulk_reply_raw);
}
+/*
+ * Introspection stuff
+ */
+
+/*
+ * {{{ proto Redis::IsConnected
+ */
+PHP_METHOD(Redis, isConnected) {
+ RedisSock *redis_sock;
+
+ if((redis_sock = redis_sock_get_connected(INTERNAL_FUNCTION_PARAM_PASSTHRU TSRMLS_CC))) {
+ RETURN_TRUE;
+ } else {
+ RETURN_FALSE;
+ }
+}
+
+/*
+ * {{{ proto Redis::getHost()
+ */
+PHP_METHOD(Redis, getHost) {
+ RedisSock *redis_sock;
+
+ if((redis_sock = redis_sock_get_connected(INTERNAL_FUNCTION_PARAM_PASSTHRU TSRMLS_CC))) {
+ RETURN_STRING(redis_sock->host, 1);
+ } else {
+ RETURN_FALSE;
+ }
+}
+
+/*
+ * {{{ proto Redis::getPort()
+ */
+PHP_METHOD(Redis, getPort) {
+ RedisSock *redis_sock;
+
+ if((redis_sock = redis_sock_get_connected(INTERNAL_FUNCTION_PARAM_PASSTHRU TSRMLS_CC))) {
+ // Return our port
+ RETURN_LONG(redis_sock->port);
+ } else {
+ RETURN_FALSE;
+ }
+}
+
+/*
+ * {{{ proto Redis::getDBNum
+ */
+PHP_METHOD(Redis, getDBNum) {
+ RedisSock *redis_sock;
+
+ if((redis_sock = redis_sock_get_connected(INTERNAL_FUNCTION_PARAM_PASSTHRU TSRMLS_CC))) {
+ // Return our db number
+ RETURN_LONG(redis_sock->dbNumber);
+ } else {
+ RETURN_FALSE;
+ }
+}
+
+/*
+ * {{{ proto Redis::getTimeout
+ */
+PHP_METHOD(Redis, getTimeout) {
+ RedisSock *redis_sock;
+
+ if((redis_sock = redis_sock_get_connected(INTERNAL_FUNCTION_PARAM_PASSTHRU TSRMLS_CC))) {
+ RETURN_DOUBLE(redis_sock->timeout);
+ } else {
+ RETURN_FALSE;
+ }
+}
+
+/*
+ * {{{ proto Redis::getReadTimeout
+ */
+PHP_METHOD(Redis, getReadTimeout) {
+ RedisSock *redis_sock;
+
+ if((redis_sock = redis_sock_get_connected(INTERNAL_FUNCTION_PARAM_PASSTHRU TSRMLS_CC))) {
+ RETURN_DOUBLE(redis_sock->read_timeout);
+ } else {
+ RETURN_FALSE;
+ }
+}
+
+/*
+ * {{{ proto Redis::getPersistentID
+ */
+PHP_METHOD(Redis, getPersistentID) {
+ RedisSock *redis_sock;
+
+ if((redis_sock = redis_sock_get_connected(INTERNAL_FUNCTION_PARAM_PASSTHRU TSRMLS_CC))) {
+ if(redis_sock->persistent_id != NULL) {
+ RETURN_STRING(redis_sock->persistent_id, 1);
+ } else {
+ RETURN_NULL();
+ }
+ } else {
+ RETURN_FALSE;
+ }
+}
+
+/*
+ * {{{ proto Redis::getAuth
+ */
+PHP_METHOD(Redis, getAuth) {
+ RedisSock *redis_sock;
+
+ if((redis_sock = redis_sock_get_connected(INTERNAL_FUNCTION_PARAM_PASSTHRU TSRMLS_CC))) {
+ if(redis_sock->auth != NULL) {
+ RETURN_STRING(redis_sock->auth, 1);
+ } else {
+ RETURN_NULL();
+ }
+ } else {
+ RETURN_FALSE;
+ }
+}
+
/* vim: set tabstop=4 softtabstop=4 noexpandtab shiftwidth=4: */