List:Commits« Previous MessageNext Message »
From:ahristov Date:March 20 2007 8:47pm
Subject:PHP mysqlnd svn commit: r215 - in trunk/ext/mysqli: . mysqlnd tests
View as plain text  
Author: ahristov
Date: 2007-03-20 21:47:48 +0100 (Tue, 20 Mar 2007)
New Revision: 215

Modified:
   trunk/ext/mysqli/mysqli_warning.c
   trunk/ext/mysqli/mysqlnd/mysqlnd.c
   trunk/ext/mysqli/mysqlnd/mysqlnd.h
   trunk/ext/mysqli/mysqlnd/mysqlnd_wireprotocol.c
   trunk/ext/mysqli/php_mysqli.h
   trunk/ext/mysqli/tests/072.phpt
Log:
Fix a bug in wireprotocol.c regarding Unicode.

Fix mysqli_warning to return unicode.
It will work if character_set_system is latin1 or utf8.
We should go back to this later.


Modified: trunk/ext/mysqli/mysqli_warning.c
===================================================================
--- trunk/ext/mysqli/mysqli_warning.c	2007-03-20 15:32:37 UTC (rev 214)
+++ trunk/ext/mysqli/mysqli_warning.c	2007-03-20 20:47:48 UTC (rev 215)
@@ -27,43 +27,47 @@
 #include "ext/standard/info.h"
 #include "php_mysqli.h"
 
+
 /* {{{ void php_clear_warnings() */
 void php_clear_warnings(MYSQLI_WARNING *w)
 {
-	MYSQLI_WARNING	*n;
+	MYSQLI_WARNING *n;
 
 	while (w) {
 		n = w;
-		efree(w->reason);
+		zval_dtor(&(w->reason));
+		zval_dtor(&(w->sqlstate));
 		w = w->next;
 		efree(n);
 	} 
 }
 /* }}} */
 
+
+#ifndef HAVE_MYSQLND
 /* {{{ MYSQLI_WARNING *php_new_warning */
-MYSQLI_WARNING *php_new_warning(char *reason, char *sqlstate, int errorno)
+static
+MYSQLI_WARNING *php_new_warning(const char *reason, int errorno TSRMLS_DC)
 {
-	MYSQLI_WARNING	*w;
+	MYSQLI_WARNING *w;
 
 	w = (MYSQLI_WARNING *)ecalloc(1, sizeof(MYSQLI_WARNING));
 
-	w->reason = safe_estrdup(reason);
-	if (sqlstate) {
-		strcpy(w->sqlstate, sqlstate);
-	} else {
-		strcpy(w->sqlstate, "00000");
-	}
+	ZVAL_UTF8_STRING(&(w->reason), reason, ZSTR_DUPLICATE);
+	
+	ZVAL_UTF8_STRINGL(&(w->sqlstate), "HY000", sizeof("HY000") - 1,  ZSTR_DUPLICATE);
+
 	w->errorno = errorno;
 
 	return w;
 }
 /* }}} */
 
