ZeroTierOne/ext/libpqxx-7.7.3/test/test62.cxx
2022-06-22 15:03:19 -07:00

62 lines
1.5 KiB
C++

#include <cstring>
#include <iostream>
#include <pqxx/transaction>
#include "test_helpers.hxx"
using namespace pqxx;
// Example program for libpqxx. Test binary string functionality.
namespace
{
void test_062()
{
connection conn;
work tx{conn};
std::string const TestStr{
"Nasty\n\030Test\n\t String with \200\277 weird bytes "
"\r\0 and Trailer\\\\\0"};
tx.exec0("CREATE TEMP TABLE pqxxbin (binfield bytea)");
std::string const Esc{tx.esc_raw(std::basic_string<std::byte>{
reinterpret_cast<std::byte const *>(std::data(TestStr)),
std::size(TestStr)})};
tx.exec0("INSERT INTO pqxxbin VALUES ('" + Esc + "')");
result R{tx.exec("SELECT * from pqxxbin")};
tx.exec0("DELETE FROM pqxxbin");
auto const B{R.at(0).at(0).as<std::basic_string<std::byte>>()};
PQXX_CHECK(not std::empty(B), "Binary string became empty in conversion.");
PQXX_CHECK_EQUAL(
std::size(B), std::size(TestStr), "Binary string was mangled.");
std::basic_string<std::byte>::const_iterator c;
std::basic_string<std::byte>::size_type i;
for (i = 0, c = std::begin(B); i < std::size(B); ++i, ++c)
{
PQXX_CHECK(c != std::end(B), "Premature end to binary string.");
char const x{TestStr.at(i)}, y{char(B.at(i))}, z{char(std::data(B)[i])};
PQXX_CHECK_EQUAL(
std::string(&x, 1), std::string(&y, 1), "Binary string byte changed.");
PQXX_CHECK_EQUAL(
std::string(&y, 1), std::string(&z, 1),
"Inconsistent byte at offset " + to_string(i) + ".");
}
}
PQXX_REGISTER_TEST(test_062);
} // namespace