Database System 0.1.0
Advanced C++20 Database System with Multi-Backend Support
Loading...
Searching...
No Matches
orm_entity_demo.cpp
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2025, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
22#include <iostream>
23#include <memory>
24#include <string>
25#include <vector>
26
27#include "database/orm/entity.h"
29
30using namespace database;
31using namespace database::orm;
32
33// -------------------------------------------------------
34// Define a User entity
35//
36// We manually implement table_name() and define fields
37// using the ENTITY_FIELD macro for type-safe accessors.
38// -------------------------------------------------------
40{
41public:
42 using primary_key_type = int64_t;
43
44 std::string table_name() const override { return "users"; }
45
46 // Declare fields with constraints
47 ENTITY_FIELD(int64_t, id,
48 field_constraint::primary_key | field_constraint::auto_increment)
49 ENTITY_FIELD(std::string, username,
50 field_constraint::not_null | field_constraint::unique)
51 ENTITY_FIELD(std::string, email,
52 field_constraint::not_null | field_constraint::unique)
53 ENTITY_FIELD(int32_t, age, field_constraint::not_null)
54 ENTITY_FIELD(bool, is_active, field_constraint::not_null)
55
57
58 // CRUD operations (stubs for this demo)
59 bool save() override { return false; }
60 bool load() override { return false; }
61 bool update() override { return false; }
62 bool remove() override { return false; }
63
64private:
65 static inline entity_metadata metadata_{"users"};
66};
67
68// Initialize entity metadata by registering each field
69void user_entity::initialize_metadata()
70{
71 metadata_.add_field(id_metadata_);
72 metadata_.add_field(username_metadata_);
73 metadata_.add_field(email_metadata_);
74 metadata_.add_field(age_metadata_);
75 metadata_.add_field(is_active_metadata_);
76}
77
78// -------------------------------------------------------
79// Define a Post entity with indexed field
80// -------------------------------------------------------
82{
83public:
84 using primary_key_type = int64_t;
85
86 std::string table_name() const override { return "posts"; }
87
88 ENTITY_FIELD(int64_t, id,
89 field_constraint::primary_key | field_constraint::auto_increment)
90 ENTITY_FIELD(std::string, title, field_constraint::not_null)
91 ENTITY_FIELD(std::string, body, field_constraint::none)
94
96
97 bool save() override { return false; }
98 bool load() override { return false; }
99 bool update() override { return false; }
100 bool remove() override { return false; }
101
102private:
103 static inline entity_metadata metadata_{"posts"};
104};
105
106void post_entity::initialize_metadata()
107{
108 metadata_.add_field(id_metadata_);
109 metadata_.add_field(title_metadata_);
110 metadata_.add_field(body_metadata_);
111 metadata_.add_field(author_id_metadata_);
112}
113
114// -------------------------------------------------------
115// Main
116// -------------------------------------------------------
117int main()
118{
119 std::cout << "=== orm_entity_demo example ===" << std::endl;
120
121 // -------------------------------------------------------
122 // 1. Inspect User entity metadata
123 // -------------------------------------------------------
124 std::cout << "\n--- User entity metadata ---" << std::endl;
125 {
126 user_entity user;
127 const auto& meta = user.get_metadata();
128
129 std::cout << "Table: " << meta.table_name() << std::endl;
130 std::cout << "Fields:" << std::endl;
131
132 for (const auto& field : meta.fields())
133 {
134 std::cout << " " << field.name()
135 << " (" << field.type_name() << ")";
136
137 if (field.is_primary_key())
138 {
139 std::cout << " [PK]";
140 }
141 if (field.is_auto_increment())
142 {
143 std::cout << " [AUTO]";
144 }
145 if (field.is_not_null())
146 {
147 std::cout << " [NOT NULL]";
148 }
149 if (field.is_unique())
150 {
151 std::cout << " [UNIQUE]";
152 }
153 if (field.has_index())
154 {
155 std::cout << " [INDEX]";
156 }
157 std::cout << std::endl;
158 }
159
160 // Primary key info
161 const auto* pk = meta.get_primary_key();
162 if (pk != nullptr)
163 {
164 std::cout << "Primary key: " << pk->name() << std::endl;
165 }
166 }
167
168 // -------------------------------------------------------
169 // 2. Generate CREATE TABLE SQL
170 // -------------------------------------------------------
171 std::cout << "\n--- Generated SQL ---" << std::endl;
172 {
173 user_entity user;
174 std::cout << "User table SQL:" << std::endl;
175 std::cout << user.get_metadata().create_table_sql() << std::endl;
176
177 post_entity post;
178 std::cout << "\nPost table SQL:" << std::endl;
179 std::cout << post.get_metadata().create_table_sql() << std::endl;
180 }
181
182 // -------------------------------------------------------
183 // 3. Generate index SQL
184 // -------------------------------------------------------
185 std::cout << "\n--- Generated index SQL ---" << std::endl;
186 {
187 post_entity post;
188 auto index_sql = post.get_metadata().create_indexes_sql();
189 if (!index_sql.empty())
190 {
191 std::cout << "Post indexes:" << std::endl;
192 std::cout << index_sql << std::endl;
193 }
194 else
195 {
196 std::cout << "No additional indexes defined" << std::endl;
197 }
198 }
199
200 // -------------------------------------------------------
201 // 4. Using field accessors
202 // -------------------------------------------------------
203 std::cout << "\n--- Field accessors ---" << std::endl;
204 {
205 user_entity user;
206
207 // Set field values through accessors
208 user.id = int64_t{1};
209 user.username = std::string("john_doe");
210 user.email = std::string("john@example.com");
211 user.age = int32_t{30};
212 user.is_active = true;
213
214 // Read field values
215 std::cout << "User: "
216 << "id=" << user.id.get()
217 << " username=" << user.username.get()
218 << " email=" << user.email.get()
219 << " age=" << user.age.get()
220 << " active=" << std::boolalpha << user.is_active.get()
221 << std::endl;
222 }
223
224 // -------------------------------------------------------
225 // 5. Type trait checks
226 // -------------------------------------------------------
227 std::cout << "\n--- Type trait checks ---" << std::endl;
228 {
229 std::cout << "is_entity<user_entity>: "
230 << std::boolalpha << is_entity_v<user_entity> << std::endl;
231 std::cout << "is_entity<post_entity>: "
232 << std::boolalpha << is_entity_v<post_entity> << std::endl;
233 std::cout << "is_entity<int>: "
234 << std::boolalpha << is_entity_v<int> << std::endl;
235
236 std::cout << "is_field_type<int32_t>: "
237 << std::boolalpha << is_field_type_v<int32_t> << std::endl;
238 std::cout << "is_field_type<std::string>: "
239 << std::boolalpha << is_field_type_v<std::string> << std::endl;
240 std::cout << "is_field_type<std::vector<int>>: "
241 << std::boolalpha << is_field_type_v<std::vector<int>> << std::endl;
242 }
243
244 std::cout << "\n=== orm_entity_demo example completed ===" << std::endl;
245 return 0;
246}
Base class for all ORM entities.
Definition entity.h:143
virtual const entity_metadata & get_metadata() const =0
virtual bool update()=0
virtual bool remove()=0
Metadata for entire entities including table mapping and relationships.
Definition entity.h:118
std::string create_table_sql() const
Definition entity.cpp:123
void add_field(const field_metadata &field)
Definition entity.cpp:87
std::string create_indexes_sql() const
Definition entity.cpp:146
const std::string & table_name() const
Definition entity.h:124
field_constraint::not_null field_constraint::index bool save() override
bool update() override
bool load() override
static entity_metadata metadata_
bool remove() override
std::string table_name() const override
int64_t primary_key_type
ENTITY_FIELD(int64_t, id, field_constraint::primary_key|field_constraint::auto_increment) ENTITY_FIELD(int64_t
int64_t primary_key_type
std::string table_name() const override
Defines the enumeration of supported database types.
#define ENTITY_METADATA()
Definition entity.h:289
#define ENTITY_FIELD(type, name,...)
Definition entity.h:274
field_constraint not_null()
Definition entity.h:301
int main()