#ifndef QUERY_SESSION_HPP #define QUERY_SESSION_HPP #include "matador/sql/connection.hpp" #include "matador/sql/connection_pool.hpp" #include "matador/sql/entity.hpp" #include "matador/sql/statement.hpp" #include "matador/sql/table_repository.hpp" #include namespace matador::sql { class dialect; class session { public: explicit session(connection_pool &pool); template void attach(const std::string &table_name); void create_schema(); template entity insert(Type *obj); template< class Type, typename... Args > entity insert(Args&&... args) { return insert(new Type(std::forward(args)...)); } template void drop_table(); void drop_table(const std::string &table_name); [[nodiscard]] query_result fetch(const query_context &q) const; // [[nodiscard]] query_result fetch(const std::string &sql) const; [[nodiscard]] size_t execute(const std::string &sql) const; statement prepare(query_context q) const; record describe_table(const std::string &table_name) const; bool table_exists(const std::string &table_name) const; [[nodiscard]] const table_repository& tables() const; const class dialect& dialect() const; private: friend class query_select_finish; [[nodiscard]] std::unique_ptr fetch(const std::string &sql) const; private: connection_pool &pool_; const class dialect &dialect_; table_repository table_repository_; mutable std::unordered_map prototypes_; }; template void session::attach(const std::string &table_name) { table_repository_.attach(table_name); } template entity session::insert(Type *obj) { auto c = pool_.acquire(); auto info = table_repository_.info(); if (!info) { return {}; } c->insert().into(info->name).values(*obj).execute(); return entity{obj}; } template void session::drop_table() { auto info = table_repository_.info(); if (info) { return drop_table(info.name); } } } #endif //QUERY_SESSION_HPP