Skip to content

Commit 782077c

Browse files
committed
Fix json serializer
1 parent 9ce59ef commit 782077c

File tree

5 files changed

+112
-127
lines changed

5 files changed

+112
-127
lines changed

package.xml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -147,9 +147,7 @@ http://pear.php.net/dtd/package-2.0.xsd">
147147
<dependencies>
148148
<required>
149149
<php>
150-
<min>5.2.0</min>
151-
<max>6.0.0</max>
152-
<exclude>6.0.0</exclude>
150+
<min>7.0.0</min>
153151
</php>
154152
<pearinstaller>
155153
<min>1.4.0b1</min>

php_memcached.c

Lines changed: 93 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,9 @@
5050
#endif
5151

5252
#ifdef ZTS
53-
#define MEMC_G(v) TSRMG(php_memcached_globals_id, zend_php_memcached_globals *, memc_ini.v)
53+
#define MEMC_G(v) TSRMG(php_memcached_globals_id, zend_php_memcached_globals *, memc.v)
5454
#else
55-
#define MEMC_G(v) (php_memcached_globals.memc_ini.v)
55+
#define MEMC_G(v) (php_memcached_globals.memc.v)
5656
#endif
5757

5858
#include <ctype.h>
@@ -285,10 +285,10 @@ PHP_INI_MH(OnUpdateSessionPrefixString)
285285
}
286286

287287
#define MEMC_INI_ENTRY(key, default_value, update_fn, gkey) \
288-
STD_PHP_INI_ENTRY("memcached."key, default_value, PHP_INI_ALL, update_fn, memc_ini.gkey, zend_php_memcached_globals, php_memcached_globals)
288+
STD_PHP_INI_ENTRY("memcached."key, default_value, PHP_INI_ALL, update_fn, memc.gkey, zend_php_memcached_globals, php_memcached_globals)
289289

290290
#define MEMC_SESSION_INI_ENTRY(key, default_value, update_fn, gkey) \
291-
STD_PHP_INI_ENTRY("memcached.sess_"key, default_value, PHP_INI_ALL, update_fn, session_ini.gkey, zend_php_memcached_globals, php_memcached_globals)
291+
STD_PHP_INI_ENTRY("memcached.sess_"key, default_value, PHP_INI_ALL, update_fn, session.gkey, zend_php_memcached_globals, php_memcached_globals)
292292

293293

294294
/* {{{ INI entries */
@@ -298,7 +298,7 @@ PHP_INI_BEGIN()
298298
MEMC_SESSION_INI_ENTRY("locking", "1", OnUpdateBool, lock_enabled)
299299
MEMC_SESSION_INI_ENTRY("lock_wait_min", "1000", OnUpdateLongGEZero, lock_wait_min)
300300
MEMC_SESSION_INI_ENTRY("lock_wait_max", "2000", OnUpdateLongGEZero, lock_wait_max)
301-
MEMC_SESSION_INI_ENTRY("lock_retries", "5", OnUpdateLongGEZero, lock_retries)
301+
MEMC_SESSION_INI_ENTRY("lock_retries", "5", OnUpdateLong, lock_retries)
302302
MEMC_SESSION_INI_ENTRY("lock_expire", "0", OnUpdateLongGEZero, lock_expiration)
303303
MEMC_SESSION_INI_ENTRY("compression", "1", OnUpdateBool, compression_enabled)
304304
MEMC_SESSION_INI_ENTRY("binary_protocol", "1", OnUpdateBool, binary_protocol_enabled)
@@ -323,9 +323,6 @@ PHP_INI_BEGIN()
323323
MEMC_INI_ENTRY("compression_factor", "1.3", OnUpdateReal, compression_factor)
324324
MEMC_INI_ENTRY("compression_threshold", "2000", OnUpdateLong, compression_threshold)
325325
MEMC_INI_ENTRY("serializer", SERIALIZER_DEFAULT_NAME, OnUpdateSerializer, serializer_name)
326-
#if HAVE_MEMCACHED_SASL
327-
MEMC_INI_ENTRY("use_sasl", "0", OnUpdateBool, sasl_enabled)
328-
#endif
329326
MEMC_INI_ENTRY("store_retry_count", "2", OnUpdateLong, store_retry_count)
330327
PHP_INI_END()
331328
/* }}} */
@@ -367,7 +364,7 @@ static
367364
void php_memc_destroy(memcached_st *memc, php_memc_user_data_t *memc_user_data);
368365

