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