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));
56 type =
static_cast<StatementType>(statementHandle->getType(&statusWrapper));
62 throw FbCppException(
"Cannot use SET TRANSACTION command with Statement class. Use Transaction class");
67 "Cannot use COMMIT command with Statement class. Use the commit method from the Transaction class");
72 "Cannot use ROLLBACK command with Statement class. Use the rollback method from the Transaction class");
76 throw FbCppException(
"Unsupported statement type: BLOB segment operations");
83 std::vector<std::byte>& message)
88 message.resize(metadata->getMessageLength(&statusWrapper));
92 const auto count = metadata->getCount(&statusWrapper);
93 descriptors.reserve(count);
95 for (
unsigned index = 0u; index < count; ++index)
100 .scale = metadata->getScale(&statusWrapper, index),
101 .length = metadata->getLength(&statusWrapper, index),
104 .isNullable =
static_cast<bool>(metadata->isNullable(&statusWrapper, index)),
107 switch (descriptor.originalType)
109 case DescriptorOriginalType::TEXT:
111 builder.reset(metadata->getBuilder(&statusWrapper));
113 builder->setType(&statusWrapper, index, SQL_VARYING);
114 descriptor.adjustedType = DescriptorAdjustedType::STRING;
117 case DescriptorOriginalType::TIME_TZ_EX:
119 builder.reset(metadata->getBuilder(&statusWrapper));
121 builder->setType(&statusWrapper, index, SQL_TIME_TZ);
122 descriptor.adjustedType = DescriptorAdjustedType::TIME_TZ;
125 case DescriptorOriginalType::TIMESTAMP_TZ_EX:
127 builder.reset(metadata->getBuilder(&statusWrapper));
129 builder->setType(&statusWrapper, index, SQL_TIMESTAMP_TZ);
130 descriptor.adjustedType = DescriptorAdjustedType::TIMESTAMP_TZ;
139 descriptor.offset = metadata->getOffset(&statusWrapper, index);
140 descriptor.nullOffset = metadata->getNullOffset(&statusWrapper, index);
142 *
reinterpret_cast<std::int16_t*
>(&message[descriptor.nullOffset]) = FB_TRUE;
145 descriptors.push_back(descriptor);
150 metadata.reset(builder->getMetadata(&statusWrapper));
151 message.resize(metadata->getMessageLength(&statusWrapper));
153 for (
unsigned index = 0u; index < count; ++index)
155 auto& descriptor = descriptors[index];
156 descriptor.offset = metadata->getOffset(&statusWrapper, index);
157 descriptor.nullOffset = metadata->getNullOffset(&statusWrapper, index);
159 *
reinterpret_cast<std::int16_t*
>(&message[descriptor.nullOffset]) = FB_TRUE;
164 inMetadata.reset(statementHandle->getInputMetadata(&statusWrapper));
165 processMetadata(inMetadata, inDescriptors, inMessage);
167 outMetadata.reset(statementHandle->getOutputMetadata(&statusWrapper));
168 processMetadata(outMetadata, outDescriptors, outMessage);
206 resultSetHandle->close(&statusWrapper);
207 resultSetHandle.reset();
210 const auto outMessageData = outMessage.data();
214 for (
const auto& descriptor : outDescriptors)
215 *
reinterpret_cast<std::int16_t*
>(&outMessageData[descriptor.nullOffset]) = FB_TRUE;
222 resultSetHandle.reset(statementHandle->openCursor(&statusWrapper, transaction.
getHandle().get(),
223 inMetadata.get(), inMessage.data(), outMetadata.get(), 0));
224 return resultSetHandle->fetchNext(&statusWrapper, outMessageData) == fb::IStatus::RESULT_OK;
227 statementHandle->execute(&statusWrapper, transaction.
getHandle().get(), inMetadata.get(), inMessage.data(),
228 outMetadata.get(), outMessageData);