From a5e4615ea2a5eaace1c4a5a150c1bd0b94cf65da Mon Sep 17 00:00:00 2001 From: Sergey Revenko Date: Fri, 24 Oct 2014 18:24:09 +0400 Subject: [PATCH 1/3] Add support for 64-bit numbers in increment/decrement operations --- php_memcached.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/php_memcached.c b/php_memcached.c index 2bd39d10..10a6fecd 100644 --- a/php_memcached.c +++ b/php_memcached.c @@ -1795,7 +1795,7 @@ static void php_memc_incdec_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool by_key, { char *key, *server_key; int key_len, server_key_len; - long offset = 1; + uint64_t offset = 1; uint64_t value, initial = 0; time_t expiry = 0; memcached_return status; @@ -1831,9 +1831,9 @@ static void php_memc_incdec_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool by_key, if ((!by_key && n_args < 3) || (by_key && n_args < 4)) { if (by_key) { if (incr) { - status = memcached_increment_by_key(m_obj->memc, server_key, server_key_len, key, key_len, (unsigned int)offset, &value); + status = memcached_increment_by_key(m_obj->memc, server_key, server_key_len, key, key_len, offset, &value); } else { - status = memcached_decrement_by_key(m_obj->memc, server_key, server_key_len, key, key_len, (unsigned int)offset, &value); + status = memcached_decrement_by_key(m_obj->memc, server_key, server_key_len, key, key_len, offset, &value); } } else { if (incr) { @@ -1849,15 +1849,15 @@ static void php_memc_incdec_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool by_key, } if (by_key) { if (incr) { - status = memcached_increment_with_initial_by_key(m_obj->memc, server_key, server_key_len, key, key_len, (unsigned int)offset, initial, expiry, &value); + status = memcached_increment_with_initial_by_key(m_obj->memc, server_key, server_key_len, key, key_len, offset, initial, expiry, &value); } else { - status = memcached_decrement_with_initial_by_key(m_obj->memc, server_key, server_key_len, key, key_len, (unsigned int)offset, initial, expiry, &value); + status = memcached_decrement_with_initial_by_key(m_obj->memc, server_key, server_key_len, key, key_len, offset, initial, expiry, &value); } } else { if (incr) { - status = memcached_increment_with_initial(m_obj->memc, key, key_len, (unsigned int)offset, initial, expiry, &value); + status = memcached_increment_with_initial(m_obj->memc, key, key_len, offset, initial, expiry, &value); } else { - status = memcached_decrement_with_initial(m_obj->memc, key, key_len, (unsigned int)offset, initial, expiry, &value); + status = memcached_decrement_with_initial(m_obj->memc, key, key_len, offset, initial, expiry, &value); } } } From d4d4ae73e27472fd4d79544caab45b971c6f98d3 Mon Sep 17 00:00:00 2001 From: Sergey Revenko Date: Mon, 27 Oct 2014 10:22:59 +0300 Subject: [PATCH 2/3] Fix issue with tests --- php_memcached.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/php_memcached.c b/php_memcached.c index 10a6fecd..62b4a6fd 100644 --- a/php_memcached.c +++ b/php_memcached.c @@ -1795,7 +1795,7 @@ static void php_memc_incdec_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool by_key, { char *key, *server_key; int key_len, server_key_len; - uint64_t offset = 1; + int64_t offset = 1; uint64_t value, initial = 0; time_t expiry = 0; memcached_return status; From ab3d6d854d75ea5921d7b01311774744aa268ae3 Mon Sep 17 00:00:00 2001 From: Sergey Revenko Date: Mon, 27 Oct 2014 10:43:46 +0300 Subject: [PATCH 3/3] Fix issue with old libmemcached versions --- php_memcached.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/php_memcached.c b/php_memcached.c index 62b4a6fd..090fca04 100644 --- a/php_memcached.c +++ b/php_memcached.c @@ -1795,7 +1795,11 @@ static void php_memc_incdec_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool by_key, { char *key, *server_key; int key_len, server_key_len; +#if defined(LIBMEMCACHED_VERSION_HEX) && LIBMEMCACHED_VERSION_HEX >= 0x01000016 int64_t offset = 1; +#else + long offset = 1; +#endif uint64_t value, initial = 0; time_t expiry = 0; memcached_return status; @@ -1828,6 +1832,8 @@ static void php_memc_incdec_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool by_key, } retry: +#if defined(LIBMEMCACHED_VERSION_HEX) && LIBMEMCACHED_VERSION_HEX >= 0x01000016 + if ((!by_key && n_args < 3) || (by_key && n_args < 4)) { if (by_key) { if (incr) { @@ -1861,6 +1867,41 @@ static void php_memc_incdec_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool by_key, } } } +#else + if ((!by_key && n_args < 3) || (by_key && n_args < 4)) { + if (by_key) { + if (incr) { + status = memcached_increment_by_key(m_obj->memc, server_key, server_key_len, key, key_len, (unsigned int)offset, &value); + } else { + status = memcached_decrement_by_key(m_obj->memc, server_key, server_key_len, key, key_len, (unsigned int)offset, &value); + } + } else { + if (incr) { + status = memcached_increment(m_obj->memc, key, key_len, (unsigned int)offset, &value); + } else { + status = memcached_decrement(m_obj->memc, key, key_len, (unsigned int)offset, &value); + } + } + } else { + if (!memcached_behavior_get(m_obj->memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Initial value is only supported with binary protocol"); + RETURN_FALSE; + } + if (by_key) { + if (incr) { + status = memcached_increment_with_initial_by_key(m_obj->memc, server_key, server_key_len, key, key_len, (unsigned int)offset, initial, expiry, &value); + } else { + status = memcached_decrement_with_initial_by_key(m_obj->memc, server_key, server_key_len, key, key_len, (unsigned int)offset, initial, expiry, &value); + } + } else { + if (incr) { + status = memcached_increment_with_initial(m_obj->memc, key, key_len, (unsigned int)offset, initial, expiry, &value); + } else { + status = memcached_decrement_with_initial(m_obj->memc, key, key_len, (unsigned int)offset, initial, expiry, &value); + } + } + } +#endif if (php_memc_handle_error(i_obj, status TSRMLS_CC) < 0) { PHP_MEMC_FAILOVER_RETRY