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());
60 cursorFlags = fb::IStatement::CURSOR_TYPE_SCROLLABLE;
62 type =
static_cast<StatementType>(statementHandle->getType(&statusWrapper));
68 throw FbCppException(
"Cannot use SET TRANSACTION command with Statement class. Use Transaction class");
73 "Cannot use COMMIT command with Statement class. Use the commit method from the Transaction class");
78 "Cannot use ROLLBACK command with Statement class. Use the rollback method from the Transaction class");
82 throw FbCppException(
"Unsupported statement type: BLOB segment operations");
89 std::vector<std::byte>& message)
94 message.resize(metadata->getMessageLength(&statusWrapper));
98 const auto count = metadata->getCount(&statusWrapper);
99 descriptors.reserve(count);
101 for (
unsigned index = 0u; index < count; ++index)
106 .scale = metadata->getScale(&statusWrapper, index),
107 .length = metadata->getLength(&statusWrapper, index),
110 .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),
119 switch (descriptor.originalType)
123 builder.reset(metadata->getBuilder(&statusWrapper));
125 builder->setType(&statusWrapper, index, SQL_VARYING);
131 builder.reset(metadata->getBuilder(&statusWrapper));
133 builder->setType(&statusWrapper, index, SQL_TIME_TZ);
139 builder.reset(metadata->getBuilder(&statusWrapper));
141 builder->setType(&statusWrapper, index, SQL_TIMESTAMP_TZ);
151 descriptor.offset = metadata->getOffset(&statusWrapper, index);
152 descriptor.nullOffset = metadata->getNullOffset(&statusWrapper, index);
154 *
reinterpret_cast<std::int16_t*
>(&message[descriptor.nullOffset]) = FB_TRUE;
157 descriptors.push_back(descriptor);
162 metadata.reset(builder->getMetadata(&statusWrapper));
163 message.resize(metadata->getMessageLength(&statusWrapper));
165 for (
unsigned index = 0u; index < count; ++index)
167 auto& descriptor = descriptors[index];
168 descriptor.offset = metadata->getOffset(&statusWrapper, index);
169 descriptor.nullOffset = metadata->getNullOffset(&statusWrapper, index);
171 *
reinterpret_cast<std::int16_t*
>(&message[descriptor.nullOffset]) = FB_TRUE;
176 inMetadata.reset(statementHandle->getInputMetadata(&statusWrapper));
177 processMetadata(inMetadata, inDescriptors, inMessage);
179 outMetadata.reset(statementHandle->getOutputMetadata(&statusWrapper));
180 processMetadata(outMetadata, outDescriptors, outMessage);
218 resultSetHandle->close(&statusWrapper);
219 resultSetHandle.reset();
222 const auto outMessageData = outMessage.data();
226 for (
const auto& descriptor : outDescriptors)
227 *
reinterpret_cast<std::int16_t*
>(&outMessageData[descriptor.nullOffset]) = FB_TRUE;
234 resultSetHandle.reset(statementHandle->openCursor(&statusWrapper, transaction.
getHandle().get(),
235 inMetadata.get(), inMessage.data(), outMetadata.get(), cursorFlags));
236 return resultSetHandle->fetchNext(&statusWrapper, outMessageData) == fb::IStatus::RESULT_OK;
239 statementHandle->execute(&statusWrapper, transaction.
getHandle().get(), inMetadata.get(), inMessage.data(),
240 outMetadata.get(), outMessageData);