Skip to content

Commit a5e5fb5

Browse files
committed
Refactor ibase_num_fields(), ibase_num_params(), ibase_field_info(), ibase_param_info()
1 parent 03dc505 commit a5e5fb5

File tree

1 file changed

+60
-44
lines changed

1 file changed

+60
-44
lines changed

ibase_query.c

Lines changed: 60 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1892,29 +1892,21 @@ PHP_FUNCTION(ibase_free_query)
18921892
PHP_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

21192135
static int _php_ibase_get_vars_count(ibase_query *ib_query)
21202136
{

0 commit comments

Comments
 (0)