36 : attachment{attachment},
37 status{attachment.getClient().newStatus()},
38 statusWrapper{attachment.getClient(), status.get()},
39 calendarConverter{attachment.getClient(), &statusWrapper},
40 numericConverter{attachment.getClient(), &statusWrapper}
45 unsigned flags = fb::IStatement::PREPARE_PREFETCH_METADATA;
48 flags |= fb::IStatement::PREPARE_PREFETCH_LEGACY_PLAN;
51 flags |= fb::IStatement::PREPARE_PREFETCH_DETAILED_PLAN;
53 statementHandle.reset(attachment.
getHandle()->prepare(&statusWrapper, transaction.
getHandle().get(),
54 static_cast<unsigned>(sql.length()), sql.data(), SQL_DIALECT_CURRENT, flags));
57 statementHandle->setCursorName(&statusWrapper, options.
getCursorName()->c_str());
59 type =
static_cast<StatementType>(statementHandle->getType(&statusWrapper));
65 throw FbCppException(
"Cannot use SET TRANSACTION command with Statement class. Use Transaction class");
70 "Cannot use COMMIT command with Statement class. Use the commit method from the Transaction class");
75 "Cannot use ROLLBACK command with Statement class. Use the rollback method from the Transaction class");
79 throw FbCppException(
"Unsupported statement type: BLOB segment operations");
86 std::vector<std::byte>& message)
91 message.resize(metadata->getMessageLength(&statusWrapper));
95 const auto count = metadata->getCount(&statusWrapper);
96 descriptors.reserve(count);
98 for (
unsigned index = 0u; index < count; ++index)
103 .scale = metadata->getScale(&statusWrapper, index),
104 .length = metadata->getLength(&statusWrapper, index),
107 .isNullable =
static_cast<bool>(metadata->isNullable(&statusWrapper, index)),
110 switch (descriptor.originalType)
114 builder.reset(metadata->getBuilder(&statusWrapper));
116 builder->setType(&statusWrapper, index, SQL_VARYING);
122 builder.reset(metadata->getBuilder(&statusWrapper));
124 builder->setType(&statusWrapper, index, SQL_TIME_TZ);
130 builder.reset(metadata->getBuilder(&statusWrapper));
132 builder->setType(&statusWrapper, index, SQL_TIMESTAMP_TZ);
142 descriptor.offset = metadata->getOffset(&statusWrapper, index);
143 descriptor.nullOffset = metadata->getNullOffset(&statusWrapper, index);
145 *
reinterpret_cast<std::int16_t*
>(&message[descriptor.nullOffset]) = FB_TRUE;
148 descriptors.push_back(descriptor);
153 metadata.reset(builder->getMetadata(&statusWrapper));
154 message.resize(metadata->getMessageLength(&statusWrapper));
156 for (
unsigned index = 0u; index < count; ++index)
158 auto& descriptor = descriptors[index];
159 descriptor.offset = metadata->getOffset(&statusWrapper, index);
160 descriptor.nullOffset = metadata->getNullOffset(&statusWrapper, index);
162 *
reinterpret_cast<std::int16_t*
>(&message[descriptor.nullOffset]) = FB_TRUE;
167 inMetadata.reset(statementHandle->getInputMetadata(&statusWrapper));
168 processMetadata(inMetadata, inDescriptors, inMessage);
170 outMetadata.reset(statementHandle->getOutputMetadata(&statusWrapper));
171 processMetadata(outMetadata, outDescriptors, outMessage);
209 resultSetHandle->close(&statusWrapper);
210 resultSetHandle.reset();
213 const auto outMessageData = outMessage.data();
217 for (
const auto& descriptor : outDescriptors)
218 *
reinterpret_cast<std::int16_t*
>(&outMessageData[descriptor.nullOffset]) = FB_TRUE;
225 resultSetHandle.reset(statementHandle->openCursor(&statusWrapper, transaction.
getHandle().get(),
226 inMetadata.get(), inMessage.data(), outMetadata.get(), 0));
227 return resultSetHandle->fetchNext(&statusWrapper, outMessageData) == fb::IStatus::RESULT_OK;
230 statementHandle->execute(&statusWrapper, transaction.
getHandle().get(), inMetadata.get(), inMessage.data(),
231 outMetadata.get(), outMessageData);