@@ -771,9 +771,11 @@ PHP_METHOD(Redis,__destruct) {
771
771
772
772
// If we think we're in MULTI mode, send a discard
773
773
IF_MULTI () {
774
- // Discard any multi commands, and free any callbacks that have been
775
- // queued
776
- send_discard_static (redis_sock TSRMLS_CC );
774
+ IF_NOT_PIPELINE () {
775
+ // Discard any multi commands, and free any callbacks that have been
776
+ // queued
777
+ send_discard_static (redis_sock TSRMLS_CC );
778
+ }
777
779
free_reply_callbacks (redis_sock );
778
780
}
779
781
}
@@ -2243,9 +2245,8 @@ PHP_METHOD(Redis, multi)
2243
2245
{
2244
2246
2245
2247
RedisSock * redis_sock ;
2246
- char * cmd ;
2247
- int response_len , cmd_len ;
2248
- char * response ;
2248
+ char * cmd , * resp ;
2249
+ int cmd_len , resp_len ;
2249
2250
zval * object ;
2250
2251
zend_long multi_value = MULTI ;
2251
2252
@@ -2262,37 +2263,45 @@ PHP_METHOD(Redis, multi)
2262
2263
RETURN_FALSE ;
2263
2264
}
2264
2265
2265
- if (multi_value == MULTI || multi_value == PIPELINE ) {
2266
- redis_sock -> mode = multi_value ;
2267
- } else {
2268
- RETURN_FALSE ;
2269
- }
2270
-
2271
- redis_sock -> current = NULL ;
2272
-
2273
- IF_MULTI () {
2274
- cmd_len = redis_cmd_format_static (& cmd , "MULTI" , "" );
2275
-
2276
- SOCKET_WRITE_COMMAND (redis_sock , cmd , cmd_len )
2277
- efree (cmd );
2278
-
2279
- if ((response = redis_sock_read (redis_sock , & response_len TSRMLS_CC ))
2280
- == NULL )
2281
- {
2282
- RETURN_FALSE ;
2266
+ if (multi_value == PIPELINE ) {
2267
+ IF_PIPELINE () {
2268
+ php_error_docref (NULL TSRMLS_CC , E_WARNING ,
2269
+ "Already in pipeline mode" );
2270
+ } else {
2271
+ IF_MULTI () {
2272
+ php_error_docref (NULL TSRMLS_CC , E_ERROR ,
2273
+ "Can 't activate pipeline in multi mode!");
2274
+ RETURN_FALSE ;
2275
+ }
2276
+ free_reply_callbacks (redis_sock );
2277
+ REDIS_ENABLE_MODE (redis_
9E81
sock , PIPELINE );
2283
2278
}
2284
-
2285
- if (strncmp (response , "+OK" , 3 ) == 0 ) {
2286
- efree (response );
2287
- RETURN_ZVAL (getThis (), 1 , 0 );
2279
+ } else if (multi_value == MULTI ) {
2280
+ IF_MULTI () {
2281
+ php_error_docref (NULL TSRMLS_CC , E_WARNING ,
2282
+ "Already in multi mode" );
2283
+ } else {
2284
+ cmd_len = redis_cmd_format_static (& cmd , "MULTI" , "" );
2285
+ IF_PIPELINE () {
2286
+ PIPELINE_ENQUEUE_COMMAND (cmd , cmd_len );
2287
+ efree (cmd );
2288
+ } else {
2289
+ SOCKET_WRITE_COMMAND (redis_sock , cmd , cmd_len )
2290
+ efree (cmd );
2291
+ if ((resp = redis_sock_read (redis_sock , & resp_len TSRMLS_CC )) == NULL) {
2292
+ RETURN_FALSE ;
2293
+ } else if (strncmp (resp , "+OK" , 3 ) != 0 ) {
2294
+ efree (resp );
2295
+ RETURN_FALSE ;
2296
+ }
2297
+ efree (resp );
2298
+ }
2299
+ REDIS_ENABLE_MODE (redis_sock , MULTI );
2288
2300
}
2289
- efree ( response );
2301
+ } else {
2290
2302
RETURN_FALSE ;
2291
2303
}
2292
- IF_PIPELINE () {
2293
- free_reply_callbacks (redis_sock );
2294
- RETURN_ZVAL (getThis (), 1 , 0 );
2295
- }
2304
+ RETURN_ZVAL (getThis (), 1 , 0 );
2296
2305
}
2297
2306
2298
2307
/* discard */
@@ -2362,6 +2371,12 @@ PHP_METHOD(Redis, exec)
2362
2371
2363
2372
IF_MULTI () {
2364
2373
cmd_len = redis_cmd_format_static (& cmd , "EXEC" , "" );
2374
+ IF_PIPELINE () {
2375
+ PIPELINE_ENQUEUE_COMMAND (cmd , cmd_len );
2376
+ efree (cmd );
2377
+ REDIS_DISABLE_MODE (redis_sock , MULTI );
2378
+ RETURN_ZVAL (getThis (), 1 , 0 );
2379
+ }
2365
2380
SOCKET_WRITE_COMMAND (redis_sock , cmd , cmd_len )
2366
2381
efree (cmd );
2367
2382
@@ -2371,12 +2386,12 @@ PHP_METHOD(Redis, exec)
2371
2386
{
2372
2387
zval_dtor (return_value );
2373
2388
free_reply_callbacks (redis_sock );
2374
- redis_sock -> mode = ATOMIC ;
2389
+ REDIS_DISABLE_MODE ( redis_sock , MULTI ) ;
2375
2390
redis_sock -> watching = 0 ;
2376
2391
RETURN_FALSE ;
2377
2392
}
2378
2393
free_reply_callbacks (redis_sock );
2379
- redis_sock -> mode = ATOMIC ;
2394
+ REDIS_DISABLE_MODE ( redis_sock , MULTI ) ;
2380
2395
redis_sock -> watching = 0 ;
2381
2396
}
2382
2397
@@ -2409,8 +2424,8 @@ PHP_METHOD(Redis, exec)
2409
2424
/* Empty array when no command was run. */
2410
2425
array_init (return_value );
2411
2426
}
2412
- redis_sock -> mode = ATOMIC ;
2413
2427
free_reply_callbacks (redis_sock );
2428
+ REDIS_DISABLE_MODE (redis_sock , PIPELINE );
2414
2429
}
2415
2430
}
2416
2431
@@ -2456,13 +2471,20 @@ PHP_METHOD(Redis, pipeline)
2456
2471
RETURN_FALSE ;
2457
2472
}
2458
2473
2459
- IF_NOT_PIPELINE () {
2460
- redis_sock -> mode = PIPELINE ;
2461
-
2474
+ IF_PIPELINE () {
2475
+ php_error_docref (NULL TSRMLS_CC , E_WARNING ,
2476
+ "Already in pipeline mode" );
2477
+ } else {
2478
+ IF_MULTI () {
2479
+ php_error_docref (NULL TSRMLS_CC , E_ERROR ,
2480
+ "Can 't activate pipeline in multi mode!");
2481
+ RETURN_FALSE ;
2482
+ }
2462
2483
/* NB : we keep the function fold, to detect the last function.
2463
2484
* We need the response format of the n - 1 command. So, we can delete
2464
2485
* when n > 2, the { 1 .. n - 2} commands */
2465
2486
free_reply_callbacks (redis_sock );
2487
+ REDIS_ENABLE_MODE (redis_sock , PIPELINE );
2466
2488
}
2467
2489
RETURN_ZVAL (getThis (), 1 , 0 );
2468
2490
}
@@ -3411,7 +3433,13 @@ PHP_METHOD(Redis, getMode) {
3411
3433
RETURN_FALSE ;
3412
3434
}
3413
3435
3414
- RETVAL_LONG (redis_sock -> mode );
3436
+ IF_PIPELINE () {
3437
+ RETVAL_LONG (PIPELINE );
3438
+ } else IF_MULTI () {
3439
+ RETVAL_LONG (MULTI );
3440
+ } else {
3441
+ RETVAL_LONG (ATOMIC );
3442
+ }
3415
3443
}
3416
3444
3417
3445
/* {{{ proto Redis::time() */
0 commit comments