Author: ahristov
Date: 2007-03-12 14:28:11 +0100 (Mon, 12 Mar 2007)
New Revision: 103
Modified:
trunk/ext/mysqli/mysqli.c
trunk/ext/mysqli/mysqli_api.c
trunk/ext/mysqli/mysqli_fe.c
trunk/ext/mysqli/mysqli_libmysql.h
trunk/ext/mysqli/mysqli_mysqlnd.h
trunk/ext/mysqli/mysqli_nonapi.c
trunk/ext/mysqli/mysqlnd/mysqlnd.c
trunk/ext/mysqli/php_mysqli.h
Log:
Integration of mysqli with mysqlnd PS API.
Now the SVN should compile.
Some tests are leaking, will investigate where it came from
Modified: trunk/ext/mysqli/mysqli.c
===================================================================
--- trunk/ext/mysqli/mysqli.c 2007-03-12 13:18:39 UTC (rev 102)
+++ trunk/ext/mysqli/mysqli.c 2007-03-12 13:28:11 UTC (rev 103)
@@ -66,6 +66,7 @@
static int le_pmysqli;
+/* Destructor for Persistent Connections */
ZEND_RSRC_DTOR_FUNC(php_mysqli_dtor)
{
if (rsrc->ptr) {
@@ -73,7 +74,7 @@
#if defined(HAVE_MYSQLND)
mysqlnd_end_psession(mysql);
#endif
- mysql_close(mysql);
+ mysqli_close(mysql, MYSQLI_CLOSE_IMPLICIT);
}
}
@@ -82,6 +83,7 @@
return le_pmysqli;
}
+#ifndef HAVE_MYSQLND
/* {{{ php_free_stmt_bind_buffer */
void php_free_stmt_bind_buffer(BIND_BUFFER bbuf, int type)
{
@@ -123,22 +125,33 @@
return;
}
/* }}} */
+#endif
/* {{{ php_clear_stmt_bind */
void php_clear_stmt_bind(MY_STMT *stmt TSRMLS_DC)
{
if (stmt->stmt) {
- mysql_stmt_close(stmt->stmt);
+ if (mysqli_stmt_close(stmt->stmt, TRUE)) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error occured while closing statement");
+ return;
+ }
}
+ /*
+ mysqlnd keeps track of the binding and has freed its
+ structures in stmt_close() above
+ */
+#ifndef HAVE_MYSQLND
+ /* Clean param bind */
php_free_stmt_bind_buffer(stmt->param, FETCH_SIMPLE);
+ /* Clean output bind */
php_free_stmt_bind_buffer(stmt->result, FETCH_RESULT);
+#endif
if (stmt->query) {
efree(stmt->query);
}
efree(stmt);
- return;
}
/* }}} */
@@ -178,7 +191,7 @@
MY_MYSQL *mysql = (MY_MYSQL *)my_res->ptr;
if (mysql->mysql) {
if (!mysql->persistent) {
- mysql_close(mysql->mysql);
+ mysqli_close(mysql->mysql, MYSQLI_CLOSE_IMPLICIT);
}
}
php_clear_mysql(mysql);
Modified: trunk/ext/mysqli/mysqli_api.c
===================================================================
--- trunk/ext/mysqli/mysqli_api.c 2007-03-12 13:18:39 UTC (rev 102)
+++ trunk/ext/mysqli/mysqli_api.c 2007-03-12 13:28:11 UTC (rev 103)
@@ -75,74 +75,25 @@
/* }}} */
-/* {{{ proto bool mysqli_stmt_bind_param(object stmt, string types, mixed variable
[,mixed,....]) U
- Bind variables to a prepared statement as parameters */
-#if !defined(HAVE_MYSQLND)
-PHP_FUNCTION(mysqli_stmt_bind_param)
+#ifndef HAVE_MYSQLND
+static
+int mysqli_stmt_bind_param_do_bind(MY_STMT *stmt, unsigned int argc, unsigned int
num_vars,
+ zval ***args, unsigned int start, const char * const types TSRMLS_DC)
{
- zval ***args;
- int argc = ZEND_NUM_ARGS();
- int i;
- int num_vars;
- int start = 2;
- int ofs;
- MY_STMT *stmt;
- zval *mysql_stmt;
+ int i, ofs;
MYSQL_BIND *bind;
- char *types;
- int types_len;
unsigned long rc;
- /* calculate and check number of parameters */
- if (argc < 2) {
- /* there has to be at least one pair */
- WRONG_PARAM_COUNT;
- }
-
- if (zend_parse_method_parameters((getThis()) ? 1:2 TSRMLS_CC, getThis(), "Os&",
&mysql_stmt, mysqli_stmt_class_entry,
- &types, &types_len, UG(utf8_conv)) == FAILURE) {
- return;
- }
-
- MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt",
MYSQLI_STATUS_VALID);
-
- num_vars = argc - 1;
- if (getThis()) {
- start = 1;
- } else {
- /* ignore handle parameter in procedural interface*/
- --num_vars;
- }
-
- if (types_len != argc - start) {
- /* number of bind variables doesn't match number of elements in type definition string
*/
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number of elements in type definition
string doesn't match number of bind variables");
- RETURN_FALSE;
- }
-
- if (types_len != stmt->stmt->param_count) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number of variables doesn't match number
of parameters in prepared statement");
- RETURN_FALSE;
- }
-
/* prevent leak if variables are already bound */
if (stmt->param.var_cnt) {
php_free_stmt_bind_buffer(stmt->param, FETCH_SIMPLE);
}
-
- args = (zval ***)safe_emalloc(argc, sizeof(zval **), 0);
-
- if (zend_get_parameters_array_ex(argc, args) == FAILURE) {
- efree(args);
- zend_wrong_param_count(TSRMLS_C);
- RETURN_FALSE;
- }
-
+
stmt->param.is_null = ecalloc(num_vars, sizeof(char));
- bind = (MYSQL_BIND *)ecalloc(num_vars, sizeof(MYSQL_BIND));
+ bind = (MYSQL_BIND *) ecalloc(num_vars, sizeof(MYSQL_BIND));
ofs = 0;
- for (i=start; i < argc; i++) {
+ for (i = start; i < argc; i++) {
/* set specified type */
switch (types[ofs]) {
@@ -171,88 +122,153 @@
default:
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Undefined fieldtype %c (parameter %d)",
types[ofs], i+1);
- RETVAL_FALSE;
+ rc = 1;
goto end_1;
}
ofs++;
}
rc = mysql_stmt_bind_param(stmt->stmt, bind);
- MYSQLI_REPORT_STMT_ERROR(stmt->stmt);
+end_1:
if (rc) {
- RETVAL_FALSE;
- goto end_1;
+ efree(stmt->param.is_null);
+ } else {
+ stmt->param.var_cnt = num_vars;
+ stmt->param.vars = (zval **)safe_emalloc(num_vars, sizeof(zval), 0);
+ for (i = 0; i < num_vars; i++) {
+ if (bind[i].buffer_type != MYSQL_TYPE_LONG_BLOB) {
+ ZVAL_ADDREF(*args[i+start]);
+ stmt->param.vars[i] = *args[i+start];
+ } else {
+ stmt->param.vars[i] = NULL;
+ }
+ }
}
+ efree(bind);
- stmt->param.var_cnt = num_vars;
- stmt->param.vars = (zval **)safe_emalloc(num_vars, sizeof(zval), 0);
- for (i = 0; i < num_vars; i++) {
- if (bind[i].buffer_type != MYSQL_TYPE_LONG_BLOB) {
- ZVAL_ADDREF(*args[i+start]);
- stmt->param.vars[i] = *args[i+start];
- } else {
- stmt->param.vars[i] = NULL;
+ return rc;
+}
+#else
+static
+int mysqli_stmt_bind_param_do_bind(MY_STMT *stmt, unsigned int argc, unsigned int
num_vars,
+ zval ***args, unsigned int start, const char * const types TSRMLS_DC)
+{
+ int i;
+ MYSQLND_PARAM_BIND *params;
+ enum_func_status ret = FAIL;
+
+ params = emalloc((argc - start) * sizeof(MYSQLND_PARAM_BIND));
+ for (i = 0; i < (argc - start); i++) {
+ zend_uchar type;
+ switch (types[i]) {
+ case 'd': /* Double */
+ type = MYSQL_TYPE_DOUBLE;
+ break;
+ case 'i': /* Integer */
+#if SIZEOF_LONG==8
+ type = MYSQL_TYPE_LONGLONG;
+#elif SIZEOF_LONG==4
+ type = MYSQL_TYPE_LONG;
+#endif
+ break;
+ case 'b': /* Blob (send data) */
+ type = MYSQL_TYPE_LONG_BLOB;
+ break;
+ case 's': /* string */
+ type = MYSQL_TYPE_VAR_STRING;
+ break;
+ default:
+ /* We count parameters from 1 */
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Undefined fieldtype %c (parameter %d)",
types[i], i + start + 1);
+ ret = FAIL;
+ efree(params);
+ goto end;
}
+ params[i].zv = *(args[i + start]);
+ params[i].type = type;
}
- RETVAL_TRUE;
-end_1:
- efree(args);
- efree(bind);
+ ret = mysqlnd_stmt_bind_param(stmt->stmt, params);
+
+end:
+ return ret;
}
#endif
-/* }}} */
-
-/* {{{ proto bool mysqli_stmt_bind_result(object stmt, mixed var, [,mixed, ...]) U
- Bind variables to a prepared statement for result storage */
-#if !defined(HAVE_MYSQLND)
-/* TODO:
- do_alloca, free_alloca
-*/
-
-PHP_FUNCTION(mysqli_stmt_bind_result)
+/* {{{ proto bool mysqli_stmt_bind_param(object stmt, string types, mixed variable
[,mixed,....]) U
+ Bind variables to a prepared statement as parameters */
+PHP_FUNCTION(mysqli_stmt_bind_param)
{
- zval ***args;
- int argc = ZEND_NUM_ARGS();
- int i;
- int start = 1;
- int var_cnt;
- int ofs;
- long col_type;
- ulong rc;
- MY_STMT *stmt;
- zval *mysql_stmt;
- MYSQL_BIND *bind;
+ zval ***args;
+ int argc = ZEND_NUM_ARGS();
+ int num_vars;
+ int start = 2;
+ MY_STMT *stmt;
+ zval *mysql_stmt;
+ char *types;
+ int types_len;
+ unsigned long rc;
- if (getThis()) {
- start = 0;
+ /* calculate and check number of parameters */
+ if (argc < 2) {
+ /* there has to be at least one pair */
+ WRONG_PARAM_COUNT;
}
- if (zend_parse_method_parameters((getThis()) ? 0:1 TSRMLS_CC, getThis(), "O",
&mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
+ if (zend_parse_method_parameters((getThis()) ? 1:2 TSRMLS_CC, getThis(), "Os&",
&mysql_stmt, mysqli_stmt_class_entry,
+ &types, &types_len, UG(utf8_conv)) == FAILURE) {
return;
}
MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt",
MYSQLI_STATUS_VALID);
- if (argc < (getThis() ? 1 : 2)) {
- WRONG_PARAM_COUNT;
+ num_vars = argc - 1;
+ if (getThis()) {
+ start = 1;
+ } else {
+ /* ignore handle parameter in procedural interface*/
+ --num_vars;
}
+ if (types_len != argc - start) {
+ /* number of bind variables doesn't match number of elements in type definition string
*/
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number of elements in type definition
string doesn't match number of bind variables");
+ RETURN_FALSE;
+ }
+
+ if (types_len != mysql_stmt_param_count(stmt->stmt)) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number of variables doesn't match number
of parameters in prepared statement");
+ RETURN_FALSE;
+ }
+
args = (zval ***)safe_emalloc(argc, sizeof(zval **), 0);
if (zend_get_parameters_array_ex(argc, args) == FAILURE) {
- efree(args);
- WRONG_PARAM_COUNT;
+ zend_wrong_param_count(TSRMLS_C);
+ rc = 1;
+ } else {
+ rc = mysqli_stmt_bind_param_do_bind(stmt, argc, num_vars, args, start, types
TSRMLS_CC);
+ MYSQLI_REPORT_STMT_ERROR(stmt->stmt);
}
- var_cnt = argc - start;
+ efree(args);
- if (var_cnt != mysql_stmt_field_count(stmt->stmt)) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number of bind variables doesn't match
number of fields in prepared statement");
- efree(args);
- RETURN_FALSE;
- }
+ RETURN_BOOL(!rc);
+}
+/* }}} */
+#ifndef HAVE_MYSQLND
+/* TODO:
+ do_alloca, free_alloca
+*/
+static int
+mysqli_stmt_bind_result_do_bind(MY_STMT *stmt, zval ***args, unsigned int argc, unsigned
int start TSRMLS_DC)
+{
+ MYSQL_BIND *bind;
+ int i, ofs;
+ int var_cnt = argc - start;
+ long col_type;
+ ulong rc;
+
/* prevent leak if variables are already bound */
if (stmt->result.var_cnt) {
php_free_stmt_bind_buffer(stmt->result, FETCH_RESULT);
@@ -391,7 +407,6 @@
}
/* Don't free stmt->result.is_null because is_null & buf are one block of memory
*/
efree(stmt->result.buf);
- RETVAL_FALSE;
} else {
stmt->result.var_cnt = var_cnt;
stmt->result.vars = (zval **)safe_emalloc((var_cnt), sizeof(zval), 0);
@@ -400,12 +415,71 @@
ZVAL_ADDREF(*args[i]);
stmt->result.vars[ofs] = *args[i];
}
- RETVAL_TRUE;
}
- efree(args);
efree(bind);
+
+ return rc;
}
+#else
+static int
+mysqli_stmt_bind_result_do_bind(MY_STMT *stmt, zval ***args, unsigned int argc, unsigned
int start TSRMLS_DC)
+{
+ unsigned int i;
+ MYSQLND_RESULT_BIND *params;
+
+ params = emalloc((argc - start) * sizeof(MYSQLND_RESULT_BIND));
+ for (i = 0; i < (argc - start); i++) {
+ params[i].zv = *(args[i + start]);
+ }
+ return mysqlnd_stmt_bind_result(stmt->stmt, params);
+}
#endif
+
+/* {{{ proto bool mysqli_stmt_bind_result(object stmt, mixed var, [,mixed, ...]) U
+ Bind variables to a prepared statement for result storage */
+PHP_FUNCTION(mysqli_stmt_bind_result)
+{
+ zval ***args;
+ int argc = ZEND_NUM_ARGS();
+ int start = 1;
+ ulong rc;
+ MY_STMT *stmt;
+ zval *mysql_stmt;
+
+ if (getThis()) {
+ start = 0;
+ }
+
+ if (zend_parse_method_parameters((getThis()) ? 0:1 TSRMLS_CC, getThis(), "O",
&mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
+ return;
+ }
+
+ MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt",
MYSQLI_STATUS_VALID);
+
+ if (argc < (getThis() ? 1 : 2)) {
+ WRONG_PARAM_COUNT;
+ }
+
+ args = (zval ***)safe_emalloc(argc, sizeof(zval **), 0);
+
+ if (zend_get_parameters_array_ex(argc, args) == FAILURE) {
+ efree(args);
+ WRONG_PARAM_COUNT;
+ }
+
+
+ if ((argc - start) != mysql_stmt_field_count(stmt->stmt)) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number of bind variables doesn't match
number of fields in prepared statement");
+ efree(args);
+ RETURN_FALSE;
+ }
+
+ rc = mysqli_stmt_bind_result_do_bind(stmt, args, argc, start TSRMLS_CC);
+
+ efree(args);
+
+ RETURN_BOOL(!rc);
+}
/* }}} */
/* {{{ proto bool mysqli_change_user(object link, string user, string password, string
database) U
@@ -475,9 +549,10 @@
php_clear_mysql(mysql);
- if (!mysql->persistent)
- mysql_close(mysql->mysql);
-
+ if (!mysql->persistent) {
+ mysqli_close(mysql->mysql, MYSQLI_CLOSE_EXPLICIT);
+ }
+
MYSQLI_CLEAR_RESOURCE(&mysql_link);
efree(mysql);
RETURN_TRUE;
@@ -516,12 +591,7 @@
MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result",
MYSQLI_STATUS_VALID);
-#if !defined(HAVE_MYSQLND)
- if (result->handle && result->handle->status ==
MYSQL_STATUS_USE_RESULT)
-#else
- if (result->conn)
-#endif
- {
+ if (mysqli_result_is_buffered(result)) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Function cannot be used with
MYSQL_USE_RESULT");
RETURN_FALSE;
}
@@ -610,7 +680,6 @@
/* {{{ proto bool mysqli_stmt_execute(object stmt) U
Execute a prepared statement */
-#if !defined(HAVE_MYSQLND)
PHP_FUNCTION(mysqli_stmt_execute)
{
MY_STMT *stmt;
@@ -621,8 +690,10 @@
return;
}
MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt",
MYSQLI_STATUS_VALID);
-
- for (i = 0; i < stmt->param.var_cnt; i++) {
+
+ i = 0;
+#ifndef HAVE_MYSQLND
+ for (; i < stmt->param.var_cnt; i++) {
if (stmt->param.vars[i]) {
if ( !(stmt->param.is_null[i] = (stmt->param.vars[i]->type == IS_NULL)) ) {
switch (stmt->stmt->params[i].buffer_type) {
@@ -652,6 +723,8 @@
}
}
}
+#endif
+
if (mysql_stmt_execute(stmt->stmt)) {
MYSQLI_REPORT_STMT_ERROR(stmt->stmt);
RETVAL_FALSE;
@@ -660,9 +733,10 @@
}
if (MyG(report_mode) & MYSQLI_REPORT_INDEX) {
- php_mysqli_report_index(stmt->query, stmt->stmt->mysql->server_status
TSRMLS_CC);
+ php_mysqli_report_index(stmt->query, mysqli_stmt_server_status(stmt->stmt)
TSRMLS_CC);
}
+#ifndef HAVE_MYSQLND
/* free converted utf8 strings */
if (UG(unicode)) {
for (i = 0; i < stmt->param.var_cnt; i++) {
@@ -671,14 +745,14 @@
}
}
}
+#endif
}
-#endif
/* }}} */
-/* {{{ proto mixed mysqli_stmt_fetch(object stmt) U
- Fetch results from a prepared statement into the bound variables */
+
+/* {{{ mixed mysqli_stmt_fetch_libmysql */
#if !defined(HAVE_MYSQLND)
-PHP_FUNCTION(mysqli_stmt_fetch)
+void mysqli_stmt_fetch_libmysql(INTERNAL_FUNCTION_PARAMETERS)
{
MY_STMT *stmt;
zval *mysql_stmt;
@@ -694,8 +768,6 @@
MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt",
MYSQLI_STATUS_VALID);
/* reset buffers */
-
-
for (i = 0; i < stmt->result.var_cnt; i++) {
if (stmt->result.buf[i].type == IS_STRING) {
memset(stmt->result.buf[i].val, 0, stmt->result.buf[i].buflen);
@@ -820,10 +892,47 @@
break;
}
}
+/* }}} */
+#else
+/* {{{ mixed mysqli_stmt_fetch_mysqlnd */
+void mysqli_stmt_fetch_mysqlnd(INTERNAL_FUNCTION_PARAMETERS)
+{
+ MY_STMT *stmt;
+ zval *mysql_stmt;
+ zend_bool fetched_anything;
+ enum_func_status ret;
+
+
+ if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O",
&mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
+ return;
+ }
+ MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt",
MYSQLI_STATUS_VALID);
+
+ if (FAIL == (ret = mysqlnd_stmt_fetch(stmt->stmt, &fetched_anything TSRMLS_CC)))
{
+ RETURN_BOOL(FALSE);
+ } else if (fetched_anything == TRUE) {
+ RETURN_BOOL(TRUE);
+ } else {
+ RETURN_NULL();
+ }
+}
#endif
/* }}} */
+/* {{{ proto mixed mysqli_stmt_fetch(object stmt) U
+ Fetch results from a prepared statement into the bound variables */
+PHP_FUNCTION(mysqli_stmt_fetch)
+{
+#if !defined(HAVE_MYSQLND)
+ mysqli_stmt_fetch_libmysql(INTERNAL_FUNCTION_PARAM_PASSTHRU);
+#else
+ mysqli_stmt_fetch_mysqlnd(INTERNAL_FUNCTION_PARAM_PASSTHRU);
+#endif
+
+}
+
+
static void php_add_field_properties(zval *value, MYSQL_FIELD *field TSRMLS_DC)
{
add_property_utf8_string(value, "name",(field->name ? field->name : ""),
ZSTR_DUPLICATE);
@@ -1039,7 +1148,7 @@
}
MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result",
MYSQLI_STATUS_VALID);
- mysql_free_result(result);
+ mysqli_free_result(result, FALSE);
MYSQLI_CLEAR_RESOURCE(&mysql_result);
}
/* }}} */
@@ -1403,7 +1512,6 @@
/* {{{ proto mixed mysqli_prepare(object link, string query) U
Prepare a SQL statement for execution */
-#if !defined(HAVE_MYSQLND)
PHP_FUNCTION(mysqli_prepare)
{
MY_MYSQL *mysql;
@@ -1419,31 +1527,35 @@
}
MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link",
MYSQLI_STATUS_VALID);
+#if !defined(HAVE_MYSQLND)
if (mysql->mysql->status == MYSQL_STATUS_GET_RESULT) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "All data must be fetched before a new
statement prepare takes place");
RETURN_FALSE;
}
+#endif
stmt = (MY_STMT *)ecalloc(1,sizeof(MY_STMT));
if ((stmt->stmt = mysql_stmt_init(mysql->mysql))) {
if (mysql_stmt_prepare(stmt->stmt, query, query_len)) {
+#if !defined(HAVE_MYSQLND)
char last_error[MYSQL_ERRMSG_SIZE];
char sqlstate[SQLSTATE_LENGTH+1];
unsigned int last_errno;
- /* mysql_stmt_close clears errors, so we have to store them temporarily */
+ /* mysql_stmt_close() (libmysql) clears errors, so we have to store them temporarily
*/
last_errno = stmt->stmt->last_errno;
memcpy(last_error, stmt->stmt->last_error, MYSQL_ERRMSG_SIZE);
memcpy(sqlstate, mysql->mysql->net.sqlstate, SQLSTATE_LENGTH+1);
- mysql_stmt_close(stmt->stmt);
+ mysqli_stmt_close(stmt->stmt, FALSE);
stmt->stmt = NULL;
/* restore error messages */
mysql->mysql->net.last_errno = last_errno;
memcpy(mysql->mysql->net.last_error, last_error, MYSQL_ERRMSG_SIZE);
memcpy(mysql->mysql->net.sqlstate, sqlstate, SQLSTATE_LENGTH+1);
+#endif
}
}
@@ -1470,7 +1582,6 @@
mysqli_resource->status = MYSQLI_STATUS_VALID;
MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_stmt_class_entry);
}
-#endif
/* }}} */
/* {{{ proto bool mysqli_real_connect(object link [,string hostname [,string username
[,string passwd [,string dbname [,int port [,string socket [,int flags]]]]]]]) U
@@ -1570,11 +1681,7 @@
} else {
if (!mysql_field_count(mysql->mysql)) {
if (MyG(report_mode) & MYSQLI_REPORT_INDEX) {
-#if !defined(HAVE_MYSQLND)
- php_mysqli_report_index(query, mysql->mysql->server_status TSRMLS_CC);
-#else
- php_mysqli_report_index(query, mysql->mysql->upsert_status.server_status
TSRMLS_CC);
-#endif
+ php_mysqli_report_index(query, mysqli_server_status(mysql->mysql) TSRMLS_CC);
}
}
RETVAL_TRUE;
@@ -1602,7 +1709,7 @@
newstr_len = mysql_real_escape_string(mysql->mysql, newstr, escapestr,
escapestr_len);
newstr = erealloc(newstr, newstr_len + 1);
- RETURN_UTF8_STRING(newstr, 0);
+ RETURN_UTF8_STRING(newstr, 0);
}
/* }}} */
@@ -1627,7 +1734,6 @@
/* {{{ proto bool mysqli_stmt_send_long_data(object stmt, int param_nr, string data) U
*/
-#if !defined(HAVE_MYSQLND)
PHP_FUNCTION(mysqli_stmt_send_long_data)
{
MY_STMT *stmt;
@@ -1653,12 +1759,10 @@
RETURN_TRUE;
}
}
-#endif
/* }}} */
/* {{{ proto mixed mysqli_stmt_affected_rows(object stmt) U
Return the number of rows affected in the last query for the given link */
-#if !defined(HAVE_MYSQLND)
PHP_FUNCTION(mysqli_stmt_affected_rows)
{
MY_STMT *stmt;
@@ -1676,12 +1780,10 @@
}
MYSQLI_RETURN_LONG_LONG(rc)
}
-#endif
/* }}} */
/* {{{ proto bool mysqli_stmt_close(object stmt) U
Close statement */
-#if !defined(HAVE_MYSQLND)
PHP_FUNCTION(mysqli_stmt_close)
{
MY_STMT *stmt;
@@ -1692,18 +1794,16 @@
}
MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt",
MYSQLI_STATUS_VALID);
- mysql_stmt_close(stmt->stmt);
+ mysqli_stmt_close(stmt->stmt, FALSE);
stmt->stmt = NULL;
php_clear_stmt_bind(stmt TSRMLS_CC);
MYSQLI_CLEAR_RESOURCE(&mysql_stmt);
RETURN_TRUE;
}
-#endif
/* }}} */
/* {{{ proto void mysqli_stmt_data_seek(object stmt, int offset) U
Move internal result pointer */
-#if !defined(HAVE_MYSQLND)
PHP_FUNCTION(mysqli_stmt_data_seek)
{
MY_STMT *stmt;
@@ -1722,12 +1822,10 @@
mysql_stmt_data_seek(stmt->stmt, offset);
}
-#endif
/* }}} */
/* {{{ proto int mysqli_stmt_field_count(object stmt) U
Return the number of result columns for the given statement */
-#if !defined(HAVE_MYSQLND)
PHP_FUNCTION(mysqli_stmt_field_count)
{
MY_STMT *stmt;
@@ -1740,12 +1838,10 @@
RETURN_LONG(mysql_stmt_field_count(stmt->stmt));
}
-#endif
/* }}} */
/* {{{ proto void mysqli_stmt_free_result(object stmt) U
Free stored result memory for the given statement handle */
-#if !defined(HAVE_MYSQLND)
PHP_FUNCTION(mysqli_stmt_free_result)
{
MY_STMT *stmt;
@@ -1759,12 +1855,10 @@
mysql_stmt_free_result(stmt->stmt);
}
-#endif
/* }}} */
/* {{{ proto mixed mysqli_stmt_insert_id(object stmt) U
Get the ID generated from the previous INSERT operation */
-#if !defined(HAVE_MYSQLND)
PHP_FUNCTION(mysqli_stmt_insert_id)
{
MY_STMT *stmt;
@@ -1778,12 +1872,10 @@
rc = mysql_stmt_insert_id(stmt->stmt);
MYSQLI_RETURN_LONG_LONG(rc)
}
-#endif
/* }}} */
/* {{{ proto int mysqli_stmt_param_count(object stmt) U
Return the number of parameter for the given statement */
-#if !defined(HAVE_MYSQLND)
PHP_FUNCTION(mysqli_stmt_param_count)
{
MY_STMT *stmt;
@@ -1796,12 +1888,10 @@
RETURN_LONG(mysql_stmt_param_count(stmt->stmt));
}
-#endif
/* }}} */
/* {{{ proto bool mysqli_stmt_reset(object stmt) U
reset a prepared statement */
-#if !defined(HAVE_MYSQLND)
PHP_FUNCTION(mysqli_stmt_reset)
{
MY_STMT *stmt;
@@ -1818,12 +1908,10 @@
}
RETURN_TRUE;
}
-#endif
/* }}} */
/* {{{ proto mixed mysqli_stmt_num_rows(object stmt) U
Return the number of rows in statements result set */
-#if !defined(HAVE_MYSQLND)
PHP_FUNCTION(mysqli_stmt_num_rows)
{
MY_STMT *stmt;
@@ -1839,7 +1927,6 @@
rc = mysql_stmt_num_rows(stmt->stmt);
MYSQLI_RETURN_LONG_LONG(rc)
}
-#endif
/* }}} */
/* {{{ proto bool mysqli_select_db(object link, string dbname) U
@@ -1914,7 +2001,9 @@
MY_MYSQL *mysql;
zval *mysql_link;
char *stat = NULL;
+#if defined(HAVE_MYSQLND)
uint stat_len;
+#endif
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O",
&mysql_link, mysqli_link_class_entry) == FAILURE) {
return;
@@ -1939,7 +2028,6 @@
/* {{{ proto int mysqli_stmt_attr_set(object stmt, long attr, long mode) U
*/
-#if !defined(HAVE_MYSQLND)
PHP_FUNCTION(mysqli_stmt_attr_set)
{
MY_STMT *stmt;
@@ -1958,17 +2046,15 @@
}
RETURN_TRUE;
}
-#endif
/* }}} */
/* {{{ proto int mysqli_stmt_attr_get(object stmt, long attr) U
*/
-#if !defined(HAVE_MYSQLND)
PHP_FUNCTION(mysqli_stmt_attr_get)
{
MY_STMT *stmt;
zval *mysql_stmt;
-#if MYSQL_VERSION_ID > 50099
+#if !defined(HAVE_MYSQLND) && MYSQL_VERSION_ID > 50099
my_bool value;
#else
ulong value = 0;
@@ -1986,12 +2072,10 @@
}
RETURN_LONG((long)value);
}
-#endif
/* }}} */
/* {{{ proto int mysqli_stmt_errno(object stmt) U
*/
-#if !defined(HAVE_MYSQLND)
PHP_FUNCTION(mysqli_stmt_errno)
{
MY_STMT *stmt;
@@ -2004,12 +2088,10 @@
RETURN_LONG(mysql_stmt_errno(stmt->stmt));
}
-#endif
/* }}} */
/* {{{ proto string mysqli_stmt_error(object stmt) U
*/
-#if !defined(HAVE_MYSQLND)
PHP_FUNCTION(mysqli_stmt_error)
{
MY_STMT *stmt;
@@ -2022,13 +2104,11 @@
RETURN_UTF8_STRING((char *)mysql_stmt_error(stmt->stmt), ZSTR_DUPLICATE);
}
-#endif
/* }}} */
/* {{{ proto mixed mysqli_stmt_init(object link) U
Initialize statement object
*/
-#if !defined(HAVE_MYSQLND)
PHP_FUNCTION(mysqli_stmt_init)
{
MY_MYSQL *mysql;
@@ -2053,13 +2133,11 @@
mysqli_resource->ptr = (void *)stmt;
MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_stmt_class_entry);
}
-#endif
/* }}} */
/* {{{ proto bool mysqli_stmt_prepare(object stmt, string query) U
prepare server side statement with query
*/
-#if !defined(HAVE_MYSQLND)
PHP_FUNCTION(mysqli_stmt_prepare)
{
MY_STMT *stmt;
@@ -2081,12 +2159,10 @@
MYSQLI_SET_STATUS(&mysql_stmt, MYSQLI_STATUS_VALID);
RETURN_TRUE;
}
-#endif
/* }}} */
/* {{{ proto mixed mysqli_stmt_result_metadata(object stmt) U
return result set from statement */
-#if !defined(HAVE_MYSQLND)
PHP_FUNCTION(mysqli_stmt_result_metadata)
{
MY_STMT *stmt;
@@ -2109,37 +2185,40 @@
mysqli_resource->status = MYSQLI_STATUS_VALID;
MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_result_class_entry);
}
-#endif
/* }}} */
/* {{{ proto bool mysqli_stmt_store_result(stmt) U
*/
-#if !defined(HAVE_MYSQLND)
PHP_FUNCTION(mysqli_stmt_store_result)
{
MY_STMT *stmt;
zval *mysql_stmt;
- int i=0;
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O",
&mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
return;
}
MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt",
MYSQLI_STATUS_VALID);
- /*
- If the user wants to store the data and we have BLOBs/TEXTs we try to allocate
- not the maximal length of the type (which is 16MB even for LONGBLOB) but
- the maximal length of the field in the result set. If he/she has quite big
- BLOB/TEXT columns after calling store_result() the memory usage of PHP will
- double - but this is a known problem of the simple MySQL API ;)
- */
- for (i = mysql_stmt_field_count(stmt->stmt) - 1; i >=0; --i) {
- if (stmt->stmt->fields && stmt->stmt->fields[i].type ==
MYSQL_TYPE_BLOB) {
- my_bool tmp=1;
- mysql_stmt_attr_set(stmt->stmt, STMT_ATTR_UPDATE_MAX_LENGTH, &tmp);
- break;
+#if !defined(HAVE_MYSQLND)
+ {
+ /*
+ If the user wants to store the data and we have BLOBs/TEXTs we try to allocate
+ not the maximal length of the type (which is 16MB even for LONGBLOB) but
+ the maximal length of the field in the result set. If he/she has quite big
+ BLOB/TEXT columns after calling store_result() the memory usage of PHP will
+ double - but this is a known problem of the simple MySQL API ;)
+ */
+ int i = 0;
+
+ for (i = mysql_stmt_field_count(stmt->stmt) - 1; i >=0; --i) {
+ if (stmt->stmt->fields && stmt->stmt->fields[i].type ==
MYSQL_TYPE_BLOB) {
+ my_bool tmp=1;
+ mysql_stmt_attr_set(stmt->stmt, STMT_ATTR_UPDATE_MAX_LENGTH, &tmp);
+ break;
+ }
}
}
+#endif
if (mysql_stmt_store_result(stmt->stmt)){
MYSQLI_REPORT_STMT_ERROR(stmt->stmt);
@@ -2147,12 +2226,10 @@
}
RETURN_TRUE;
}
-#endif
/* }}} */
/* {{{ proto string mysqli_stmt_sqlstate(object stmt) U
*/
-#if !defined(HAVE_MYSQLND)
PHP_FUNCTION(mysqli_stmt_sqlstate)
{
MY_STMT *stmt;
@@ -2165,7 +2242,6 @@
RETURN_UTF8_STRING((char *)mysql_stmt_sqlstate(stmt->stmt), ZSTR_DUPLICATE);
}
-#endif
/* }}} */
/* {{{ proto object mysqli_store_result(object link) U
@@ -2187,11 +2263,7 @@
RETURN_FALSE;
}
if (MyG(report_mode) & MYSQLI_REPORT_INDEX) {
-#if !defined(HAVE_MYSQLND)
- php_mysqli_report_index("from previous query", mysql->mysql->server_status
TSRMLS_CC);
-#else
- php_mysqli_report_index("from previous query",
mysql->mysql->upsert_status.server_status TSRMLS_CC);
-#endif
+ php_mysqli_report_index("from previous query", mysqli_server_status(mysql->mysql)
TSRMLS_CC);
}
mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
@@ -2221,13 +2293,8 @@
Return whether thread safety is given or not */
PHP_FUNCTION(mysqli_thread_safe)
{
-#if !defined(HAVE_MYSQLND)
RETURN_BOOL(mysql_thread_safe());
-#else
- RETURN_TRUE;
-#endif
}
-
/* }}} */
/* {{{ proto mixed mysqli_use_result(object link) U
@@ -2250,11 +2317,7 @@
}
if (MyG(report_mode) & MYSQLI_REPORT_INDEX) {
-#if !defined(HAVE_MYSQLND)
- php_mysqli_report_index("from previous query", mysql->mysql->server_status
TSRMLS_CC);
-#else
- php_mysqli_report_index("from previous query",
mysql->mysql->upsert_status.server_status TSRMLS_CC);
-#endif
+ php_mysqli_report_index("from previous query", mysqli_server_status(mysql->mysql)
TSRMLS_CC);
}
mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
mysqli_resource->ptr = (void *)result;
Modified: trunk/ext/mysqli/mysqli_fe.c
===================================================================
--- trunk/ext/mysqli/mysqli_fe.c 2007-03-12 13:18:39 UTC (rev 102)
+++ trunk/ext/mysqli/mysqli_fe.c 2007-03-12 13:28:11 UTC (rev 103)
@@ -139,7 +139,6 @@
#endif
PHP_FE(mysqli_sqlstate, NULL)
PHP_FE(mysqli_stat, NULL)
-#if !defined(HAVE_MYSQLND)
PHP_FE(mysqli_prepare, NULL)
PHP_FE(mysqli_stmt_execute, NULL)
PHP_FALIAS(mysqli_execute, mysqli_stmt_execute, NULL)
@@ -158,7 +157,9 @@
PHP_FE(mysqli_stmt_insert_id, NULL)
PHP_FE(mysqli_stmt_reset, NULL)
PHP_FE(mysqli_stmt_param_count, NULL)
+#if !defined(HAVE_MYSQLND)
PHP_FE(mysqli_ssl_set, NULL)
+#endif
PHP_FE(mysqli_stmt_affected_rows, NULL)
PHP_FE(mysqli_stmt_close, NULL)
PHP_FE(mysqli_stmt_data_seek, NULL)
@@ -167,7 +168,6 @@
PHP_FE(mysqli_stmt_num_rows, NULL)
PHP_FE(mysqli_stmt_sqlstate, NULL)
PHP_FE(mysqli_stmt_store_result, NULL)
-#endif
PHP_FE(mysqli_store_result, NULL)
PHP_FE(mysqli_thread_id, NULL)
PHP_FE(mysqli_thread_safe, NULL)
@@ -175,14 +175,12 @@
PHP_FE(mysqli_warning_count, NULL)
/* Aliases */
-#if !defined(HAVE_MYSQLND)
PHP_FALIAS(mysqli_bind_param, mysqli_stmt_bind_param, third_arg_force_by_ref_rest)
PHP_FALIAS(mysqli_bind_result, mysqli_stmt_bind_result, second_arg_force_by_ref_rest)
PHP_FALIAS(mysqli_fetch, mysqli_stmt_fetch, NULL)
PHP_FALIAS(mysqli_param_count, mysqli_stmt_param_count, NULL)
PHP_FALIAS(mysqli_get_metadata, mysqli_stmt_result_metadata, NULL)
PHP_FALIAS(mysqli_send_long_data, mysqli_stmt_send_long_data, NULL)
-#endif
PHP_FALIAS(mysqli_client_encoding, mysqli_character_set_name, NULL)
PHP_FALIAS(mysqli_escape_string, mysqli_real_escape_string, NULL)
PHP_FALIAS(mysqli_set_opt, mysqli_options, NULL)
@@ -217,9 +215,9 @@
PHP_FALIAS(rpl_query_type,mysqli_rpl_query_type,NULL)
PHP_FALIAS(slave_query,mysqli_slave_query,NULL)
PHP_FALIAS(ssl_set,mysqli_ssl_set,NULL)
+#endif
PHP_FALIAS(prepare,mysqli_prepare,NULL)
PHP_FALIAS(stmt_init,mysqli_stmt_init, NULL)
-#endif
PHP_FALIAS(dump_debug_info,mysqli_dump_debug_info,NULL)
#ifdef HAVE_MYSQLI_GET_CHARSET
PHP_FALIAS(get_charset,mysqli_get_charset,NULL)
@@ -285,7 +283,6 @@
* Every user visible function must have an entry in mysqli_stmt_functions[].
*/
zend_function_entry mysqli_stmt_methods[] = {
-#if !defined(HAVE_MYSQLND)
PHP_FALIAS(__construct,mysqli_stmt_construct,NULL)
PHP_FALIAS(attr_get,mysqli_stmt_attr_get,NULL)
PHP_FALIAS(attr_set,mysqli_stmt_attr_set,NULL)
@@ -304,7 +301,6 @@
PHP_FALIAS(reset,mysqli_stmt_reset,NULL)
PHP_FALIAS(prepare,mysqli_stmt_prepare, NULL)
PHP_FALIAS(store_result,mysqli_stmt_store_result,NULL)
-#endif
{NULL, NULL, NULL}
};
/* }}} */
Modified: trunk/ext/mysqli/mysqli_libmysql.h
===================================================================
--- trunk/ext/mysqli/mysqli_libmysql.h 2007-03-12 13:18:39 UTC (rev 102)
+++ trunk/ext/mysqli/mysqli_libmysql.h 2007-03-12 13:28:11 UTC (rev 103)
@@ -19,6 +19,16 @@
*/
+/* These are unused */
+#define MYSQLI_CLOSE_EXPLICIT
+#define MYSQLI_CLOSE_IMPLICIT
+#define MYSQLI_CLOSE_DISCONNECTED
+
+#define mysqli_result_is_buffered(r) ((r)->handle &&
(r)->handle->status == MYSQL_STATUS_USE_RESULT)
+#define mysqli_server_status(c) (c)->server_status
#define mysqli_stmt_warning_count(s) mysql_warning_count((s))
#define mysqli_stmt_server_status(s) (s)->mysql->server_status
#define mysqli_stmt_get_connection(s) (s)->mysql
+#define mysqli_close(c, is_forced) mysql_close((c))
+#define mysqli_stmt_close(c, implicit) mysql_stmt_close((c))
+#define mysqli_free_result(r, is_forced) mysql_free_result((r))
Modified: trunk/ext/mysqli/mysqli_mysqlnd.h
===================================================================
--- trunk/ext/mysqli/mysqli_mysqlnd.h 2007-03-12 13:18:39 UTC (rev 102)
+++ trunk/ext/mysqli/mysqli_mysqlnd.h 2007-03-12 13:28:11 UTC (rev 103)
@@ -43,7 +43,7 @@
#define mysql_affected_rows(r) mysqlnd_affected_rows((r))
#define mysql_autocommit(r,m) mysqlnd_autocommit((r),(m))
#define mysql_change_user(r,a,b,c) mysqlnd_change_user((r), (a), (b), (c))
-#define mysql_close(r) mysqlnd_close((r))
+#define mysql_close(r) mysqlnd_close((r), MYSQLND_CLOSE_NORMAL)
#define mysql_commit(r) mysqlnd_commit((r))
#define mysql_data_seek(r,o) mysqlnd_data_seek((r),(o))
#define mysql_dump_debug_info(r) mysqlnd_dump_debug_info((r))
@@ -81,15 +81,21 @@
#define mysql_stmt_error(s) mysqlnd_stmt_error((s))
#define mysql_stmt_sqlstate(s) mysqlnd_stmt_sqlstate((s))
#define mysql_stmt_prepare(s,q,l) mysqlnd_stmt_prepare((s), (q), (l))
+#define mysql_stmt_execute(s) mysqlnd_stmt_execute((s))
+#define mysql_stmt_reset(s) mysqlnd_stmt_reset((s))
#define mysql_stmt_store_result(s) mysqlnd_stmt_store_result((s))
+#define mysql_stmt_free_result(s) mysqlnd_stmt_free_result((s))
#define mysql_stmt_data_seek(s,r) mysqlnd_stmt_data_seek((s), (r))
+#define mysql_stmt_send_long_data(s,p,d,l) mysqlnd_stmt_send_long_data((s), (p), (d),
(l))
#define mysql_stmt_attr_get(s,a,v) mysqlnd_stmt_attr_get((s), (a), (v))
#define mysql_stmt_attr_set(s,a,v) mysqlnd_stmt_attr_set((s), (a), (v))
+#define mysql_stmt_param_metadata(s) mysqlnd_stmt_param_metadata((s))
+#define mysql_stmt_result_metadata(s) mysqlnd_stmt_result_metadata((s))
#define mysql_thread_safe() mysqlnd_thread_safe()
#define mysql_info(r) mysqlnd_info((r))
#define mysql_options(r,a,b) mysqlnd_options((r), (a), (b))
#define mysql_stmt_init(r) mysqlnd_stmt_init((r))
-#define mysql_free_result(r) mysqlnd_free_result((r))
+#define mysql_free_result(r) mysqlnd_free_result((r), FALSE)
#define mysql_store_result(r) mysqlnd_store_result((r))
#define mysql_use_result(r) mysqlnd_use_result((r))
#define mysql_thread_id(r) mysqlnd_thread_id((r))
@@ -102,7 +108,16 @@
#define mysql_warning_count(r) mysqlnd_warning_count((r))
/* Here comes non-libmysql API to have less ifdefs in mysqli*/
+#define MYSQLI_CLOSE_EXPLICIT MYSQLND_CLOSE_EXPLICIT
+#define MYSQLI_CLOSE_IMPLICIT MYSQLND_CLOSE_IMPLICIT
+#define MYSQLI_CLOSE_DISCONNECTED MYSQLND_CLOSE_DISCONNECTED
+
+#define mysqli_result_is_buffered(r) ((r)->conn)
+#define mysqli_server_status(c) (c)->upsert_status.server_status
#define mysqli_stmt_warning_count(s) mysqlnd_stmt_warning_count((s))
#define mysqli_stmt_server_status(s) (s)->upsert_status.server_status
#define mysqli_stmt_get_connection(s) (s)->conn
+#define mysqli_close(c, how) mysqlnd_close((c), (how))
+#define mysqli_stmt_close(c, implicit) mysqlnd_stmt_close((c), (implicit))
+#define mysqli_free_result(r, implicit) mysqlnd_free_result((r), (implicit))
Modified: trunk/ext/mysqli/mysqli_nonapi.c
===================================================================
--- trunk/ext/mysqli/mysqli_nonapi.c 2007-03-12 13:18:39 UTC (rev 102)
+++ trunk/ext/mysqli/mysqli_nonapi.c 2007-03-12 13:28:11 UTC (rev 103)
@@ -158,7 +158,7 @@
"%s", mysql_error(mysql->mysql));
/* free mysql structure */
- mysql_close(mysql->mysql);
+ mysqli_close(mysql->mysql, MYSQLI_CLOSE_DISCONNECTED);
efree(mysql);
if (persistent) {
efree(hash_key);
@@ -179,10 +179,8 @@
#if !defined(HAVE_MYSQLND)
mysql->mysql->reconnect = MyG(reconnect);
-#endif
/* set our own local_infile handler */
-#if !defined(HAVE_MYSQLND)
php_set_local_infile_handler_default(mysql);
#endif
@@ -421,11 +419,7 @@
if (!mysql_field_count(mysql->mysql)) {
/* no result set - not a SELECT */
if (MyG(report_mode) & MYSQLI_REPORT_INDEX) {
-#if !defined(HAVE_MYSQLND)
- php_mysqli_report_index(query, mysql->mysql->server_status TSRMLS_CC);
-#else
- php_mysqli_report_index(query, mysql->mysql->upsert_status.server_status
TSRMLS_CC);
-#endif
+ php_mysqli_report_index(query, mysqli_server_status(mysql->mysql) TSRMLS_CC);
}
RETURN_TRUE;
}
@@ -439,11 +433,7 @@
}
if (MyG(report_mode) & MYSQLI_REPORT_INDEX) {
-#if !defined(HAVE_MYSQLND)
- php_mysqli_report_index(query, mysql->mysql->server_status TSRMLS_CC);
-#else
- php_mysqli_report_index(query, mysql->mysql->upsert_status.server_status
TSRMLS_CC);
-#endif
+ php_mysqli_report_index(query, mysqli_server_status(mysql->mysql) TSRMLS_CC);
}
mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
@@ -479,7 +469,6 @@
/* }}} */
/* {{{ proto object mysqli_stmt_get_warnings(object link) U */
-#if !defined(HAVE_MYSQLND)
PHP_FUNCTION(mysqli_stmt_get_warnings)
{
MY_STMT *stmt;
@@ -492,8 +481,8 @@
}
MYSQLI_FETCH_RESOURCE(stmt, MY_STMT*, &stmt_link, "mysqli_stmt",
MYSQLI_STATUS_VALID);
- if (mysql_warning_count(stmt->stmt->mysql)) {
- w = php_get_warnings(stmt->stmt->mysql TSRMLS_CC);
+ if (mysqli_stmt_warning_count(stmt->stmt)) {
+ w = php_get_warnings(mysqli_stmt_get_connection(stmt->stmt) TSRMLS_CC);
} else {
RETURN_FALSE;
}
@@ -502,7 +491,6 @@
mysqli_resource->status = MYSQLI_STATUS_INITIALIZED;
MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_warning_class_entry);
}
-#endif
/* }}} */
#ifdef HAVE_MYSQLI_SET_CHARSET
@@ -548,7 +536,7 @@
#if !defined(HAVE_MYSQLND)
MY_CHARSET_INFO cs;
#else
- MYSQLND_CHARSET *cs;
+ const MYSQLND_CHARSET *cs;
#endif
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O",
&mysql_link, mysqli_link_class_entry) == FAILURE) {
Modified: trunk/ext/mysqli/mysqlnd/mysqlnd.c
===================================================================
--- trunk/ext/mysqli/mysqlnd/mysqlnd.c 2007-03-12 13:18:39 UTC (rev 102)
+++ trunk/ext/mysqli/mysqlnd/mysqlnd.c 2007-03-12 13:28:11 UTC (rev 103)
@@ -1141,6 +1141,13 @@
mysqlnd_unbuffered_free_last_data() before it. The function returns always true.
*/
if (PASS == (ret = PACKET_READ(row_packet, result->conn)) &&
!row_packet->eof) {
+ mysqlnd_unbuffered_free_last_data(result);
+
+ result->last_row_data = row_packet->fields;
+ result->last_row_buffer = row_packet->row_buffer;
+ row_packet->fields = NULL;
+ row_packet->row_buffer = NULL;
+
result->row_count++;
*fetched_anything = TRUE;
@@ -1148,13 +1155,6 @@
if (!row_packet->skip_extraction) {
HashTable *row_ht = Z_ARRVAL_P(row);
- mysqlnd_unbuffered_free_last_data(result);
-
- result->last_row_data = row_packet->fields;
- result->last_row_buffer = row_packet->row_buffer;
- row_packet->fields = NULL;
- row_packet->row_buffer = NULL;
-
for (i = 0; i < field_count; i++) {
zval *data = result->last_row_data[i];
int len = (Z_TYPE_P(data) == IS_NULL)? 0:Z_STRLEN_P(data);
Modified: trunk/ext/mysqli/php_mysqli.h
===================================================================
--- trunk/ext/mysqli/php_mysqli.h 2007-03-12 13:18:39 UTC (rev 102)
+++ trunk/ext/mysqli/php_mysqli.h 2007-03-12 13:28:11 UTC (rev 103)
@@ -33,6 +33,7 @@
#else
#include <mysql.h>
#include <errmsg.h>
+#include "ext/mysqli/mysqli_libmysql.h"
#endif
/* character set support */
| Thread |
|---|
| • PHP mysqlnd svn commit: r103 - in trunk/ext/mysqli: . mysqlnd | ahristov | 12 Mar |