+
 /* {{{ MYSQLI_WARNING *php_get_warnings(MYSQL *mysql TSRMLS_DC) */
 MYSQLI_WARNING *php_get_warnings(MYSQL *mysql TSRMLS_DC)
 {
-	MYSQLI_WARNING	*w, *first = NULL, *prev = NULL;
+	MYSQLI_WARNING *w, *first = NULL, *prev = NULL;
 	MYSQL_RES		*result;
 	MYSQL_ROW 		row;
 
@@ -74,20 +78,103 @@
 	result = mysql_store_result(mysql);
 
 	while ((row = mysql_fetch_row(result))) {
-		w = php_new_warning(row[2], "HY000", atoi(row[1]));
+		w = php_new_warning(row[2], atoi(row[1]) TSRMLS_CC);
 		if (!first) {
 			first = w;
 		}
 		if (prev) {
+			prev->next = w;
+		}
+		prev = w;
+	}
+	mysql_free_result(result);
+	return first;
+}
+/* }}} */
+#else
+/* {{{ MYSQLI_WARNING *php_new_warning */
+static
+MYSQLI_WARNING *php_new_warning(const zval *reason, int errorno TSRMLS_DC)
+{
+	MYSQLI_WARNING *w;
+
+	w = (MYSQLI_WARNING *)ecalloc(1, sizeof(MYSQLI_WARNING));
+
+	w->reason = *reason;
+	zval_copy_ctor(&(w->reason));
+	/*
+	  XXX: THIS JUST WON'T WORK IF 'character_set_system' is different
+	       than latin1 or utf8 !!!! We have to fix it by querying the server for its
+		   character_set_system and create appropriate convertor for anything but
+		   utf8/latin1 .
+	*/
+	ZVAL_UTF8_STRINGL(&(w->reason),  Z_STRVAL(w->reason), Z_STRLEN(w->reason), 
ZSTR_AUTOFREE);
+	
+	ZVAL_UTF8_STRINGL(&(w->sqlstate), "HY000", sizeof("HY000") - 1,  ZSTR_DUPLICATE);
+
+	w->errorno = errorno;
+
+	return w;
+}
+/* }}} */
+
+
+/* {{{ MYSQLI_WARNING *php_get_warnings(MYSQL *mysql TSRMLS_DC) */
+MYSQLI_WARNING *php_get_warnings(MYSQL *mysql TSRMLS_DC)
+{
+	MYSQLI_WARNING	*w, *first = NULL, *prev = NULL;
+	MYSQL_RES		*result;
+	zval			*row;
+
+	if (mysql_real_query(mysql, "SHOW WARNINGS", 13)) {
+		return NULL;
+	}
+
+	result = mysql_use_result(mysql);
+
+	for (;;) {
+		zval **entry;
+		int errno;
+		MAKE_STD_ZVAL(row);
+
+		mysqlnd_fetch_into(result, MYSQLND_FETCH_NUM, row);
+		if (Z_TYPE_P(row) != IS_ARRAY) {
+			zval_ptr_dtor(&row);
+			break;
+		}
+		zend_hash_internal_pointer_reset(Z_ARRVAL_P(row));
+		/* 0. we don't care about the first */
+		zend_hash_move_forward(Z_ARRVAL_P(row));
+
+		/* 1. Here comes the error no */
+		zend_hash_get_current_data(Z_ARRVAL_P(row), (void **)&entry);
+		convert_to_long_ex(entry);
+		errno = Z_LVAL_PP(entry);
+		zend_hash_move_forward(Z_ARRVAL_P(row));
+
+		/* 2. Here comes the reason */
+		zend_hash_get_current_data(Z_ARRVAL_P(row), (void **)&entry);
+
+		w = php_new_warning(*entry, errno TSRMLS_CC);
+		zval_ptr_dtor(entry);
+		if (!first) {
+			first = w;
+		}
+		if (prev) {
 			prev->next = (void *)w;
 		}
 		prev = w;
+
+		zval_ptr_dtor(&row);
 	}
+	
 	mysql_free_result(result);
 	return first;
 }
 /* }}} */
+#endif
 
+
 /* {{{ bool mysqli_warning::next() */
 PHP_METHOD(mysqli_warning, next) 
 {
@@ -113,7 +200,9 @@
 }
 /* }}} */
 
+
 /* {{{ property mysqli_warning_message */
+static
 int mysqli_warning_message(mysqli_object *obj, zval **retval TSRMLS_DC)
 {
 	MYSQLI_WARNING *w;
@@ -123,17 +212,16 @@
 	}
 
 	w = (MYSQLI_WARNING *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
-	ALLOC_ZVAL(*retval);
-	if (w->reason) {
-		ZVAL_STRING(*retval, w->reason, 1);
-	} else {
-		ZVAL_NULL(*retval);
-	}
+	MAKE_STD_ZVAL(*retval);
+	**retval = w->reason;
+	zval_copy_ctor(*retval);
 	return SUCCESS;
 }
 /* }}} */
 
+
 /* {{{ property mysqli_warning_sqlstate */
+static
 int mysqli_warning_sqlstate(mysqli_object *obj, zval **retval TSRMLS_DC)
 {
 	MYSQLI_WARNING *w;
@@ -143,13 +231,16 @@
 	}
 
 	w = (MYSQLI_WARNING *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
-	ALLOC_ZVAL(*retval);
-	ZVAL_STRING(*retval, w->sqlstate, 1);
+	MAKE_STD_ZVAL(*retval);
+	**retval = w->sqlstate;
+	zval_copy_ctor(*retval);
 	return SUCCESS;
 }
 /* }}} */
 
+
 /* {{{ property mysqli_warning_error */
+static
 int mysqli_warning_errno(mysqli_object *obj, zval **retval TSRMLS_DC)
 {
 	MYSQLI_WARNING *w;
@@ -158,12 +249,13 @@
 		return FAILURE;
 	}
 	w = (MYSQLI_WARNING *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
-	ALLOC_ZVAL(*retval);
+	MAKE_STD_ZVAL(*retval);
 	ZVAL_LONG(*retval, w->errorno);
 	return SUCCESS;
 }
 /* }}} */
 
