1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
#include <iostream>
#include <sstream>
#include "test_helpers.hxx"
using namespace PGSTD;
using namespace pqxx;
// Test program for libpqxx's Large Objects interface.
namespace
{
const string Contents = "Large object test contents";
class WriteLargeObject : public transactor<>
{
public:
explicit WriteLargeObject(largeobject &O) :
transactor<>("WriteLargeObject"),
m_Object(),
m_ObjectOutput(O)
{
}
void operator()(argument_type &T)
{
largeobjectaccess A(T);
cout << "Created large object #" << A.id() << endl;
m_Object = largeobject(A);
A.write(Contents);
typedef largeobjectaccess::size_type lobj_size_t;
char Buf[200];
const lobj_size_t Size = sizeof(Buf) - 1;
lobj_size_t Offset = A.seek(0, ios::beg);
PQXX_CHECK_EQUAL(Offset, 0, "Wrong position after seek to beginning.");
PQXX_CHECK_EQUAL(
size_t(A.read(Buf, Size)),
Contents.size(),
"Unexpected read() result.");
PQXX_CHECK_EQUAL(
string(Buf, Contents.size()),
Contents,
"Large object contents were mutilated.");
// Now write contents again, this time as a C string
PQXX_CHECK_EQUAL(
A.seek(-int(Contents.size()), ios::end),
0,
"Bad position after seeking to beginning of large object.");
A.write(Buf, lobj_size_t(Contents.size()));
A.seek(0, ios::beg);
PQXX_CHECK_EQUAL(
size_t(A.read(Buf, Size)),
Contents.size(),
"Bad length for rewritten large object.");
PQXX_CHECK_EQUAL(
string(Buf, Contents.size()),
Contents,
"Rewritten large object was mangled.");
}
void on_commit()
{
PQXX_CHECK(
m_ObjectOutput != m_Object,
"Large objects: false negative on operator!=().");
PQXX_CHECK(
!(m_ObjectOutput == m_Object),
"Large objects: false positive on operator==().");
m_ObjectOutput = m_Object;
PQXX_CHECK(
!(m_ObjectOutput != m_Object),
"Large objects: false positive on operator!=().");
PQXX_CHECK(
m_ObjectOutput == m_Object,
"Large objects: false negative on operator==().");
PQXX_CHECK(
m_ObjectOutput <= m_Object,
"Large objects: false negative on operator<=().");
PQXX_CHECK(
m_ObjectOutput >= m_Object,
"Large objects: false negative on operator>=().");
PQXX_CHECK(
!(m_ObjectOutput < m_Object),
"Large objects: false positive on operator<().");
PQXX_CHECK(
!(m_ObjectOutput > m_Object),
"Large objects: false positive on operator>().");
}
private:
largeobject m_Object;
largeobject &m_ObjectOutput;
};
class DeleteLargeObject : public transactor<>
{
public:
explicit DeleteLargeObject(largeobject O) : m_Object(O) {}
void operator()(argument_type &T)
{
m_Object.remove(T);
}
private:
largeobject m_Object;
};
void test_051(transaction_base &orgT)
{
connection_base &C(orgT.conn());
orgT.abort();
largeobject Obj;
C.perform(WriteLargeObject(Obj));
C.perform(DeleteLargeObject(Obj));
}
} // namespace
PQXX_REGISTER_TEST_T(test_051, nontransaction)
|