@@ -386,7 +386,7 @@ static void php_memc_deleteMulti_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool by
386
386
static void php_memc_getDelayed_impl (INTERNAL_FUNCTION_PARAMETERS , zend_bool by_key );
387
387
388
388
/* Invoke PHP functions */
389
- static zend_bool s_invoke_cache_callback (zval * zobject , zend_fcall_info * fci , zend_fcall_info_cache * fcc , zend_string * key , zval * value );
389
+ static zend_bool s_invoke_cache_callback (zval * zobject , zend_fcall_info * fci , zend_fcall_info_cache * fcc , zend_bool with_cas , zend_string * key , zval * value );
390
390
391
391
/* Iterate result sets */
392
392
typedef zend_bool (* php_memc_result_apply_fn )(php_memc_object_t * intern , zend_string * key , zval * value , zval * cas , uint32_t flags , void * context );
@@ -750,7 +750,7 @@ zend_bool s_invoke_new_instance_cb(zval *object, zend_fcall_info *fci, zend_fcal
750
750
}
751
751
752
752
static
753
- zend_bool s_invoke_cache_callback (zval * zobject , zend_fcall_info * fci , zend_fcall_info_cache * fcc , zend_string * key , zval * value )
753
+ zend_bool s_invoke_cache_callback (zval * zobject , zend_fcall_info * fci , zend_fcall_info_cache * fcc , zend_bool with_cas , zend_string * key , zval * value )
754
754
{
755
755
zend_bool status = 0 ;
756
756
zval params [4 ];
@@ -759,21 +759,42 @@ zend_bool s_invoke_cache_callback(zval *zobject, zend_fcall_info *fci, zend_fcal
759
759
760
760
/* Prepare params */
761
761
ZVAL_COPY (& params [0 ], zobject );
762
- ZVAL_STR (& params [1 ], zend_string_copy (key )); /* key */
763
- ZVAL_NEW_REF (& params [2 ], value ); /* value */
764
- ZVAL_NEW_EMPTY_REF (& params [3 ]); /* expiration */
765
- ZVAL_NULL (Z_REFVAL (params [3 ]));
762
+ ZVAL_STR_COPY (& params [1 ], key ); /* key */
763
+ ZVAL_NEW_REF (& params [2 ], value ); /* value */
764
+
765
+ if (with_cas ) {
766
+ fci -> param_count = 3 ;
767
+ } else {
768
+ ZVAL_NEW_EMPTY_REF (& params [3 ]); /* expiration */
769
+ ZVAL_NULL (Z_REFVAL (params [3 ]));
770
+ fci -> param_count = 4 ;
771
+ }
766
772
767
773
fci -> retval = & retval ;
768
774
fci -> params = params ;
769
- fci -> param_count = 4 ;
770
775
771
776
if (zend_call_function (fci , fcc ) == SUCCESS ) {
772
777
if (zend_is_true (& retval )) {
773
- time_t expiration = zval_get_long (Z_REFVAL (params [3 ]));
774
- status = s_memc_write_zval (intern , MEMC_OP_SET , NULL , key , Z_REFVAL (params [2 ]), expiration );
775
- /* memleak? zval_ptr_dtor(value); */
776
- ZVAL_COPY (value , Z_REFVAL (params [2 ]));
778
+ time_t expiration ;
779
+ zval * val = Z_REFVAL (params [2 ]);
780
+
781
+ if (with_cas ) {
782
+ if (Z_TYPE_P (val ) == IS_ARRAY ) {
783
+ zval * rv = zend_hash_str_find (Z_ARRVAL_P (val ), "value" , sizeof ("value" ) - 1 );
784
+ if (rv ) {
785
+ zval * cas = zend_hash_str_find (Z_ARRVAL_P (val ), "cas" , sizeof ("cas" ) - 1 );
786
+ expiration = cas ? Z_LVAL_P (cas ) : 0 ;
787
+ status = s_memc_write_zval (intern , MEMC_OP_SET , NULL , key , rv , expiration );
788
+ }
789
+ /* memleak? zval_ptr_dtor(value); */
790
+ ZVAL_COPY (value , val );
791
+ }
792
+ } else {
793
+ expiration = zval_get_long (Z_REFVAL (params [3 ]));
794
+ status = s_memc_write_zval (intern , MEMC_OP_SET , NULL , key , val , expiration );
795
+ /* memleak? zval_ptr_dtor(value); */
796
+ ZVAL_COPY (value , val );
797
+ }
777
798
}
778
799
}
779
800
else {
@@ -783,7 +804,9 @@ zend_bool s_invoke_cache_callback(zval *zobject, zend_fcall_info *fci, zend_fcal
783
804
zval_ptr_dtor (& params [0 ]);
784
805
zval_ptr_dtor (& params [1 ]);
785
806
zval_ptr_dtor (& params [2 ]);
786
- zval_ptr_dtor (& params [3 ]);
807
+ if (!with_cas ) {
808
+ zval_ptr_dtor (& params [3 ]);
809
+ }
787
810
zval_ptr_dtor (& retval );
788
811
789
812
return status ;
@@ -1408,7 +1431,7 @@ void php_memc_get_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool by_key)
1408
1431
1409
1432
if (!mget_status ) {
1410
1433
if (s_memc_status_has_result_code (intern , MEMCACHED_NOTFOUND ) && fci .size > 0 ) {
1411
- status = s_invoke_cache_callback (object , & fci , & fcc , key , return_value );
1434
+ status = s_invoke_cache_callback (object , & fci , & fcc , context . extended , key , return_value );
1412
1435
1413
1436
if (!status ) {
1414
1437
zval_ptr_dtor (return_value );
@@ -1488,9 +1511,15 @@ static void php_memc_getMulti_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool by_ke
1488
1511
}
1489
1512
1490
1513
MEMC_METHOD_FETCH_OBJECT ;
1491
- s_memc_set_status (intern , MEMCACHED_SUCCESS , 0 );
1492
1514
1493
1515
array_init (return_value );
1516
+ if (zend_hash_num_elements (Z_ARRVAL_P (keys )) == 0 ) {
1517
+ /* BC compatible */
1518
+ s_memc_set_status (intern , MEMCACHED_NOTFOUND , 0 );
1519
+ return ;
1520
+ }
1521
+
1522
+ s_memc_set_status (intern , MEMCACHED_SUCCESS , 0 );
1494
1523
1495
1524
preserve_order = (flags & MEMC_GET_PRESERVE_ORDER );
1496
1525
s_hash_to_keys (& keys_out , Z_ARRVAL_P (keys ), preserve_order , return_value );
0 commit comments