Skip to content

Commit 46f926e

Browse files
authored
Expose descriptor metadata: name, relation, alias, owner, charSetId, subType (asfernandes#38)
1 parent 1da1d7b commit 46f926e

3 files changed

Lines changed: 98 additions & 1 deletion

File tree

src/fb-cpp/Descriptor.h

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#define FBCPP_DESCRIPTOR_H
2727

2828
#include "fb-api.h"
29+
#include <string>
2930

3031

3132
///
@@ -279,7 +280,36 @@ namespace fbcpp
279280
/// Indicates whether the column or parameter can contain null values.
280281
///
281282
bool isNullable;
282-
// FIXME: more things
283+
284+
///
285+
/// Column or parameter name.
286+
///
287+
std::string name;
288+
289+
///
290+
/// Table or relation this column belongs to (empty for expressions).
291+
///
292+
std::string relation;
293+
294+
///
295+
/// Column alias as it appears in the query's SELECT list.
296+
///
297+
std::string alias;
298+
299+
///
300+
/// Owner of the relation (empty for expressions).
301+
///
302+
std::string owner;
303+
304+
///
305+
/// Character set ID for string and BLOB columns.
306+
///
307+
unsigned charSetId;
308+
309+
///
310+
/// Sub-type (BLOB sub-type or numeric sub-type).
311+
///
312+
int subType;
283313
};
284314
} // namespace fbcpp
285315

src/fb-cpp/Statement.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,12 @@ Statement::Statement(
108108
.offset = 0,
109109
.nullOffset = 0,
110110
.isNullable = static_cast<bool>(metadata->isNullable(&statusWrapper, index)),
111+
.name = metadata->getField(&statusWrapper, index),
112+
.relation = metadata->getRelation(&statusWrapper, index),
113+
.alias = metadata->getAlias(&statusWrapper, index),
114+
.owner = metadata->getOwner(&statusWrapper, index),
115+
.charSetId = metadata->getCharSet(&statusWrapper, index),
116+
.subType = metadata->getSubType(&statusWrapper, index),
111117
};
112118

113119
switch (descriptor.originalType)

src/test/Statement.cpp

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,67 @@ BOOST_AUTO_TEST_CASE(constructorProvidesMetadataHandles)
235235
BOOST_CHECK(outputDescriptor.adjustedType == DescriptorAdjustedType::STRING);
236236
}
237237

238+
BOOST_AUTO_TEST_CASE(descriptorMetadataFields)
239+
{
240+
const auto database = getTempFile("Statement-descriptorMetadataFields.fdb");
241+
242+
Attachment attachment{CLIENT, database, AttachmentOptions().setCreateDatabase(true)};
243+
FbDropDatabase attachmentDrop{attachment};
244+
245+
Transaction transaction{attachment};
246+
247+
Statement createTable{attachment, transaction,
248+
"create table test_meta ("
249+
" id integer not null,"
250+
" name varchar(100),"
251+
" amount numeric(18, 2),"
252+
" data blob sub_type text"
253+
")"};
254+
createTable.execute(transaction);
255+
transaction.commit();
256+
257+
Transaction transaction2{attachment};
258+
259+
Statement select{attachment, transaction2, "select t.id as pk, t.name as label, t.amount, t.data from test_meta t"};
260+
261+
const auto& descriptors = select.getOutputDescriptors();
262+
BOOST_REQUIRE_EQUAL(descriptors.size(), 4U);
263+
264+
// Column 0: t.id as pk
265+
BOOST_CHECK_EQUAL(descriptors[0].name, "ID");
266+
BOOST_CHECK_EQUAL(descriptors[0].alias, "PK");
267+
BOOST_CHECK_EQUAL(descriptors[0].relation, "TEST_META");
268+
BOOST_CHECK(descriptors[0].subType == 0);
269+
270+
// Column 1: t.name as label
271+
BOOST_CHECK_EQUAL(descriptors[1].name, "NAME");
272+
BOOST_CHECK_EQUAL(descriptors[1].alias, "LABEL");
273+
BOOST_CHECK_EQUAL(descriptors[1].relation, "TEST_META");
274+
BOOST_CHECK(descriptors[1].adjustedType == DescriptorAdjustedType::STRING);
275+
276+
// Column 2: t.amount (no alias, numeric)
277+
BOOST_CHECK_EQUAL(descriptors[2].name, "AMOUNT");
278+
BOOST_CHECK_EQUAL(descriptors[2].alias, "AMOUNT");
279+
BOOST_CHECK_EQUAL(descriptors[2].relation, "TEST_META");
280+
281+
// Column 3: t.data (blob sub_type text)
282+
BOOST_CHECK_EQUAL(descriptors[3].name, "DATA");
283+
BOOST_CHECK_EQUAL(descriptors[3].alias, "DATA");
284+
BOOST_CHECK_EQUAL(descriptors[3].relation, "TEST_META");
285+
BOOST_CHECK_EQUAL(descriptors[3].subType, 1);
286+
287+
// Input descriptors for a parameterized query
288+
Statement paramSelect{attachment, transaction2, "select t.id from test_meta t where t.id = ?"};
289+
290+
const auto& inDescriptors = paramSelect.getInputDescriptors();
291+
BOOST_REQUIRE_EQUAL(inDescriptors.size(), 1U);
292+
293+
// Input parameters have empty name/relation/alias
294+
BOOST_CHECK(inDescriptors[0].name.empty());
295+
BOOST_CHECK(inDescriptors[0].relation.empty());
296+
BOOST_CHECK(inDescriptors[0].alias.empty());
297+
}
298+
238299
BOOST_AUTO_TEST_SUITE_END()
239300

240301

0 commit comments

Comments
 (0)