- }
-
- /* update */
- if ( ((key_type == HASH_KEY_IS_STRING) && (SUCCESS == zend_hash_find(Z_ARRVAL_P(qarray), key, keylen, (void *) &qarray_entry))) ||
- ((key_type == HASH_KEY_IS_LONG) && (SUCCESS == zend_hash_index_find(Z_ARRVAL_P(qarray), idx, (void *) &qarray_entry)))) {
- zval equal;
-
- /* recursive */
- if (Z_TYPE_P(params_entry) == IS_ARRAY || Z_TYPE_P(params_entry) == IS_OBJECT) {
- return php_http_querystring_modify(*qarray_entry, params_entry TSRMLS_CC);
+
+ FOREACH_HASH_KEYVAL(pos, ptr, key, params_entry) {
+ /* only public properties */
+ if (key.type != HASH_KEY_IS_STRING || *key.str) {
+ if (Z_TYPE_PP(params_entry) == IS_NULL) {
+ /*
+ * delete
+ */
+ if (key.type == HASH_KEY_IS_STRING) {
+ zend_hash_del(Z_ARRVAL_P(qarray), key.str, key.len);
+ } else {
+ zend_hash_index_del(Z_ARRVAL_P(qarray), key.num);
+ }
+ } else if ( ((key.type == HASH_KEY_IS_STRING) && (SUCCESS == zend_hash_find(Z_ARRVAL_P(qarray), key.str, key.len, (void *) &qarray_entry)))
+ || ((key.type == HASH_KEY_IS_LONG) && (SUCCESS == zend_hash_index_find(Z_ARRVAL_P(qarray), key.num, (void *) &qarray_entry)))) {
+ /*
+ * update
+ */
+ zval equal, *entry = NULL;
+
+ /* recursive */
+ if (Z_TYPE_PP(params_entry) == IS_ARRAY || Z_TYPE_PP(params_entry) == IS_OBJECT) {
+ entry = php_http_zsep(1, IS_ARRAY, *qarray_entry);
+ php_http_querystring_update(entry, *params_entry, NULL TSRMLS_CC);
+ } else if ((FAILURE == is_equal_function(&equal, *qarray_entry, *params_entry TSRMLS_CC)) || !Z_BVAL(equal)) {
+ Z_ADDREF_PP(params_entry);
+ entry = *params_entry;
+ }
+
+ if (entry) {
+ if (key.type == HASH_KEY_IS_STRING) {
+ zend_hash_update(Z_ARRVAL_P(qarray), key.str, key.len, (void *) &entry, sizeof(zval *), NULL);
+ } else {
+ zend_hash_index_update(Z_ARRVAL_P(qarray), key.num, (void *) &entry, sizeof(zval *), NULL);
+ }
+ }
+ } else {
+ zval *entry;
+ /*
+ * add
+ */
+ if (Z_TYPE_PP(params_entry) == IS_OBJECT) {
+ MAKE_STD_ZVAL(entry);
+ array_init(entry);
+ php_http_querystring_update(entry, *params_entry, NULL TSRMLS_CC);
+ } else {
+ Z_ADDREF_PP(params_entry);
+ entry = *params_entry;
+ }
+ if (key.type == HASH_KEY_IS_STRING) {
+ add_assoc_zval_ex(qarray, key.str, key.len, entry);
+ } else {
+ add_index_zval(qarray, key.num, entry);
+ }
+ }
+ }