+
 /* {{{ mysqli_warning_construct(object obj) */
 PHP_FUNCTION(mysqli_warning_construct)
 {
@@ -185,12 +277,10 @@
 		MY_MYSQL *mysql;
 		MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &z, "mysqli_link", MYSQLI_STATUS_VALID);
 		hdl = mysql->mysql;
-#if !defined(HAVE_MYSQLND)
 	} else if (obj->zo.ce == mysqli_stmt_class_entry) {
 		MY_STMT *stmt;
 		MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &z, "mysqli_stmt", MYSQLI_STATUS_VALID);
-		hdl = stmt->stmt->mysql;
-#endif
+		hdl = mysqli_stmt_get_connection(stmt->stmt);
 	} else {
 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "invalid class argument");
 		RETURN_FALSE;
@@ -216,18 +306,24 @@
 }
 /* }}} */
 
+
+/* {{{ mysqli_warning_methods */
 zend_function_entry mysqli_warning_methods[] = {
 	PHP_FALIAS(mysqli_warning, mysqli_warning_construct, NULL)
 	ZEND_ME(mysqli_warning, next, NULL, ZEND_ACC_PUBLIC)
 	{NULL, NULL, NULL}
 };
+/* }}} */
 
+
+/* {{{ mysqli_warning_property_entries */
 mysqli_property_entry mysqli_warning_property_entries[] = {
 	{"message", mysqli_warning_message, NULL},
 	{"sqlstate", mysqli_warning_sqlstate, NULL},
 	{"errno", mysqli_warning_errno, NULL},
 	{NULL, NULL, NULL}
 };
+/* }}} */
 
 /*
  * Local variables:

Modified: trunk/ext/mysqli/mysqlnd/mysqlnd.c
===================================================================
--- trunk/ext/mysqli/mysqlnd/mysqlnd.c	2007-03-20 15:32:37 UTC (rev 214)
+++ trunk/ext/mysqli/mysqlnd/mysqlnd.c	2007-03-20 20:47:48 UTC (rev 215)
@@ -24,6 +24,7 @@
 #include "mysqlnd_wireprotocol.h"
 #include "mysqlnd_priv.h"
 #include "mysqlnd_statistics.h"
+#include "ext/standard/basic_functions.h"
 
 #define MYSQLND_SILENT
 
@@ -1161,43 +1162,6 @@
 /* }}} */
 
 
-/* {{{ _mysqlnd_fetch_row */
-static
-MYSQLND_ROW _mysqlnd_fetch_row(MYSQLND_RES *result TSRMLS_DC ZEND_FILE_LINE_DC)
-{
-	unsigned int flags = MYSQLND_FETCH_NUM;
-	zval* row;
-	MYSQLND_ROW ret = NULL;
-	zend_bool fetched_anything;
-
-	if (result->m.fetch_row) {
-		MAKE_STD_ZVAL(row);
-		mysqlnd_array_init(row, result->field_count);
-
-		if (PASS == result->m.fetch_row(result, row, flags, &fetched_anything TSRMLS_CC)
&&
-			fetched_anything == TRUE)
-		{
-			zval **entry;
-			uint i = 0;
-			if (!result->last_row) {
-				result->last_row = emalloc(result->field_count * sizeof(char *));
-			}
-			ret = result->last_row;
-
-			zend_hash_internal_pointer_reset(Z_ARRVAL_P(row));
-			while (zend_hash_get_current_data(Z_ARRVAL_P(row), (void **)&entry) == SUCCESS) {
-				/* Everything is a string */
-				ret[i++] = Z_STRVAL_PP(entry);
-				zend_hash_move_forward(Z_ARRVAL_P(row));
-			}
-		}
-		zval_ptr_dtor(&row);
-	}
-	return ret;
-}
-/* }}} */
-
-
 /* {{{ mysqlnd_fetch_lengths_unbuffered */
 static
 unsigned long * mysqlnd_fetch_lengths_unbuffered(MYSQLND_RES * const result)
@@ -1391,7 +1355,6 @@
 	result->type			= MYSQLND_RES_NORMAL;
 	result->m.fetch_row		= result->m.fetch_row_normal_unbuffered;
 	result->m.fetch_lengths	= mysqlnd_fetch_lengths_unbuffered;
