diff options
| -rw-r--r-- | ext/mysqli/mysqli.c | 43 |
1 files changed, 37 insertions, 6 deletions
diff --git a/ext/mysqli/mysqli.c b/ext/mysqli/mysqli.c index 30a0c13eb8..a363f4cc2f 100644 --- a/ext/mysqli/mysqli.c +++ b/ext/mysqli/mysqli.c @@ -44,7 +44,7 @@ PR_MAIN *prmain; extern void php_mysqli_connect(INTERNAL_FUNCTION_PARAMETERS); typedef int (*mysqli_read_t)(mysqli_object *obj, zval **retval TSRMLS_DC); -typedef int (*mysqli_write_t)(mysqli_object *obj, zval *member, zval *newval TSRMLS_DC); +typedef int (*mysqli_write_t)(mysqli_object *obj, zval *newval TSRMLS_DC); typedef struct _mysqli_prop_handler { mysqli_read_t read_func; @@ -149,7 +149,7 @@ static int mysqli_read_na(mysqli_object *obj, zval **retval TSRMLS_DC) /* }}} */ /* {{{ mysqli_write_na */ -static int mysqli_write_na(mysqli_object *obj, zval *member, zval *newval TSRMLS_DC) +static int mysqli_write_na(mysqli_object *obj, zval *newval TSRMLS_DC) { php_error_docref(NULL TSRMLS_CC, E_ERROR, "Cannot write property"); return FAILURE; @@ -195,19 +195,50 @@ zval *mysqli_read_property(zval *object, zval *member, zend_bool silent TSRMLS_D if (member == &tmp_member) { zval_dtor(member); } - - return(retval); } /* }}} */ -/* {{{ mysqli_write_property */ +/* {{{ mysqli_read_property */ void mysqli_write_property(zval *object, zval *member, zval *value TSRMLS_DC) { - return; + zval tmp_member; + mysqli_object *obj; + mysqli_prop_handler *hnd; + zend_object_handlers *std_hnd; + int ret; + + if (member->type != IS_STRING) { + tmp_member = *member; + zval_copy_ctor(&tmp_member); + convert_to_string(&tmp_member); + member = &tmp_member; + } + + ret = FAILURE; + obj = (mysqli_object *)zend_objects_get_address(object TSRMLS_CC); + + if (obj->prop_handler != NULL) { + ret = zend_hash_find((HashTable *)obj->prop_handler, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, (void **) &hnd); + } + if (ret == SUCCESS) { + hnd->write_func(obj, value TSRMLS_CC); + if (! PZVAL_IS_REF(value) && value->refcount == 0) { + value->refcount++; + zval_ptr_dtor(&value); + } + } else { + std_hnd = zend_get_std_object_handlers(); + std_hnd->write_property(object, member, value TSRMLS_CC); + } + + if (member == &tmp_member) { + zval_dtor(member); + } } /* }}} */ + void mysqli_add_property(HashTable *h, char *pname, mysqli_read_t r_func, mysqli_write_t w_func TSRMLS_DC) { mysqli_prop_handler p; |
