-
Notifications
You must be signed in to change notification settings - Fork 3
/
DbRec.h
192 lines (154 loc) · 4.74 KB
/
DbRec.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
#ifndef DBREC_H
#define DBREC_H
#include <stdint.h>
#include <QNetworkAddressEntry>
#include <QString>
#include <QDebug>
#include <QSqlDatabase>
#include <QObject>
struct DbField {
enum Type {
PKEY_TYPE, // int64_t
BOOL_TYPE, // int
INT32_TYPE, // int32_t
UINT32_TYPE, // unit32_t
INT64_TYPE, // int64_t
FLOAT_TYPE, // float
DOUBLE_TYPE, // double
STRING_TYPE, // QString
ENUM_TYPE, // QString
BYTEARR_TYPE, // QByteArr
DATETIME_TYPE, // QDateTime
DATE_TYPE, // QDate
TIME_TYPE, // QTime
INET_TYPE, // QNetworkAddressEntry
UNKOWN_TYPE
};
const char *colName;
enum Type type;
int colEnum;
size_t offset;
static const char *type2str(int type);
};
#define class_offsetof(cl, m) \
(size_t)(&((cl*)0)->m)
/* Forward declaration */
class DbRec;
/* One of these for each table which will be used */
class DbTable {
public:
DbTable(QSqlDatabase &db, const char *tblName, const DbField dbf_arr[]);
/* Eliminate default copy constructor and assignment operator */
DbTable(const DbTable&)= delete;
DbTable& operator=(const DbTable&)= delete;
int fetchAll(
DbRec * rtnVec[],
unsigned vecSz,
const QString & sql_tail
) const;
// Recursive CTE.
int fetchAll_r(
DbRec * rtnVec[],
unsigned vecSz,
const QString &sql_pfx,
const char *tmp_tbl,
const char *tmp_pKey
) const;
inline const DbField *DbField_arr() const {
return _DbField_arr;
} inline const DbField *pKey() const {
return _pKey;
} inline const QString & name() const {
return _name;
}
inline QSqlDatabase& db() {
return _db;
}
protected:
virtual DbRec* factory() const =0;
friend class DbRec;
virtual void emit_cast_sig_insert(DbRec*)=0;
virtual void emit_cast_sig_update(DbRec*)=0;
virtual void emit_cast_sig_remove(DbRec*)=0;
private:
QSqlDatabase &_db;
QString _name;
const DbField *_DbField_arr, *_pKey;
};
QDebug operator<<(QDebug dbg, const DbField &o);
/* One of these for each record with which we will be working */
class DbRec {
public:
DbRec& operator=(const DbRec&);
virtual ~DbRec();
/* Eliminate default copy constructor */
DbRec(const DbRec&)= delete;
int insert(DbTable &tbl);
int remove(DbTable &tbl);
int update(DbTable &tbl);
int fetch(DbTable &tbl);
void set_field_null(bool tf, int fieldEnum);
bool is_field_null(int fieldEnum) const;
void set_nullFlags(int64_t flags);
protected:
DbRec(void *offset_this, const DbField dbf_arr[]);
private:
friend class DbTable;
int fetch(QSqlQuery& q, const DbField dbf_arr[]);
int bind(QSqlQuery & q, const DbField * f);
int stow(QSqlQuery & q, const DbField * f);
inline int *offset_bool(size_t offset) {
return (int *)(_offset_this + offset);
}
inline const int *offset_bool(size_t offset) const {
return (const int *)(_offset_this + offset);
}
inline int32_t *offset_int32(size_t offset) {
return (int32_t *) (_offset_this + offset);
}
inline const int32_t *offset_int32(size_t offset) const {
return (const int32_t *) (_offset_this + offset);
}
inline uint32_t *offset_uint32(size_t offset) {
return (uint32_t *) (_offset_this + offset);
}
inline int64_t *offset_int64(size_t offset) {
return (int64_t *) (_offset_this + offset);
}
inline const int64_t *offset_int64(size_t offset) const {
return (const int64_t *) (_offset_this + offset);
}
inline float *offset_float(size_t offset) {
return (float *)(_offset_this + offset);
}
inline double *offset_double(size_t offset) {
return (double *)(_offset_this + offset);
}
inline QString *offset_QString(size_t offset) {
return (QString *) (_offset_this + offset);
}
inline const QString *offset_QString(size_t offset) const {
return (const QString *) (_offset_this + offset);
}
inline QByteArray *offset_QByteArray(size_t offset) {
return (QByteArray *) (_offset_this + offset);
}
inline QDateTime *offset_QDateTime(size_t offset) {
return (QDateTime *) (_offset_this + offset);
}
inline QDate *offset_QDate(size_t offset) {
return (QDate *) (_offset_this + offset);
}
inline QTime *offset_QTime(size_t offset) {
return (QTime *) (_offset_this + offset);
}
inline QNetworkAddressEntry *offset_QNetworkAddressEntry(size_t offset) {
return (QNetworkAddressEntry *) (_offset_this + offset);
}
friend QDebug operator<<(QDebug dbg, const DbRec &o);
char *_offset_this;
const DbField *_DbField_arr;
int64_t _nullFlags;
};
QDebug operator<<(QDebug dbg, const DbRec &o);
#endif // DBREC_H