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);