File: test051.cxx

package info (click to toggle)
libpqxx 4.0.1%2Bdfsg3-8
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 16,012 kB
  • ctags: 9,469
  • sloc: sh: 11,289; cpp: 10,801; xml: 1,256; makefile: 287; ansic: 195; python: 159
file content (136 lines) | stat: -rw-r--r-- 2,930 bytes parent folder | download | duplicates (2)
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)