File: test_stateless_cursor.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 (87 lines) | stat: -rw-r--r-- 3,104 bytes parent folder | download | duplicates (3)
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
#include <test_helpers.hxx>

using namespace PGSTD;
using namespace pqxx;

namespace
{
void test_stateless_cursor(transaction_base &trans)
{
  stateless_cursor<cursor_base::read_only, cursor_base::owned> empty(
	trans,
	pqxx::test::select_series(trans.conn(), 0, -1),
	"empty",
	false);

  result rows = empty.retrieve(0, 0);
  PQXX_CHECK_EQUAL(rows.empty(), true, "Empty result not empty");
  rows = empty.retrieve(0, 1);
  PQXX_CHECK_EQUAL(rows.size(), 0u, "Empty result returned rows");

  PQXX_CHECK_EQUAL(empty.size(), 0u, "Empty cursor not empty");

  PQXX_CHECK_THROWS(
    empty.retrieve(1, 0),
    out_of_range,
    "Empty cursor tries to retrieve");

  stateless_cursor<cursor_base::read_only, cursor_base::owned> stateless(
	trans,
	pqxx::test::select_series(trans.conn(), 0, 9),
	"stateless",
	false);

  PQXX_CHECK_EQUAL(stateless.size(), 10u, "stateless_cursor::size() mismatch");

  // Retrieve nothing.
  rows = stateless.retrieve(1, 1);
  PQXX_CHECK_EQUAL(rows.size(), 0u, "1-to-1 retrieval not empty");

  // Retrieve two rows.
  rows = stateless.retrieve(1, 3);
  PQXX_CHECK_EQUAL(rows.size(), 2u, "Retrieved wrong number of rows");
  PQXX_CHECK_EQUAL(rows[0][0].as<int>(), 1, "Data/position mismatch");
  PQXX_CHECK_EQUAL(rows[1][0].as<int>(), 2, "Data/position mismatch");

  // Retrieve same rows in reverse.
  rows = stateless.retrieve(2, 0);
  PQXX_CHECK_EQUAL(rows.size(), 2u, "Retrieved wrong number of rows");
  PQXX_CHECK_EQUAL(rows[0][0].as<int>(), 2, "Data/position mismatch");
  PQXX_CHECK_EQUAL(rows[1][0].as<int>(), 1, "Data/position mismatch");

  // Retrieve beyond end.
  rows = stateless.retrieve(9, 13);
  PQXX_CHECK_EQUAL(rows.size(), 1u, "Row count wrong at end");
  PQXX_CHECK_EQUAL(rows[0][0].as<int>(), 9, "Data/pos mismatch at end");

  // Retrieve beyond beginning.
  rows = stateless.retrieve(0, -4);
  PQXX_CHECK_EQUAL(rows.size(), 1u, "Row count wrong at beginning");
  PQXX_CHECK_EQUAL(rows[0][0].as<int>(), 0, "Data/pos mismatch at beginning");

  // Retrieve entire result set backwards.
  rows = stateless.retrieve(10, -15);
  PQXX_CHECK_EQUAL(rows.size(), 10u, "Reverse complete retrieval is broken");
  PQXX_CHECK_EQUAL(rows[0][0].as<int>(), 9, "Data mismatch");
  PQXX_CHECK_EQUAL(rows[9][0].as<int>(), 0, "Data mismatch");

  // Normal usage pattern: step through result set, 4 rows at a time.
  rows = stateless.retrieve(0, 4);
  PQXX_CHECK_EQUAL(rows.size(), 4u, "Wrong batch size");
  PQXX_CHECK_EQUAL(rows[0][0].as<int>(), 0, "Batch in wrong place");
  PQXX_CHECK_EQUAL(rows[3][0].as<int>(), 3, "Batch in wrong place");

  rows = stateless.retrieve(4, 8);
  PQXX_CHECK_EQUAL(rows.size(), 4u, "Wrong batch size");
  PQXX_CHECK_EQUAL(rows[0][0].as<int>(), 4, "Batch in wrong place");
  PQXX_CHECK_EQUAL(rows[3][0].as<int>(), 7, "Batch in wrong place");

  rows = stateless.retrieve(8, 12);
  PQXX_CHECK_EQUAL(rows.size(), 2u, "Wrong batch size");
  PQXX_CHECK_EQUAL(rows[0][0].as<int>(), 8, "Batch in wrong place");
  PQXX_CHECK_EQUAL(rows[1][0].as<int>(), 9, "Batch in wrong place");

}
} // namespace

PQXX_REGISTER_TEST(test_stateless_cursor)