iliaa Tue Jul 22 12:06:09 2003 EDT
Modified files: (Branch: PHP_4_3)
/php-src/ext/mysql php_mysql.c
Log:
MFH: r1.196: mysql_fixes
Index: php-src/ext/mysql/php_mysql.c
diff -u php-src/ext/mysql/php_mysql.c:1.174.2.19
php-src/ext/mysql/php_mysql.c:1.174.2.20
--- php-src/ext/mysql/php_mysql.c:1.174.2.19 Wed Jun 18 11:19:28 2003
+++ php-src/ext/mysql/php_mysql.c Tue Jul 22 12:06:09 2003
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_mysql.c,v 1.174.2.19 2003/06/18 15:19:28 iliaa Exp $ */
+/* $Id: php_mysql.c,v 1.174.2.20 2003/07/22 16:06:09 iliaa Exp $ */
/* TODO:
*
@@ -222,6 +222,26 @@
#define CHECK_LINK(link) { if (link==-1) { php_error_docref(NULL TSRMLS_CC,
E_WARNING, "A link to the server could not be established"); RETURN_FALSE; } }
+#define PHPMY_UNBUFFERED_QUERY_CHECK() \
+{ \
+ if (mysql->active_result_id) { \
+ do { \
+ int type; \
+ MYSQL_RES *mysql_result; \
+ \
+ mysql_result = (MYSQL_RES *)
zend_list_find(mysql->active_result_id, &type); \
+ if (mysql_result && type==le_result) {
\
+ if (!mysql_eof(mysql_result)) {
\
+ php_error_docref(NULL TSRMLS_CC, E_NOTICE,
"Function called without first fetching all rows from a previous unbuffered query"); \
+ while (mysql_fetch_row(mysql_result)); \
+ } \
+ zend_list_delete(mysql->active_result_id); \
+ mysql->active_result_id = 0; \
+ } \
+ } while(0); \
+ } \
+} \
+
/* {{{ _free_mysql_result
* This wrapper is required since mysql_free_result() returns an integer, and
* thus, cannot be used directly
@@ -239,14 +259,30 @@
*/
static void php_mysql_set_default_link(int id TSRMLS_DC)
{
- if (MySG(default_link)!=-1) {
- zend_list_delete(MySG(default_link));
- }
MySG(default_link) = id;
zend_list_addref(id);
}
/* }}} */
+/* {{{ php_mysql_select_db
+*/
+static int php_mysql_select_db(php_mysql_conn *mysql, char *db TSRMLS_DC)
+{
+ /* a small optimization to avoid selecting the database if it is already
selected */
+ if (mysql->conn.db && !strcmp(mysql->conn.db, db)) {
+ return 1;
+ } else {
+ PHPMY_UNBUFFERED_QUERY_CHECK();
+
+ if (mysql_select_db(&mysql->conn, db) != 0) {
+ return 0;
+ } else {
+ return 1;
+ }
+ }
+}
+/* }}} */
+
/* {{{ _close_mysql_link
*/
static void _close_mysql_link(zend_rsrc_list_entry *rsrc TSRMLS_DC)
@@ -833,11 +869,13 @@
ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, id, "MySQL-Link",
le_link, le_plink);
if (id==-1) { /* explicit resource number */
+ PHPMY_UNBUFFERED_QUERY_CHECK();
zend_list_delete(Z_RESVAL_PP(mysql_link));
}
if (id!=-1
|| (mysql_link && Z_RESVAL_PP(mysql_link)==MySG(default_link))) {
+ PHPMY_UNBUFFERED_QUERY_CHECK();
zend_list_delete(MySG(default_link));
MySG(default_link) = -1;
}
@@ -877,10 +915,10 @@
convert_to_string_ex(db);
- if (mysql_select_db(&mysql->conn, Z_STRVAL_PP(db))!=0) {
- RETVAL_FALSE;
+ if (php_mysql_select_db(mysql, Z_STRVAL_PP(db) TSRMLS_CC)) {
+ RETURN_TRUE;
} else {
- RETVAL_TRUE;
+ RETURN_FALSE;
}
}
/* }}} */
@@ -1057,6 +1095,8 @@
}
ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link",
le_link, le_plink);
+ PHPMY_UNBUFFERED_QUERY_CHECK();
+
RETURN_STRING((char *)mysql_stat(&mysql->conn), 1);
}
/* }}} */
@@ -1115,10 +1155,11 @@
}
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "This function is deprecated,
please use mysql_query() to issue a SQL CREATE DATABASE statement instead.");
-
ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, id, "MySQL-Link",
le_link, le_plink);
-
+
+ PHPMY_UNBUFFERED_QUERY_CHECK();
+
convert_to_string_ex(db);
if (mysql_create_db(&mysql->conn, Z_STRVAL_PP(db))==0) {
@@ -1184,26 +1225,12 @@
if (db) {
convert_to_string_ex(db);
- if (mysql_select_db(&mysql->conn, Z_STRVAL_PP(db))!=0) {
+ if (!php_mysql_select_db(mysql, Z_STRVAL_PP(db) TSRMLS_CC)) {
RETURN_FALSE;
}
}
-
- if (mysql->active_result_id) do {
- int type;
- MYSQL_RES *mysql_result;
-
- mysql_result = (MYSQL_RES *) zend_list_find(mysql->active_result_id,
&type);
- if (mysql_result && type==le_result) {
- if (!mysql_eof(mysql_result)) {
- php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Function
called without first fetching all rows from a previous unbuffered query");
- while (mysql_fetch_row(mysql_result));
- }
- zend_list_delete(mysql->active_result_id);
- mysql->active_result_id = 0;
- }
- } while(0);
+ PHPMY_UNBUFFERED_QUERY_CHECK();
convert_to_string_ex(query);
@@ -1386,6 +1413,8 @@
ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, id, "MySQL-Link",
le_link, le_plink);
+ PHPMY_UNBUFFERED_QUERY_CHECK();
+
if ((mysql_result=mysql_list_dbs(&mysql->conn, NULL))==NULL) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to save MySQL
query result");
RETURN_FALSE;
@@ -1426,9 +1455,12 @@
ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, id, "MySQL-Link",
le_link, le_plink);
convert_to_string_ex(db);
- if (mysql_select_db(&mysql->conn, Z_STRVAL_PP(db))!=0) {
+ if (!php_mysql_select_db(mysql, Z_STRVAL_PP(db) TSRMLS_CC)) {
RETURN_FALSE;
}
+
+ PHPMY_UNBUFFERED_QUERY_CHECK();
+
if ((mysql_result=mysql_list_tables(&mysql->conn, NULL))==NULL) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to save MySQL
query result");
RETURN_FALSE;
@@ -1469,9 +1501,12 @@
ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, id, "MySQL-Link",
le_link, le_plink);
convert_to_string_ex(db);
- if (mysql_select_db(&mysql->conn, Z_STRVAL_PP(db))!=0) {
+ if (!php_mysql_select_db(mysql, Z_STRVAL_PP(db) TSRMLS_CC)) {
RETURN_FALSE;
}
+
+ PHPMY_UNBUFFERED_QUERY_CHECK();
+
convert_to_string_ex(table);
if ((mysql_result=mysql_list_fields(&mysql->conn, Z_STRVAL_PP(table),
NULL))==NULL) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to save MySQL
query result");
@@ -1501,6 +1536,8 @@
ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link",
le_link, le_plink);
+ PHPMY_UNBUFFERED_QUERY_CHECK();
+
mysql_result = mysql_list_processes(&mysql->conn);
if (mysql_result == NULL) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to save MySQL
query result");
@@ -2385,6 +2422,9 @@
}
ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link",
le_link, le_plink);
+
+ PHPMY_UNBUFFERED_QUERY_CHECK();
+
RETURN_BOOL(! mysql_ping(&mysql->conn));
}
/* }}} */
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php