369366
static
370-
zend_bool s_memcached_result_to_zval(memcached_result_st *result, zval *return_value);
367+
zend_bool s_memcached_result_to_zval(memcached_st *memc, memcached_result_st *result, zval *return_value);
371368

372369
static
373370
zend_string *s_zval_to_payload(zval *value, uint32_t *flags, enum memcached_serializer serializer, enum memcached_compression_type compression_type);
@@ -377,6 +374,24 @@ static
377374
Method implementations
378375
****************************************/
379376

377+
zend_bool php_memc_init_sasl_if_needed()
378+
{
379+
#if HAVE_MEMCACHED_SASL
380+
if (MEMC_G(sasl_initialised)) {
381+
return 1;
382+
}
383+
if (sasl_client_init(NULL) != SASL_OK) {
384+
php_error_docref(NULL, E_ERROR, "Failed to initialize SASL library");
385+
return 0;
386+
}
387+
return 1;
388+
#else
389+
php_error_docref(NULL, E_ERROR, "Memcached not built with sasl support");
390+
return 0;
391+
#endif
392+
}
393+
394+
380395

381396
memcached_return php_memcached_exist (memcached_st *memc, zend_string *key)
382397
{
@@ -816,7 +831,7 @@ memcached_return s_memcached_get_multi(memcached_st *memc, HashTable *hash_keys,
816831
}
817832

818833
ZVAL_UNDEF(&value);
819-
if (!s_memcached_result_to_zval(&result, &value)) {
834+
if (!s_memcached_result_to_zval(memc, &result, &value)) {
820835
if (EG(exception)) {
821836
status = MEMC_RES_PAYLOAD_FAILURE;
822837

@@ -1136,9 +1151,9 @@ PHP_METHOD(Memcached, fetch)
11361151
size_t res_key_len = 0;
11371152
const char *payload = NULL;
11381153
size_t payload_len = 0;
1139-
zval value;
11401154
uint32_t flags = 0;
11411155
uint64_t cas = 0;
1156+
zval value, zv_cas;
11421157
memcached_result_st result;
11431158
memcached_return status = MEMCACHED_SUCCESS;
11441159
MEMC_METHOD_INIT_VARS;
@@ -1157,29 +1172,25 @@ PHP_METHOD(Memcached, fetch)
11571172
RETURN_FALSE;
11581173
}
11591174

1160-
payload = memcached_result_value(&result);
1161-
payload_len = memcached_result_length(&result);
1162-
flags = memcached_result_flags(&result);
1163-
res_key = memcached_result_key_value(&result);
1164-
res_key_len = memcached_result_key_length(&result);
1165-
cas = memcached_result_cas(&result);
1166-
1167-
if (!s_memcached_result_to_zval(&result, &value)) {
1175+
if (!s_memcached_result_to_zval(intern->memc, &result, &value)) {
11681176
memcached_result_free(&result);
11691177
intern->rescode = MEMC_RES_PAYLOAD_FAILURE;
11701178
RETURN_FALSE;
11711179
}
11721180

11731181
array_init(return_value);
1174-
add_assoc_stringl_ex(return_value, ZEND_STRL("key"), (char *)res_key, res_key_len);
1175-
add_assoc_zval_ex(return_value, ZEND_STRL("value"), &value);
1176-
if (cas != 0) {
1177-
/* XXX: also check against ULLONG_MAX or memc_behavior */
1178-
add_assoc_double_ex(return_value, ZEND_STRL("cas"), (double)cas);
1179-
}
1180-
if (MEMC_VAL_GET_USER_FLAGS(flags) != 0) {
1181-
add_assoc_long_ex(return_value, ZEND_STRL("flags"), MEMC_VAL_GET_USER_FLAGS(flags));
1182-
}
1182+
1183+
flags = memcached_result_flags(&result);
1184+
res_key = memcached_result_key_value(&result);
1185+
res_key_len = memcached_result_key_length(&result);
1186+
cas = memcached_result_cas(&result);
1187+
1188+
add_assoc_stringl_ex(return_value, ZEND_STRL("key"), (char *) res_key, res_key_len);
1189+
add_assoc_zval_ex(return_value, ZEND_STRL("value"), &value);
1190+
1191+
s_uint64_to_zval (&zv_cas, cas);
1192+
add_assoc_zval_ex(return_value, ZEND_STRL("cas"), &zv_cas);
1193+
add_assoc_long_ex(return_value, ZEND_STRL("flags"), MEMC_VAL_GET_USER_FLAGS(flags));
11831194

11841195
memcached_result_free(&result);
11851196
}
@@ -1193,9 +1204,9 @@ PHP_METHOD(Memcached, fetchAll)
11931204
size_t res_key_len = 0;
11941205
const char *payload = NULL;
11951206
size_t payload_len = 0;
1196-
zval value, entry;
11971207
uint32_t flags;
11981208
uint64_t cas = 0;
1209+
zval value, entry, zv_cas;
11991210
memcached_result_st result;
12001211
memcached_return status = MEMCACHED_SUCCESS;
12011212
MEMC_METHOD_INIT_VARS;
@@ -1211,30 +1222,27 @@ PHP_METHOD(Memcached, fetchAll)
12111222
memcached_result_create(intern->memc, &result);
12121223

12131224
while ((memcached_fetch_result(intern->memc, &result, &status)) != NULL) {
1214-
payload = memcached_result_value(&result);
1215-
payload_len = memcached_result_length(&result);
1216-
flags = memcached_result_flags(&result);
1217-
res_key = memcached_result_key_value(&result);
1218-
res_key_len = memcached_result_key_length(&result);
1219-
cas = memcached_result_cas(&result);
12201225

1221-
if (!s_memcached_result_to_zval(&result, &value)) {
1226+
if (!s_memcached_result_to_zval(intern->memc, &result, &value)) {
12221227
memcached_result_free(&result);
12231228
zval_dtor(return_value);
12241229
intern->rescode = MEMC_RES_PAYLOAD_FAILURE;
12251230
RETURN_FALSE;
12261231
}
12271232

1233+
flags = memcached_result_flags(&result);
1234+
res_key = memcached_result_key_value(&result);
1235+
res_key_len = memcached_result_key_length(&result);
1236+
cas = memcached_result_cas(&result);
1237+
12281238
array_init(&entry);
12291239
add_assoc_stringl_ex(&entry, ZEND_STRL("key"), (char *)res_key, res_key_len);
1230-
add_assoc_zval_ex(&entry, ZEND_STRL("value"), &value);
1231-
if (cas != 0) {
1232-
/* XXX: also check against ULLONG_MAX or memc_behavior */
1233-
add_assoc_double_ex(&entry, ZEND_STRL("cas"), (double)cas);
1234-
}
1235-
if (MEMC_VAL_GET_USER_FLAGS(flags) != 0) {
1236-
add_assoc_long_ex(&entry, ZEND_STRL("flags"), MEMC_VAL_GET_USER_FLAGS(flags));
1237-
}
1240+
add_assoc_zval_ex(&entry, ZEND_STRL("value"), &value);
1241+
1242+
s_uint64_to_zval (&zv_cas, cas);
1243+
add_assoc_zval_ex(&entry, ZEND_STRL("cas"), &zv_cas);
1244+
add_assoc_long_ex(&entry, ZEND_STRL("flags"), MEMC_VAL_GET_USER_FLAGS(flags));
1245+
12381246
add_next_index_zval(return_value, &entry);
12391247
}
12401248

@@ -2825,8 +2833,7 @@ static PHP_METHOD(Memcached, setSaslAuthData)
28252833
return;
28262834
}
28272835

2828-
if (!MEMC_G(sasl_enabled)) {
2829-
php_error_docref(NULL, E_WARNING, "SASL support (memcached.use_sasl) isn't enabled in php.ini");
2836+
if (!php_memc_init_sasl_if_needed()) {
28302837
RETURN_FALSE;
28312838
}
28322839

@@ -3363,7 +3370,7 @@ zend_string *s_decompress_value (const char *payload, size_t payload_len, uint32
33633370
}
33643371

33653372
static
3366-
zend_bool s_unserialize_value (int val_type, zend_string *payload, zval *return_value)
3373+
zend_bool s_unserialize_value (memcached_st *memc, int val_type, zend_string *payload, zval *return_value)
33673374
{
33683375
switch (val_type) {
33693376
case MEMC_VAL_IS_SERIALIZED:
@@ -3402,7 +3409,10 @@ zend_bool s_unserialize_value (int val_type, zend_string *payload, zval *return_
34023409

34033410
case MEMC_VAL_IS_JSON:
34043411
#ifdef HAVE_JSON_API
3405-
php_json_decode(return_value, payload->val, payload->len, (serializer == SERIALIZER_JSON_ARRAY), PHP_JSON_PARSER_DEFAULT_DEPTH);
3412+
{
3413+
php_memc_user_data_t *memc_user_data = memcached_get_user_data(memc);
3414+
php_json_decode(return_value, payload->val, payload->len, (memc_user_data->serializer == SERIALIZER_JSON_ARRAY), PHP_JSON_PARSER_DEFAULT_DEPTH);
3415+
}
34063416
#else
34073417
ZVAL_FALSE(return_value);
34083418
php_error_docref(NULL, E_WARNING, "could not unserialize value, no json support");
@@ -3424,7 +3434,7 @@ zend_bool s_unserialize_value (int val_type, zend_string *payload, zval *return_
34243434
}
34253435

34263436
static
3427-
zend_bool s_memcached_result_to_zval(memcached_result_st *result, zval *return_value)
3437+
zend_bool s_memcached_result_to_zval(memcached_st *memc, memcached_result_st *result, zval *return_value)
34283438
{
34293439
zend_string *data;
34303440
const char *payload;
@@ -3485,7 +3495,7 @@ zend_bool s_memcached_result_to_zval(memcached_result_st *result, zval *return_v
34853495
case MEMC_VAL_IS_IGBINARY:
34863496
case MEMC_VAL_IS_JSON:
34873497
case MEMC_VAL_IS_MSGPACK:
3488-
retval = s_unserialize_value (MEMC_VAL_GET_TYPE(flags), data, return_value);
3498+
retval = s_unserialize_value (memc, MEMC_VAL_GET_TYPE(flags), data, return_value);
34893499
break;
34903500

34913501
default:
@@ -3648,7 +3658,7 @@ int s_invoke_result_callback(zval *zmemc_obj, zend_fcall_info *fci, zend_fcall_i
36483658

36493659
intern = Z_MEMC_OBJ_P(zmemc_obj);
36503660

3651-
if (!s_memcached_result_to_zval(result, &value)) {
3661+
if (!s_memcached_result_to_zval(intern->memc, result, &value)) {
36523662
intern->rescode = MEMC_RES_PAYLOAD_FAILURE;
36533663
return -1;
36543664
}
@@ -4159,37 +4169,35 @@ PHP_GINIT_FUNCTION(php_memcached)
41594169
{
41604170
#ifdef HAVE_MEMCACHED_SESSION
41614171

4162-
php_memcached_globals->session_ini.lock_enabled = 0;
4163-
php_memcached_globals->session_ini.lock_wait_max = 2000;
4164-
php_memcached_globals->session_ini.lock_wait_min = 1000;
4165-
php_memcached_globals->session_ini.lock_retries = 5;
4166-
php_memcached_globals->session_ini.lock_expiration = 30;
4167-
php_memcached_globals->session_ini.compression_enabled = 1;
4168-
php_memcached_globals->session_ini.binary_protocol_enabled = 1;
4169-
php_memcached_globals->session_ini.consistent_hash_enabled = 1;
4170-
php_memcached_globals->session_ini.number_of_replicas = 0;
4171-
php_memcached_globals->session_ini.server_failure_limit = 1;
4172-
php_memcached_globals->session_ini.randomize_replica_read_enabled = 1;
4173-
php_memcached_globals->session_ini.remove_failed_servers_enabled = 1;
4174-
php_memcached_globals->session_ini.connect_timeout = 1000;
4175-
php_memcached_globals->session_ini.prefix = NULL;
4176-
php_memcached_globals->session_ini.persistent_enabled = 0;
4177-
php_memcached_globals->session_ini.sasl_username = NULL;
4178-
php_memcached_globals->session_ini.sasl_password = NULL;
4172+
php_memcached_globals->session.lock_enabled = 0;
4173+
php_memcached_globals->session.lock_wait_max = 2000;
4174+
php_memcached_globals->session.lock_wait_min = 1000;
4175+
php_memcached_globals->session.lock_retries = 5;
4176+
php_memcached_globals->session.lock_expiration = 30;
4177+
php_memcached_globals->session.compression_enabled = 1;
4178+
php_memcached_globals->session.binary_protocol_enabled = 1;
4179+
php_memcached_globals->session.consistent_hash_enabled = 1;
4180+
php_memcached_globals->session.number_of_replicas = 0;
4181+
php_memcached_globals->session.server_failure_limit = 1;
4182+
php_memcached_globals->session.randomize_replica_read_enabled = 1;
4183+
php_memcached_globals->session.remove_failed_servers_enabled = 1;
4184+
php_memcached_globals->session.connect_timeout = 1000;
4185+
php_memcached_globals->session.prefix = NULL;
4186+
php_memcached_globals->session.persistent_enabled = 0;
4187+
php_memcached_globals->session.sasl_username = NULL;
4188+
php_memcached_globals->session.sasl_password = NULL;
41794189

4180-
php_memcached_globals->no_effect = 0;
4181-
4182-
#endif
4183-
php_memcached_globals->memc_ini.serializer_name = NULL;
4184-
php_memcached_globals->memc_ini.serializer = SERIALIZER_DEFAULT;
4185-
php_memcached_globals->memc_ini.compression_type = NULL;
4186-
php_memcached_globals->memc_ini.compression_threshold = 2000;
4187-
php_memcached_globals->memc_ini.compression_type_real = COMPRESSION_TYPE_FASTLZ;
4188-
php_memcached_globals->memc_ini.compression_factor = 1.30;
4189-
php_memcached_globals->memc_ini.store_retry_count = 2;
4190-
#if HAVE_MEMCACHED_SASL
4191-
php_memcached_globals->memc_ini.sasl_enabled = 0;
41924190
#endif
4191+
php_memcached_globals->memc.serializer_name = NULL;
4192+
php_memcached_globals->memc.serializer = SERIALIZER_DEFAULT;
4193+
php_memcached_globals->memc.compression_type = NULL;
4194+
php_memcached_globals->memc.compression_threshold = 2000;
4195+
php_memcached_globals->memc.compression_type_real = COMPRESSION_TYPE_FASTLZ;
4196+
php_memcached_globals->memc.compression_factor = 1.30;
4197+
php_memcached_globals->memc.store_retry_count = 2;
4198+
4199+
php_memcached_globals->memc.sasl_initialised = 0;
4200+
php_memcached_globals->no_effect = 0;
41934201
}
41944202

41954203
zend_module_entry memcached_module_entry = {
@@ -4385,11 +4393,11 @@ static void php_memc_register_constants(INIT_FUNC_ARGS)
43854393
/*
43864394
* Serializer types.
43874395
*/
4388-
REGISTER_MEMC_CLASS_CONST_LONG(SERIALIZER_PHP, SERIALIZER_PHP);
4389-
REGISTER_MEMC_CLASS_CONST_LONG(SERIALIZER_IGBINARY, SERIALIZER_IGBINARY);
4390-
REGISTER_MEMC_CLASS_CONST_LONG(SERIALIZER_JSON, SERIALIZER_JSON);
4396+
REGISTER_MEMC_CLASS_CONST_LONG(SERIALIZER_PHP, SERIALIZER_PHP);
4397+
REGISTER_MEMC_CLASS_CONST_LONG(SERIALIZER_IGBINARY, SERIALIZER_IGBINARY);
4398+
REGISTER_MEMC_CLASS_CONST_LONG(SERIALIZER_JSON, SERIALIZER_JSON);
43914399
REGISTER_MEMC_CLASS_CONST_LONG(SERIALIZER_JSON_ARRAY, SERIALIZER_JSON_ARRAY);
4392-
REGISTER_MEMC_CLASS_CONST_LONG(SERIALIZER_MSGPACK, SERIALIZER_MSGPACK);
4400+
REGISTER_MEMC_CLASS_CONST_LONG(SERIALIZER_MSGPACK, SERIALIZER_MSGPACK);
43934401

43944402
/*
43954403
* Compression types
@@ -4487,15 +4495,6 @@ PHP_MINIT_FUNCTION(memcached)
44874495
#ifdef HAVE_MEMCACHED_SESSION
44884496
php_memc_session_minit(module_number);
44894497
#endif
4490-
4491-
#if HAVE_MEMCACHED_SASL
4492-
if (MEMC_G(sasl_enabled)) {
4493-
if (sasl_client_init(NULL) != SASL_OK) {
4494-
php_error_docref(NULL, E_ERROR, "Failed to initialize SASL library");
4495-
return FAILURE;
4496-
}
4497-
}
4498-
#endif
44994498
return SUCCESS;
45004499
}
45014500
/* }}} */
@@ -4504,7 +4503,7 @@ PHP_MINIT_FUNCTION(memcached)
45044503
PHP_MSHUTDOWN_FUNCTION(memcached)
45054504
{
45064505
#if HAVE_MEMCACHED_SASL
4507-
if (MEMC_G(sasl_enabled)) {
4506+
if (MEMC_G(sasl_initialised)) {
45084507
sasl_done();
45094508
}
45104509
#endif

0 commit comments

Comments
 (0)