@@ -2522,6 +2522,103 @@ static int php_memc_set_option(php_memc_t *i_obj, long option, zval *value TSRML
2522
2522
return 1 ;
2523
2523
}
2524
2524
2525
+ /* {{{ Memcached::setBucket(array host_map, array forward_map, long buckets, long replicas)
2526
+ Sets the memcached virtual buckets */
2527
+
2528
+ PHP_METHOD (Memcached , setBucket )
2529
+ {
2530
+ zval * host_map ;
2531
+ zval * forward_map ;
2532
+ long buckets ;
2533
+ long replicas ;
2534
+
2535
+ uint32_t * hm = NULL ,* fm = NULL ;
2536
+ zend_bool ok = 1 ;
2537
+ uint key_len ;
2538
+ char * key ;
2539
+ ulong key_index ;
2540
+ zval * * value ;
2541
+ MEMC_METHOD_INIT_VARS ;
2542
+
2543
+ if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "aa!ll" , & host_map , & forward_map , & buckets , & replicas ) == FAILURE ) {
2544
+ return ;
2545
+ }
2546
+
2547
+
2548
+ hm = (uint32_t * )malloc (buckets * sizeof (uint32_t ));
2549
+
2550
+ int i = 0 ;
2551
+ for (zend_hash_internal_pointer_reset (Z_ARRVAL_P (host_map ));
2552
+ zend_hash_get_current_data (Z_ARRVAL_P (host_map ), (void * ) & value ) == SUCCESS ;
2553
+ zend_hash_move_forward (Z_ARRVAL_P (host_map ))) {
2554
+
2555
+ if (i < buckets ) {
2556
+ if (zend_hash_get_current_key_ex (Z_ARRVAL_P (host_map ), & key , & key_len , & key_index , 0 , NULL ) == HASH_KEY_IS_LONG ) {
2557
+ zval copy = * * value ;
2558
+ zval_copy_ctor (& copy );
2559
+ INIT_PZVAL (& copy );
2560
+ convert_to_long (& copy );
2561
+ hm [i ] = Z_LVAL_P (& copy );
2562
+ ++ i ;
2563
+ zval_dtor (& copy );
2564
+ } else {
2565
+ php_error_docref (NULL TSRMLS_CC , E_WARNING , "invalid configuration option ");
2566
+ ok = 0 ;
2567
+ }
2568
+ } else {
2569
+ php_error_docref (NULL TSRMLS_CC , E_WARNING , "array size mismatch ");
2570
+ ok = 0 ;
2571
+ break ;
2572
+ }
2573
+ }
2574
+
2575
+ if (i != buckets ) {
2576
+ php_error_docref (NULL TSRMLS_CC , E_WARNING , "array size mismatch ");
2577
+ ok = 0 ;
2578
+ }
2579
+
2580
+ i = 0 ;
2581
+ if (ok != 0 && forward_map != NULL ) {
2582
+ fm = (uint32_t * )malloc (buckets * sizeof (uint32_t ));
2583
+ for (zend_hash_internal_pointer_reset (Z_ARRVAL_P (forward_map ));
2584
+ zend_hash_get_current_data (Z_ARRVAL_P (forward_map ), (void * ) & value ) == SUCCESS ;
2585
+ zend_hash_move_forward (Z_ARRVAL_P (forward_map ))) {
2586
+
2587
+ if (i < buckets ) {
2588
+ if (zend_hash_get_current_key_ex (Z_ARRVAL_P (forward_map ), & key , & key_len , & key_index , 0 , NULL ) == HASH_KEY_IS_LONG ) {
2589
+ zval copy = * * value ;
2590
+ zval_copy_ctor (& copy );
2591
+ INIT_PZVAL (& copy );
2592
+
2593
+ convert_to_long (& copy );
2594
+ fm [i ] = Z_LVAL_P (& copy );
2595
+ ++ i ;
2596
+ zval_dtor (& copy );
2597
+ } else {
2598
+ php_error_docref (NULL TSRMLS_CC , E_WARNING , "invalid configuration option ");
2599
+ ok = 0 ;
2600
+ }
2601
+ } else {
2602
+ php_error_docref (NULL TSRMLS_CC , E_WARNING , "array size mismatch ");
2603
+ ok = 0 ;
2604
+ }
2605
+ }
2606
+ }
2607
+
2608
+ MEMC_METHOD_FETCH_OBJECT ;
2609
+
2610
+ if (memcached_bucket_set (m_obj -> memc , hm , fm , buckets , replicas ) != MEMCACHED_SUCCESS )
2611
+ {
2612
+ ok = 0 ;
2613
+ php_error_docref (NULL TSRMLS_CC , E_WARNING ,"memcached_bucket_set don't returned MEMCACHED_SUCCESS" );
2614
+ }
2615
+ free (hm );
2616
+ free (fm );
2617
+ RETURN_BOOL (ok );
2618
+
2619
+ }
2620
+ /* }}} */
2621
+
2525
2622
/* {{{ Memcached::setOptions(array options)
2526
2623
Sets the value for the given option constant */
2527
2624
static PHP_METHOD (Memcached , setOptions )
@@ -3772,6 +3869,13 @@ ZEND_BEGIN_ARG_INFO(arginfo_setOptions, 0)
3772
3869
ZEND_ARG_INFO (0 , options )
3773
3870
ZEND_END_ARG_INFO ()
3774
3871
3872
+ ZEND_BEGIN_ARG_INFO (arginfo_setBucket , 0 )
3873
+ ZEND_ARG_INFO (0 , host_map )
3874
+ ZEND_ARG_INFO (0 , forward_map )
3875
+ ZEND_ARG_INFO (0 , buckets )
3876
+ ZEND_ARG_INFO (0 , replicas )
3877
+ ZEND_END_ARG_INFO ()
3878
+
3775
3879
ZEND_BEGIN_ARG_INFO (arginfo_getStats , 0 )
3776
3880
ZEND_END_ARG_INFO ()
3777
3881
@@ -3859,6 +3963,7 @@ static zend_function_entry memcached_class_methods[] = {
3859
3963
MEMC_ME (getOption , arginfo_getOption )
3860
3964
MEMC_ME (setOption , arginfo_setOption )
3861
3965
MEMC_ME (setOptions , arginfo_setOptions )
3966
+ MEMC_ME (setBucket , arginfo_setBucket )
3862
3967
#ifdef HAVE_MEMCACHED_SASL
3863
3968
MEMC_ME (setSaslAuthData , arginfo_setSaslAuthData )
3864
3969
#endif
0 commit comments