Skip to content

Commit e6f3fb3

Browse files
committed
Implement mysql_unbuffered_query() - uses mysql_use_result() instead of
mysql_store_result()
1 parent 256537a commit e6f3fb3

File tree

2 files changed

+47
-37
lines changed

2 files changed

+47
-37
lines changed

ext/mysql/php_mysql.c

Lines changed: 46 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ static int le_result, le_link, le_plink;
102102

103103
typedef struct _php_mysql_conn {
104104
MYSQL conn;
105-
MYSQL_RES *active_result;
105+
int active_result_id;
106106
} php_mysql_conn;
107107

108108

@@ -114,6 +114,7 @@ function_entry mysql_functions[] = {
114114
PHP_FE(mysql_create_db, NULL)
115115
PHP_FE(mysql_drop_db, NULL)
116116
PHP_FE(mysql_query, NULL)
117+
PHP_FE(mysql_unbuffered_query, NULL)
117118
PHP_FE(mysql_db_query, NULL)
118119
PHP_FE(mysql_list_dbs, NULL)
119120
PHP_FE(mysql_list_tables, NULL)
@@ -194,6 +195,7 @@ void timeout(int sig);
194195
static void _free_mysql_result(zend_rsrc_list_entry *rsrc)
195196
{
196197
MYSQL_RES *mysql_result = (MYSQL_RES *)rsrc->ptr;
198+
197199
mysql_free_result(mysql_result);
198200
}
199201

@@ -301,8 +303,6 @@ PHP_MINIT_FUNCTION(mysql)
301303
REGISTER_LONG_CONSTANT("MYSQL_NUM", MYSQL_NUM, CONST_CS | CONST_PERSISTENT);
302304
REGISTER_LONG_CONSTANT("MYSQL_BOTH", MYSQL_BOTH, CONST_CS | CONST_PERSISTENT);
303305

304-
REGISTER_LONG_CONSTANT("MYSQL_USE_RESULT", MYSQL_USE_RESULT, CONST_CS | CONST_PERSISTENT);
305-
REGISTER_LONG_CONSTANT("MYSQL_STORE_RESULT", MYSQL_STORE_RESULT, CONST_CS | CONST_PERSISTENT);
306306
return SUCCESS;
307307
}
308308

@@ -482,6 +482,7 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
482482
}
483483
/* create the link */
484484
mysql = (php_mysql_conn *) malloc(sizeof(php_mysql_conn));
485+
mysql->active_result_id = 0;
485486
#if MYSQL_VERSION_ID > 32199 /* this lets us set the port number */
486487
mysql_init(&mysql->conn);
487488
if (mysql_real_connect(&mysql->conn, host, user, passwd, NULL, port, socket, 0)==NULL) {
@@ -568,6 +569,7 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
568569
}
569570

570571
mysql = (php_mysql_conn *) emalloc(sizeof(php_mysql_conn));
572+
mysql->active_result_id = 0;
571573
#if MYSQL_VERSION_ID > 32199 /* this lets us set the port number */
572574
mysql_init(&mysql->conn);
573575
if (mysql_real_connect(&mysql->conn, host, user, passwd, NULL, port, socket, 0)==NULL) {
@@ -899,9 +901,7 @@ PHP_FUNCTION(mysql_drop_db)
899901
/* }}} */
900902

901903

902-
903-
904-
static void php_mysql_do_query(zval **query, zval **mysql_link, int link_id, zval **db, int use_store, zval *return_value)
904+
static void php_mysql_do_query_general(zval **query, zval **mysql_link, int link_id, zval **db, int use_store, zval *return_value)
905905
{
906906
php_mysql_conn *mysql;
907907
MYSQL_RES *mysql_result;
@@ -916,6 +916,21 @@ static void php_mysql_do_query(zval **query, zval **mysql_link, int link_id, zva
916916
}
917917
}
918918

919+
920+
if (mysql->active_result_id) do {
921+
int type;
922+
MYSQL_RES *mysql_result;
923+
924+
mysql_result = (MYSQL_RES *) zend_list_find(mysql->active_result_id, &type);
925+
if (mysql_result && type==le_result && !mysql_eof(mysql_result)) {
926+
php_error(E_NOTICE, "Called %s() without first fetching all rows from a previous unbuffered query",
927+
get_active_function_name());
928+
while (mysql_fetch_row(mysql_result));
929+
zend_list_delete(mysql->active_result_id);
930+
mysql->active_result_id = 0;
931+
}
932+
} while(0);
933+
919934
convert_to_string_ex(query);
920935
/* mysql_query is binary unsafe, use mysql_real_query */
921936
#if MYSQL_VERSION_ID > 32199
@@ -941,19 +956,16 @@ static void php_mysql_do_query(zval **query, zval **mysql_link, int link_id, zva
941956
}
942957
}
943958
ZEND_REGISTER_RESOURCE(return_value, mysql_result, le_result);
959+
if (use_store == MYSQL_USE_RESULT) {
960+
mysql->active_result_id = Z_LVAL_P(return_value);
961+
}
944962
}
945963

