@@ -1514,18 +1514,18 @@ void _php_ibase_insert_alias(HashTable *ht, const char *alias, size_t alias_len)
15141514
15151515static void _php_ibase_fetch_hash (INTERNAL_FUNCTION_PARAMETERS , int fetch_type ) /* {{{ */
15161516{
1517- zval * result_arg ;
1517+ zval * res_arg , * result ;
15181518 zend_long flag = 0 ;
15191519 zend_long i , array_cnt = 0 ;
15201520 ibase_query * ib_query ;
15211521
15221522 RESET_ERRMSG ;
15231523
1524- if (zend_parse_parameters (ZEND_NUM_ARGS (), "r|l" , & result_arg , & flag )) {
1524+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "r|l" , & res_arg , & flag )) {
15251525 RETURN_FALSE ;
15261526 }
15271527
1528- if (_php_ibase_fetch_query_res (result_arg , & ib_query )) {
1528+ if (_php_ibase_fetch_query_res (res_arg , & ib_query )) {
15291529 RETURN_FALSE ;
15301530 }
15311531
@@ -1573,113 +1573,109 @@ static void _php_ibase_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int fetch_type)
15731573
15741574 for (i = 0 ; i < ib_query -> out_fields_count ; ++ i ) {
15751575 XSQLVAR * var = & ib_query -> out_sqlda -> sqlvar [i ];
1576+ result = zend_hash_get_current_data (ht_ret );
15761577
1577- // TODO: just continue and unnest. All fields are set to NULL already
1578- if (((var -> sqltype & 1 ) == 0 ) || * var -> sqlind != -1 ) {
1579- zval * result = zend_hash_get_current_data (ht_ret );
1580-
1581- switch (var -> sqltype & ~1 ) {
1582-
1583- default :
1584- _php_ibase_var_zval (result , var -> sqldata , var -> sqltype , var -> sqllen ,
1585- var -> sqlscale , flag );
1586- break ;
1587- case SQL_BLOB :
1588- if (flag & PHP_IBASE_FETCH_BLOBS ) { /* fetch blob contents into hash */
1589-
1590- ibase_blob blob_handle ;
1591- zend_ulong max_len = 0 ;
1592- static char bl_items [] = {isc_info_blob_total_length };
1593- char bl_info [20 ];
1594- unsigned short i ;
1595-
1596- blob_handle .bl_handle = 0 ;
1597- blob_handle .bl_qd = * (ISC_QUAD * ) var -> sqldata ;
1578+ switch (var -> sqltype & ~1 ) {
15981579
1599- if (isc_open_blob (IB_STATUS , & ib_query -> link -> handle , & ib_query -> trans -> handle ,
1600- & blob_handle .bl_handle , & blob_handle .bl_qd )) {
1601- _php_ibase_error ();
1602- goto _php_ibase_fetch_error ;
1603- }
1580+ default :
1581+ _php_ibase_var_zval (result , var -> sqldata , var -> sqltype , var -> sqllen ,
1582+ var -> sqlscale , flag );
1583+ break ;
1584+ case SQL_BLOB :
1585+ if (flag & PHP_IBASE_FETCH_BLOBS ) { /* fetch blob contents into hash */
16041586
1605- if ( isc_blob_info ( IB_STATUS , & blob_handle . bl_handle , sizeof ( bl_items ),
1606- bl_items , sizeof ( bl_info ), bl_info )) {
1607- _php_ibase_error () ;
1608- goto _php_ibase_fetch_error ;
1609- }
1587+ ibase_blob blob_handle ;
1588+ zend_ulong max_len = 0 ;
1589+ static char bl_items [] = { isc_info_blob_total_length } ;
1590+ char bl_info [ 20 ] ;
1591+ unsigned short i ;
16101592
1611- /* find total length of blob's data */
1612- for (i = 0 ; i < sizeof (bl_info ); ) {
1613- unsigned short item_len ;
1614- char item = bl_info [i ++ ];
1593+ blob_handle .bl_handle = 0 ;
1594+ blob_handle .bl_qd = * (ISC_QUAD * ) var -> sqldata ;
16151595
1616- if (item == isc_info_end || item == isc_info_truncated ||
1617- item == isc_info_error || i >= sizeof (bl_info )) {
1596+ if (isc_open_blob (IB_STATUS , & ib_query -> link -> handle , & ib_query -> trans -> handle ,
1597+ & blob_handle .bl_handle , & blob_handle .bl_qd )) {
1598+ _php_ibase_error ();
1599+ goto _php_ibase_fetch_error ;
1600+ }
16181601
1619- _php_ibase_module_error ("Could not determine BLOB size (internal error)"
1620- );
1621- goto _php_ibase_fetch_error ;
1622- }
1602+ if (isc_blob_info (IB_STATUS , & blob_handle .bl_handle , sizeof (bl_items ),
1603+ bl_items , sizeof (bl_info ), bl_info )) {
1604+ _php_ibase_error ();
1605+ goto _php_ibase_fetch_error ;
1606+ }
16231607
1624- item_len = (unsigned short ) isc_vax_integer (& bl_info [i ], 2 );
1608+ /* find total length of blob's data */
1609+ for (i = 0 ; i < sizeof (bl_info ); ) {
1610+ unsigned short item_len ;
1611+ char item = bl_info [i ++ ];
16251612
1626- if (item == isc_info_blob_total_length ) {
1627- max_len = isc_vax_integer (& bl_info [i + 2 ], item_len );
1628- break ;
1629- }
1630- i += item_len + 2 ;
1631- }
1613+ if (item == isc_info_end || item == isc_info_truncated ||
1614+ item == isc_info_error || i >= sizeof (bl_info )) {
16321615
1633- if (max_len == 0 ) {
1634- ZVAL_STRING (result , "" );
1635- } else if (SUCCESS != _php_ibase_blob_get (result , & blob_handle ,
1636- max_len )) {
1616+ _php_ibase_module_error ("Could not determine BLOB size (internal error)"
1617+ );
16371618 goto _php_ibase_fetch_error ;
16381619 }
16391620
1640- if (isc_close_blob (IB_STATUS , & blob_handle .bl_handle )) {
1641- _php_ibase_error ();
1642- goto _php_ibase_fetch_error ;
1621+ item_len = (unsigned short ) isc_vax_integer (& bl_info [i ], 2 );
1622+
1623+ if (item == isc_info_blob_total_length ) {
1624+ max_len = isc_vax_integer (& bl_info [i + 2 ], item_len );
1625+ break ;
16431626 }
1627+ i += item_len + 2 ;
1628+ }
16441629
1645- } else { /* blob id only */
1646- ISC_QUAD bl_qd = * (ISC_QUAD * ) var -> sqldata ;
1647- ZVAL_NEW_STR (result , _php_ibase_quad_to_string (bl_qd ));
1630+ if (max_len == 0 ) {
1631+ ZVAL_STRING (result , "" );
1632+ } else if (SUCCESS != _php_ibase_blob_get (result , & blob_handle ,
1633+ max_len )) {
1634+ goto _php_ibase_fetch_error ;
16481635 }
1649- break ;
1650- case SQL_ARRAY :
1651- if (flag & PHP_IBASE_FETCH_ARRAYS ) { /* array can be *huge* so only fetch if asked */
1652- ISC_QUAD ar_qd = * (ISC_QUAD * ) var -> sqldata ;
1653- ibase_array * ib_array = & ib_query -> out_array [array_cnt ++ ];
1654- void * ar_data = emalloc (ib_array -> ar_size );
1655-
1656- if (isc_array_get_slice (IB_STATUS , & ib_query -> link -> handle ,
1657- & ib_query -> trans -> handle , & ar_qd , & ib_array -> ar_desc ,
1658- ar_data , & ib_array -> ar_size )) {
1659- _php_ibase_error ();
1660- efree (ar_data );
1661- goto _php_ibase_fetch_error ;
1662- }
16631636
1664- if (FAILURE == _php_ibase_arr_zval (result , ar_data , ib_array -> ar_size , ib_array ,
1665- 0 , flag )) {
1666- efree (ar_data );
1667- goto _php_ibase_fetch_error ;
1668- }
1637+ if (isc_close_blob (IB_STATUS , & blob_handle .bl_handle )) {
1638+ _php_ibase_error ();
1639+ goto _php_ibase_fetch_error ;
1640+ }
1641+
1642+ } else { /* blob id only */
1643+ ISC_QUAD bl_qd = * (ISC_QUAD * ) var -> sqldata ;
1644+ ZVAL_NEW_STR (result , _php_ibase_quad_to_string (bl_qd ));
1645+ }
1646+ break ;
1647+ case SQL_ARRAY :
1648+ if (flag & PHP_IBASE_FETCH_ARRAYS ) { /* array can be *huge* so only fetch if asked */
1649+ ISC_QUAD ar_qd = * (ISC_QUAD * ) var -> sqldata ;
1650+ ibase_array * ib_array = & ib_query -> out_array [array_cnt ++ ];
1651+ void * ar_data = emalloc (ib_array -> ar_size );
1652+
1653+ if (isc_array_get_slice (IB_STATUS , & ib_query -> link -> handle ,
1654+ & ib_query -> trans -> handle , & ar_qd , & ib_array -> ar_desc ,
1655+ ar_data , & ib_array -> ar_size )) {
1656+ _php_ibase_error ();
16691657 efree (ar_data );
1658+ goto _php_ibase_fetch_error ;
1659+ }
16701660
1671- } else { /* blob id only */
1672- ISC_QUAD ar_qd = * (ISC_QUAD * ) var -> sqldata ;
1673- ZVAL_NEW_STR (result , _php_ibase_quad_to_string (ar_qd ));
1661+ if (FAILURE == _php_ibase_arr_zval (result , ar_data , ib_array -> ar_size , ib_array ,
1662+ 0 , flag )) {
1663+ efree (ar_data );
1664+ goto _php_ibase_fetch_error ;
16741665 }
1675- break ;
1676- _php_ibase_fetch_error :
1677- RETURN_FALSE ;
1678- } /* switch */
1679- }
1666+ efree (ar_data );
1667+
1668+ } else { /* blob id only */
1669+ ISC_QUAD ar_qd = * (ISC_QUAD * ) var -> sqldata ;
1670+ ZVAL_NEW_STR (result , _php_ibase_quad_to_string (ar_qd ));
1671+ }
1672+ break ;
1673+ _php_ibase_fetch_error :
1674+ RETURN_FALSE ;
1675+ } /* switch */
16801676
16811677 zend_hash_move_forward (ht_ret );
1682- } /* for field */
1678+ }
16831679
16841680 RETVAL_ARR (ht_ret );
16851681}
0 commit comments