3
3
VALUE cMysql2Statement ;
4
4
extern VALUE mMysql2 , cMysql2Error , cBigDecimal , cDateTime , cDate ;
5
5
static 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 ;
6
7
7
8
#define GET_STATEMENT (self ) \
8
9
mysql_stmt_wrapper *stmt_wrapper; \
@@ -205,26 +206,28 @@ static void *nogvl_stmt_store_result(void *ptr) {
205
206
*/
206
207
static VALUE execute (int argc , VALUE * argv , VALUE self ) {
207
208
MYSQL_BIND * bind_buffers = NULL ;
209
+ unsigned long * length_buffers = NULL ;
208
210
unsigned long bind_count ;
209
211
long i ;
210
212
MYSQL_STMT * stmt ;
211
213
MYSQL_RES * metadata ;
212
214
VALUE current ;
213
215
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
+
217
222
GET_STATEMENT (self );
218
223
GET_CLIENT (stmt_wrapper -> client );
224
+
219
225
#ifdef HAVE_RUBY_ENCODING_H
220
- rb_encoding * conn_enc = rb_to_encoding (wrapper -> encoding );
226
+ conn_enc = rb_to_encoding (wrapper -> encoding );
221
227
#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 );
228
231
229
232
stmt = stmt_wrapper -> stmt ;
230
233
@@ -291,13 +294,13 @@ static VALUE execute(int argc, VALUE *argv, VALUE self) {
291
294
292
295
memset (& t , 0 , sizeof (MYSQL_TIME ));
293
296
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 ));
301
304
302
305
* (MYSQL_TIME * )(bind_buffers [i ].buffer ) = t ;
303
306
} else if (CLASS_OF (argv [i ]) == cDate ) {
@@ -310,9 +313,9 @@ static VALUE execute(int argc, VALUE *argv, VALUE self) {
310
313
memset (& t , 0 , sizeof (MYSQL_TIME ));
311
314
t .second_part = 0 ;
312
315
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 ));
316
319
317
320
* (MYSQL_TIME * )(bind_buffers [i ].buffer ) = t ;
318
321
} else if (CLASS_OF (argv [i ]) == cBigDecimal ) {
@@ -349,7 +352,10 @@ static VALUE execute(int argc, VALUE *argv, VALUE self) {
349
352
}
350
353
351
354
current = rb_hash_dup (rb_iv_get (stmt_wrapper -> client , "@query_options" ));
355
+ (void )RB_GC_GUARD (current );
356
+ Check_Type (current , T_HASH );
352
357
358
+ is_streaming = (Qtrue == rb_hash_aref (current , sym_stream ));
353
359
if (!is_streaming ) {
354
360
// recieve the whole result set from the server
355
361
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) {
360
366
361
367
resultObj = rb_mysql_result_to_obj (stmt_wrapper -> client , wrapper -> encoding , current , metadata , stmt );
362
368
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
-
373
369
if (!is_streaming ) {
374
370
// cache all result
375
371
rb_funcall (resultObj , intern_each , 0 );
@@ -439,4 +435,12 @@ void init_mysql2_statement() {
439
435
intern_error_number_eql = rb_intern ("error_number=" );
440
436
intern_sql_state_eql = rb_intern ("sql_state=" );
441
437
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" );
442
446
}
0 commit comments