946964

947-
948-
949-
950-
/* {{{ proto int mysql_query(string query [, int link_identifier] [, int result_mode])
951-
Send an SQL query to MySQL */
952-
PHP_FUNCTION(mysql_query)
965+
static void php_mysql_do_query(INTERNAL_FUNCTION_PARAMETERS, int use_store)
953966
{
954967
zval **query, **mysql_link;
955-
zval **store_result;
956-
int id, use_store=MYSQL_STORE_RESULT;
968+
int id;
957969
MySLS_FETCH();
958970

959971
switch(ZEND_NUM_ARGS()) {
@@ -970,21 +982,28 @@ PHP_FUNCTION(mysql_query)
970982
}
971983
id = -1;
972984
break;
973-
case 3:
974-
if(zend_get_parameters_ex(3, &query, &mysql_link, &store_result)==FAILURE) {
975-
RETURN_FALSE;
976-
}
977-
convert_to_long_ex(store_result);
978-
if(Z_LVAL_PP(store_result) == MYSQL_USE_RESULT) {
979-
use_store = MYSQL_USE_RESULT;
980-
}
981-
id = -1;
982-
break;
983985
default:
984986
WRONG_PARAM_COUNT;
985987
break;
986988
}
987-
php_mysql_do_query(query, mysql_link, id, NULL, use_store, return_value);
989+
php_mysql_do_query_general(query, mysql_link, id, NULL, use_store, return_value);
990+
}
991+
992+
993+
/* {{{ proto int mysql_query(string query [, int link_identifier] [, int result_mode])
994+
Send an SQL query to MySQL */
995+
PHP_FUNCTION(mysql_query)
996+
{
997+
php_mysql_do_query(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQL_STORE_RESULT);
998+
}
999+
/* }}} */
1000+
1001+
1002+
/* {{{ proto int mysql_unbuffered_query(string query [, int link_identifier] [, int result_mode])
1003+
Send an SQL query to MySQL, without fetching and buffering the result rows */
1004+
PHP_FUNCTION(mysql_unbuffered_query)
1005+
{
1006+
php_mysql_do_query(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQL_USE_RESULT);
9881007
}
9891008
/* }}} */
9901009

@@ -994,7 +1013,6 @@ PHP_FUNCTION(mysql_query)
9941013
PHP_FUNCTION(mysql_db_query)
9951014
{
9961015
zval **db, **query, **mysql_link;
997-
zval **store_result;
9981016
int id, use_store=MYSQL_STORE_RESULT;
9991017
MySLS_FETCH();
10001018

@@ -1012,22 +1030,12 @@ PHP_FUNCTION(mysql_db_query)
10121030
}
10131031
id = -1;
10141032
break;
1015-
case 4:
1016-
if(zend_get_parameters_ex(4, &db, &query, &mysql_link, &store_result)==FAILURE) {
1017-
RETURN_FALSE;
1018-
}
1019-
convert_to_long_ex(store_result);
1020-
if(Z_LVAL_PP(store_result) == MYSQL_USE_RESULT) {
1021-
use_store = MYSQL_USE_RESULT;
1022-
}
1023-
id = -1;
1024-
break;
10251033
default:
10261034
WRONG_PARAM_COUNT;
10271035
break;
10281036
}
10291037

1030-
php_mysql_do_query(query, mysql_link, id, db, use_store, return_value);
1038+
php_mysql_do_query_general(query, mysql_link, id, db, MYSQL_STORE_RESULT, return_value);
10311039
}
10321040
/* }}} */
10331041

@@ -1973,3 +1981,4 @@ PHP_FUNCTION(mysql_free_result)
19731981
* End:
19741982
*/
19751983

1984+

ext/mysql/php_mysql.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ PHP_FUNCTION(mysql_select_db);
5050
PHP_FUNCTION(mysql_create_db);
5151
PHP_FUNCTION(mysql_drop_db);
5252
PHP_FUNCTION(mysql_query);
53+
PHP_FUNCTION(mysql_unbuffered_query);
5354
PHP_FUNCTION(mysql_db_query);
5455
PHP_FUNCTION(mysql_list_dbs);
5556
PHP_FUNCTION(mysql_list_tables);

0 commit comments

Comments
 (0)