@@ -130,6 +130,7 @@ static zend_function_entry redis_functions[] = {
130
130
PHP_ME (Redis , mset , NULL , ZEND_ACC_PUBLIC )
131
131
PHP_ME (Redis , msetnx , NULL , ZEND_ACC_PUBLIC )
132
132
PHP_ME (Redis , rpoplpush , NULL , ZEND_ACC_PUBLIC )
133
+ PHP_ME (Redis , brpoplpush , NULL , ZEND_ACC_PUBLIC )
133
134
PHP_ME (Redis , zAdd , NULL , ZEND_ACC_PUBLIC )
134
135
PHP_ME (Redis , zDelete , NULL , ZEND_ACC_PUBLIC )
135
136
PHP_ME (Redis , zRange , NULL , ZEND_ACC_PUBLIC )
@@ -3076,14 +3077,37 @@ PHP_METHOD(Redis, msetnx) {
3076
3077
}
3077
3078
/* }}} */
3078
3079
3080
+ PHPAPI void common_rpoplpush (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock ,
3081
+ char * srckey , int srckey_len , char * dstkey , int dstkey_len , int timeout ) {
3082
+
3083
+ char * cmd ;
3084
+ int cmd_len ;
3085
+
3086
+ int srckey_free = redis_key_prefix (redis_sock , & srckey , & srckey_len TSRMLS_CC );
3087
+ int dstkey_free = redis_key_prefix (redis_sock , & dstkey , & dstkey_len TSRMLS_CC );
3088
+ if (timeout < 0 ) {
3089
+ cmd_len = redis_cmd_format_static (& cmd , "RPOPLPUSH" , "ss" , srckey , srckey_len , dstkey , dstkey_len );
3090
+ } else {
3091
+ cmd_len = redis_cmd_format_static (& cmd , "BRPOPLPUSH" , "ssd" , srckey , srckey_len , dstkey , dstkey_len , timeout );
3092
+ }
3093
+ if (srckey_free ) efree (srckey );
3094
+ if (dstkey_free ) efree (dstkey );
3095
+
3096
+ REDIS_PROCESS_REQUEST (redis_sock , cmd , cmd_len );
3097
+ IF_ATOMIC () {
3098
+ redis_string_response (INTERNAL_FUNCTION_PARAM_PASSTHRU , redis_sock , NULL , NULL );
3099
+ }
3100
+ REDIS_PROCESS_RESPONSE (redis_string_response );
3101
+
3102
+ }
3079
3103
3080
3104
/* {{{ proto string Redis::rpoplpush(string srckey, string dstkey)
3081
3105
*/
3082
3106
PHP_METHOD (Redis , rpoplpush )
3083
3107
{
3084
3108
zval * object ;
3085
3109
RedisSock * redis_sock ;
3086
- char * srckey = NULL , * dstkey = NULL , * cmd ;
3110
+ char * srckey = NULL , * dstkey = NULL ;
3087
3111
int srckey_len , dstkey_len , cmd_len ;
3088
3112
3089
3113
if (zend_parse_method_parameters (ZEND_NUM_ARGS () TSRMLS_CC , getThis (), "Oss" ,
@@ -3096,19 +3120,34 @@ PHP_METHOD(Redis, rpoplpush)
3096
3120
RETURN_FALSE ;
3097
3121
}
3098
3122
3099
- int srckey_free = redis_key_prefix (redis_sock , & srckey , & srckey_len TSRMLS_CC );
3100
- int dstkey_free = redis_key_prefix (redis_sock , & dstkey , & dstkey_len TSRMLS_CC );
3101
- cmd_len = redis_cmd_format_static (& cmd , "RPOPLPUSH" , "ss" , srckey , srckey_len , dstkey , dstkey_len );
3102
- if (srckey_free ) efree (srckey );
3103
- if (dstkey_free ) efree (dstkey );
3123
+ common_rpoplpush (INTERNAL_FUNCTION_PARAM_PASSTHRU , redis_sock , srckey , srckey_len , dstkey , dstkey_len , -1 );
3124
+ }
3125
+ /* }}} */
3104
3126
3105
- REDIS_PROCESS_REQUEST (redis_sock , cmd , cmd_len );
3106
- IF_ATOMIC () {
3107
- redis_string_response (INTERNAL_FUNCTION_PARAM_PASSTHRU , redis_sock , NULL , NULL );
3108
- }
3109
- REDIS_PROCESS_RESPONSE (redis_string_response );
3127
+ /* {{{ proto string Redis::brpoplpush(string srckey, string dstkey)
3128
+ */
3129
+ PHP_METHOD (Redis , brpoplpush )
3130
+ {
3131
+ zval * object ;
3132
+ RedisSock * redis_sock ;
3133
+ char * srckey = NULL , * dstkey = NULL ;
3134
+ int srckey_len , dstkey_len ;
3135
+ long timeout = 0 ;
3136
+
3137
+ if (zend_parse_method_parameters (ZEND_NUM_ARGS () TSRMLS_CC , getThis (), "Ossl" ,
3138
+ & object , redis_ce , & srckey , & srckey_len ,
3139
+ & dstkey , & dstkey_len , & timeout ) == FAILURE ) {
3140
+ RETURN_FALSE ;
3141
+ }
3142
+
3143
+ if (redis_sock_get (object , & redis_sock TSRMLS_CC ) < 0 ) {
3144
+ RETURN_FALSE ;
3145
+ }
3146
+
3147
+ common_rpoplpush (INTERNAL_FUNCTION_PARAM_PASSTHRU , redis_sock , srckey , srckey_len , dstkey , dstkey_len , timeout );
3110
3148
}
3111
3149
/* }}} */
3150
+
3112
3151
/* {{{ proto long Redis::zAdd(string key, int score, string value)
3113
3152
*/
3114
3153
PHP_METHOD (Redis , zAdd ) {
0 commit comments