Skip to content

Commit f2a30b7

Browse files
committed
Introduce fb_insert_field_info()
1 parent e2155f3 commit f2a30b7

File tree

3 files changed

+55
-11
lines changed

3 files changed

+55
-11
lines changed

ibase_query.c

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1894,8 +1894,19 @@ static void _php_ibase_field_info(zval *return_value, ibase_query *ib_query, int
18941894

18951895
array_init(return_value);
18961896

1897-
if (is_outvar) {
1898-
// TODO: use newer API for long names
1897+
// AFAIK describe bind does not set sqlname, aliasname, relname?
1898+
// Confirmation needed so I leave this as is. After that we can check
1899+
// is_outvar
1900+
1901+
#if FB_API_VER >= 40
1902+
if(IBG(fb_get_master_interface) && IBG(fb_get_statement_interface)) {
1903+
if(fb_insert_field_info(IB_STATUS, ib_query, is_outvar, num, return_value)){
1904+
_php_ibase_error();
1905+
RETURN_FALSE;
1906+
}
1907+
} else {
1908+
#endif
1909+
// Old API
18991910
add_index_stringl(return_value, 0, var->sqlname, MIN(31, var->sqlname_length));
19001911
add_assoc_stringl(return_value, "name", var->sqlname, MIN(31, var->sqlname_length));
19011912

@@ -1904,15 +1915,9 @@ static void _php_ibase_field_info(zval *return_value, ibase_query *ib_query, int
19041915

19051916
add_index_stringl(return_value, 2, var->relname, MIN(31, var->relname_length));
19061917
add_assoc_stringl(return_value, "relation", var->relname, MIN(31, var->relname_length));
1907-
} else {
1908-
// AFAIK describe bind does not set these. Confirmation pending.
1909-
add_index_stringl(return_value, 0, "", 0);
1910-
add_assoc_stringl(return_value, "name", "", 0);
1911-
add_index_stringl(return_value, 1, "", 0);
1912-
add_assoc_stringl(return_value, "alias", "", 0);
1913-
add_index_stringl(return_value, 2, "", 0);
1914-
add_assoc_stringl(return_value, "relation", "", 0);
1918+
#if FB_API_VER >= 40
19151919
}
1920+
#endif
19161921

19171922
len = slprintf(buf, 16, "%d", var->sqllen);
19181923
add_index_stringl(return_value, 3, buf, len);

pdo_firebird_utils.cpp

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,6 @@ extern "C" int fb_insert_aliases(ISC_STATUS* st, ibase_query *ib_query)
101101

102102
assert(cols == ib_query->out_fields_count);
103103

104-
zval t;
105104
for (unsigned i = 0; i < cols; ++i)
106105
{
107106
_php_ibase_insert_alias(ib_query->ht_aliases,
@@ -119,4 +118,43 @@ extern "C" int fb_insert_aliases(ISC_STATUS* st, ibase_query *ib_query)
119118
return 0;
120119
}
121120

121+
extern "C" int fb_insert_field_info(ISC_STATUS* st, ibase_query *ib_query, int is_outvar, int num, zval *into_array)
122+
{
123+
Firebird::IMaster* master = Firebird::fb_get_master_interface();
124+
Firebird::ThrowStatusWrapper status(master->getStatus());
125+
Firebird::IStatement* statement = NULL;
126+
Firebird::IMessageMetadata* meta = NULL;
127+
ISC_STATUS res;
128+
129+
if (res = fb_get_statement_interface(st, &statement, &ib_query->stmt)){
130+
return res;
131+
}
132+
133+
try {
134+
if(is_outvar) {
135+
meta = statement->getOutputMetadata(&status);
136+
} else {
137+
meta = statement->getInputMetadata(&status);
138+
}
139+
140+
add_index_string(into_array, 0, meta->getField(&status, num));
141+
add_assoc_string(into_array, "name", meta->getField(&status, num));
142+
143+
add_index_string(into_array, 1, meta->getAlias(&status, num));
144+
add_assoc_string(into_array, "alias", meta->getAlias(&status, num));
145+
146+
add_index_string(into_array, 2, meta->getRelation(&status, num));
147+
add_assoc_string(into_array, "relation", meta->getRelation(&status, num));
148+
}
149+
catch (const Firebird::FbException& error)
150+
{
151+
if (status.hasData()) {
152+
fb_copy_status((const ISC_STATUS*)status.getErrors(), st, 20);
153+
return st[1];
154+
}
155+
}
156+
157+
return 0;
158+
}
159+
122160
#endif

pdo_firebird_utils.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ void fb_decode_timestamp_tz(const ISC_TIMESTAMP_TZ* timestampTz,
4141
unsigned timeZoneBufferLength, char* timeZoneBuffer);
4242

4343
int fb_insert_aliases(ISC_STATUS* st, ibase_query *ib_query);
44+
int fb_insert_field_info(ISC_STATUS* st, ibase_query *ib_query, int is_outvar, int num, zval *into_array);
4445

4546
#ifdef __cplusplus
4647
}

0 commit comments

Comments
 (0)