-	result->m.fetch_row_old_way = _mysqlnd_fetch_row;
 
 	result->conn = conn->m->get_reference(conn);
 	/*
@@ -1511,7 +1474,6 @@
 	result->type			= MYSQLND_RES_NORMAL;
 	result->m.fetch_row		= result->m.fetch_row_normal_buffered;
 	result->m.fetch_lengths	= mysqlnd_fetch_lengths_buffered;
-	result->m.fetch_row_old_way = _mysqlnd_fetch_row;
 
 	conn->state = CONN_FETCHING_DATA;
 

Modified: trunk/ext/mysqli/mysqlnd/mysqlnd.h
===================================================================
--- trunk/ext/mysqli/mysqlnd/mysqlnd.h	2007-03-20 15:32:37 UTC (rev 214)
+++ trunk/ext/mysqli/mysqlnd/mysqlnd.h	2007-03-20 20:47:48 UTC (rev 215)
@@ -569,7 +569,6 @@
 	MYSQLND_FIELD *		(*fetch_field)(MYSQLND_RES * const result);
 	MYSQLND_FIELD *		(*fetch_field_direct)(const MYSQLND_RES * const result,
MYSQLND_FIELD_OFFSET fieldnr);
 
-	MYSQLND_ROW 		(*fetch_row_old_way)(MYSQLND_RES * result TSRMLS_DC ZEND_FILE_LINE_DC);
 	unsigned long *		(*fetch_lengths)(MYSQLND_RES * const result);
 	void				(*free_result_buffers)(MYSQLND_RES * result TSRMLS_DC);	/* private */
 	enum_func_status	(*free_result)(MYSQLND_RES * result, zend_bool implicit TSRMLS_DC);
@@ -824,7 +823,6 @@
 
 
 /* Query */
-#define mysqlnd_fetch_row(result)						(result)->m.fetch_row_old_way((result)
TSRMLS_CC ZEND_FILE_LINE_CC)
 #define mysqlnd_fetch_into(result, flags,
return_value)	(result)->m.fetch_into((result), (flags), (return_value) TSRMLS_CC
ZEND_FILE_LINE_CC)
 #define mysqlnd_fetch_all(result, flags, return_value)	(result)->m.fetch_all((result),
(flags), (return_value) TSRMLS_CC ZEND_FILE_LINE_CC)
 #define mysqlnd_get_connection_stats(conn,
values)		(conn)->m->get_statistics((conn),  (values) TSRMLS_CC ZEND_FILE_LINE_CC)

Modified: trunk/ext/mysqli/mysqlnd/mysqlnd_wireprotocol.c
===================================================================
--- trunk/ext/mysqli/mysqlnd/mysqlnd_wireprotocol.c	2007-03-20 15:32:37 UTC (rev 214)
+++ trunk/ext/mysqli/mysqlnd/mysqlnd_wireprotocol.c	2007-03-20 20:47:48 UTC (rev 215)
@@ -1219,7 +1219,7 @@
 				packet->fields_metadata[i].charsetnr == MYSQLND_BINARY_CHARSET_NR)
 			{
 				/* BLOB - no conversion please */
-				ZVAL_STRINGL(*current_field,  (char *)p, len, 0);
+				ZVAL_STRINGL(*current_field,  (char *)p, len, UG(unicode));
 			} else {
 				ZVAL_UTF8_STRINGL(*current_field,  (char *)p, len, 0);
 			}

Modified: trunk/ext/mysqli/php_mysqli.h
===================================================================
--- trunk/ext/mysqli/php_mysqli.h	2007-03-20 15:32:37 UTC (rev 214)
+++ trunk/ext/mysqli/php_mysqli.h	2007-03-20 20:47:48 UTC (rev 215)
@@ -114,13 +114,15 @@
 	HashTable 		*prop_handler;
 } mysqli_object; /* extends zend_object */
 
-typedef struct {
-	char			*reason;
-	char			sqlstate[6];
-	int				errorno;
-   	void			*next;
-} MYSQLI_WARNING;
+typedef struct st_mysqli_warning MYSQLI_WARNING;
 
+struct st_mysqli_warning {
+	zval	reason;
+	zval	sqlstate;
+	int		errorno;
+   	MYSQLI_WARNING	*next;
+};
+
 typedef struct _mysqli_property_entry {
 	char *pname;
 	int (*r_func)(mysqli_object *obj, zval **retval TSRMLS_DC);

Modified: trunk/ext/mysqli/tests/072.phpt
===================================================================
--- trunk/ext/mysqli/tests/072.phpt	2007-03-20 15:32:37 UTC (rev 214)
+++ trunk/ext/mysqli/tests/072.phpt	2007-03-20 20:47:48 UTC (rev 215)
@@ -19,9 +19,11 @@
 	var_dump($w->sqlstate);
 
 	$mysql->close();
+	echo "done!"
 ?>
---EXPECT--
+--EXPECTF--
 int(1)
 int(1051)
-string(26) "Unknown table 'not_exists'"
-string(5) "HY000"
+%s(26) "Unknown table 'not_exists'"
+%s(5) "HY000"
+done!

Thread
PHP mysqlnd svn commit: r215 - in trunk/ext/mysqli: . mysqlnd testsahristov20 Mar