33VALUE cMysql2Statement ;
44extern VALUE mMysql2 , cMysql2Error , cBigDecimal , cDateTime , cDate ;
55static VALUE sym_stream , intern_error_number_eql , intern_sql_state_eql , intern_each ;
6+ static VALUE intern_usec , intern_sec , intern_min , intern_hour , intern_day , intern_month , intern_year ;
67
78#define GET_STATEMENT (self ) \
89 mysql_stmt_wrapper *stmt_wrapper; \
@@ -205,26 +206,28 @@ static void *nogvl_stmt_store_result(void *ptr) {
205206 */
206207static VALUE execute (int argc , VALUE * argv , VALUE self ) {
207208 MYSQL_BIND * bind_buffers = NULL ;
209+ unsigned long * length_buffers = NULL ;
208210 unsigned long bind_count ;
209211 long i ;
210212 MYSQL_STMT * stmt ;
211213 MYSQL_RES * metadata ;
212214 VALUE current ;
213215 VALUE resultObj ;
214- VALUE * params_enc = alloca (sizeof (VALUE ) * argc );
215- unsigned long * length_buffers = NULL ;
216- int is_streaming = 0 ;
216+ VALUE * params_enc ;
217+ int is_streaming ;
218+ #ifdef HAVE_RUBY_ENCODING_H
219+ rb_encoding * conn_enc ;
220+ #endif
221+
217222 GET_STATEMENT (self );
218223 GET_CLIENT (stmt_wrapper -> client );
224+
219225#ifdef HAVE_RUBY_ENCODING_H
220- rb_encoding * conn_enc = rb_to_encoding (wrapper -> encoding );
226+ conn_enc = rb_to_encoding (wrapper -> encoding );
221227#endif
222- {
223- VALUE valStreaming = rb_hash_aref (rb_iv_get (stmt_wrapper -> client , "@query_options" ), sym_stream );
224- if (valStreaming == Qtrue ) {
225- is_streaming = 1 ;
226- }
227- }
228+
229+ /* Scratch space for string encoding exports, allocate on the stack. */
230+ params_enc = alloca (sizeof (VALUE ) * argc );
228231
229232 stmt = stmt_wrapper -> stmt ;
230233
@@ -291,13 +294,13 @@ static VALUE execute(int argc, VALUE *argv, VALUE self) {
291294
292295 memset (& t , 0 , sizeof (MYSQL_TIME ));
293296 t .neg = 0 ;
294- t .second_part = FIX2INT (rb_funcall (rb_time , rb_intern ( "usec" ) , 0 ));
295- t .second = FIX2INT (rb_funcall (rb_time , rb_intern ( "sec" ) , 0 ));
296- t .minute = FIX2INT (rb_funcall (rb_time , rb_intern ( "min" ) , 0 ));
297- t .hour = FIX2INT (rb_funcall (rb_time , rb_intern ( "hour" ) , 0 ));
298- t .day = FIX2INT (rb_funcall (rb_time , rb_intern ( "day" ) , 0 ));
299- t .month = FIX2INT (rb_funcall (rb_time , rb_intern ( "month" ) , 0 ));
300- t .year = FIX2INT (rb_funcall (rb_time , rb_intern ( "year" ) , 0 ));
297+ t .second_part = FIX2INT (rb_funcall (rb_time , intern_usec , 0 ));
298+ t .second = FIX2INT (rb_funcall (rb_time , intern_sec , 0 ));
299+ t .minute = FIX2INT (rb_funcall (rb_time , intern_min , 0 ));
300+ t .hour = FIX2INT (rb_funcall (rb_time , intern_hour , 0 ));
301+ t .day = FIX2INT (rb_funcall (rb_time , intern_day , 0 ));
302+ t .month = FIX2INT (rb_funcall (rb_time , intern_month , 0 ));
303+ t .year = FIX2INT (rb_funcall (rb_time , intern_year , 0 ));
301304
302305 * (MYSQL_TIME * )(bind_buffers [i ].buffer ) = t ;
303306 } else if (CLASS_OF (argv [i ]) == cDate ) {
@@ -310,9 +313,9 @@ static VALUE execute(int argc, VALUE *argv, VALUE self) {
310313 memset (& t , 0 , sizeof (MYSQL_TIME ));
311314 t .second_part = 0 ;
312315 t .neg = 0 ;
313- t .day = FIX2INT (rb_funcall (rb_time , rb_intern ( "day" ) , 0 ));
314- t .month = FIX2INT (rb_funcall (rb_time , rb_intern ( "month" ) , 0 ));
315- t .year = FIX2INT (rb_funcall (rb_time , rb_intern ( "year" ) , 0 ));
316+ t .day = FIX2INT (rb_funcall (rb_time , intern_day , 0 ));
317+ t .month = FIX2INT (rb_funcall (rb_time , intern_month , 0 ));
318+ t .year = FIX2INT (rb_funcall (rb_time , intern_year , 0 ));
316319
317320 * (MYSQL_TIME * )(bind_buffers [i ].buffer ) = t ;
318321 } else if (CLASS_OF (argv [i ]) == cBigDecimal ) {
@@ -349,7 +352,10 @@ static VALUE execute(int argc, VALUE *argv, VALUE self) {
349352 }
350353
351354 current = rb_hash_dup (rb_iv_get (stmt_wrapper -> client , "@query_options" ));
355+ (void )RB_GC_GUARD (current );
356+ Check_Type (current , T_HASH );
352357
358+ is_streaming = (Qtrue == rb_hash_aref (current , sym_stream ));
353359 if (!is_streaming ) {
354360 // recieve the whole result set from the server
355361 if (rb_thread_call_without_gvl (nogvl_stmt_store_result , stmt , RUBY_UBF_IO , 0 ) == Qfalse ) {
@@ -360,16 +366,6 @@ static VALUE execute(int argc, VALUE *argv, VALUE self) {
360366
361367 resultObj = rb_mysql_result_to_obj (stmt_wrapper -> client , wrapper -> encoding , current , metadata , stmt );
362368
363- #ifdef HAVE_RUBY_ENCODING_H
364- {
365- mysql2_result_wrapper * result_wrapper ;
366-
367- GET_CLIENT (stmt_wrapper -> client );
368- GetMysql2Result (resultObj , result_wrapper );
369- result_wrapper -> encoding = wrapper -> encoding ;
370- }
371- #endif
372-
373369 if (!is_streaming ) {
374370 // cache all result
375371 rb_funcall (resultObj , intern_each , 0 );
@@ -439,4 +435,12 @@ void init_mysql2_statement() {
439435 intern_error_number_eql = rb_intern ("error_number=" );
440436 intern_sql_state_eql = rb_intern ("sql_state=" );
441437 intern_each = rb_intern ("each" );
438+
439+ intern_usec = rb_intern ("usec" );
440+ intern_sec = rb_intern ("sec" );
441+ intern_min = rb_intern ("min" );
442+ intern_hour = rb_intern ("hour" );
443+ intern_day = rb_intern ("day" );
444+ intern_month = rb_intern ("month" );
445+ intern_year = rb_intern ("year" );
442446}
0 commit comments