#include #include "test_helpers.hxx" using namespace pqxx; // Test: nontransaction changes are committed immediately. namespace { int BoringYear{1977}; void test_039() { connection conn; nontransaction tx1{conn}; test::create_pqxxevents(tx1); std::string const Table{"pqxxevents"}; // Verify our start condition before beginning: there must not be a 1977 // record already. result R(tx1.exec( "SELECT * FROM " + Table + " " "WHERE year=" + to_string(BoringYear))); PQXX_CHECK_EQUAL( std::size(R), 0, "Already have a row for " + to_string(BoringYear) + ", cannot test."); // (Not needed, but verify that clear() works on empty containers) R.clear(); PQXX_CHECK(std::empty(R), "Result is non-empty after clear()."); // OK. Having laid that worry to rest, add a record for 1977. tx1.exec0( "INSERT INTO " + Table + " VALUES" "(" + to_string(BoringYear) + "," "'Yawn'" ")"); // Abort tx1. Since tx1 is a nontransaction, which provides only the // transaction class interface without providing any form of transactional // integrity, this is not going to undo our work. tx1.abort(); // Verify that our record was added, despite the Abort() nontransaction tx2(conn, "tx2"); R = tx2.exec( "SELECT * FROM " + Table + " " "WHERE year=" + to_string(BoringYear)); PQXX_CHECK_EQUAL(std::size(R), 1, "Unexpected result size."); PQXX_CHECK(R.capacity() >= std::size(R), "Result's capacity is too small."); R.clear(); PQXX_CHECK(std::empty(R), "result::clear() is broken."); // Now remove our record again tx2.exec0( "DELETE FROM " + Table + " " "WHERE year=" + to_string(BoringYear)); tx2.commit(); // And again, verify results nontransaction tx3(conn, "tx3"); R = tx3.exec( "SELECT * FROM " + Table + " " "WHERE year=" + to_string(BoringYear)); PQXX_CHECK_EQUAL(std::size(R), 0, "Record is not gone as expected."); } PQXX_REGISTER_TEST(test_039); } // namespace