From 4b6c45dd23be82abc2fdbf1655700ddd55c09538 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Mon, 25 Jan 2021 14:45:03 +0100 Subject: [PATCH] implement stats callback suggestions by Remi --- php_memcached_server.c | 49 +++++++++++++++++++++----------------- tests/memcachedserver.phpt | 22 +++++++++++++++++ tests/server.php | 19 +++++++++------ 3 files changed, 61 insertions(+), 29 deletions(-) diff --git a/php_memcached_server.c b/php_memcached_server.c index a166051..24c328f 100644 --- a/php_memcached_server.c +++ b/php_memcached_server.c @@ -519,7 +519,7 @@ protocol_binary_response_status s_stat_handler (const void *cookie, const void * } else { ZVAL_NULL(&zkey); } - ZVAL_NULL(&zstats); + array_init(&zstats); ZVAL_MAKE_REF(&zstats); ZVAL_COPY(¶ms[0], &zcookie); @@ -529,29 +529,34 @@ protocol_binary_response_status s_stat_handler (const void *cookie, const void * retval = s_invoke_php_callback (&MEMC_GET_CB(MEMC_SERVER_ON_STAT), params, 3); if (retval == PROTOCOL_BINARY_RESPONSE_SUCCESS) { - if (Z_ISNULL(zstats)) { - retval = response_handler(cookie, NULL, 0, NULL, 0); - } else { - zval *zarray = &zstats; - zend_string *key; - zval *val; + zval *zarray = &zstats; + zend_string *key; + zend_long idx; + zval *val; - ZVAL_DEREF(zarray); - if (Z_TYPE_P(zarray) != IS_ARRAY) { - convert_to_array(zarray); - } - - ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(zarray), key, val) - { - zend_string *val_str = zval_get_string(val); - retval = response_handler(cookie, key->val, key->len, val_str->val, val_str->len); - if (retval != PROTOCOL_BINARY_RESPONSE_SUCCESS) { - break; - } - zend_string_release(val_str); - } - ZEND_HASH_FOREACH_END(); + ZVAL_DEREF(zarray); + if (Z_TYPE_P(zarray) != IS_ARRAY) { + convert_to_array(zarray); } + + ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(zarray), idx, key, val) + { + zend_string *val_str = zval_get_string(val); + + if (key) { + retval = response_handler(cookie, key->val, key->len, val_str->val, val_str->len); + } else { + char buf[0x20], *ptr, *end = &buf[sizeof(buf) - 1]; + ptr = zend_print_long_to_buf(end, idx); + retval = response_handler(cookie, ptr, end - ptr, val_str->val, val_str->len); + } + zend_string_release(val_str); + + if (retval != PROTOCOL_BINARY_RESPONSE_SUCCESS) { + break; + } + } + ZEND_HASH_FOREACH_END(); } zval_ptr_dtor(¶ms[0]); diff --git a/tests/memcachedserver.phpt b/tests/memcachedserver.phpt index d47dd73..8d6bf22 100644 --- a/tests/memcachedserver.phpt +++ b/tests/memcachedserver.phpt @@ -37,6 +37,8 @@ $cache->replace ('replace_key', 'value 2', 200); var_dump($cache->getVersion()); var_dump($cache->getStats()); var_dump($cache->getStats("foobar")); +var_dump($cache->getStats("scalar")); +var_dump($cache->getStats("numeric array")); $cache->quit(); @@ -84,5 +86,25 @@ array(1) { string(3) "bar" } } +client_id=[%s]: Stat key=[scalar] +array(1) { + ["127.0.0.1:3434"]=> + array(1) { + [0]=> + string(%d) "you want it, you get it" + } +} +client_id=[%s]: Stat key=[numeric array] +array(1) { + ["127.0.0.1:3434"]=> + array(3) { + [-1]=> + string(3) "one" + [0]=> + string(3) "two" + [1]=> + string(5) "three" + } +} client_id=[%s]: Client quit Done diff --git a/tests/server.php b/tests/server.php index f5ff2f6..bce4c0b 100644 --- a/tests/server.php +++ b/tests/server.php @@ -77,13 +77,18 @@ $server->on (Memcached::ON_SET, }); $server->on (Memcached::ON_STAT, - function ($client_id, $key, array &$values = null) { - echo "client_id=[$client_id]: Stat key=[$key]" . PHP_EOL; - $values = [ - "key" => $key, - "foo" => "bar", - ]; - return Memcached::RESPONSE_SUCCESS; + function ($client_id, $key, array &$values) { + echo "client_id=[$client_id]: Stat key=[$key]" . PHP_EOL; + + if ($key === "scalar") { + $values = "you want it, you get it"; + } elseif ($key === "numeric array") { + $values = [-1 => "one", "two", "three"]; + } else { + $values["key"] = $key; + $values["foo"] = "bar"; + } + return Memcached::RESPONSE_SUCCESS; }); $server->on (Memcached::ON_VERSION,