Browse Source

Fixed MySQLi built with mysqlnd

pull/686/merge
Xinchen Hui 12 years ago
parent
commit
b7b5fa111b
  1. 2
      ext/mysqli/mysqli.c
  2. 54
      ext/mysqli/mysqli_nonapi.c
  3. 19
      ext/mysqli/mysqli_warning.c
  4. 2
      ext/mysqlnd/mysqlnd.c

2
ext/mysqli/mysqli.c

@ -497,7 +497,7 @@ static MYSQLND *mysqli_convert_zv_to_mysqlnd(zval * zv TSRMLS_DC)
mysqli_object *intern = Z_MYSQLI_P(zv);
if (!(my_res = (MYSQLI_RESOURCE *)intern->ptr)) {
/* We know that we have a mysqli object, so this failure should be emitted */
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't fetch %s", intern->zo.ce->name);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't fetch %s", intern->zo.ce->name->val);
return NULL;
}
mysql = (MY_MYSQL *)(my_res->ptr);

54
ext/mysqli/mysqli_nonapi.c

@ -365,7 +365,7 @@ PHP_FUNCTION(mysqli_fetch_all)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O|l", &mysql_result, mysqli_result_class_entry, &mode) == FAILURE) {
return;
}
MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result", MYSQLI_STATUS_VALID);
MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, mysql_result, "mysqli_result", MYSQLI_STATUS_VALID);
if (!mode || (mode & ~MYSQLND_FETCH_BOTH)) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Mode can be only MYSQLI_FETCH_NUM, "
@ -399,7 +399,7 @@ PHP_FUNCTION(mysqli_get_connection_stats)
&mysql_link, mysqli_link_class_entry) == FAILURE) {
return;
}
MYSQLI_FETCH_RESOURCE_CONN(mysql, &mysql_link, MYSQLI_STATUS_VALID);
MYSQLI_FETCH_RESOURCE_CONN(mysql, mysql_link, MYSQLI_STATUS_VALID);
mysqlnd_get_connection_stats(mysql->mysql, return_value);
}
@ -636,36 +636,34 @@ PHP_FUNCTION(mysqli_query)
/* {{{ mysqlnd_zval_array_to_mysqlnd_array functions */
static int mysqlnd_zval_array_to_mysqlnd_array(zval *in_array, MYSQLND ***out_array TSRMLS_DC)
{
zval **elem;
zval *elem;
int i = 0, current = 0;
if (Z_TYPE_P(in_array) != IS_ARRAY) {
return 0;
}
*out_array = ecalloc(zend_hash_num_elements(Z_ARRVAL_P(in_array)) + 1, sizeof(MYSQLND *));
for (zend_hash_internal_pointer_reset(Z_ARRVAL_P(in_array));
zend_hash_get_current_data(Z_ARRVAL_P(in_array), (void **) &elem) == SUCCESS;
zend_hash_move_forward(Z_ARRVAL_P(in_array))) {
ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(in_array), elem) {
i++;
if (Z_TYPE_PP(elem) != IS_OBJECT ||
!instanceof_function(Z_OBJCE_PP(elem), mysqli_link_class_entry TSRMLS_CC)) {
if (Z_TYPE_P(elem) != IS_OBJECT ||
!instanceof_function(Z_OBJCE_P(elem), mysqli_link_class_entry TSRMLS_CC)) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Parameter %d not a mysqli object", i);
} else {
MY_MYSQL *mysql;
MYSQLI_RESOURCE *my_res;
mysqli_object *intern = (mysqli_object *)zend_object_store_get_object(*elem TSRMLS_CC);
mysqli_object *intern = Z_MYSQLI_P(elem);
if (!(my_res = (MYSQLI_RESOURCE *)intern->ptr)) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "[%d] Couldn't fetch %s", i, intern->zo.ce->name);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "[%d] Couldn't fetch %s", i, intern->zo.ce->name->val);
continue;
}
mysql = (MY_MYSQL*) my_res->ptr;
if (MYSQLI_STATUS_VALID && my_res->status < MYSQLI_STATUS_VALID) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid object %d or resource %s", i, intern->zo.ce->name);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid object %d or resource %s", i, intern->zo.ce->name->val);
continue;
}
(*out_array)[current++] = mysql->mysql;
}
}
} ZEND_HASH_FOREACH_END();
return 0;
}
/* }}} */
@ -674,32 +672,29 @@ static int mysqlnd_zval_array_to_mysqlnd_array(zval *in_array, MYSQLND ***out_ar
static int mysqlnd_zval_array_from_mysqlnd_array(MYSQLND **in_array, zval *out_array TSRMLS_DC)
{
MYSQLND **p = in_array;
HashTable *new_hash;
zval **elem, **dest_elem;
zval dest_array;
zval *elem, *dest_elem;
int ret = 0, i = 0;
ALLOC_HASHTABLE(new_hash);
zend_hash_init(new_hash, zend_hash_num_elements(Z_ARRVAL_P(out_array)), NULL, ZVAL_PTR_DTOR, 0);
array_init_size(&dest_array, zend_hash_num_elements(Z_ARRVAL_P(out_array)));
for (zend_hash_internal_pointer_reset(Z_ARRVAL_P(out_array));
zend_hash_get_current_data(Z_ARRVAL_P(out_array), (void **) &elem) == SUCCESS;
zend_hash_move_forward(Z_ARRVAL_P(out_array)))
{
ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(out_array), elem) {
i++;
if (Z_TYPE_PP(elem) != IS_OBJECT || !instanceof_function(Z_OBJCE_PP(elem), mysqli_link_class_entry TSRMLS_CC)) {
if (Z_TYPE_P(elem) != IS_OBJECT ||
!instanceof_function(Z_OBJCE_P(elem), mysqli_link_class_entry TSRMLS_CC)) {
continue;
}
{
MY_MYSQL *mysql;
MYSQLI_RESOURCE *my_res;
mysqli_object *intern = (mysqli_object *)zend_object_store_get_object(*elem TSRMLS_CC);
mysqli_object *intern = Z_MYSQLI_P(elem);
if (!(my_res = (MYSQLI_RESOURCE *)intern->ptr)) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "[%d] Couldn't fetch %s", i, intern->zo.ce->name);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "[%d] Couldn't fetch %s", i, intern->zo.ce->name->val);
continue;
}
mysql = (MY_MYSQL *) my_res->ptr;
if (mysql->mysql == *p) {
zend_hash_next_index_insert(new_hash, (void *)elem, sizeof(zval *), (void **)&dest_elem);
dest_elem = zend_hash_next_index_insert(Z_ARRVAL(dest_array), elem);
if (dest_elem) {
zval_add_ref(dest_elem);
}
@ -707,14 +702,11 @@ static int mysqlnd_zval_array_from_mysqlnd_array(MYSQLND **in_array, zval *out_a
p++;
}
}
}
} ZEND_HASH_FOREACH_END();
/* destroy old array and add new one */
zend_hash_destroy(Z_ARRVAL_P(out_array));
efree(Z_ARRVAL_P(out_array));
zend_hash_internal_pointer_reset(new_hash);
Z_ARRVAL_P(out_array) = new_hash;
zval_ptr_dtor(out_array);
ZVAL_COPY_VALUE(out_array, &dest_array);
return 0;
}
@ -734,7 +726,7 @@ static int mysqlnd_dont_poll_zval_array_from_mysqlnd_array(MYSQLND **in_array, z
mysqli_object *intern = Z_MYSQLI_P(elem);
mysql = (MY_MYSQL *)((MYSQLI_RESOURCE *)intern->ptr)->ptr;
if (mysql->mysql == *p) {
dest_elem = zend_hash_next_index_insert(Z_ARRAY(proxy), elem);
dest_elem = zend_hash_next_index_insert(Z_ARRVAL(proxy), elem);
if (dest_elem) {
zval_add_ref(dest_elem);
}

19
ext/mysqli/mysqli_warning.c

@ -106,7 +106,7 @@ MYSQLI_WARNING *php_new_warning(const zval * reason, int errorno TSRMLS_DC)
w = (MYSQLI_WARNING *)ecalloc(1, sizeof(MYSQLI_WARNING));
ZVAL_DUP(&w->reason, reason);
convert_to_string(&w->resson);
convert_to_string(&w->reason);
//????ZVAL_UTF8_STRINGL(&(w->reason), Z_STRVAL(w->reason), Z_STRLEN(w->reason), ZSTR_AUTOFREE);
@ -123,7 +123,7 @@ MYSQLI_WARNING * php_get_warnings(MYSQLND_CONN_DATA * mysql TSRMLS_DC)
{
MYSQLI_WARNING *w, *first = NULL, *prev = NULL;
MYSQL_RES *result;
zval *row;
zval row;
if (mysql->m->query(mysql, "SHOW WARNINGS", 13 TSRMLS_CC)) {
return NULL;
@ -135,24 +135,23 @@ MYSQLI_WARNING * php_get_warnings(MYSQLND_CONN_DATA * mysql TSRMLS_DC)
zval *entry;
int errno;
MAKE_STD_ZVAL(row);
mysqlnd_fetch_into(result, MYSQLND_FETCH_NUM, row, MYSQLND_MYSQLI);
if (Z_TYPE_P(row) != IS_ARRAY) {
mysqlnd_fetch_into(result, MYSQLND_FETCH_NUM, &row, MYSQLND_MYSQLI);
if (Z_TYPE(row) != IS_ARRAY) {
zval_ptr_dtor(&row);
break;
}
zend_hash_internal_pointer_reset(Z_ARRVAL_P(row));
zend_hash_internal_pointer_reset(Z_ARRVAL(row));
/* 0. we don't care about the first */
zend_hash_move_forward(Z_ARRVAL_P(row));
zend_hash_move_forward(Z_ARRVAL(row));
/* 1. Here comes the error no */
entry = zend_hash_get_current_data(Z_ARRVAL_P(row));
entry = zend_hash_get_current_data(Z_ARRVAL(row));
convert_to_long_ex(entry);
errno = Z_LVAL_P(entry);
zend_hash_move_forward(Z_ARRVAL_P(row));
zend_hash_move_forward(Z_ARRVAL(row));
/* 2. Here comes the reason */
entry = zend_hash_get_current_data(Z_ARRVAL_P(row));
entry = zend_hash_get_current_data(Z_ARRVAL(row));
w = php_new_warning(entry, errno TSRMLS_CC);
/*

2
ext/mysqlnd/mysqlnd.c

@ -2729,7 +2729,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, tx_commit_or_rollback)(MYSQLND_CONN_DATA * con
char * name_esc = mysqlnd_escape_string_for_tx_name_in_comment(name TSRMLS_CC);
query_len = mnd_sprintf(&query, 0, (commit? "COMMIT%s %s":"ROLLBACK%s %s"),
name_esc? name_esc:"", tmp_str.s->val? tmp_str.s->val:"");
name_esc? name_esc:"", tmp_str.s? tmp_str.s->val:"");
smart_str_free(&tmp_str);
if (name_esc) {
mnd_efree(name_esc);

Loading…
Cancel
Save