kDB: Knowledge DataBase
Loading...
Searching...
No Matches
Class_h.h
1/% QString guard = _database->namespaces().join("_").toUpper() + "_" + _klass->name().toUpper() + "_H_";
2%/#ifndef _/%= guard %/
3#define _/%= guard %/
4#include <QList>
5#include <tuple>
6
7#include <kDB/Forward.h>
8#include <knowCore/Global.h>
9#include <knowCore/ValueList.h>
10
11#include "Sql.h"
12#include "TypesDefinitions.h"
13
14class QString;
15
16/% // Generate forward definition
17 for(const definitions::Forward* fw : _database->forwards())
18 {
19 // Generate namespaces
20 for(const QString& ns : fw->namespaces())
21 {%/
22 namespace /%= ns %/ {
23 /%}%/
24 class /%= fw->name() %/;
25 /% // Unwind the namespaces
26 for(const QString& ns : fw->namespaces())
27 {
28 Q_UNUSED(ns)%/
29 }
30 /%}
31 } // Generate the namespace
32 if(not _database->namespaces().isEmpty())
33 {
34 %/
35namespace /%= _database->namespaces().join("::") %/
36{/%
37 }
38 // Generate the forward definition for all classes in the database
39 for(const definitions::Class* klass : _database->classes())
40 {
41 if(klass != _klass)
42 {
43 %/
44 class /%= klass->name() %/Value;
45 class /%= klass->name() %/Record;
46 class /%= klass->name() %/SelectQuery;
47/%
48 }
49 }
50 for(const definitions::Class* sklass : _klass->classOfSubDefinitions())
51 {
52 %/
53 class /%= sklass->name() %/Value;
54 class /%= sklass->name() %/Record;
55 class /%= sklass->name() %/SelectQuery;
56 /%
57 }
58 %/
59 class /%= _klass->name() %/Value;
60 class /%= _klass->name() %/Record;
61
62 /% /* Generate the query class */ %/
63 class /%= _klass->name() %/SelectQuery
64 {
65 friend class /%= _klass->name() %/Record;
66 struct Private;
67 Private* const d;
68 private:
69 /%= _klass->name() %/SelectQuery(/%= databaseOrContainer(_klass) %/);
70 /%= _klass->name() %/SelectQuery(/%= databaseOrContainer(_klass) %/, const QString& _fieldName, const knowCore::Value& _value, Sql::Operand _op);
71 /%= _klass->name() %/SelectQuery(/%= databaseOrContainer(_klass) %/, const QString& _expression, const QVariantList& _values);
72 /%= _klass->name() %/SelectQuery(Private* _d);
73 public:
74 /%= _klass->name() %/SelectQuery();
75 /%= _klass->name() %/SelectQuery(const /%= _klass->name() %/SelectQuery& _rhs);
76 /%= _klass->name() %/SelectQuery& operator=(const /%= _klass->name() %/SelectQuery& _rhs);
77 ~/%= _klass->name() %/SelectQuery();
78 public:
79 std::size_t count(int _count = 0) const;
80 QList</%= _klass->name() %/Record> exec(int _count = 0) const;
81 QList</%= _klass->name() %/Record> exec(int _skip, int _count) const;
82 /%= _klass->name() %/Record first() const;
83 public:
84 /%= _klass->name() %/SelectQuery operator||(const /%= _klass->name() %/SelectQuery& _rhs) const;
85 /%= _klass->name() %/SelectQuery operator&&(const /%= _klass->name() %/SelectQuery& _rhs) const;
86 public:
87/% // Generate order functions
88 for(const definitions::Field* field : _klass->fields())
89 { %/
90 /%= _klass->name() %/SelectQuery orderBy/%= capitalizeFirstLetter(field->name()) %/(Sql::Sort _order) const;/%
91 }
92 %/
93 /%= _klass->name() %/SelectQuery randomOrder() const;
94 };
95 //BEGIN fields enum
96 enum class /%= _klass->name() %/Fields {/%
97 // Generate field enum
98 for(const definitions::Field* field : _klass->fields())
99 { %/
100 /%= field->name() %/,/%
101 }%/
102 };
103 //END fields enum
104 //BEGIN base value class
105 class /%= baseValueClassName(_klass) %/
106 {
107 friend class /%= _klass->name() %/Record;
108 /%
109 for(const definitions::Class* sklass : _klass->classOfSubDefinitions())
110 {
111 %/
112 friend class /%= sklass->name() %/;
113 friend class /%= sklass->name() %/SelectQuery;
114 /%
115 }
116 %/
117 protected:
118 struct Private;
119 Private* const d;
120 // TODO kDB 5.0, D() conflict in CameraInfo, D() in camera info should be renamed to distortion?
121 // KNOWCORE_D_DECL(); // Neeed to get a D() function, for API uniformity
122 const Private* DD() const { return d; }
123 protected:
124 /%= baseValueClassName(_klass) %/(Private* _d);
125 public:/%
126 if(hasDefaultBaseValueConstructor(_klass))
127 {%/
128 /%= baseValueClassName(_klass) %/();/%
129 }%/
130 /%= baseValueClassName(_klass) %/(/%= baseValueConstructionArguments(_klass, true, true) %/);
131 /%= baseValueClassName(_klass) %/(const /%= baseValueClassName(_klass) %/& _rhs);
132 /%= baseValueClassName(_klass) %/& operator=(const /%= baseValueClassName(_klass) %/& _rhs);
133 ~/%= baseValueClassName(_klass) %/();
134 public:
135 knowCore::ReturnValue<knowCore::ValueHash> toValueHash() const;
136 static knowCore::ReturnValue</%= baseValueClassName(_klass) %/> fromValueHash(const knowCore::ValueHash& _valueHash);
137 public:
138 bool operator==(const /%= baseValueClassName(_klass) %/& _rhs) const;
139 bool operator!=(const /%= baseValueClassName(_klass) %/& _rhs) const;
140 public:
141/%
142 // Add field function: getter, setter and query
143 for(const definitions::Field* field : _klass->fields())
144 {
145 if(isBaseValueField(_klass, field))
146 {
147 %/
148 /%= cppReturnType(field) %/ /%= field->name() %/() const;/%
149 if(not field->options().testFlag(definitions::Field::Constant) and not field->options().testFlag(definitions::Field::Key))
150 {%/
151 void set/%= capitalizeFirstLetter(field->name()) %/(/%= cppArgType(field) %/ _value);/%
152 }
153 }
154 }
155 %/
156 private:
157 /%
158 if(_klass->doesImplement(definitions::INIT))
159 {
160 %/
161 void init();/%
162 }
163 if(_klass->doesImplement(definitions::CLEANUP))
164 {
165 %/
166 void cleanup();/%
167 }
168 if(_klass->doesImplement(definitions::EXTENDED))
169 {
170 %/
171#include "/%= baseValueClassName(_klass) %/_.h"/%
172 }
173 %/
174 };
175 //END base value class
176 /%
177 if(hasExtendedValueClass(_klass))
178 {
179 %/
180 //BEGIN extended value class
181 class /%= _klass->name() %/Value : public /%= _klass->name() %/BaseValue
182 {
183 friend class /%= _klass->name() %/Record;
184 /%
185 for(const definitions::Class* sklass : _klass->classOfSubDefinitions())
186 {
187 %/
188 friend class /%= sklass->name() %/;
189 friend class /%= sklass->name() %/SelectQuery;
190 /%
191 }
192 %/
193 protected:
194 KNOWCORE_D_DECL();
195 const Private* DD() const { return D(); }
196 protected:
197 /%= _klass->name() %/Value(Private* _d);
198 private:
199 void init(const kDB::Repository::QueryConnectionInfo& _connection, /%= extendedValueConstructionArguments(_klass, true, false) %/);
200 public:
201 /%= _klass->name() %/Value();
202 /%= _klass->name() %/Value(const kDB::Repository::QueryConnectionInfo& _connection, /%= extendedValueConstructionArguments(_klass, true, false) %/);
203 /%= _klass->name() %/Value(const kDB::Repository::QueryConnectionInfo& _connection, const /%= _klass->name() %/BaseValue& _base_value, /%= onlyExtendedValueConstructionArguments(_klass, true, false) %/);
204 /%= _klass->name() %/Value(const /%= _klass->name() %/Value& _rhs);
205 /%= _klass->name() %/Value& operator=(const /%= _klass->name() %/Value& _rhs);
206 ~/%= _klass->name() %/Value();
207 public:
208 bool operator==(const /%= _klass->name() %/Value& _rhs) const;
209 bool operator!=(const /%= _klass->name() %/Value& _rhs) const;
210 public:
211/%
212 // Add field function: getter, setter and query
213 for(const definitions::Field* field : _klass->fields())
214 {
215 if(isExtendedValueField(_klass, field))
216 {
217 %/
218 /%= cppReturnType(field) %/ /%= field->name() %/() const;/%
219 if(not field->options().testFlag(definitions::Field::Constant) and not field->options().testFlag(definitions::Field::Key))
220 {%/
221 void set/%= capitalizeFirstLetter(field->name()) %/(/%= cppArgType(field) %/ _value);/%
222 }
223 }
224 }
225 %/
226 private:
227 /%
228 if(_klass->doesImplement(definitions::INIT))
229 {
230 %/
231 void init();/%
232 }
233 if(_klass->doesImplement(definitions::CLEANUP))
234 {
235 %/
236 void cleanup();/%
237 }
238 if(_klass->doesImplement(definitions::EXTENDED))
239 {
240 %/
241#include "/%= _klass->name() %/Value_.h"/%
242 }
243 %/
244 public:
245 kDB::Repository::QueryConnectionInfo connection() const;
246 };
247 //END extended value class
248 /%
249 }
250 %/
251 //BEGIN record class
252 class /%= _klass->name() %/Record : public /%= _klass->name() %/Value
253 {
254 /%
255 for(const definitions::Class* sklass : _klass->classOfSubDefinitions())
256 {
257 %/
258 friend class /%= sklass->name() %/;
259 friend class /%= sklass->name() %/SelectQuery;
260 /%
261 }
262 %/
263 public:
264 using SelectQuery = /%= _klass->name() %/SelectQuery;
265 public:
266 /%
267 if(not _klass->classOfContainerDefinition())
268 {
269 %/
274 static knowCore::ReturnVoid createTable(const kDB::Repository::QueryConnectionInfo& _connection);
275 /%
276 }
277 %/
278 static knowCore::ReturnValue</%= _klass->name() %/Record> create(/%= databaseOrContainer(_klass) %/, /%= createArguments(_klass, true) %/);
279 static knowCore::ReturnValue<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 knowCore::ReturnVoid 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) %/ /%= keysArguments(_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 knowCore::ReturnVoid discard();
300 knowCore::ReturnVoid refresh();
304 knowCore::ReturnVoid record();
308 knowCore::ReturnVoid record(const kDB::Repository::QueryConnectionInfo& _connection);
312 knowCore::ReturnVoid erase();
316 knowCore::ReturnVoid 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 knowCore::ReturnVoid add/%= klass->name() %/(const /%= klass->name() %/& _other);
378 knowCore::ReturnVoid 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
435KNOWCORE_CORE_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