zeev Tue Mar 13 14:52:53 2001 EDT
Modified files:
/php4/ext/mysql php_mysql.c php_mysql.h
Log:
Implement mysql_unbuffered_query() - uses mysql_use_result() instead of
mysql_store_result()
Index: php4/ext/mysql/php_mysql.c
diff -u php4/ext/mysql/php_mysql.c:1.75 php4/ext/mysql/php_mysql.c:1.76
--- php4/ext/mysql/php_mysql.c:1.75 Tue Mar 13 13:42:43 2001
+++ php4/ext/mysql/php_mysql.c Tue Mar 13 14:52:53 2001
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_mysql.c,v 1.75 2001/03/13 21:42:43 zeev Exp $ */
+/* $Id: php_mysql.c,v 1.76 2001/03/13 22:52:53 zeev Exp $ */
/* TODO:
@@ -102,7 +102,7 @@
typedef struct _php_mysql_conn {
MYSQL conn;
- MYSQL_RES *active_result;
+ int active_result_id;
} php_mysql_conn;
@@ -114,6 +114,7 @@
PHP_FE(mysql_create_db,
NULL)
PHP_FE(mysql_drop_db,
NULL)
PHP_FE(mysql_query,
NULL)
+ PHP_FE(mysql_unbuffered_query, NULL)
PHP_FE(mysql_db_query,
NULL)
PHP_FE(mysql_list_dbs,
NULL)
PHP_FE(mysql_list_tables,
NULL)
@@ -194,6 +195,7 @@
static void _free_mysql_result(zend_rsrc_list_entry *rsrc)
{
MYSQL_RES *mysql_result = (MYSQL_RES *)rsrc->ptr;
+
mysql_free_result(mysql_result);
}
@@ -301,8 +303,6 @@
REGISTER_LONG_CONSTANT("MYSQL_NUM", MYSQL_NUM, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("MYSQL_BOTH", MYSQL_BOTH, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("MYSQL_USE_RESULT", MYSQL_USE_RESULT, CONST_CS |
CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("MYSQL_STORE_RESULT", MYSQL_STORE_RESULT, CONST_CS |
CONST_PERSISTENT);
return SUCCESS;
}
@@ -482,6 +482,7 @@
}
/* create the link */
mysql = (php_mysql_conn *) malloc(sizeof(php_mysql_conn));
+ mysql->active_result_id = 0;
#if MYSQL_VERSION_ID > 32199 /* this lets us set the port number */
mysql_init(&mysql->conn);
if (mysql_real_connect(&mysql->conn, host, user, passwd, NULL, port,
socket, 0)==NULL) {
@@ -568,6 +569,7 @@
}
mysql = (php_mysql_conn *) emalloc(sizeof(php_mysql_conn));
+ mysql->active_result_id = 0;
#if MYSQL_VERSION_ID > 32199 /* this lets us set the port number */
mysql_init(&mysql->conn);
if (mysql_real_connect(&mysql->conn, host, user, passwd, NULL, port,
socket, 0)==NULL) {
@@ -898,10 +900,8 @@
}
/* }}} */
-
-
-static void php_mysql_do_query(zval **query, zval **mysql_link, int link_id, zval
**db, int use_store, zval *return_value)
+static void php_mysql_do_query_general(zval **query, zval **mysql_link, int link_id,
+zval **db, int use_store, zval *return_value)
{
php_mysql_conn *mysql;
MYSQL_RES *mysql_result;
@@ -916,6 +916,21 @@
}
}
+
+ 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 && !mysql_eof(mysql_result)) {
+ php_error(E_NOTICE, "Called %s() without first fetching all
+rows from a previous unbuffered query",
+ get_active_function_name());
+ while (mysql_fetch_row(mysql_result));
+ zend_list_delete(mysql->active_result_id);
+ mysql->active_result_id = 0;
+ }
+ } while(0);
+
convert_to_string_ex(query);
/* mysql_query is binary unsafe, use mysql_real_query */
#if MYSQL_VERSION_ID > 32199
@@ -941,19 +956,16 @@
}
}
ZEND_REGISTER_RESOURCE(return_value, mysql_result, le_result);
+ if (use_store == MYSQL_USE_RESULT) {
+ mysql->active_result_id = Z_LVAL_P(return_value);
+ }
}
-
-
-
-/* {{{ proto int mysql_query(string query [, int link_identifier] [, int result_mode])
- Send an SQL query to MySQL */
-PHP_FUNCTION(mysql_query)
+static void php_mysql_do_query(INTERNAL_FUNCTION_PARAMETERS, int use_store)
{
zval **query, **mysql_link;
- zval **store_result;
- int id, use_store=MYSQL_STORE_RESULT;
+ int id;
MySLS_FETCH();
switch(ZEND_NUM_ARGS()) {
@@ -970,31 +982,37 @@
}
id = -1;
break;
- case 3:
- if(zend_get_parameters_ex(3, &query, &mysql_link,
&store_result)==FAILURE) {
- RETURN_FALSE;
- }
- convert_to_long_ex(store_result);
- if(Z_LVAL_PP(store_result) == MYSQL_USE_RESULT) {
- use_store = MYSQL_USE_RESULT;
- }
- id = -1;
- break;
default:
WRONG_PARAM_COUNT;
break;
}
- php_mysql_do_query(query, mysql_link, id, NULL, use_store, return_value);
+ php_mysql_do_query_general(query, mysql_link, id, NULL, use_store,
+return_value);
+}
+
+
+/* {{{ proto int mysql_query(string query [, int link_identifier] [, int result_mode])
+ Send an SQL query to MySQL */
+PHP_FUNCTION(mysql_query)
+{
+ php_mysql_do_query(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQL_STORE_RESULT);
}
/* }}} */
+/* {{{ proto int mysql_unbuffered_query(string query [, int link_identifier] [, int
+result_mode])
+ Send an SQL query to MySQL, without fetching and buffering the result rows */
+PHP_FUNCTION(mysql_unbuffered_query)
+{
+ php_mysql_do_query(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQL_USE_RESULT);
+}
+/* }}} */
+
+
/* {{{ proto int mysql_db_query(string database_name, string query [, int
link_identifier] [, int result_mode])
Send an SQL query to MySQL */
PHP_FUNCTION(mysql_db_query)
{
zval **db, **query, **mysql_link;
- zval **store_result;
int id, use_store=MYSQL_STORE_RESULT;
MySLS_FETCH();
@@ -1012,22 +1030,12 @@
}
id = -1;
break;
- case 4:
- if(zend_get_parameters_ex(4, &db, &query, &mysql_link,
&store_result)==FAILURE) {
- RETURN_FALSE;
- }
- convert_to_long_ex(store_result);
- if(Z_LVAL_PP(store_result) == MYSQL_USE_RESULT) {
- use_store = MYSQL_USE_RESULT;
- }
- id = -1;
- break;
default:
WRONG_PARAM_COUNT;
break;
}
- php_mysql_do_query(query, mysql_link, id, db, use_store, return_value);
+ php_mysql_do_query_general(query, mysql_link, id, db, MYSQL_STORE_RESULT,
+return_value);
}
/* }}} */
@@ -1972,4 +1980,5 @@
* c-basic-offset: 4
* End:
*/
+
Index: php4/ext/mysql/php_mysql.h
diff -u php4/ext/mysql/php_mysql.h:1.18 php4/ext/mysql/php_mysql.h:1.19
--- php4/ext/mysql/php_mysql.h:1.18 Sun Feb 25 22:07:04 2001
+++ php4/ext/mysql/php_mysql.h Tue Mar 13 14:52:53 2001
@@ -17,7 +17,7 @@
*/
-/* $Id: php_mysql.h,v 1.18 2001/02/26 06:07:04 andi Exp $ */
+/* $Id: php_mysql.h,v 1.19 2001/03/13 22:52:53 zeev Exp $ */
#ifndef PHP_MYSQL_H
#define PHP_MYSQL_H
@@ -50,6 +50,7 @@
PHP_FUNCTION(mysql_create_db);
PHP_FUNCTION(mysql_drop_db);
PHP_FUNCTION(mysql_query);
+PHP_FUNCTION(mysql_unbuffered_query);
PHP_FUNCTION(mysql_db_query);
PHP_FUNCTION(mysql_list_dbs);
PHP_FUNCTION(mysql_list_tables);
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]