#include "stdafx.h" #include "TestPostgres.h" #include #include #include #include #include "md5.h" #include "../include/qtl_postgres.hpp" using namespace std; struct TestpostgresRecord { int32_t id; char name[33]; qtl::postgres::timestamp create_time; TestpostgresRecord() { memset(this, 0, sizeof(TestpostgresRecord)); } void print() const { printf("ID=\"%d\", Name=\"%s\"\n", id, name); } }; namespace qtl { template<> inline void bind_record(qtl::postgres::statement& command, TestpostgresRecord&& v) { qtl::bind_fields(command, v.id, v.name, v.create_time); } } TestPostgres::TestPostgres() { this->id = 0; TEST_ADD(TestPostgres::test_dual) TEST_ADD(TestPostgres::test_clear) TEST_ADD(TestPostgres::test_insert) TEST_ADD(TestPostgres::test_select) TEST_ADD(TestPostgres::test_update) TEST_ADD(TestPostgres::test_insert2) TEST_ADD(TestPostgres::test_iterator) TEST_ADD(TestPostgres::test_any) } inline void TestPostgres::connect(qtl::postgres::database& db) { TEST_ASSERT_MSG(db.open("localhost", "postgres", "111111", 5432U, "test") == true, "Cannot connect to database"); } void TestPostgres::test_dual() { qtl::postgres::database db; connect(db); try { db.query("select 0, 'hello world';", [](int32_t i, const std::string& str) { printf("0=\"%d\", 'hello world'=\"%s\"\n", i, str.data()); }); } catch (qtl::postgres::error& e) { ASSERT_EXCEPTION(e); } } void TestPostgres::test_select() { qtl::postgres::database db; connect(db); try { db.query("select * from test where id=$1", 0, id, [](const qtl::indicator& id, const std::string& name, const qtl::postgres::timestamp& create_time) { printf("ID=\"%d\", Name=\"%s\"\n", id.data, name.data()); }); db.query("select * from test where id=$1", 0, id, [](const TestpostgresRecord& record) { printf("ID=\"%d\", Name=\"%s\"\n", record.id, record.name); }); db.query("select * from test where id=$1", 0, id, &TestpostgresRecord::print); } catch (qtl::postgres::error& e) { ASSERT_EXCEPTION(e); } } void TestPostgres::test_insert() { qtl::postgres::database db; connect(db); try { db.query_first("insert into test(Name, CreateTime) values($1, LOCALTIMESTAMP) returning ID", "test_user", id); } catch (qtl::postgres::error& e) { ASSERT_EXCEPTION(e); } TEST_ASSERT_MSG(id > 0, "insert failture."); } void TestPostgres::test_insert2() { qtl::postgres::database db; connect(db); try { uint64_t affected = 0; qtl::postgres::statement stmt = db.open_command("insert into test(Name, CreateTime) values($1, LOCALTIMESTAMP)"); qtl::execute(stmt, &affected, "second_user", "third_user"); TEST_ASSERT_MSG(affected == 2, "Cannot insert 2 records to table test."); } catch (qtl::postgres::error& e) { ASSERT_EXCEPTION(e); } } void TestPostgres::test_update() { qtl::postgres::database db; connect(db); try { db.execute_direct("update test set Name=$1 WHERE ID=$2", NULL, "other_user", id); } catch (qtl::postgres::error& e) { ASSERT_EXCEPTION(e); } TEST_ASSERT_MSG(id > 0, "insert failture."); } void TestPostgres::test_clear() { qtl::postgres::database db; connect(db); try { db.simple_execute("delete from test"); } catch (qtl::postgres::error& e) { ASSERT_EXCEPTION(e); } } void TestPostgres::test_iterator() { qtl::postgres::database db; connect(db); try { cout << "after insert all:" << endl; for (auto& record : db.result("select * from test")) { printf("ID=\"%d\", Name=\"%s\"\n", record.id, record.name); } } catch (qtl::postgres::error& e) { ASSERT_EXCEPTION(e); } } void TestPostgres::test_any() { #ifdef _QTL_ENABLE_CPP17 qtl::postgres::database db; connect(db); try { db.query("select 0, 'hello world', LOCALTIMESTAMP", [](const std::any& i, const std::any& str, const std::any& now) { const qtl::postgres::time& time = std::any_cast(now); struct tm tm; time.as_tm(tm); cout << "0=\"" << std::any_cast(i) << "\", 'hello world'=\"" << std::any_cast(str) << "\", now=\"" << std::put_time(&tm, "%c") << "\" \n"; }); } catch (qtl::postgres::error& e) { ASSERT_EXCEPTION(e); } catch (std::bad_cast& e) { ASSERT_EXCEPTION(e); } #endif } int main(int argc, char* argv[]) { Test::TextOutput output(Test::TextOutput::Verbose); cout << endl << "Testing postgres:" << endl; TestPostgres test_postgres; test_postgres.run(output); return 0; }