@@ -102,7 +102,7 @@ static int le_result, le_link, le_plink;
102
102
103
103
typedef struct _php_mysql_conn {
104
104
MYSQL conn ;
105
- MYSQL_RES * active_result ;
105
+ int active_result_id ;
106
106
} php_mysql_conn ;
107
107
108
108
@@ -114,6 +114,7 @@ function_entry mysql_functions[] = {
114
114
PHP_FE (mysql_create_db , NULL )
115
115
PHP_FE (mysql_drop_db , NULL )
116
116
PHP_FE (mysql_query , NULL )
117
+ PHP_FE (mysql_unbuffered_query , NULL )
117
118
PHP_FE (mysql_db_query , NULL )
118
119
PHP_FE (mysql_list_dbs , NULL )
119
120
PHP_FE (mysql_list_tables , NULL )
@@ -194,6 +195,7 @@ void timeout(int sig);
194
195
static void _free_mysql_result (zend_rsrc_list_entry * rsrc )
195
196
{
196
197
MYSQL_RES * mysql_result = (MYSQL_RES * )rsrc -> ptr ;
198
+
197
199
mysql_free_result (mysql_result );
198
200
}
199
201
@@ -301,8 +303,6 @@ PHP_MINIT_FUNCTION(mysql)
301
303
REGISTER_LONG_CONSTANT ("MYSQL_NUM" , MYSQL_NUM , CONST_CS | CONST_PERSISTENT );
302
304
REGISTER_LONG_CONSTANT ("MYSQL_BOTH" , MYSQL_BOTH , CONST_CS | CONST_PERSISTENT );
303
305
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 );
306
306
return SUCCESS ;
307
307
}
308
308
@@ -482,6 +482,7 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
482
482
}
483
483
/* create the link */
484
484
mysql = (php_mysql_conn * ) malloc (sizeof (php_mysql_conn ));
485
+ mysql -> active_result_id = 0 ;
485
486
#if MYSQL_VERSION_ID > 32199 /* this lets us set the port number */
486
487
mysql_init (& mysql -> conn );
487
488
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)
568
569
}
569
570
570
571
mysql = (php_mysql_conn * ) emalloc (sizeof (php_mysql_conn ));
572
+ mysql -> active_result_id = 0 ;
571
573
#if MYSQL_VERSION_ID > 32199 /* this lets us set the port number */
572
574
mysql_init (& mysql -> conn );
573
575
if (mysql_real_connect (& mysql -> conn , host , user , passwd , NULL , port , socket , 0 )== NULL ) {
@@ -899,9 +901,7 @@ PHP_FUNCTION(mysql_drop_db)
899
901
/* }}} */
900
902
901
903
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 )
905
905
{
906
906
php_mysql_conn * mysql ;
907
907
MYSQL_RES * mysql_result ;
@@ -916,6 +916,21 @@ static void php_mysql_do_query(zval **query, zval **mysql_link, int link_id, zva
916
916
}
917
917
}
918
918
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
+
919
934
convert_to_string_ex (query );
920
935
/* mysql_query is binary unsafe, use mysql_real_query */
921
936
#if MYSQL_VERSION_ID > 32199
@@ -941,19 +956,16 @@ static void php_mysql_do_query(zval **query, zval **mysql_link, int link_id, zva
941
956
}
942
957
}
943
958
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
+ }
944
962
}
945
963
946
964
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 )
953
966
{
954
967
zval * * query , * * mysql_link ;
955
- zval * * store_result ;
956
- int id , use_store = MYSQL_STORE_RESULT ;
968
+ int id ;
957
969
MySLS_FETCH ();
958
970
959
971
switch (ZEND_NUM_ARGS ()) {
@@ -970,21 +982,28 @@ PHP_FUNCTION(mysql_query)
970
982
}
971
983
id = -1 ;
972
984
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 ;
983
985
default :
984
986
WRONG_PARAM_COUNT ;
985
987
break ;
986
988
}
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 );
988
1007
}
989
1008
/* }}} */
990
1009
@@ -994,7 +1013,6 @@ PHP_FUNCTION(mysql_query)
994
1013
PHP_FUNCTION (mysql_db_query )
995
1014
{
996
1015
zval * * db , * * query , * * mysql_link ;
997
- zval * * store_result ;
998
1016
int id , use_store = MYSQL_STORE_RESULT ;
999
1017
MySLS_FETCH ();
1000
1018
@@ -1012,22 +1030,12 @@ PHP_FUNCTION(mysql_db_query)
1012
1030
}
1013
1031
id = -1 ;
1014
1032
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 ;
1025
1033
default :
1026
1034
WRONG_PARAM_COUNT ;
1027
1035
break ;
1028
1036
}
1029
1037
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 );
1031
1039
}
1032
1040
/* }}} */
1033
1041
@@ -1973,3 +1981,4 @@ PHP_FUNCTION(mysql_free_result)
1973
1981
* End:
1974
1982
*/
1975
1983
1984
+
0 commit comments