@@ -1892,29 +1892,21 @@ PHP_FUNCTION(ibase_free_query)
18921892PHP_FUNCTION (ibase_num_fields )
18931893{
18941894 zval * result ;
1895- int type ;
18961895 XSQLDA * sqlda ;
1896+ ibase_query * ib_query ;
18971897
18981898 RESET_ERRMSG ;
18991899
19001900 if (zend_parse_parameters (ZEND_NUM_ARGS (), "r" , & result ) == FAILURE ) {
19011901 return ;
19021902 }
19031903
1904- type = Z_RES_P (result )-> type ;
1905-
1906- if (type == le_query ) {
1907- ibase_query * ib_query ;
1908-
1909- ib_query = (ibase_query * )zend_fetch_resource_ex (result , LE_QUERY , le_query );
1910- sqlda = ib_query -> out_sqlda ;
1911- } else {
1912- ibase_result * ib_result ;
1913-
1914- ib_result = (ibase_result * )zend_fetch_resource_ex (result , LE_RESULT , le_result );
1915- sqlda = ib_result -> out_sqlda ;
1904+ if (_php_ibase_fetch_query_res (result , & ib_query )) {
1905+ return ;
19161906 }
19171907
1908+ sqlda = ib_query -> out_sqlda ;
1909+
19181910 if (sqlda == NULL ) {
19191911 RETURN_LONG (0 );
19201912 } else {
@@ -1923,21 +1915,54 @@ PHP_FUNCTION(ibase_num_fields)
19231915}
19241916/* }}} */
19251917
1926- static void _php_ibase_field_info (zval * return_value , XSQLVAR * var ) /* {{{ */
1918+ static void _php_ibase_field_info (zval * return_value , ibase_query * ib_query , int is_outvar , int num ) /* {{{ */
19271919{
19281920 unsigned short len ;
19291921 char buf [16 ], * s = buf ;
1922+ XSQLDA * sqlda ;
1923+ XSQLVAR * var ;
1924+
1925+ if (is_outvar ){
1926+ sqlda = ib_query -> out_sqlda ;
1927+ if (sqlda == NULL ) {
1928+ _php_ibase_module_error ("Trying to get field info from a non-select query" );
1929+ RETURN_FALSE ;
1930+ }
1931+ } else {
1932+ sqlda = ib_query -> in_sqlda ;
1933+ if (sqlda == NULL ) {
1934+ // TODO: Add warning? Remove above warning?
1935+ RETURN_FALSE ;
1936+ }
1937+ }
1938+
1939+ var = sqlda -> sqlvar ;
1940+
1941+ if (!var || num < 0 || num >= sqlda -> sqld )RETURN_FALSE ;
1942+
1943+ var += num ;
19301944
19311945 array_init (return_value );
19321946
1933- add_index_stringl (return_value , 0 , var -> sqlname , var -> sqlname_length );
1934- add_assoc_stringl (return_value , "name" , var -> sqlname , var -> sqlname_length );
1947+ if (is_outvar ) {
1948+ // TODO: use newer API for long names
1949+ add_index_stringl (return_value , 0 , var -> sqlname , MIN (31 , var -> sqlname_length ));
1950+ add_assoc_stringl (return_value , "name" , var -> aliasname , MIN (31 , var -> aliasname_length ));
19351951
1936- add_index_stringl (return_value , 1 , var -> aliasname , var -> aliasname_length );
1937- add_assoc_stringl (return_value , "alias" , var -> aliasname , var -> aliasname_length );
1952+ add_index_stringl (return_value , 1 , var -> aliasname , MIN ( 31 , var -> aliasname_length ) );
1953+ add_assoc_stringl (return_value , "alias" , var -> aliasname , MIN ( 31 , var -> aliasname_length ) );
19381954
1939- add_index_stringl (return_value , 2 , var -> relname , var -> relname_length );
1940- add_assoc_stringl (return_value , "relation" , var -> relname , var -> relname_length );
1955+ add_index_stringl (return_value , 2 , var -> relname , MIN (31 , var -> relname_length ));
1956+ add_assoc_stringl (return_value , "relation" , var -> relname , MIN (31 , var -> relname_length ));
1957+ } else {
1958+ // AFAIK describe bind does not set these. Confirmation pending.
1959+ add_index_stringl (return_value , 0 , "" , 0 );
1960+ add_assoc_stringl (return_value , "name" , "" , 0 );
1961+ add_index_stringl (return_value , 1 , "" , 0 );
1962+ add_assoc_stringl (return_value , "alias" , "" , 0 );
1963+ add_index_stringl (return_value , 2 , "" , 0 );
1964+ add_assoc_stringl (return_value , "relation" , "" , 0 );
1965+ }
19411966
19421967 len = slprintf (buf , 16 , "%d" , var -> sqllen );
19431968 add_index_stringl (return_value , 3 , buf , len );
@@ -2020,6 +2045,7 @@ static void _php_ibase_field_info(zval *return_value, XSQLVAR *var) /* {{{ */
20202045 break ;
20212046#if FB_API_VER >= 40
20222047 // These are converted to VARCHAR via isc_dpb_set_bind tag at connect and will appear to clients as VARCHAR
2048+ // TODO: add info regardless
20232049 // case SQL_DEC16:
20242050 // case SQL_DEC34:
20252051 // case SQL_INT128:
@@ -2043,38 +2069,19 @@ PHP_FUNCTION(ibase_field_info)
20432069{
20442070 zval * result_arg ;
20452071 zend_long field_arg ;
2046- int type ;
2047- XSQLDA * sqlda ;
2072+ ibase_query * ib_query ;
20482073
20492074 RESET_ERRMSG ;
20502075
20512076 if (zend_parse_parameters (ZEND_NUM_ARGS (), "rl" , & result_arg , & field_arg ) == FAILURE ) {
20522077 return ;
20532078 }
20542079
2055- type = Z_RES_P (result_arg )-> type ;
2056-
2057- if (type == le_query ) {
2058- ibase_query * ib_query ;
2059-
2060- ib_query = (ibase_query * )zend_fetch_resource_ex (result_arg , LE_QUERY , le_query );
2061- sqlda = ib_query -> out_sqlda ;
2062- } else {
2063- ibase_result * ib_result ;
2064-
2065- ib_result = (ibase_result * )zend_fetch_resource_ex (result_arg , LE_RESULT , le_result );
2066- sqlda = ib_result -> out_sqlda ;
2067- }
2068-
2069- if (sqlda == NULL ) {
2070- _php_ibase_module_error ("Trying to get field info from a non-select query" );
2071- RETURN_FALSE ;
2080+ if (_php_ibase_fetch_query_res (result_arg , & ib_query )) {
2081+ return ;
20722082 }
20732083
2074- if (field_arg < 0 || field_arg >= sqlda -> sqld ) {
2075- RETURN_FALSE ;
2076- }
2077- _php_ibase_field_info (return_value , sqlda -> sqlvar + field_arg );
2084+ _php_ibase_field_info (return_value , ib_query , 1 , (ISC_SHORT )field_arg );
20782085}
20792086/* }}} */
20802087
@@ -2091,7 +2098,9 @@ PHP_FUNCTION(ibase_num_params)
20912098 return ;
20922099 }
20932100
2094- ib_query = (ibase_query * )zend_fetch_resource_ex (result , LE_QUERY , le_query );
2101+ if (_php_ibase_fetch_query_res (result , & ib_query )) {
2102+ return ;
2103+ }
20952104
20962105 if (ib_query -> in_sqlda == NULL ) {
20972106 RETURN_LONG (0 );
@@ -2115,6 +2124,13 @@ PHP_FUNCTION(ibase_param_info)
21152124 return ;
21162125 }
21172126
2127+ if (_php_ibase_fetch_query_res (result_arg , & ib_query )) {
2128+ return ;
2129+ }
2130+
2131+ _php_ibase_field_info (return_value , ib_query , 0 , field_arg );
2132+ }
2133+ /* }}} */
21182134
21192135static int _php_ibase_get_vars_count (ibase_query * ib_query )
21202136{
0 commit comments