@@ -486,14 +486,8 @@ PHP_METHOD(PDOStatement, execute)
486
486
}
487
487
/* }}} */
488
488
489
- static inline void fetch_value (pdo_stmt_t * stmt , zval * dest , int colno , int * type_override ) /* {{{ */
489
+ static inline void fetch_value (pdo_stmt_t * stmt , zval * dest , int colno , enum pdo_param_type * type_override ) /* {{{ */
490
490
{
491
- struct pdo_column_data * col ;
492
- char * value = NULL ;
493
- size_t value_len = 0 ;
494
- int caller_frees = 0 ;
495
- int type , new_type ;
496
-
497
491
if (colno < 0 ) {
498
492
zend_value_error ("Column index must be greater than or equal to 0" );
499
493
ZVAL_NULL (dest );
@@ -506,126 +500,62 @@ static inline void fetch_value(pdo_stmt_t *stmt, zval *dest, int colno, int *typ
506
500
return ;
507
501
}
508
502
509
- col = & stmt -> columns [colno ];
510
- type = PDO_PARAM_TYPE (col -> param_type );
511
- new_type = type_override ? (int )PDO_PARAM_TYPE (* type_override ) : type ;
512
-
513
- value = NULL ;
514
- value_len = 0 ;
503
+ ZVAL_NULL (dest );
504
+ stmt -> methods -> get_col (stmt , colno , dest , type_override );
515
505
516
- stmt -> methods -> get_col (stmt , colno , & value , & value_len , & caller_frees );
517
-
518
- switch (type ) {
519
- case PDO_PARAM_ZVAL :
520
- if (value && value_len == sizeof (zval )) {
521
- ZVAL_COPY_VALUE (dest , (zval * )value );
522
-
523
- if (Z_TYPE_P (dest ) == IS_STRING && Z_STRLEN_P (dest ) == 0
524
- && stmt -> dbh -> oracle_nulls == PDO_NULL_EMPTY_STRING ) {
525
- zval_ptr_dtor_str (dest );
526
- ZVAL_NULL (dest );
527
- }
528
- } else {
529
- ZVAL_NULL (dest );
530
- }
506
+ if (Z_TYPE_P (dest ) == IS_STRING && Z_STRLEN_P (dest ) == 0
507
+ && stmt -> dbh -> oracle_nulls == PDO_NULL_EMPTY_STRING ) {
508
+ zval_ptr_dtor_str (dest );
509
+ ZVAL_NULL (dest );
510
+ }
531
511
532
- if (Z_TYPE_P (dest ) == IS_NULL ) {
533
- type = new_type ;
534
- }
535
- break ;
512
+ /* If stringification is requested, override with PDO_PARAM_STR. */
513
+ enum pdo_param_type pdo_param_str = PDO_PARAM_STR ;
514
+ if (stmt -> dbh -> stringify ) {
515
+ type_override = & pdo_param_str ;
516
+ }
536
517
537
- case PDO_PARAM_INT :
538
- if (value && value_len == sizeof (zend_long )) {
539
- ZVAL_LONG (dest , * (zend_long * )value );
518
+ if (type_override && Z_TYPE_P (dest ) != IS_NULL ) {
519
+ switch (* type_override ) {
520
+ case PDO_PARAM_INT :
521
+ convert_to_long (dest );
540
522
break ;
541
- }
542
- ZVAL_NULL (dest );
543
- break ;
544
-
545
- case PDO_PARAM_BOOL :
546
- if (value && value_len == sizeof (zend_bool )) {
547
- ZVAL_BOOL (dest , * (zend_bool * )value );
523
+ case PDO_PARAM_BOOL :
524
+ convert_to_boolean (dest );
548
525
break ;
549
- }
550
- ZVAL_NULL ( dest );
551
- break ;
552
-
553
- case PDO_PARAM_LOB :
554
- if ( value == NULL ) {
555
- ZVAL_NULL ( dest );
556
- } else if ( value_len == 0 ) {
557
- /* Warning, empty strings need to be passed as stream */
558
- if ( stmt -> dbh -> stringify || new_type == PDO_PARAM_STR ) {
559
- zend_string * buf ;
560
- buf = php_stream_copy_to_mem (( php_stream * ) value , PHP_STREAM_COPY_ALL , 0 );
561
- if (buf == NULL ) {
526
+ case PDO_PARAM_STR :
527
+ if ( Z_TYPE_P ( dest ) == IS_FALSE ) {
528
+ /* Return "0" rather than "", because this is what database drivers that
529
+ * don't have a dedicated boolean type would return. */
530
+ zval_ptr_dtor_nogc ( dest );
531
+ ZVAL_INTERNED_STR ( dest , ZSTR_CHAR ( '0' ));
532
+ } else if ( Z_TYPE_P ( dest ) == IS_RESOURCE ) {
533
+ /* Convert LOB stream to string */
534
+ php_stream * stream ;
535
+ php_stream_from_zval_no_verify ( stream , dest );
536
+ zend_string * str = php_stream_copy_to_mem ( stream , PHP_STREAM_COPY_ALL , 0 ) ;
537
+ zval_ptr_dtor_nogc ( dest );
538
+ if (str == NULL ) {
562
539
ZVAL_EMPTY_STRING (dest );
563
540
} else {
564
- ZVAL_STR (dest , buf );
541
+ ZVAL_STR (dest , str );
565
542
}
566
- php_stream_close ((php_stream * )value );
567
- } else {
568
- php_stream_to_zval ((php_stream * )value , dest );
569
- }
570
- } else if (!stmt -> dbh -> stringify && new_type != PDO_PARAM_STR ) {
571
- /* they gave us a string, but LOBs are represented as streams in PDO */
572
- zend_string * str = zend_string_init (value , value_len , 0 );
573
- php_stream * stream = php_stream_memory_open (TEMP_STREAM_READONLY , str );
574
- if (stream ) {
575
- php_stream_to_zval (stream , dest );
576
543
} else {
577
- ZVAL_NULL (dest );
544
+ convert_to_string (dest );
578
545
}
579
- zend_string_release (str );
580
- } else {
581
- ZVAL_STRINGL (dest , value , value_len );
582
- }
583
- break ;
584
-
585
- case PDO_PARAM_STR :
586
- if (value && !(value_len == 0 && stmt -> dbh -> oracle_nulls == PDO_NULL_EMPTY_STRING )) {
587
- ZVAL_STRINGL (dest , value , value_len );
588
- break ;
589
- }
590
- default :
591
- ZVAL_NULL (dest );
592
- }
593
-
594
- if (type != new_type ) {
595
- switch (new_type ) {
596
- case PDO_PARAM_INT :
597
- convert_to_long_ex (dest );
598
- break ;
599
- case PDO_PARAM_BOOL :
600
- convert_to_boolean_ex (dest );
601
- break ;
602
- case PDO_PARAM_STR :
603
- convert_to_string_ex (dest );
604
546
break ;
605
547
case PDO_PARAM_NULL :
606
- convert_to_null_ex (dest );
548
+ convert_to_null (dest );
607
549
break ;
608
- default :
609
- ;
610
- }
611
- }
612
-
613
- if (caller_frees && value ) {
614
- efree (value );
615
- }
616
-
617
- if (stmt -> dbh -> stringify ) {
618
- switch (Z_TYPE_P (dest )) {
619
- case IS_FALSE :
620
- /* Return "0" rather than "", because this is what database drivers that
621
- * don't have a dedicated boolean type would return. */
622
- zval_ptr_dtor_nogc (dest );
623
- ZVAL_INTERNED_STR (dest , ZSTR_CHAR ('0' ));
550
+ case PDO_PARAM_LOB :
551
+ if (Z_TYPE_P (dest ) == IS_STRING ) {
552
+ php_stream * stream =
553
+ php_stream_memory_open (TEMP_STREAM_READONLY , Z_STR_P (dest ));
554
+ zval_ptr_dtor_str (dest );
555
+ php_stream_to_zval (stream , dest );
556
+ }
624
557
break ;
625
- case IS_TRUE :
626
- case IS_LONG :
627
- case IS_DOUBLE :
628
- convert_to_string (dest );
558
+ default :
629
559
break ;
630
560
}
631
561
}
@@ -673,7 +603,7 @@ static bool do_fetch_common(pdo_stmt_t *stmt, enum pdo_fetch_orientation ori, ze
673
603
zval_ptr_dtor (Z_REFVAL (param -> parameter ));
674
604
675
605
/* set new value */
676
- fetch_value (stmt , Z_REFVAL (param -> parameter ), param -> paramno , ( int * ) & param -> param_type );
606
+ fetch_value (stmt , Z_REFVAL (param -> parameter ), param -> paramno , & param -> param_type );
677
607
678
608
/* TODO: some smart thing that avoids duplicating the value in the
679
609
* general loop below. For now, if you're binding output columns,
@@ -1761,10 +1691,6 @@ PHP_METHOD(PDOStatement, getColumnMeta)
1761
1691
add_assoc_str (return_value , "name" , zend_string_copy (col -> name ));
1762
1692
add_assoc_long (return_value , "len" , col -> maxlen ); /* FIXME: unsigned ? */
1763
1693
add_assoc_long (return_value , "precision" , col -> precision );
1764
- if (col -> param_type != PDO_PARAM_ZVAL ) {
1765
- /* if param_type is PDO_PARAM_ZVAL the driver has to provide correct data */
1766
- add_assoc_long (return_value , "pdo_type" , col -> param_type );
1767
- }
1768
1694
}
1769
1695
/* }}} */
1770
1696
0 commit comments