@@ -236,6 +236,16 @@ static zend_function_entry redis_functions[] = {
236236 /* config */
237237 PHP_ME (Redis , config , NULL , ZEND_ACC_PUBLIC )
238238
239+ /* introspection */
240+ PHP_ME (Redis , getHost , NULL , ZEND_ACC_PUBLIC )
241+ PHP_ME (Redis , getPort , NULL , ZEND_ACC_PUBLIC )
242+ PHP_ME (Redis , getDBNum , NULL , ZEND_ACC_PUBLIC )
243+ PHP_ME (Redis , getTimeout , NULL , ZEND_ACC_PUBLIC )
244+ PHP_ME (Redis , getReadTimeout , NULL , ZEND_ACC_PUBLIC )
245+ PHP_ME (Redis , getPersistentID , NULL , ZEND_ACC_PUBLIC )
246+ PHP_ME (Redis , getAuth , NULL , ZEND_ACC_PUBLIC )
247+ PHP_ME (Redis , isConnected , NULL , ZEND_ACC_PUBLIC )
248+
239249 /* aliases */
240250 PHP_MALIAS (Redis , open , connect , NULL , ZEND_ACC_PUBLIC )
241251 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
385395 return Z_LVAL_PP (socket );
386396}
387397
398+ /**
399+ * redis_sock_get_direct
400+ * Returns our attached RedisSock pointer if we're connected
401+ */
402+ PHPAPI RedisSock * redis_sock_get_connected (INTERNAL_FUNCTION_PARAMETERS TSRMLS_DC ) {
403+ zval * object ;
404+ RedisSock * redis_sock ;
405+
406+ // If we can't grab our object, or get a socket, or we're not connected, return NULL
407+ if ((zend_parse_method_parameters (ZEND_NUM_ARGS () TSRMLS_CC , getThis (), "O" , & object , redis_ce ) == FAILURE ) ||
408+ (redis_sock_get (object , & redis_sock TSRMLS_CC , 1 ) < 0 ) || redis_sock -> status != REDIS_SOCK_STATUS_CONNECTED )
409+ {
410+ return NULL ;
411+ }
412+
413+ // Return our socket
414+ return redis_sock ;
415+ }
416+
417+
388418/**
389419 * PHP_MINIT_FUNCTION
390420 */
@@ -3297,6 +3327,10 @@ PHP_METHOD(Redis, auth) {
32973327
32983328 cmd_len = redis_cmd_format_static (& cmd , "AUTH" , "s" , password , password_len );
32993329
3330+ // Free previously stored auth if we have one, and store this password
3331+ if (redis_sock -> auth ) efree (redis_sock -> auth );
3332+ redis_sock -> auth = estrndup (password , password_len );
3333+
33003334 REDIS_PROCESS_REQUEST (redis_sock , cmd , cmd_len );
33013335 IF_ATOMIC () {
33023336 redis_boolean_response (INTERNAL_FUNCTION_PARAM_PASSTHRU , redis_sock , NULL , NULL );
@@ -6312,6 +6346,124 @@ PHP_METHOD(Redis, time) {
63126346 REDIS_PROCESS_RESPONSE (redis_sock_read_multibulk_reply_raw );
63136347}
63146348
6349+ /*
6350+ * Introspection stuff
6351+ */
6352+
6353+ /*
6354+ * {{{ proto Redis::IsConnected
6355+ */
6356+ PHP_METHOD (Redis , isConnected ) {
6357+ RedisSock * redis_sock ;
6358+
6359+ if ((redis_sock = redis_sock_get_connected (INTERNAL_FUNCTION_PARAM_PASSTHRU TSRMLS_CC ))) {
6360+ RETURN_TRUE ;
6361+ } else {
6362+ RETURN_FALSE ;
6363+ }
6364+ }
6365+
6366+ /*
6367+ * {{{ proto Redis::getHost()
6368+ */
6369+ PHP_METHOD (Redis , getHost ) {
6370+ RedisSock * redis_sock ;
6371+
6372+ if ((redis_sock = redis_sock_get_connected (INTERNAL_FUNCTION_PARAM_PASSTHRU TSRMLS_CC ))) {
6373+ RETURN_STRING (redis_sock -> host , 1 );
6374+ } else {
6375+ RETURN_FALSE ;
6376+ }
6377+ }
6378+
6379+ /*
6380+ * {{{ proto Redis::getPort()
6381+ */
6382+ PHP_METHOD (Redis , getPort ) {
6383+ RedisSock * redis_sock ;
6384+
6385+ if ((redis_sock = redis_sock_get_connected (INTERNAL_FUNCTION_PARAM_PASSTHRU TSRMLS_CC ))) {
6386+ // Return our port
6387+ RETURN_LONG (redis_sock -> port );
6388+ } else {
6389+ RETURN_FALSE ;
6390+ }
6391+ }
6392+
6393+ /*
6394+ * {{{ proto Redis::getDBNum
6395+ */
6396+ PHP_METHOD (Redis , getDBNum ) {
6397+ RedisSock * redis_sock ;
6398+
6399+ if ((redis_sock = redis_sock_get_connected (INTERNAL_FUNCTION_PARAM_PASSTHRU TSRMLS_CC ))) {
6400+ // Return our db number
6401+ RETURN_LONG (redis_sock -> dbNumber );
6402+ } else {
6403+ RETURN_FALSE ;
6404+ }
6405+ }
6406+
6407+ /*
6408+ * {{{ proto Redis::getTimeout
6409+ */
6410+ PHP_METHOD (Redis , getTimeout ) {
6411+ RedisSock * redis_sock ;
6412+
6413+ if ((redis_sock = redis_sock_get_connected (INTERNAL_FUNCTION_PARAM_PASSTHRU TSRMLS_CC ))) {
6414+ RETURN_DOUBLE (redis_sock -> timeout );
6415+ } else {
6416+ RETURN_FALSE ;
6417+ }
6418+ }
6419+
6420+ /*
6421+ * {{{ proto Redis::getReadTimeout
6422+ */
6423+ PHP_METHOD (Redis , getReadTimeout ) {
6424+ RedisSock * redis_sock ;
6425+
6426+ if ((redis_sock = redis_sock_get_connected (INTERNAL_FUNCTION_PARAM_PASSTHRU TSRMLS_CC ))) {
6427+ RETURN_DOUBLE (redis_sock -> read_timeout );
6428+ } else {
6429+ RETURN_FALSE ;
6430+ }
6431+ }
6432+
6433+ /*
6434+ * {{{ proto Redis::getPersistentID
6435+ */
6436+ PHP_METHOD (Redis , getPersistentID ) {
6437+ RedisSock * redis_sock ;
6438+
6439+ if ((redis_sock = redis_sock_get_connected (INTERNAL_FUNCTION_PARAM_PASSTHRU TSRMLS_CC ))) {
6440+ if (redis_sock -> persistent_id != NULL ) {
6441+ RETURN_STRING (redis_sock -> persistent_id , 1 );
6442+ } else {
6443+ RETURN_NULL ();
6444+ }
6445+ } else {
6446+ RETURN_FALSE ;
6447+ }
6448+ }
6449+
6450+ /*
6451+ * {{{ proto Redis::getAuth
6452+ */
6453+ PHP_METHOD (Redis , getAuth ) {
6454+ RedisSock * redis_sock ;
6455+
6456+ if ((redis_sock = redis_sock_get_connected (INTERNAL_FUNCTION_PARAM_PASSTHRU TSRMLS_CC ))) {
6457+ if (redis_sock -> auth != NULL ) {
6458+ RETURN_STRING (redis_sock -> auth , 1 );
6459+ } else {
6460+ RETURN_NULL ();
6461+ }
6462+ } else {
6463+ RETURN_FALSE ;
6464+ }
6465+ }
6466+
63156467/*
63166468 * $redis->client('list');
63176469 * $redis->client('kill', <ip:port>);
0 commit comments