14#include <unordered_map>
24 class entity_metadata;
27 template<
typename T,
typename =
void>
32 typename T::primary_key_type,
33 decltype(std::declval<T>().table_name()),
34 decltype(std::declval<T>().get_metadata())
35 >> : std::is_convertible<decltype(std::declval<T>().table_name()), std::string> {};
42 std::is_same_v<T, int32_t> ||
43 std::is_same_v<T, int64_t> ||
44 std::is_same_v<T, double> ||
45 std::is_same_v<T, std::string> ||
46 std::is_same_v<T, bool> ||
47 std::is_same_v<T, std::chrono::system_clock::time_point>;
50 template<
typename EntityType,
typename = std::enable_if_t<is_entity_v<EntityType>>>
66 return static_cast<field_constraint>(
static_cast<int>(a) |
static_cast<int>(b));
70 return (
static_cast<int>(constraints) &
static_cast<int>(check)) != 0;
127 std::vector<const field_metadata*>
get_indexes()
const;
163 template<
typename T,
typename = std::enable_if_t<is_field_type_v<T>>>
180 operator const T&()
const {
return value_; }
191 template<
typename EntityType,
typename>
204 template<
typename OtherEntity>
207 template<
typename OtherEntity>
216 double sum(
const std::string& field);
217 double avg(
const std::string& field);
222 std::shared_ptr<core::database_backend>
db_;
255 template<
typename EntityType>
258 template<
typename EntityType>
261 template<
typename EntityType>
265 bool create_tables(std::shared_ptr<core::database_backend> db);
266 bool drop_tables(std::shared_ptr<core::database_backend> db);
267 bool sync_schema(std::shared_ptr<core::database_backend> db);
274 #define ENTITY_FIELD(type, name, ...) \
277 static inline field_metadata name##_metadata_{#name, #type, __VA_ARGS__}; \
279 field_accessor<type> name{name##_, name##_metadata_}; \
280 static const field_metadata& name##_field() { return name##_metadata_; }
282 #define ENTITY_TABLE(table_name) \
284 std::string table_name() const override { return table_name; } \
285 using primary_key_type = decltype(id_); \
287 static inline entity_metadata metadata_{table_name};
289 #define ENTITY_METADATA() \
291 const entity_metadata& get_metadata() const override { \
292 static std::once_flag init_flag; \
293 std::call_once(init_flag, [this]() { initialize_metadata(); }); \
297 static void initialize_metadata();
Base class for all ORM entities.
virtual const entity_metadata & get_metadata() const =0
virtual ~entity_base()=default
virtual std::string table_name() const =0
Manages entity metadata and provides factory methods.
std::enable_if_t< is_entity_v< EntityType > > register_entity()
std::enable_if_t< is_entity_v< EntityType >, const entity_metadata & > get_metadata()
bool drop_tables(std::shared_ptr< core::database_backend > db)
bool sync_schema(std::shared_ptr< core::database_backend > db)
std::unordered_map< std::string, std::unique_ptr< entity_metadata > > metadata_cache_
std::enable_if_t< is_entity_v< EntityType >, query_builder< EntityType > > query(std::shared_ptr< core::database_backend > db)
bool create_tables(std::shared_ptr< core::database_backend > db)
entity_manager()=default
Default constructor - used by database_context.
Template class for type-safe field access.
field_accessor & operator=(const T &value)
const field_metadata & metadata_
field_accessor(T &value, const field_metadata &metadata)
const field_metadata & metadata() const
Template query builder for type-safe ORM queries.
query_builder & offset(size_t count)
core::database_value min(const std::string &field)
std::optional< EntityType > first()
core::database_value max(const std::string &field)
query_builder & where(const std::string &condition)
std::shared_ptr< core::database_backend > db_
EntityType map_result_to_entity(const core::database_result &result, size_t row) const
std::enable_if_t< is_entity_v< OtherEntity >, query_builder & > left_join(const std::string &condition)
std::enable_if_t< is_entity_v< OtherEntity >, query_builder & > join(const std::string &condition)
query_builder(std::shared_ptr< core::database_backend > db)
query_builder & limit(size_t count)
std::string order_clause_
std::string where_clause_
std::vector< EntityType > execute()
query_builder & order_by(const std::string &field, bool ascending=true)
double sum(const std::string &field)
double avg(const std::string &field)
std::string build_query() const
Abstract interface for database backends.
Defines the enumeration of supported database types.
std::vector< database_row > database_result
std::variant< std::string, int64_t, double, bool, std::nullptr_t > database_value
field_constraint operator|(field_constraint a, field_constraint b)
field_constraint auto_increment()
field_constraint unique()
constexpr bool is_entity_v
field_constraint not_null()
field_constraint primary_key()
bool has_constraint(field_constraint constraints, field_constraint check)
field_constraint default_now()
constexpr bool is_field_type_v