kDB: Knowledge DataBase
Loading...
Searching...
No Matches
Class_h.h
1// clang-format off
2/% QString guard = _database->namespaces().join("_").toUpper() + "_" + _klass->name().toUpper() + "_H_";
3%/#ifndef _/%= guard %/
4#define _/%= guard %/
5#include <QList>
6#include <tuple>
7
8#include <kDB/Forward.h>
9#include <knowCore/Global.h>
10#include <knowCore/ValueList.h>
11
12#include "Sql.h"
13#include "TypesDefinitions.h"
14
15class QString;
16
17/% // Generate forward definition
18 for(const definitions::Forward* fw : _database->forwards())
19 {
20 // Generate namespaces
21 for(const QString& ns : fw->namespaces())
22 {%/
23 namespace /%= ns %/ {
24 /%}%/
25 class /%= fw->name() %/;
26 /% // Unwind the namespaces
27 for(const QString& ns : fw->namespaces())
28 {
29 Q_UNUSED(ns)%/
30 }
31 /%}
32 } // Generate the namespace
33 if(not _database->namespaces().isEmpty())
34 {
35 %/
36namespace /%= _database->namespaces().join("::") %/
37{/%
38 }
39 // Generate the forward definition for all classes in the database
40 for(const definitions::Class* klass : _database->classes())
41 {
42 if(klass != _klass)
43 {
44 %/
45 class /%= klass->name() %/Value;
46 class /%= klass->name() %/Record;
47 class /%= klass->name() %/SelectQuery;
48/%
49 }
50 }
51 for(const definitions::Class* sklass : _klass->classOfSubDefinitions())
52 {
53 %/
54 class /%= sklass->name() %/Value;
55 class /%= sklass->name() %/Record;
56 class /%= sklass->name() %/SelectQuery;
57 /%
58 }
59 %/
60 class /%= _klass->name() %/Value;
61 class /%= _klass->name() %/Record;
62
63 /% /* Generate the query class */ %/
64 class /%= _klass->name() %/SelectQuery
65 {
66 friend class /%= _klass->name() %/Record;
67 struct Private;
68 Private* const d;
69 private:
70 /%= _klass->name() %/SelectQuery(/%= databaseOrContainer(_klass) %/);
71 /%= _klass->name() %/SelectQuery(/%= databaseOrContainer(_klass) %/, const QString& _fieldName, const knowCore::Value& _value, Sql::Operand _op);
72 /%= _klass->name() %/SelectQuery(/%= databaseOrContainer(_klass) %/, const QString& _expression, const QVariantList& _values);
73 /%= _klass->name() %/SelectQuery(Private* _d);
74 public:
75 /%= _klass->name() %/SelectQuery();
76 /%= _klass->name() %/SelectQuery(const /%= _klass->name() %/SelectQuery& _rhs);
77 /%= _klass->name() %/SelectQuery& operator=(const /%= _klass->name() %/SelectQuery& _rhs);
78 ~/%= _klass->name() %/SelectQuery();
79 public:
80 std::size_t count(int _count = 0) const;
81 QList</%= _klass->name() %/Record> exec(int _count = 0) const;
82 QList</%= _klass->name() %/Record> exec(int _skip, int _count) const;
83 /%= _klass->name() %/Record first() const;
84 public:
85 /%= _klass->name() %/SelectQuery operator||(const /%= _klass->name() %/SelectQuery& _rhs) const;
86 /%= _klass->name() %/SelectQuery operator&&(const /%= _klass->name() %/SelectQuery& _rhs) const;
87 public:
88/% // Generate order functions
89 for(const definitions::Field* field : _klass->fields())
90 { %/
91 /%= _klass->name() %/SelectQuery orderBy/%= capitalizeFirstLetter(field->name()) %/(Sql::Sort _order) const;/%
92 }
93 %/
94 /%= _klass->name() %/SelectQuery randomOrder() const;
95 };
96 //BEGIN fields enum
97 enum class /%= _klass->name() %/Fields {/%
98 // Generate field enum
99 for(const definitions::Field* field : _klass->fields())
100 { %/
101 /%= field->name() %/,/%
102 }%/
103 };
104 //END fields enum
105 //BEGIN base value class
106 class /%= baseValueClassName(_klass) %/
107 {
108 friend class /%= _klass->name() %/Record;
109 /%
110 for(const definitions::Class* sklass : _klass->classOfSubDefinitions())
111 {
112 %/
113 friend class /%= sklass->name() %/;
114 friend class /%= sklass->name() %/SelectQuery;
115 /%
116 }
117 %/
118 protected:
119 struct Private;
120 Private* const d;
121 KNOWCORE_D_DECL();
122 protected:
123 /%= baseValueClassName(_klass) %/(Private* _d);
124 public:/%
125 if(hasDefaultBaseValueConstructor(_klass))
126 {%/
127 /%= baseValueClassName(_klass) %/();/%
128 }%/
129 /%= baseValueClassName(_klass) %/(/%= baseValueConstructionArguments(_klass, true, true) %/);
130 /%= baseValueClassName(_klass) %/(const /%= baseValueClassName(_klass) %/& _rhs);
131 /%= baseValueClassName(_klass) %/& operator=(const /%= baseValueClassName(_klass) %/& _rhs);
132 ~/%= baseValueClassName(_klass) %/();
133 public:
134 cres_qresult<knowCore::ValueHash> toValueHash() const;
135 static cres_qresult</%= baseValueClassName(_klass) %/> fromValueHash(const knowCore::ValueHash& _valueHash);
136 public:
137 bool operator==(const /%= baseValueClassName(_klass) %/& _rhs) const;
138 bool operator!=(const /%= baseValueClassName(_klass) %/& _rhs) const;
139 public:
140/%
141 // Add field function: getter, setter and query
142 for(const definitions::Field* field : _klass->fields())
143 {
144 if(isBaseValueField(_klass, field))
145 {
146 %/
147 /%= cppReturnType(field) %/ /%= field->name() %/() const;/%
148 if(not field->options().testFlag(definitions::Field::Constant) and not field->options().testFlag(definitions::Field::Key))
149 {%/
150 void set/%= capitalizeFirstLetter(field->name()) %/(/%= cppArgType(field) %/ _value);/%
151 }
152 }
153 }
154 %/
155 private:
156 /%
157 if(_klass->doesImplement(definitions::INIT))
158 {
159 %/
160 void init();/%
161 }
162 if(_klass->doesImplement(definitions::CLEANUP))
163 {
164 %/
165 void cleanup();/%
166 }
167 if(_klass->doesImplement(definitions::EXTENDED))
168 {
169 %/
170#include "/%= baseValueClassName(_klass) %/_.h"/%
171 }
172 %/
173 };
174 //END base value class
175 /%
176 if(hasExtendedValueClass(_klass))
177 {
178 %/
179 //BEGIN extended value class
180 class /%= _klass->name() %/Value : public /%= _klass->name() %/BaseValue
181 {
182 friend class /%= _klass->name() %/Record;
183 /%
184 for(const definitions::Class* sklass : _klass->classOfSubDefinitions())
185 {
186 %/
187 friend class /%= sklass->name() %/;
188 friend class /%= sklass->name() %/SelectQuery;
189 /%
190 }
191 %/
192 protected:
193 KNOWCORE_D_DECL();
194 protected:
195 /%= _klass->name() %/Value(Private* _d);
196 private:
197 void init(const kDB::Repository::QueryConnectionInfo& _connection, /%= extendedValueConstructionArguments(_klass, true, false) %/);
198 public:
199 /%= _klass->name() %/Value();
200 /%= _klass->name() %/Value(const kDB::Repository::QueryConnectionInfo& _connection, /%= extendedValueConstructionArguments(_klass, true, false) %/);
201 /%= _klass->name() %/Value(const kDB::Repository::QueryConnectionInfo& _connection, const /%= _klass->name() %/BaseValue& _base_value, /%= onlyExtendedValueConstructionArguments(_klass, true, false) %/);
202 /%= _klass->name() %/Value(const /%= _klass->name() %/Value& _rhs);
203 /%= _klass->name() %/Value& operator=(const /%= _klass->name() %/Value& _rhs);
204 ~/%= _klass->name() %/Value();
205 public:
206 bool operator==(const /%= _klass->name() %/Value& _rhs) const;
207 bool operator!=(const /%= _klass->name() %/Value& _rhs) const;
208 public:
209/%
210 // Add field function: getter, setter and query
211 for(const definitions::Field* field : _klass->fields())
212 {
213 if(isExtendedValueField(_klass, field))
214 {
215 %/
216 /%= cppReturnType(field) %/ /%= field->name() %/() const;/%
217 if(not field->options().testFlag(definitions::Field::Constant) and not field->options().testFlag(definitions::Field::Key))
218 {%/
219 void set/%= capitalizeFirstLetter(field->name()) %/(/%= cppArgType(field) %/ _value);/%
220 }
221 }
222 }
223 %/
224 private:
225 /%
226 if(_klass->doesImplement(definitions::INIT))
227 {
228 %/
229 void init();/%
230 }
231 if(_klass->doesImplement(definitions::CLEANUP))
232 {
233 %/
234 void cleanup();/%
235 }
236 if(_klass->doesImplement(definitions::EXTENDED))
237 {
238 %/
239#include "/%= _klass->name() %/Value_.h"/%
240 }
241 %/
242 public:
243 kDB::Repository::QueryConnectionInfo connection() const;
244 };
245 //END extended value class
246 /%
247 }
248 %/
249 //BEGIN record class
250 class /%= _klass->name() %/Record : public /%= _klass->name() %/Value
251 {
252 /%
253 for(const definitions::Class* sklass : _klass->classOfSubDefinitions())
254 {
255 %/
256 friend class /%= sklass->name() %/;
257 friend class /%= sklass->name() %/SelectQuery;
258 /%
259 }
260 %/
261 public:
262 using SelectQuery = /%= _klass->name() %/SelectQuery;
263 using SqlSort = /%= _database->namespaces().join("::") %/::Sql::Sort;
264 using SqlOperand = /%= _database->namespaces().join("::") %/::Sql::Operand;
265 public:
266 /%
267 if(not _klass->classOfContainerDefinition())
268 {
269 %/
274 static cres_qresult<void> createTable(const kDB::Repository::QueryConnectionInfo& _connection);
275 /%
276 }
277 %/
278 static cres_qresult</%= _klass->name() %/Record> create(/%= databaseOrContainer(_klass) %/, /%= createArguments(_klass, true) %/);
279 static cres_qresult<QList</%= _klass->name() %/Record>> create(/%= databaseOrContainer(_klass) %/, const QList</%= _klass->name() %/Value>& _values);
280 enum LockMode
281 {
282 AccessShare, RowShare, RowExclusive, ShareUpdateExclusive, Share, ShareRowExclusive, Exclusive, AccessExclusive
283 };
284 static cres_qresult<void> lock(const kDB::Repository::Transaction& _transaction, LockMode _mode = LockMode::AccessExclusive);
285 public:
286 /%= _klass->name() %/Record();
287 /%= _klass->name() %/Record(const /%= _klass->name() %/Record& _rhs);
288 /%= _klass->name() %/Record& operator=(const /%= _klass->name() %/Record& _rhs);
289 /%= _klass->name() %/Record(/%= databaseOrContainer(_klass) %/ /%= constructorKeyArguments(_klass) %/);
290 ~/%= _klass->name() %/Record();
291 public:
292 bool operator==(const /%= _klass->name() %/Record& _rhs) const;
296 bool sameValuesAs(const /%= _klass->name() %/Record& _rhs) const;
297 bool operator!=(const /%= _klass->name() %/Record& _rhs) const;
298 public:
299 cres_qresult<void> discard();
300 cres_qresult<void> refresh();
304 cres_qresult<void> record();
308 cres_qresult<void> record(const kDB::Repository::QueryConnectionInfo& _connection);
312 cres_qresult<void> erase();
316 cres_qresult<void> erase(const kDB::Repository::QueryConnectionInfo& _connection);
320 bool isPersistent() const;
321 public:
322/%
323 // Add function to access children
324 if(not _klass->children().empty())
325 {
326 for(const definitions::Class* child : _klass->children())
327 {
328 if(hasSingleChild(child, _klass))
329 {%/
330 /%= child->name() %/ /%= childfunctionname(child->name()) %/() const;/%
331 } else {
332 %/
333 /%= child->name() %/SelectQuery /%= childrenfunctionname(child->name()) %/() const;/%
334 }
335 }
336 }
337
338 // Add field function: getter for auto, and query for everything
339 for(const definitions::Field* field : _klass->fields())
340 {
341 if(isRecordField(_klass, field))
342 {%/
343 /%= cppReturnType(field) %/ /%= field->name() %/() const;/%
344 }
345 %/
346 static SelectQuery by/%= capitalizeFirstLetter(field->name()) %/(/%= databaseOrContainer(_klass) %/, /%= cppArgType(field) %/, Sql::Operand _op = Sql::Operand::EQ);/%
347 }
348 %/
349
353 static SelectQuery by(/%= databaseOrContainer(_klass) %/, const QString& _expression, const QVariantList& _values); // QVariantList has to be used, because knowCore::Value cannot hold a /%= _klass->name() %/Fields
354
355 template<typename _T1_, typename ... _T_>
356 static SelectQuery by(/%= databaseOrContainer(_klass) %/, const QString& _expression, _T1_ _v, _T_... _values)
357 {
358 return by(/%= databaseOrContainerParameterName(_klass) %/, _expression, QVariantList(), _v, _values...);
359 }
360 private:
361 template<typename _T1_, typename ... _T_>
362 static SelectQuery by(/%= databaseOrContainer(_klass) %/, const QString& _expression, const QVariantList& _arguments, _T1_ _v, _T_... _values)
363 {
364 QVariantList args = _arguments; args.append(QVariant::fromValue(_v));
365 return by(/%= databaseOrContainerParameterName(_klass) %/, _expression, args, _values...);
366 }
367
368 // Add all queries
369 public:
370 static SelectQuery all(/%= databaseOrContainer(_klass) %/);
371
372 public:
373/% for(const definitions::Mapping* mapping : _klass->mappings())
374 {
375 const definitions::Class* klass = mapping->other(_klass);%/
376 QList</%= klass->name() %/> /%= functiongetallname(klass->name()) %/() const;
377 cres_qresult<void> add/%= klass->name() %/(const /%= klass->name() %/& _other);
378 cres_qresult<void> remove/%= klass->name() %/(const /%= klass->name() %/& _other);
379/%}%/
380 private:
381 /%
382 if(_klass->doesImplement(definitions::INIT))
383 {
384 %/
385 void init();/%
386 }
387 if(_klass->doesImplement(definitions::CLEANUP))
388 {
389 %/
390 void cleanup();/%
391 }
392 if(_klass->doesImplement(definitions::EXTENDED))
393 {
394 %/
395#include "/%= _klass->name() %/Record_.h"/%
396 }
397 %/
398 public:
399 kDB::Repository::QueryConnectionInfo connection() const;
400 private:
401 KNOWCORE_D_DECL();
402 };
403 /%
404 //END Generate the record class
405 if(hasExtendedValueClass(_klass))
406 {%/
407 //BEGIN Extended value constructor with default
408 inline /%= _klass->name() %/Value::/%= _klass->name() %/Value(const kDB::Repository::QueryConnectionInfo& _connection, /%= extendedValueConstructionArguments(_klass, true, true) %/) : /%= _klass->name() %/Value()
409 {
410 init(_connection, /%= extendedValueConstructionArguments(_klass, false, false) %/);
411 }
412 /%
413 //END Extended value constructor with default
414 }
415if(not _database->namespaces().isEmpty())
416{
417%/
418}/%
419}
420%/
421
422#include <QMetaType>
423/%
424 if(hasExtendedValueClass(_klass))
425 {%/
426Q_DECLARE_METATYPE(/%= _database->namespaces().join("::") %/::/%= _klass->name() %/BaseValue)/%
427 }
428%/
429Q_DECLARE_METATYPE(/%= _database->namespaces().join("::") %/::/%= _klass->name() %/Value)
430Q_DECLARE_METATYPE(/%= _database->namespaces().join("::") %/::/%= _klass->name() %/Record)
431Q_DECLARE_METATYPE(/%= _database->namespaces().join("::") %/::/%= _klass->name() %/Fields)
432
433#include <knowCore/Formatter.h>
434
435clog_format_declare_formatter(/%= _database->namespaces().join("::") %/::/%= _klass->name() %/Record)
436{
437 return format_to(ctx.out(), "'/%= _database->namespaces().join("::") %/::/%= _klass->name() %/Record'");
438}
439
440#endif
Definition Revision.h:9
Definition QueryConnectionInfo.h:8
Definition ValueHash.h:13
Definition Value.h:21