#include #include "matador/sql/column.hpp" #include "matador/sql/condition.hpp" #include "matador/sql/connection_info.hpp" #include "matador/sql/connection_pool.hpp" #include "matador/sql/session.hpp" #include "connection.hpp" #include "models/airplane.hpp" using namespace matador::sql; using namespace matador::test; class StatementTestFixture { public: StatementTestFixture() : pool(matador::test::connection::dns, 4), ses(pool) { ses.create().table("airplane").execute(); } ~StatementTestFixture() { drop_table_if_exists("airplane"); } protected: matador::sql::connection_pool pool; matador::sql::session ses; std::vector> planes{ make_entity(1, "Airbus", "A380"), make_entity(2, "Boeing", "707"), make_entity(3, "Boeing", "747") }; private: void drop_table_if_exists(const std::string &table_name) { if (ses.table_exists(table_name)) { ses.drop().table(table_name).execute(); } } }; TEST_CASE_METHOD(StatementTestFixture, " Create prepared statement", "[statement]") { SECTION("Insert with prepared statement and placeholder") { auto stmt = ses.insert() .into("airplane") .values().prepare(); for (const auto &plane: planes) { auto res = stmt.bind(*plane).execute(); REQUIRE(res == 1); stmt.reset(); } auto result = ses.select().from("airplane").fetch_all(); size_t index{0}; for (const auto &i: result) { REQUIRE(i.id == planes[index]->id); REQUIRE(i.brand == planes[index]->brand); REQUIRE(i.model == planes[index++]->model); } } SECTION("Select with prepared statement") { for (const auto &plane: planes) { auto res = ses.insert().into("airplane").values(*plane).execute(); REQUIRE(res == 1); } auto stmt = ses.select().from("airplane").where("brand"_col == _).prepare(); stmt.bind(0, "Airbus"); auto result = stmt.fetch(); for (const auto &i: result) { REQUIRE(i.id == planes[0]->id); REQUIRE(i.brand == planes[0]->brand); REQUIRE(i.model == planes[0]->model); } stmt.reset(); stmt.bind(0, "Boeing"); result = stmt.fetch(); size_t index{1}; for (const auto &i: result) { REQUIRE(i.id == planes[index]->id); REQUIRE(i.brand == planes[index]->brand); REQUIRE(i.model == planes[index++]->model); } } }