summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorThies C. Arntzen <thies@php.net>2000-06-16 14:11:01 +0000
committerThies C. Arntzen <thies@php.net>2000-06-16 14:11:01 +0000
commit43d91224f6f54476b714eca50bd7caddb1d99ffd (patch)
tree0988834b5d37a2e645c0ac5cc687890b1e61dc44 /ext
parent8f8889d02dc3a0d05823ffb478b950eb3eb6022a (diff)
downloadphp-git-43d91224f6f54476b714eca50bd7caddb1d99ffd.tar.gz
@- Changed WDDX to serialize arrays as structs only if needed. (Thies)
Diffstat (limited to 'ext')
-rw-r--r--ext/wddx/wddx.c58
1 files changed, 49 insertions, 9 deletions
diff --git a/ext/wddx/wddx.c b/ext/wddx/wddx.c
index a0a1e5d62b..a8072922e0 100644
--- a/ext/wddx/wddx.c
+++ b/ext/wddx/wddx.c
@@ -385,21 +385,52 @@ static void php_wddx_serialize_hash(wddx_packet *packet, zval *var)
{
zval **ent;
char *key;
+ int is_struct = 0, ent_type;
ulong idx;
HashTable *target_hash;
char tmp_buf[WDDX_BUF_LEN];
target_hash = HASH_OF(var);
- php_wddx_add_chunk_static(packet, WDDX_STRUCT_S);
/* If variable is an object, always use struct and serialize its classname */
if (var->type == IS_OBJECT) {
+ php_wddx_add_chunk_static(packet, WDDX_STRUCT_S);
sprintf(tmp_buf, WDDX_VAR_S, PHP_CLASS_NAME_VAR);
php_wddx_add_chunk(packet, tmp_buf);
php_wddx_add_chunk_static(packet, WDDX_STRING_S);
php_wddx_add_chunk_ex(packet, var->value.obj.ce->name, var->value.obj.ce->name_length);
php_wddx_add_chunk_static(packet, WDDX_STRING_E);
php_wddx_add_chunk_static(packet, WDDX_VAR_E);
+ is_struct = 1;
+ } else {
+ int ind = 0,type;
+
+ for (zend_hash_internal_pointer_reset(target_hash);
+ zend_hash_get_current_data(target_hash, (void**)&ent) == SUCCESS;
+ zend_hash_move_forward(target_hash)) {
+
+ type = zend_hash_get_current_key(target_hash, &key, &idx);
+
+ if (type == HASH_KEY_IS_STRING) {
+ is_struct = 1;
+ efree(key);
+ break;
+ }
+
+ if (idx != ind) {
+ is_struct = 1;
+ break;
+ }
+
+ ind++;
+ }
+
+ if (is_struct) {
+ php_wddx_add_chunk_static(packet, WDDX_STRUCT_S);
+ } else {
+ sprintf(tmp_buf, WDDX_ARRAY_S, zend_hash_num_elements(target_hash));
+ php_wddx_add_chunk(packet, tmp_buf);
+ }
}
for (zend_hash_internal_pointer_reset(target_hash);
@@ -408,16 +439,25 @@ static void php_wddx_serialize_hash(wddx_packet *packet, zval *var)
if (*ent == var)
continue;
- if (zend_hash_get_current_key(target_hash, &key, &idx) == HASH_KEY_IS_STRING) {
- php_wddx_serialize_var(packet, *ent, key);
- efree(key);
- } else {
- sprintf(tmp_buf, "%ld", idx);
- php_wddx_serialize_var(packet, *ent, tmp_buf);
- }
+ if (is_struct) {
+ ent_type = zend_hash_get_current_key(target_hash, &key, &idx);
+
+ if (ent_type == HASH_KEY_IS_STRING) {
+ php_wddx_serialize_var(packet, *ent, key);
+ efree(key);
+ } else {
+ sprintf(tmp_buf, "%ld", idx);
+ php_wddx_serialize_var(packet, *ent, tmp_buf);
+ }
+ } else
+ php_wddx_serialize_var(packet, *ent, NULL);
}
- php_wddx_add_chunk_static(packet, WDDX_STRUCT_E);
+ if (is_struct) {
+ php_wddx_add_chunk_static(packet, WDDX_STRUCT_E);
+ } else {
+ php_wddx_add_chunk_static(packet, WDDX_ARRAY_E);
+ }
}
/* }}} */