#include #include "matador/sql/column.hpp" #include "matador/sql/condition.hpp" #include "matador/sql/connection.hpp" #include "connection.hpp" #include "models/airplane.hpp" using namespace matador::sql; using namespace matador::test; class StatementTestFixture { public: StatementTestFixture() : db(matador::test::connection::dns) { db.open(); db.create().table("airplane").execute(); } ~StatementTestFixture() { drop_table_if_exists("airplane"); } protected: matador::sql::connection db; 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 (db.exists(table_name)) { db.drop().table(table_name).execute(); } } }; TEST_CASE_METHOD(StatementTestFixture, " Create prepared statement", "[statement]") { SECTION("Insert with prepared statement and placeholder") { auto stmt = db.insert() .into("airplane") .values().prepare(); for (const auto &plane: planes) { auto res = stmt.bind(*plane).execute(); REQUIRE(res == 1); stmt.reset(); } auto result = db.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 = db.insert().into("airplane").values(*plane).execute(); REQUIRE(res == 1); } auto stmt = db.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); } } }