@@ -235,6 +235,16 @@ static zend_function_entry redis_functions[] = {
235235     /* config */ 
236236     PHP_ME (Redis , config , NULL , ZEND_ACC_PUBLIC )
237237
238+      /* introspection */ 
239+      PHP_ME (Redis , getHost , NULL , ZEND_ACC_PUBLIC )
240+      PHP_ME (Redis , getPort , NULL , ZEND_ACC_PUBLIC )
241+      PHP_ME (Redis , getDBNum , NULL , ZEND_ACC_PUBLIC )
242+      PHP_ME (Redis , getTimeout , NULL , ZEND_ACC_PUBLIC )
243+      PHP_ME (Redis , getReadTimeout , NULL , ZEND_ACC_PUBLIC )
244+      PHP_ME (Redis , getPersistentID , NULL , ZEND_ACC_PUBLIC )
245+      PHP_ME (Redis , getAuth , NULL , ZEND_ACC_PUBLIC )
246+      PHP_ME (Redis , isConnected , NULL , ZEND_ACC_PUBLIC )
247+ 
238248     /* aliases */ 
239249     PHP_MALIAS (Redis , open , connect , NULL , ZEND_ACC_PUBLIC )
240250     PHP_MALIAS (Redis , popen , pconnect , NULL , ZEND_ACC_PUBLIC )
@@ -384,6 +394,26 @@ PHPAPI int redis_sock_get(zval *id, RedisSock **redis_sock TSRMLS_DC, int no_thr
384394    return  Z_LVAL_PP (socket );
385395}
386396
397+ /** 
398+  * redis_sock_get_direct 
399+  * Returns our attached RedisSock pointer if we're connected 
400+  */ 
401+ PHPAPI  RedisSock  * redis_sock_get_connected (INTERNAL_FUNCTION_PARAMETERS  TSRMLS_DC ) {
402+     zval  * object ;
403+     RedisSock  * redis_sock ;
404+ 
405+     // If we can't grab our object, or get a socket, or we're not connected, return NULL 
406+     if ((zend_parse_method_parameters (ZEND_NUM_ARGS () TSRMLS_CC , getThis (), "O" , & object , redis_ce ) ==  FAILURE ) || 
407+        (redis_sock_get (object , & redis_sock  TSRMLS_CC , 1 ) <  0 ) ||  redis_sock -> status  !=  REDIS_SOCK_STATUS_CONNECTED )
408+     {
409+         return  NULL ;
410+     }
411+ 
412+     // Return our socket 
413+     return  redis_sock ;
414+ }
415+ 
416+ 
387417/** 
388418 * PHP_MINIT_FUNCTION 
389419 */ 
@@ -3289,6 +3319,10 @@ PHP_METHOD(Redis, auth) {
32893319
32903320    cmd_len  =  redis_cmd_format_static (& cmd , "AUTH" , "s" , password , password_len );
32913321
3322+     // Free previously stored auth if we have one, and store this password 
3323+     if (redis_sock -> auth ) efree (redis_sock -> auth );
3324+     redis_sock -> auth  =  estrndup (password , password_len );
3325+ 
32923326	REDIS_PROCESS_REQUEST (redis_sock , cmd , cmd_len );
32933327	IF_ATOMIC () {
32943328		redis_boolean_response (INTERNAL_FUNCTION_PARAM_PASSTHRU , redis_sock , NULL , NULL );
@@ -6304,5 +6338,123 @@ PHP_METHOD(Redis, time) {
63046338	REDIS_PROCESS_RESPONSE (redis_sock_read_multibulk_reply_raw );
63056339}
63066340
6341+ /* 
6342+  * Introspection stuff 
6343+  */ 
6344+ 
6345+ /* 
6346+  * {{{ proto Redis::IsConnected 
6347+  */ 
6348+ PHP_METHOD (Redis , isConnected ) {
6349+     RedisSock  * redis_sock ;
6350+ 
6351+     if ((redis_sock  =  redis_sock_get_connected (INTERNAL_FUNCTION_PARAM_PASSTHRU  TSRMLS_CC ))) {
6352+         RETURN_TRUE ;
6353+     } else  {
6354+         RETURN_FALSE ;
6355+     }
6356+ }
6357+ 
6358+ /* 
6359+  * {{{ proto Redis::getHost() 
6360+  */ 
6361+ PHP_METHOD (Redis , getHost ) {
6362+     RedisSock  * redis_sock ;
6363+ 
6364+     if ((redis_sock  =  redis_sock_get_connected (INTERNAL_FUNCTION_PARAM_PASSTHRU  TSRMLS_CC ))) {
6365+         RETURN_STRING (redis_sock -> host , 1 );
6366+     } else  {
6367+         RETURN_FALSE ;
6368+     }
6369+ }
6370+ 
6371+ /* 
6372+  * {{{ proto Redis::getPort() 
6373+  */ 
6374+ PHP_METHOD (Redis , getPort ) {
6375+     RedisSock  * redis_sock ;
6376+ 
6377+     if ((redis_sock  =  redis_sock_get_connected (INTERNAL_FUNCTION_PARAM_PASSTHRU  TSRMLS_CC ))) {
6378+         // Return our port 
6379+         RETURN_LONG (redis_sock -> port );
6380+     } else  {
6381+         RETURN_FALSE ;
6382+     }
6383+ }
6384+ 
6385+ /* 
6386+  * {{{ proto Redis::getDBNum 
6387+  */ 
6388+ PHP_METHOD (Redis , getDBNum ) {
6389+     RedisSock  * redis_sock ;
6390+ 
6391+     if ((redis_sock  =  redis_sock_get_connected (INTERNAL_FUNCTION_PARAM_PASSTHRU  TSRMLS_CC ))) {
6392+         // Return our db number 
6393+         RETURN_LONG (redis_sock -> dbNumber );
6394+     } else  {
6395+         RETURN_FALSE ;
6396+     }
6397+ }
6398+ 
6399+ /* 
6400+  * {{{ proto Redis::getTimeout 
6401+  */ 
6402+ PHP_METHOD (Redis , getTimeout ) {
6403+     RedisSock  * redis_sock ;
6404+ 
6405+     if ((redis_sock  =  redis_sock_get_connected (INTERNAL_FUNCTION_PARAM_PASSTHRU  TSRMLS_CC ))) {
6406+         RETURN_DOUBLE (redis_sock -> timeout );
6407+     } else  {
6408+         RETURN_FALSE ;
6409+     }
6410+ }
6411+ 
6412+ /* 
6413+  * {{{ proto Redis::getReadTimeout 
6414+  */ 
6415+ PHP_METHOD (Redis , getReadTimeout ) {
6416+     RedisSock  * redis_sock ;
6417+ 
6418+     if ((redis_sock  =  redis_sock_get_connected (INTERNAL_FUNCTION_PARAM_PASSTHRU  TSRMLS_CC ))) {
6419+         RETURN_DOUBLE (redis_sock -> read_timeout );
6420+     } else  {
6421+         RETURN_FALSE ;
6422+     }
6423+ }
6424+ 
6425+ /* 
6426+  * {{{ proto Redis::getPersistentID 
6427+  */ 
6428+ PHP_METHOD (Redis , getPersistentID ) {
6429+     RedisSock  * redis_sock ;
6430+ 
6431+     if ((redis_sock  =  redis_sock_get_connected (INTERNAL_FUNCTION_PARAM_PASSTHRU  TSRMLS_CC ))) {
6432+         if (redis_sock -> persistent_id  !=  NULL ) {
6433+             RETURN_STRING (redis_sock -> persistent_id , 1 );
6434+         } else  {
6435+             RETURN_NULL ();
6436+         }
6437+     } else  {
6438+         RETURN_FALSE ;
6439+     }
6440+ }
6441+ 
6442+ /* 
6443+  * {{{ proto Redis::getAuth 
6444+  */ 
6445+ PHP_METHOD (Redis , getAuth ) {
6446+     RedisSock  * redis_sock ;
6447+ 
6448+     if ((redis_sock  =  redis_sock_get_connected (INTERNAL_FUNCTION_PARAM_PASSTHRU  TSRMLS_CC ))) {
6449+         if (redis_sock -> auth  !=  NULL ) {
6450+             RETURN_STRING (redis_sock -> auth , 1 );
6451+         } else  {
6452+             RETURN_NULL ();
6453+         }
6454+     } else  {
6455+         RETURN_FALSE ;
6456+     }
6457+ }
6458+ 
63076459/* vim: set tabstop=4 softtabstop=4 noexpandtab shiftwidth=4: */ 
63086460
0 commit comments