From 6ea7695d08ac7376e80f3c746b8dd17c312390b2 Mon Sep 17 00:00:00 2001 From: Chris Goffinet Date: Sun, 24 May 2009 10:34:46 +0800 Subject: [PATCH 1/2] Added preserve_order (boolean) to getMulti. This will return an assoc array back in same order as the keys were requested. If the value is not found, a NULL is set for that key. Signed-off-by: Andrei Zmievski --- memcached-api.php | 4 ++-- php_memcached.c | 17 ++++++++++++----- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/memcached-api.php b/memcached-api.php index f1851e14..d499d450 100644 --- a/memcached-api.php +++ b/memcached-api.php @@ -79,9 +79,9 @@ public function get( $key, &$cas_token = null, $cache_cb = null ) {} public function getByKey( $server_key, $key, $cache_cb = null ) {} - public function getMulti( array $keys, &$cas_tokens = null ) {} + public function getMulti( array $keys, &$cas_tokens = null, $preserve_order = false ) {} - public function getMultiByKey( $server_key, array $keys, &$cas_tokens = null ) {} + public function getMultiByKey( $server_key, array $keys, &$cas_tokens = null, $preserve_order = false ) {} public function getDelayed( array $keys, $with_cas = null, $value_cb = null ) {} diff --git a/php_memcached.c b/php_memcached.c index b11a1a67..313f2f64 100644 --- a/php_memcached.c +++ b/php_memcached.c @@ -488,28 +488,30 @@ static void php_memc_getMulti_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool by_ke zval *cas_tokens = NULL; uint64_t orig_cas_flag; zval *value; + zend_bool preserve_order = 0; int i = 0; memcached_result_st result; memcached_return status = MEMCACHED_SUCCESS; MEMC_METHOD_INIT_VARS; if (by_key) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sa|z", &server_key, - &server_key_len, &keys, &cas_tokens) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sa|zb", &server_key, + &server_key_len, &keys, &cas_tokens,&preserve_order) == FAILURE) { return; } } else { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|z", &keys, &cas_tokens) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|zb", &keys, &cas_tokens, &preserve_order) == FAILURE) { return; } } - + MEMC_METHOD_FETCH_OBJECT; MEMC_G(rescode) = MEMCACHED_SUCCESS; num_keys = zend_hash_num_elements(Z_ARRVAL_P(keys)); mkeys = safe_emalloc(num_keys, sizeof(char *), 0); mkeys_len = safe_emalloc(num_keys, sizeof(size_t), 0); + array_init(return_value); /* * Create the array of keys for libmemcached. If none of the keys were valid @@ -522,6 +524,9 @@ static void php_memc_getMulti_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool by_ke if (Z_TYPE_PP(entry) == IS_STRING && Z_STRLEN_PP(entry) > 0) { mkeys[i] = Z_STRVAL_PP(entry); mkeys_len[i] = Z_STRLEN_PP(entry); + if(preserve_order) { + add_assoc_null_ex(return_value, mkeys[i], mkeys_len[i]+1); + } i++; } } @@ -568,7 +573,7 @@ static void php_memc_getMulti_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool by_ke zval_dtor(cas_tokens); array_init(cas_tokens); } - array_init(return_value); + status = MEMCACHED_SUCCESS; memcached_result_create(i_obj->memc, &result); while ((memcached_fetch_result(i_obj->memc, &result, &status)) != NULL) { @@ -2443,12 +2448,14 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_getMulti, 0, 0, 1) ZEND_ARG_ARRAY_INFO(0, keys, 0) ZEND_ARG_INFO(1, cas_tokens) + ZEND_ARG_INFO(0, preserve_order) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_getMultiByKey, 0, 0, 2) ZEND_ARG_INFO(0, server_key) ZEND_ARG_ARRAY_INFO(0, keys, 0) ZEND_ARG_INFO(1, cas_tokens) + ZEND_ARG_INFO(0, preserve_order) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_getDelayed, 0, 0, 1) From f627ca6ced6fe338d149772a8b6eabac0724cc6e Mon Sep 17 00:00:00 2001 From: Oleg Grenrus Date: Mon, 25 May 2009 14:42:07 +0800 Subject: [PATCH 2/2] naive test for getMulti preserver_order Signed-off-by: Andrei Zmievski --- tests/multi_order.phpt | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 tests/multi_order.phpt diff --git a/tests/multi_order.phpt b/tests/multi_order.phpt new file mode 100644 index 00000000..48559d83 --- /dev/null +++ b/tests/multi_order.phpt @@ -0,0 +1,37 @@ +--TEST-- +Memcached check preserve_order in getMulti +--SKIPIF-- + +--FILE-- +addServer('127.0.0.1', 11211, 1); +$m->addServer('localhost', 11211, 1); + +$data = array( + 'foo' => 'foo-data', + 'bar' => 'bar-data', + 'baz' => 'baz-data', + 'lol' => 'lol-data', + 'kek' => 'kek-data', +); + +//$m->setMulti($data, 3600); +foreach ($data as $k => $v) { + $m->set($k, $v, 3600); +} + +$null = null; +$got = $m->getMulti(array_keys($data), $null, true); + +foreach ($got as $k => $v) { + echo "$k $v\n"; +} + +?> +--EXPECT-- +foo foo-data +bar bar-data +baz baz-data +lol lol-data +kek kek-data