@@ -235,6 +235,16 @@ static zend_function_entry redis_functions[] = {
235
235
/* config */
236
236
PHP_ME (Redis , config , NULL , ZEND_ACC_PUBLIC )
237
237
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
+
238
248
/* aliases */
239
249
PHP_MALIAS (Redis , open , connect , NULL , ZEND_ACC_PUBLIC )
240
250
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
384
394
return Z_LVAL_PP (socket );
385
395
}
386
396
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
+
387
417
/**
388
418
* PHP_MINIT_FUNCTION
389
419
*/
@@ -3289,6 +3319,10 @@ PHP_METHOD(Redis, auth) {
3289
3319
3290
3320
cmd_len = redis_cmd_format_static (& cmd , "AUTH" , "s" , password , password_len );
3291
3321
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
+
3292
3326
REDIS_PROCESS_REQUEST (redis_sock , cmd , cmd_len );
3293
3327
IF_ATOMIC () {
3294
3328
redis_boolean_response (INTERNAL_FUNCTION_PARAM_PASSTHRU , redis_sock , NULL , NULL );
@@ -6304,5 +6338,123 @@ PHP_METHOD(Redis, time) {
6304
6338
REDIS_PROCESS_RESPONSE (redis_sock_read_multibulk_reply_raw );
6305
6339
}
6306
6340
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
+
6307
6459
/* vim: set tabstop=4 softtabstop=4 noexpandtab shiftwidth=4: */
6308
6460
0 commit comments