Skip to content

Commit 19001d0

Browse files
author
Andrei Zmievski
committed
Implement "preserve order" option for multi-gets.
1 parent fca2cd4 commit 19001d0

File tree

3 files changed

+30
-16
lines changed

3 files changed

+30
-16
lines changed

memcached-api.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,9 @@ public function get( $key, &$cas_token = null, $cache_cb = null ) {}
7979

8080
public function getByKey( $server_key, $key, $cache_cb = null ) {}
8181

82-
public function getMulti( array $keys, &$cas_tokens = null, $preserve_order = false ) {}
82+
public function getMulti( array $keys, &$cas_tokens = null, $flags = 0 ) {}
8383

84-
public function getMultiByKey( $server_key, array $keys, &$cas_tokens = null, $preserve_order = false ) {}
84+
public function getMultiByKey( $server_key, array $keys, &$cas_tokens = null, $flags = 0 ) {}
8585

8686
public function getDelayed( array $keys, $with_cas = null, $value_cb = null ) {}
8787

php_memcached.c

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
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
@@ -71,6 +71,12 @@
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()
24502458
ZEND_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)
24542462
ZEND_END_ARG_INFO()
24552463

24562464
ZEND_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)
24612469
ZEND_END_ARG_INFO()
24622470

24632471
ZEND_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
}

tests/multi_order.phpt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
--TEST--
2-
Memcached check preserve_order in getMulti
2+
Memcached GET_PRESERVE_ORDER flag in getMulti
33
--SKIPIF--
44
<?php if (!extension_loaded("memcached")) print "skip"; ?>
55
--FILE--
66
<?php
77
$m = new Memcached();
8-
$m->addServer('127.0.0.1', 11211, 1);
98
$m->addServer('localhost', 11211, 1);
109

1110
$data = array(
@@ -22,7 +21,9 @@ foreach ($data as $k => $v) {
2221
}
2322

2423
$null = null;
25-
$got = $m->getMulti(array_keys($data), $null, true);
24+
$keys = array_keys($data);
25+
$keys[] = 'zoo';
26+
$got = $m->getMulti($keys, $null, Memcached::GET_PRESERVE_ORDER);
2627

2728
foreach ($got as $k => $v) {
2829
echo "$k $v\n";
@@ -35,3 +36,4 @@ bar bar-data
3536
baz baz-data
3637
lol lol-data
3738
kek kek-data
39+
zoo

0 commit comments

Comments
 (0)