@@ -342,253 +342,11 @@ static VALUE fields(VALUE self) {
342
342
return field_list ;
343
343
}
344
344
345
- #if 0
346
- // FIXME refactor into Mysql2::Result
347
- static VALUE each (VALUE self ) {
348
- MYSQL_STMT * stmt ;
349
- GET_STATEMENT (self );
350
- stmt = stmt_wrapper -> stmt ;
351
-
352
- if (! rb_block_given_p ())
353
- {
354
- rb_raise (cMysql2Error , "FIXME: current limitation: each require block" );
355
- }
356
-
357
- if (result ) {
358
- MYSQL_BIND * result_buffers ;
359
- my_bool * is_null ;
360
- my_bool * error ;
361
- unsigned long * length ;
362
- MYSQL_FIELD * fields ;
363
- unsigned long field_count ;
364
- unsigned long i ;
365
-
366
- // FIXME we are calling mysql_stmt_store_result() *before* instead of *after*
367
- // binding the data buffers with mysql_stmt_bind_result(). Turn into a config
368
- // flag for result sets that require a lot of memory?
369
- //
370
- // From MySQL docs:
371
- // "By default, result sets are fetched unbuffered a row at a time from the
372
- // server. To buffer the entire result set on the client, call
373
- // mysql_stmt_store_result() after binding the data buffers and before
374
- // calling mysql_stmt_fetch()."
375
- if (mysql_stmt_store_result (stmt )) {
376
- rb_raise (cMysql2Error , "%s" , mysql_stmt_error (stmt ));
377
- }
378
-
379
- fields = mysql_fetch_fields (result );
380
- field_count = mysql_num_fields (result );
381
-
382
- result_buffers = xcalloc (field_count , sizeof (MYSQL_BIND ));
383
- is_null = xcalloc (field_count , sizeof (my_bool ));
384
- error = xcalloc (field_count , sizeof (my_bool ));
385
- length = xcalloc (field_count , sizeof (unsigned long ));
386
-
387
- for (i = 0 ; i < field_count ; i ++ ) {
388
- result_buffers [i ].buffer_type = fields [i ].type ;
389
-
390
- // mysql type | C type
391
- switch (fields [i ].type ) {
392
- case MYSQL_TYPE_NULL : // NULL
393
- break ;
394
- case MYSQL_TYPE_TINY : // signed char
395
- result_buffers [i ].buffer = xcalloc (1 , sizeof (signed char ));
396
- result_buffers [i ].buffer_length = sizeof (signed char );
397
- break ;
398
- case MYSQL_TYPE_SHORT : // short int
399
- result_buffers [i ].buffer = xcalloc (1 , sizeof (short int ));
400
- result_buffers [i ].buffer_length = sizeof (short int );
401
- break ;
402
- case MYSQL_TYPE_INT24 : // int
403
- case MYSQL_TYPE_LONG : // int
404
- case MYSQL_TYPE_YEAR : // int
405
- result_buffers [i ].buffer = xcalloc (1 , sizeof (int ));
406
- result_buffers [i ].buffer_length = sizeof (int );
407
- break ;
408
- case MYSQL_TYPE_LONGLONG : // long long int
409
- result_buffers [i ].buffer = xcalloc (1 , sizeof (long long int ));
410
- result_buffers [i ].buffer_length = sizeof (long long int );
411
- break ;
412
- case MYSQL_TYPE_FLOAT : // float
413
- case MYSQL_TYPE_DOUBLE : // double
414
- result_buffers [i ].buffer = xcalloc (1 , sizeof (double ));
415
- result_buffers [i ].buffer_length = sizeof (double );
416
- break ;
417
- case MYSQL_TYPE_TIME : // MYSQL_TIME
418
- case MYSQL_TYPE_DATE : // MYSQL_TIME
419
- case MYSQL_TYPE_NEWDATE : // MYSQL_TIME
420
- case MYSQL_TYPE_DATETIME : // MYSQL_TIME
421
- case MYSQL_TYPE_TIMESTAMP : // MYSQL_TIME
422
- result_buffers [i ].buffer = xcalloc (1 , sizeof (MYSQL_TIME ));
423
- result_buffers [i ].buffer_length = sizeof (MYSQL_TIME );
424
- break ;
425
- case MYSQL_TYPE_DECIMAL : // char[]
426
- case MYSQL_TYPE_NEWDECIMAL : // char[]
427
- case MYSQL_TYPE_STRING : // char[]
428
- case MYSQL_TYPE_VAR_STRING : // char[]
429
- case MYSQL_TYPE_VARCHAR : // char[]
430
- case MYSQL_TYPE_TINY_BLOB : // char[]
431
- case MYSQL_TYPE_BLOB : // char[]
432
- case MYSQL_TYPE_MEDIUM_BLOB : // char[]
433
- case MYSQL_TYPE_LONG_BLOB : // char[]
434
- case MYSQL_TYPE_BIT : // char[]
435
- case MYSQL_TYPE_SET : // char[]
436
- case MYSQL_TYPE_ENUM : // char[]
437
- case MYSQL_TYPE_GEOMETRY : // char[]
438
- result_buffers [i ].buffer = malloc (fields [i ].max_length );
439
- result_buffers [i ].buffer_length = fields [i ].max_length ;
440
- break ;
441
- default :
442
- rb_raise (cMysql2Error , "unhandled mysql type: %d" , fields [i ].type );
443
- }
444
-
445
- result_buffers [i ].is_null = & is_null [i ];
446
- result_buffers [i ].length = & length [i ];
447
- result_buffers [i ].error = & error [i ];
448
- result_buffers [i ].is_unsigned = ((fields [i ].flags & UNSIGNED_FLAG ) != 0 );
449
- }
450
-
451
- if (mysql_stmt_bind_result (stmt , result_buffers )) {
452
- for (i = 0 ; i < field_count ; i ++ ) {
453
- if (result_buffers [i ].buffer ) {
454
- free (result_buffers [i ].buffer );
455
- }
456
- }
457
- free (result_buffers );
458
- free (is_null );
459
- free (error );
460
- free (length );
461
- rb_raise (cMysql2Error , "%s" , mysql_stmt_error (stmt ));
462
- }
463
-
464
- while (!mysql_stmt_fetch (stmt )) {
465
- VALUE row = rb_ary_new2 ((long )field_count );
466
-
467
- for (i = 0 ; i < field_count ; i ++ ) {
468
- VALUE column = Qnil ;
469
- MYSQL_TIME * ts ;
470
-
471
- if (is_null [i ]) {
472
- column = Qnil ;
473
- } else {
474
- switch (result_buffers [i ].buffer_type ) {
475
- case MYSQL_TYPE_TINY : // signed char
476
- if (result_buffers [i ].is_unsigned ) {
477
- column = UINT2NUM (* ((unsigned char * )result_buffers [i ].buffer ));
478
- } else {
479
- column = INT2NUM (* ((signed char * )result_buffers [i ].buffer ));
480
- }
481
- break ;
482
- case MYSQL_TYPE_SHORT : // short int
483
- if (result_buffers [i ].is_unsigned ) {
484
- column = UINT2NUM (* ((unsigned short int * )result_buffers [i ].buffer ));
485
- } else {
486
- column = INT2NUM (* ((short int * )result_buffers [i ].buffer ));
487
- }
488
- break ;
489
- case MYSQL_TYPE_INT24 : // int
490
- case MYSQL_TYPE_LONG : // int
491
- case MYSQL_TYPE_YEAR : // int
492
- if (result_buffers [i ].is_unsigned ) {
493
- column = UINT2NUM (* ((unsigned int * )result_buffers [i ].buffer ));
494
- } else {
495
- column = INT2NUM (* ((int * )result_buffers [i ].buffer ));
496
- }
497
- break ;
498
- case MYSQL_TYPE_LONGLONG : // long long int
499
- if (result_buffers [i ].is_unsigned ) {
500
- column = ULL2NUM (* ((unsigned long long int * )result_buffers [i ].buffer ));
501
- } else {
502
- column = LL2NUM (* ((long long int * )result_buffers [i ].buffer ));
503
- }
504
- break ;
505
- case MYSQL_TYPE_FLOAT : // float
506
- column = rb_float_new ((double )(* ((float * )result_buffers [i ].buffer )));
507
- break ;
508
- case MYSQL_TYPE_DOUBLE : // double
509
- column = rb_float_new ((double )(* ((double * )result_buffers [i ].buffer )));
510
- break ;
511
- case MYSQL_TYPE_DATE : // MYSQL_TIME
512
- ts = (MYSQL_TIME * )result_buffers [i ].buffer ;
513
- column = rb_funcall (cDate , rb_intern ("new" ), 3 , INT2NUM (ts -> year ), INT2NUM (ts -> month ), INT2NUM (ts -> day ));
514
- break ;
515
- case MYSQL_TYPE_TIME : // MYSQL_TIME
516
- ts = (MYSQL_TIME * )result_buffers [i ].buffer ;
517
- column = rb_funcall (rb_cTime ,
518
- rb_intern ("mktime" ), 6 ,
519
- UINT2NUM (Qnil ),
520
- UINT2NUM (Qnil ),
521
- UINT2NUM (Qnil ),
522
- UINT2NUM (ts -> hour ),
523
- UINT2NUM (ts -> minute ),
524
- UINT2NUM (ts -> second ));
525
- break ;
526
- case MYSQL_TYPE_NEWDATE : // MYSQL_TIME
527
- case MYSQL_TYPE_DATETIME : // MYSQL_TIME
528
- case MYSQL_TYPE_TIMESTAMP : // MYSQL_TIME
529
- ts = (MYSQL_TIME * )result_buffers [i ].buffer ;
530
- column = rb_funcall (rb_cTime ,
531
- rb_intern ("mktime" ), 6 ,
532
- UINT2NUM (ts -> year ),
533
- UINT2NUM (ts -> month ),
534
- UINT2NUM (ts -> day ),
535
- UINT2NUM (ts -> hour ),
536
- UINT2NUM (ts -> minute ),
537
- UINT2NUM (ts -> second ));
538
- break ;
539
- case MYSQL_TYPE_DECIMAL : // char[]
540
- case MYSQL_TYPE_NEWDECIMAL : // char[]
541
- column = rb_funcall (cBigDecimal , rb_intern ("new" ), 1 , rb_str_new (result_buffers [i ].buffer , * (result_buffers [i ].length )));
542
- break ;
543
- case MYSQL_TYPE_STRING : // char[]
544
- case MYSQL_TYPE_VAR_STRING : // char[]
545
- case MYSQL_TYPE_VARCHAR : // char[]
546
- case MYSQL_TYPE_TINY_BLOB : // char[]
547
- case MYSQL_TYPE_BLOB : // char[]
548
- case MYSQL_TYPE_MEDIUM_BLOB : // char[]
549
- case MYSQL_TYPE_LONG_BLOB : // char[]
550
- case MYSQL_TYPE_BIT : // char[]
551
- case MYSQL_TYPE_SET : // char[]
552
- case MYSQL_TYPE_ENUM : // char[]
553
- case MYSQL_TYPE_GEOMETRY : // char[]
554
- // FIXME: handle encoding
555
- column = rb_str_new (result_buffers [i ].buffer , * (result_buffers [i ].length ));
556
- break ;
557
- default :
558
- rb_raise (cMysql2Error , "unhandled buffer type: %d" ,
559
- result_buffers [i ].buffer_type );
560
- break ;
561
- }
562
- }
563
-
564
- rb_ary_store (row , (long )i , column );
565
- }
566
-
567
- rb_yield (row );
568
- }
569
-
570
- for (i = 0 ; i < field_count ; i ++ ) {
571
- if (result_buffers [i ].buffer ) {
572
- free (result_buffers [i ].buffer );
573
- }
574
- }
575
- free (result_buffers );
576
- free (is_null );
577
- free (error );
578
- free (length );
579
- mysql_free_result (result );
580
- }
581
-
582
- return self ;
583
- }
584
- #endif
585
-
586
345
void init_mysql2_statement () {
587
346
cMysql2Statement = rb_define_class_under (mMysql2 , "Statement" , rb_cObject );
588
347
589
348
rb_define_method (cMysql2Statement , "param_count" , param_count , 0 );
590
349
rb_define_method (cMysql2Statement , "field_count" , field_count , 0 );
591
350
rb_define_method (cMysql2Statement , "execute" , execute , -1 );
592
351
rb_define_method (cMysql2Statement , "fields" , fields , 0 );
593
- // rb_define_method(cMysql2Statement, "each", each, 0);
594
352
}
0 commit comments