1919/* TODO
2020 * - set LIBKETAMA_COMPATIBLE as the default?
2121 * - consider setOptions()
22- * - fix unserialize(serialize($memc))
22+ * - fix unserialize(serialize($memc))
2323 */
2424
2525#ifdef HAVE_CONFIG_H
7171#define MEMC_VAL_IGBINARY (1<<4)
7272#define MEMC_VAL_IS_BOOL (1<<5)
7373
74+ /****************************************
75+ "get" operation flags
76+ ****************************************/
77+ #define MEMC_GET_PRESERVE_ORDER (1<<0)
78+
79+
7480#define MEMC_COMPRESS_THRESHOLD 100
7581
7682/****************************************
@@ -490,26 +496,28 @@ static void php_memc_getMulti_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool by_ke
490496 zval * cas_tokens = NULL ;
491497 uint64_t orig_cas_flag ;
492498 zval * value ;
493- zend_bool preserve_order = 0 ;
499+ long get_flags = 0 ;
494500 int i = 0 ;
501+ zend_bool preserve_order ;
495502 memcached_result_st result ;
496503 memcached_return status = MEMCACHED_SUCCESS ;
497504 MEMC_METHOD_INIT_VARS ;
498505
499506 if (by_key ) {
500- if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "sa|zb " , & server_key ,
501- & server_key_len , & keys , & cas_tokens ,& preserve_order ) == FAILURE ) {
507+ if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "sa|zl " , & server_key ,
508+ & server_key_len , & keys , & cas_tokens , & get_flags ) == FAILURE ) {
502509 return ;
503510 }
504511 } else {
505- if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "a|zb " , & keys , & cas_tokens , & preserve_order ) == FAILURE ) {
512+ if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "a|zl " , & keys , & cas_tokens , & get_flags ) == FAILURE ) {
506513 return ;
507514 }
508515 }
509-
516+
510517 MEMC_METHOD_FETCH_OBJECT ;
511518 MEMC_G (rescode ) = MEMCACHED_SUCCESS ;
512519
520+ preserve_order = (get_flags & MEMC_GET_PRESERVE_ORDER );
513521 num_keys = zend_hash_num_elements (Z_ARRVAL_P (keys ));
514522 mkeys = safe_emalloc (num_keys , sizeof (char * ), 0 );
515523 mkeys_len = safe_emalloc (num_keys , sizeof (size_t ), 0 );
@@ -526,8 +534,8 @@ static void php_memc_getMulti_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool by_ke
526534 if (Z_TYPE_PP (entry ) == IS_STRING && Z_STRLEN_PP (entry ) > 0 ) {
527535 mkeys [i ] = Z_STRVAL_PP (entry );
528536 mkeys_len [i ] = Z_STRLEN_PP (entry );
529- if (preserve_order ) {
530- add_assoc_null_ex (return_value , mkeys [i ], mkeys_len [i ]+ 1 );
537+ if (preserve_order ) {
538+ add_assoc_null_ex (return_value , mkeys [i ], mkeys_len [i ]+ 1 );
531539 }
532540 i ++ ;
533541 }
@@ -575,7 +583,7 @@ static void php_memc_getMulti_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool by_ke
575583 zval_dtor (cas_tokens );
576584 array_init (cas_tokens );
577585 }
578-
586+
579587 status = MEMCACHED_SUCCESS ;
580588 memcached_result_create (i_obj -> memc , & result );
581589 while ((memcached_fetch_result (i_obj -> memc , & result , & status )) != NULL ) {
@@ -2450,14 +2458,14 @@ ZEND_END_ARG_INFO()
24502458ZEND_BEGIN_ARG_INFO_EX (arginfo_getMulti , 0 , 0 , 1 )
24512459 ZEND_ARG_ARRAY_INFO (0 , keys , 0 )
24522460 ZEND_ARG_INFO (1 , cas_tokens )
2453- ZEND_ARG_INFO (0 , preserve_order )
2461+ ZEND_ARG_INFO (0 , flags )
24542462ZEND_END_ARG_INFO ()
24552463
24562464ZEND_BEGIN_ARG_INFO_EX (arginfo_getMultiByKey , 0 , 0 , 2 )
24572465 ZEND_ARG_INFO (0 , server_key )
24582466 ZEND_ARG_ARRAY_INFO (0 , keys , 0 )
24592467 ZEND_ARG_INFO (1 , cas_tokens )
2460- ZEND_ARG_INFO (0 , preserve_order )
2468+ ZEND_ARG_INFO (0 , flags )
24612469ZEND_END_ARG_INFO ()
24622470
24632471ZEND_BEGIN_ARG_INFO_EX (arginfo_getDelayed , 0 , 0 , 1 )
@@ -2811,6 +2819,10 @@ static void php_memc_register_constants(INIT_FUNC_ARGS)
28112819 REGISTER_MEMC_CLASS_CONST_LONG (SERIALIZER_PHP , SERIALIZER_PHP );
28122820 REGISTER_MEMC_CLASS_CONST_LONG (SERIALIZER_IGBINARY , SERIALIZER_IGBINARY );
28132821
2822+ /*
2823+ * Flags.
2824+ */
2825+ REGISTER_MEMC_CLASS_CONST_LONG (GET_PRESERVE_ORDER , MEMC_GET_PRESERVE_ORDER );
28142826
28152827 #undef REGISTER_MEMC_CLASS_CONST_LONG
28162828}
0 commit comments