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