query/include/matador/sql/schema.hpp

82 lines
1.8 KiB
C++

#ifndef QUERY_SCHEMA_HPP
#define QUERY_SCHEMA_HPP
#include "matador/sql/column_generator.hpp"
#include "matador/sql/record.hpp"
#include <optional>
#include <string>
#include <typeindex>
#include <unordered_map>
namespace matador::sql {
class connection;
struct table_info
{
std::string name;
record prototype;
void create(connection &conn) const;
void drop(connection &conn) const;
};
class schema
{
public:
using repository = std::unordered_map<std::type_index, table_info>;
using iterator = repository::iterator;
using const_iterator = repository::const_iterator;
explicit schema(std::string name);
[[nodiscard]] std::string name() const;
template<typename Type>
const table_info& attach(const std::string &table_name)
{
return attach(std::type_index(typeid(Type)), table_info{table_name, record{column_generator::generate<Type>(*this)}});
}
const table_info& attach(std::type_index ti, const table_info& table);
template<typename Type>
[[nodiscard]] std::optional<table_info> info() const
{
return info(std::type_index(typeid(Type)));
}
[[nodiscard]] std::optional<table_info> info(std::type_index ti) const;
template<typename Type>
[[nodiscard]] std::pair<std::string, std::string> reference() const
{
return reference(std::type_index(typeid(Type)));
}
[[nodiscard]] std::pair<std::string, std::string> reference(const std::type_index &ti) const;
template<typename Type>
[[nodiscard]] bool exists() const
{
return exists(std::type_index(typeid(Type)));
}
[[nodiscard]] bool exists(const std::type_index &ti) const;
iterator begin();
[[nodiscard]] const_iterator begin() const;
iterator end();
[[nodiscard]] const_iterator end() const;
[[nodiscard]] bool empty() const;
private:
std::string name_;
repository repository_;
};
}
#endif //QUERY_SCHEMA_HPP