List:Commits« Previous MessageNext Message »
From:ahristov Date:March 12 2007 1:28pm
Subject:PHP mysqlnd svn commit: r103 - in trunk/ext/mysqli: . mysqlnd
View as plain text  
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: . mysqlndahristov12 Mar