36 : attachment{&attachment},
37 statusWrapper{attachment.getClient()},
38 calendarConverter{attachment.getClient()},
39 numericConverter{attachment.getClient()}
44 unsigned flags = fb::IStatement::PREPARE_PREFETCH_METADATA;
47 flags |= fb::IStatement::PREPARE_PREFETCH_LEGACY_PLAN;
50 flags |= fb::IStatement::PREPARE_PREFETCH_DETAILED_PLAN;
52 statementHandle.reset(attachment.
getHandle()->prepare(&statusWrapper, transaction.
getHandle().get(),
53 static_cast<unsigned>(sql.length()), sql.data(), options.
getDialect(), flags));
56 statementHandle->setCursorName(&statusWrapper, options.
getCursorName()->c_str());
59 cursorFlags = fb::IStatement::CURSOR_TYPE_SCROLLABLE;
61 type =
static_cast<StatementType>(statementHandle->getType(&statusWrapper));
67 throw FbCppException(
"Cannot use SET TRANSACTION command with Statement class. Use Transaction class");
72 "Cannot use COMMIT command with Statement class. Use the commit method from the Transaction class");
77 "Cannot use ROLLBACK command with Statement class. Use the rollback method from the Transaction class");
81 throw FbCppException(
"Unsupported statement type: BLOB segment operations");
88 std::vector<std::byte>& message)
93 message.resize(metadata->getMessageLength(&statusWrapper));
97 const auto count = metadata->getCount(&statusWrapper);
98 descriptors.reserve(count);
100 for (
unsigned index = 0u; index < count; ++index)
105 .scale = metadata->getScale(&statusWrapper, index),
106 .length = metadata->getLength(&statusWrapper, index),
109 .isNullable =
static_cast<bool>(metadata->isNullable(&statusWrapper, index)),
110 .name = metadata->getField(&statusWrapper, index),
111 .relation = metadata->getRelation(&statusWrapper, index),
112 .alias = metadata->getAlias(&statusWrapper, index),
113 .owner = metadata->getOwner(&statusWrapper, index),
114 .charSetId = metadata->getCharSet(&statusWrapper, index),
115 .subType = metadata->getSubType(&statusWrapper, index),
118 switch (descriptor.originalType)
122 builder.reset(metadata->getBuilder(&statusWrapper));
124 builder->setType(&statusWrapper, index, SQL_VARYING);
130 builder.reset(metadata->getBuilder(&statusWrapper));
132 builder->setType(&statusWrapper, index, SQL_TIME_TZ);
138 builder.reset(metadata->getBuilder(&statusWrapper));
140 builder->setType(&statusWrapper, index, SQL_TIMESTAMP_TZ);
150 descriptor.offset = metadata->getOffset(&statusWrapper, index);
151 descriptor.nullOffset = metadata->getNullOffset(&statusWrapper, index);
153 *
reinterpret_cast<std::int16_t*
>(&message[descriptor.nullOffset]) = FB_TRUE;
156 descriptors.push_back(descriptor);
161 metadata.reset(builder->getMetadata(&statusWrapper));
162 message.resize(metadata->getMessageLength(&statusWrapper));
164 for (
unsigned index = 0u; index < count; ++index)
166 auto& descriptor = descriptors[index];
167 descriptor.offset = metadata->getOffset(&statusWrapper, index);
168 descriptor.nullOffset = metadata->getNullOffset(&statusWrapper, index);
170 *
reinterpret_cast<std::int16_t*
>(&message[descriptor.nullOffset]) = FB_TRUE;
175 inMetadata.reset(statementHandle->getInputMetadata(&statusWrapper));
176 processMetadata(inMetadata, inDescriptors, inMessage);
178 outMetadata.reset(statementHandle->getOutputMetadata(&statusWrapper));
179 processMetadata(outMetadata, outDescriptors, outMessage);
181 outRow = std::make_unique<Row>(attachment.
getClient(), outDescriptors, std::span{outMessage});
219 resultSetHandle->close(&statusWrapper);
220 resultSetHandle.reset();
223 const auto outMessageData = outMessage.data();
227 for (
const auto& descriptor : outDescriptors)
228 *
reinterpret_cast<std::int16_t*
>(&outMessageData[descriptor.nullOffset]) = FB_TRUE;
235 resultSetHandle.reset(statementHandle->openCursor(&statusWrapper, transaction.
getHandle().get(),
236 inMetadata.get(), inMessage.data(), outMetadata.get(), cursorFlags));
237 return resultSetHandle->fetchNext(&statusWrapper, outMessageData) == fb::IStatus::RESULT_OK;
240 statementHandle->execute(&statusWrapper, transaction.
getHandle().get(), inMetadata.get(), inMessage.data(),
241 outMetadata.get(), outMessageData);