2.0 KiB
2.0 KiB
query_context
A fluent sql query_context builder
Object definition
enum class Color {
Red, Green, Blue, Yellow, Pink, Black, White
};
struct Coordinate
{
int x;
int y;
int z;
};
// special handling for custom type Coordinate
namespace matador::utils::access {
template<class Operator>
void attribute(Operator &op, const char *id, Coordinate &value, const field_attributes &attr = null_attributes) {
attribute(op, (std::string(id) + "_x").c_str(), value.x, attr);
attribute(op, (std::string(id) + "_y").c_str(), value.y, attr);
attribute(op, (std::string(id) + "_z").c_str(), value.z, attr);
}
}
struct airplane
{
unsigned long id;
std::string brand;
std::string model;
Color color;
Coordinate position;
template<class Operator>
void process(Operator &op) {
namespace field = matador::utils::access;
field::primary_key(op, "id", id);
field::attribute(op, "brand", brand, 255);
field::attribute(op, "model", model, 255);
field::attribute(op, "color", color);
field::attribute(op, "position", position);
}
};
connection_pool<connection> pool("sqlite://sqlite.db", 4);
session s(pool);
// create all tables
s.create().table<airplane>().execute();
std::vector<airplane> planes {
{1, "Airbus", "A380", Color::Green, {1, 2, 3}},
{2, "Boeing", "707", Color::White, {4, 5, 6}},
{3, "Boeing", "747", Color::Blue, {0, 0, 0}}
};
auto stmt = s.insert()
.into<airplane>("airplane")
.values<airplane>().prepare();
// insert
for (const auto &plane: planes) {
auto res = stmt.bind(plane).execute();
stmt.reset();
}
s.update("airplane")
.set({"model", "737"})
.where("id"_col == 2 && "color"_col == Color::White)
.execute();
auto result = s.select<airplane>()
.from("airplane")
.where("brand"_col == "Boeing")
.execute();
for (const auto &plane : result) {
std::cout << "airplane: " << plane->brand << " - " << plane->model << "\n";
}