@@ -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