A fluent sql query builder
Go to file
Sascha Kuehl 78c5f64b34 added schema creation to session class 2024-02-06 20:10:34 +01:00
backends added schema creation to session class 2024-02-06 20:10:34 +01:00
cmake added column generator and tests 2023-11-11 08:29:22 +01:00
demo added demo target 2023-11-16 20:20:36 +01:00
include/matador added schema creation to session class 2024-02-06 20:10:34 +01:00
src added schema creation to session class 2024-02-06 20:10:34 +01:00
test added session test (progress) 2024-02-04 22:24:50 +01:00
.gitignore started query builder 2023-11-01 19:55:09 +01:00
CMakeLists.txt added session test (progress) 2024-02-04 22:24:50 +01:00
LICENSE Initial commit 2023-11-01 19:40:26 +01:00
README.md updated README.md 2023-12-17 22:12:49 +01:00
Todo.md backend tests progress 2024-01-31 07:21:06 +01:00

README.md

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";
}