Skip to content

Commit 79a2995

Browse files
committed
Merging from poison/feature-udf. Changed flags for parse parameters to long. //cc #92
1 parent 56d5b97 commit 79a2995

File tree

3 files changed

+71
-20
lines changed

3 files changed

+71
-20
lines changed

php_memcached.c

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,6 @@ typedef unsigned long int uint32_t;
116116
Custom result codes
117117
****************************************/
118118
#define MEMC_RES_PAYLOAD_FAILURE -1001
119-
#define MEMC_RES_VERSION_FAILURE -1002
120119

121120
/****************************************
122121
Payload value flags
@@ -591,13 +590,13 @@ static void php_memc_get_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool by_key)
591590
/*
592591
* Enable CAS support, but only if it is currently disabled.
593592
*/
594-
if (cas_token && Z_TYPE_P(cas_token) != IS_NULL && orig_cas_flag == 0) {
593+
if (cas_token && PZVAL_IS_REF(cas_token) && orig_cas_flag == 0) {
595594
memcached_behavior_set(m_obj->memc, MEMCACHED_BEHAVIOR_SUPPORT_CAS, 1);
596595
}
597596

598597
status = memcached_mget_by_key(m_obj->memc, server_key, server_key_len, keys, key_lens, 1);
599598

600-
if (cas_token && Z_TYPE_P(cas_token) != IS_NULL && orig_cas_flag == 0) {
599+
if (cas_token && PZVAL_IS_REF(cas_token) && orig_cas_flag == 0) {
601600
memcached_behavior_set(m_obj->memc, MEMCACHED_BEHAVIOR_SUPPORT_CAS, orig_cas_flag);
602601
}
603602

@@ -766,7 +765,7 @@ static void php_memc_getMulti_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool by_ke
766765
/*
767766
* Enable CAS support, but only if it is currently disabled.
768767
*/
769-
if (cas_tokens) {
768+
if (cas_tokens && PZVAL_IS_REF(cas_tokens)) {
770769
orig_cas_flag = memcached_behavior_get(m_obj->memc, MEMCACHED_BEHAVIOR_SUPPORT_CAS);
771770
if (orig_cas_flag == 0) {
772771
memcached_behavior_set(m_obj->memc, MEMCACHED_BEHAVIOR_SUPPORT_CAS, 1);
@@ -780,7 +779,7 @@ static void php_memc_getMulti_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool by_ke
780779
/*
781780
* Restore the CAS support flag, but only if we had to turn it on.
782781
*/
783-
if (cas_tokens && orig_cas_flag == 0) {
782+
if (cas_tokens && PZVAL_IS_REF(cas_tokens) && orig_cas_flag == 0) {
784783
memcached_behavior_set(m_obj->memc, MEMCACHED_BEHAVIOR_SUPPORT_CAS, orig_cas_flag);
785784
}
786785

@@ -792,8 +791,17 @@ static void php_memc_getMulti_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool by_ke
792791
* returned as doubles, because we cannot store potential 64-bit values in longs.
793792
*/
794793
if (cas_tokens) {
795-
zval_dtor(cas_tokens);
796-
array_init(cas_tokens);
794+
if (PZVAL_IS_REF(cas_tokens)) {
795+
/* cas_tokens was passed by reference, we'll create an array for it. */
796+
zval_dtor(cas_tokens);
797+
array_init(cas_tokens);
798+
} else {
799+
/* Not passed by reference, we allow this (eg.: if you specify null
800+
to not enable cas but you want to use the udf_flags parameter).
801+
We destruct it and set it to null for the peace of mind. */
802+
zval_dtor(cas_tokens);
803+
cas_tokens = NULL;
804+
}
797805
}
798806

799807
/*
@@ -1220,7 +1228,7 @@ static void php_memc_setMulti_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool by_ke
12201228
char *server_key = NULL;
12211229
int server_key_len = 0;
12221230
time_t expiration = 0;
1223-
uint32_t udf_flags = 0;
1231+
long udf_flags = 0;
12241232
zval **entry;
12251233
char *str_key;
12261234
uint str_key_len;
@@ -1280,7 +1288,7 @@ static void php_memc_setMulti_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool by_ke
12801288
}
12811289

12821290
if (udf_flags > 0) {
1283-
MEMC_VAL_SET_USER_FLAGS(flags, udf_flags);
1291+
MEMC_VAL_SET_USER_FLAGS(flags, ((uint32_t) udf_flags));
12841292
}
12851293

12861294
payload = php_memc_zval_to_payload(*entry, &payload_len, &flags, m_obj->serializer, m_obj->compression_type TSRMLS_CC);
@@ -1385,7 +1393,7 @@ static void php_memc_store_impl(INTERNAL_FUNCTION_PARAMETERS, int op, zend_bool
13851393
zval s_zvalue;
13861394
zval *value;
13871395
long expiration = 0;
1388-
uint32_t udf_flags = 0;
1396+
long udf_flags = 0;
13891397
char *payload;
13901398
size_t payload_len;
13911399
uint32_t flags = 0;
@@ -1464,8 +1472,7 @@ static void php_memc_store_impl(INTERNAL_FUNCTION_PARAMETERS, int op, zend_bool
14641472
if (udf_flags > MEMC_VAL_USER_FLAGS_MAX) {
14651473
php_error_docref(NULL TSRMLS_CC, E_WARNING, "udf_flags will be limited to %d", MEMC_VAL_USER_FLAGS_MAX);
14661474
}
1467-
1468-
MEMC_VAL_SET_USER_FLAGS(flags, udf_flags);
1475+
MEMC_VAL_SET_USER_FLAGS(flags, ((uint32_t) udf_flags));
14691476
}
14701477

14711478
if (op == MEMC_OP_TOUCH) {
@@ -1567,7 +1574,7 @@ static void php_memc_cas_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool by_key)
15671574
int server_key_len = 0;
15681575
zval *value;
15691576
time_t expiration = 0;
1570-
uint32_t udf_flags = 0;
1577+
long udf_flags = 0;
15711578
char *payload;
15721579
size_t payload_len;
15731580
uint32_t flags = 0;
@@ -1608,8 +1615,7 @@ static void php_memc_cas_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool by_key)
16081615
if (udf_flags > MEMC_VAL_USER_FLAGS_MAX) {
16091616
php_error_docref(NULL TSRMLS_CC, E_WARNING, "udf_flags will be limited to %d", MEMC_VAL_USER_FLAGS_MAX);
16101617
}
1611-
1612-
MEMC_VAL_SET_USER_FLAGS(flags, udf_flags);
1618+
MEMC_VAL_SET_USER_FLAGS(flags, ((uint32_t) udf_flags));
16131619
}
16141620

16151621
payload = php_memc_zval_to_payload(value, &payload_len, &flags, m_obj->serializer, m_obj->compression_type TSRMLS_CC);
@@ -3482,29 +3488,29 @@ ZEND_END_ARG_INFO()
34823488
ZEND_BEGIN_ARG_INFO_EX(arginfo_get, 0, 0, 1)
34833489
ZEND_ARG_INFO(0, key)
34843490
ZEND_ARG_INFO(0, cache_cb)
3485-
ZEND_ARG_INFO(1, cas_token)
3491+
ZEND_ARG_INFO(2, cas_token)
34863492
ZEND_ARG_INFO(1, udf_flags)
34873493
ZEND_END_ARG_INFO()
34883494

34893495
ZEND_BEGIN_ARG_INFO_EX(arginfo_getByKey, 0, 0, 2)
34903496
ZEND_ARG_INFO(0, server_key)
34913497
ZEND_ARG_INFO(0, key)
34923498
ZEND_ARG_INFO(0, cache_cb)
3493-
ZEND_ARG_INFO(1, cas_token)
3499+
ZEND_ARG_INFO(2, cas_token)
34943500
ZEND_ARG_INFO(1, udf_flags)
34953501
ZEND_END_ARG_INFO()
34963502

34973503
ZEND_BEGIN_ARG_INFO_EX(arginfo_getMulti, 0, 0, 1)
34983504
ZEND_ARG_ARRAY_INFO(0, keys, 0)
3499-
ZEND_ARG_INFO(1, cas_tokens)
3505+
ZEND_ARG_INFO(2, cas_tokens)
35003506
ZEND_ARG_INFO(0, flags)
35013507
ZEND_ARG_INFO(1, udf_flags)
35023508
ZEND_END_ARG_INFO()
35033509

35043510
ZEND_BEGIN_ARG_INFO_EX(arginfo_getMultiByKey, 0, 0, 2)
35053511
ZEND_ARG_INFO(0, server_key)
35063512
ZEND_ARG_ARRAY_INFO(0, keys, 0)
3507-
ZEND_ARG_INFO(1, cas_tokens)
3513+
ZEND_ARG_INFO(2, cas_tokens)
35083514
ZEND_ARG_INFO(0, flags)
35093515
ZEND_ARG_INFO(1, udf_flags)
35103516
ZEND_END_ARG_INFO()
@@ -4030,7 +4036,6 @@ static void php_memc_register_constants(INIT_FUNC_ARGS)
40304036
*/
40314037

40324038
REGISTER_MEMC_CLASS_CONST_LONG(RES_PAYLOAD_FAILURE, MEMC_RES_PAYLOAD_FAILURE);
4033-
REGISTER_MEMC_CLASS_CONST_LONG(RES_VERSION_FAILURE, MEMC_RES_VERSION_FAILURE);
40344039

40354040
/*
40364041
* Serializer types.

tests/cas.phpt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,25 @@ if ($v !== 11) {
3030
echo "Wanted cas_test to be 11, value is: ";
3131
var_dump($v);
3232
}
33+
34+
$v = $m->get('cas_test', null, 2);
35+
if ($v != 11) {
36+
echo "Failed to get the value with \$cas_token passed by value (2)\n";
37+
return;
38+
}
39+
40+
$v = $m->get('cas_test', null, null);
41+
if ($v != 11) {
42+
echo "Failed to get the value with \$cas_token passed by value (null)\n";
43+
return;
44+
}
45+
46+
$v = $m->get('cas_test', null, $data = array(2, 4));
47+
if ($v != 11 || $data !== array(2, 4)) {
48+
echo "Failed to get the value with \$cas_token passed by value (\$data = array(2, 4))\n";
49+
return;
50+
}
51+
3352
echo "OK\n";
3453
?>
3554
--EXPECT--

tests/cas_multi.phpt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,33 @@ foreach ($data as $key => $v) {
4545
}
4646
}
4747

48+
if (array_keys($actual) !== array_keys($data)) {
49+
echo "missing value(s)\n";
50+
echo "data :";
51+
var_dump($data);
52+
echo "actual data: ";
53+
var_dump($actual);
54+
return;
55+
}
56+
57+
$actual = $m->getMulti(array_keys($data), 2);
58+
if (array_keys($actual) !== array_keys($data)) {
59+
echo "Failed to getMulti \$cas_token passed by value (2)\n";
60+
return;
61+
}
62+
63+
$actual = $m->getMulti(array_keys($data), null);
64+
if (array_keys($actual) !== array_keys($data)) {
65+
echo "Failed to getMulti \$cas_token passed by value (null)\n";
66+
return;
67+
}
68+
69+
$actual = $m->getMulti(array_keys($data), $cas_tokens = array(2, 4));
70+
if (array_keys($actual) !== array_keys($data) || $cas_tokens !== array(2, 4)) {
71+
echo "Failed to getMulti \$cas_token passed by value (\$cas_tokens = array(2, 4))\n";
72+
return;
73+
}
74+
4875
echo "OK\n";
4976

5077
?>

0 commit comments

Comments
 (0)