1 /***************************************************************************
2  * SPDX-FileCopyrightText: 2021 S. MANKOWSKI stephane@mankowski.fr
3  * SPDX-FileCopyrightText: 2021 G. DE BURE support@mankowski.fr
4  * SPDX-License-Identifier: GPL-3.0-or-later
5  ***************************************************************************/
6 #ifndef SKGDEFINE_H
7 #define SKGDEFINE_H
8 /** @file
9  * This file defines some macros.
10  *
11  * @author Stephane MANKOWSKI / Guillaume DE BURE
12  */
13 #include <qstring.h>
14 #include <qstringbuilder.h>
15 
16 #include <klocalizedstring.h>
17 
18 #include "skgbasemodeler_export.h"
19 
20 #if QT_VERSION < QT_VERSION_CHECK(5, 14, 0)
21 #define SKGENDL endl
22 #define SKGFLUSH flush
23 #else
24 #define SKGENDL Qt::endl
25 #define SKGFLUSH Qt::flush
26 #endif
27 
28 /**
29  * @var OBJECTSEPARATOR
30  * Define the separator between object and subobject
31  */
32 #define OBJECTSEPARATOR QStringLiteral(" > ")
33 
34 /**
35  * @var DUMPSQLITE
36  * To display SQLLITE internals (tables, views, indexes, ...)
37  * @see dump
38  */
39 #define DUMPSQLITE (2 << 0)
40 
41 /**
42  * @var DUMPPARAMETERS
43  * To display parameters
44  * @see dump
45  */
46 #define DUMPPARAMETERS (2 << 1)
47 
48 /**
49  * @var DUMPTRANSACTIONS
50  * To display transactions
51  * @see dump
52  */
53 #define DUMPTRANSACTIONS (2 << 2)
54 
55 /**
56  * @var DUMPNODES
57  * To display nodes
58  * @see dump
59  */
60 #define DUMPNODES (2 << 3)
61 
62 /**
63  * @var DUMPALL
64  * To display display all=@p DUMPSQLITE +@p DUMPPARAMETERS +@p DUMPTRANSACTIONS
65  * @see dump
66  */
67 
68 #define DUMPALL ((2 << 10) - 1)
69 
70 /**
71  * @var SKG_UNDO_MAX_DEPTH
72  * Default value for the max depth for the undo / redo mechanism
73  */
74 #define SKG_UNDO_MAX_DEPTH 50
75 
76 /**
77  * @var ERR_NOTIMPL
78  * Error number
79  */
80 #define ERR_NOTIMPL 1
81 
82 /**
83  * @var ERR_NOINTERFACE
84  * Error number
85  */
86 #define ERR_NOINTERFACE 2
87 
88 /**
89  * @var ERR_POINTER
90  * Error number
91  */
92 #define ERR_POINTER 3
93 
94 /**
95  * @var ERR_ABORT
96  * Error number
97  */
98 #define ERR_ABORT 4
99 
100 /**
101  * @var ERR_FAIL
102  * Error number
103  */
104 #define ERR_FAIL 5
105 
106 /**
107  * @var ERR_HANDLE
108  * Error number
109  */
110 #define ERR_HANDLE 6
111 
112 /**
113  * @var ERR_OUTOFMEMORY
114  * Error number
115  */
116 #define ERR_OUTOFMEMORY 7
117 
118 /**
119  * @var ERR_INVALIDARG
120  * Error number
121  */
122 #define ERR_INVALIDARG 8
123 
124 /**
125  * @var ERR_UNEXPECTED
126  * Error number
127  */
128 #define ERR_UNEXPECTED 9
129 
130 /**
131  * @var ERR_WRITEACCESS
132  * Error number
133  */
134 #define ERR_WRITEACCESS 10
135 
136 /**
137  * @var ERR_FORCEABLE
138  * Error number
139  */
140 #define ERR_FORCEABLE 11
141 
142 /**
143  * @var ERR_ENCRYPTION
144  * Error number
145  */
146 #define ERR_ENCRYPTION 12
147 
148 /**
149  * @var ERR_INSTALL
150  * Error number
151  */
152 #define ERR_INSTALL 13
153 
154 /**
155  * @var ERR_CORRUPTION
156  * Error number
157  */
158 #define ERR_CORRUPTION 14
159 
160 /**
161  * @var ERR_READACCESS
162  * Error number
163  */
164 #define ERR_READACCESS 15
165 
166 /**
167  * @brief For a not modified field
168  **/
169 #define NOUPDATE QStringLiteral("-------")
170 
171 /**
172   * @var EPSILON
173   * Epsilon (for comparison)
174   */
175 #define EPSILON 0.00001
176 
177 /**
178  * @def DELETECASCADE
179  * Define a standard trigger for cascaded delete
180  */
181 #define DELETECASCADE(TABLEPARENT,ATTPARENT,TABLECHILD,ATTCHILD)\
182     (QStringList() << QString()%"DROP TRIGGER IF EXISTS fkdc_"%(TABLEPARENT)%"_"%(TABLECHILD)%"_"%(ATTPARENT)%"_"%(ATTCHILD) \
183      << QString()%"CREATE TRIGGER fkdc_"%(TABLEPARENT)%"_"%(TABLECHILD)%"_"%(ATTPARENT)%"_"%(ATTCHILD)%" "\
184      "BEFORE DELETE ON "%(TABLEPARENT)%" "\
185      "FOR EACH ROW BEGIN "\
186      "    DELETE FROM "%(TABLECHILD)%" WHERE "%(TABLECHILD)%"."%(ATTCHILD)%" = OLD."%(ATTPARENT)%"; "\
187      "END")
188 
189 /**
190  * @def INSERTUPDATECONSTRAINT
191  * Define a standard trigger for foreign constraint
192  */
193 
194 
195 // Should these strings be translated ??? They look far too SQLish for that purpose
196 #define INSERTUPDATECONSTRAINT(TABLEPARENT,ATTPARENT,TABLECHILD,ATTCHILD)\
197     (QStringList() << QString()%"DROP TRIGGER IF EXISTS fki_"%(TABLECHILD)%"_"%(TABLEPARENT)%"_"%(ATTCHILD)%"_"%(ATTPARENT) \
198      << QString()%"CREATE TRIGGER fki_"%(TABLECHILD)%"_"%(TABLEPARENT)%"_"%(ATTCHILD)%"_"%(ATTPARENT)%" "\
199      "BEFORE INSERT ON "%(TABLECHILD)%" "\
200      "FOR EACH ROW BEGIN "\
201      "  SELECT RAISE(ABORT, '"%SKGServices::stringToSqlString(i18nc("Error message", "Impossible to insert object (%1 is used by %2).\nConstraint name: %3",TABLEPARENT, TABLECHILD, "fki_"%(TABLECHILD)%"_"%(TABLEPARENT)%"_"%(ATTCHILD)%"_"%(ATTPARENT)))%"') "\
202      "  WHERE NEW."%(ATTCHILD)%"!=0 AND NEW."%(ATTCHILD)%"!='' AND (SELECT "%(ATTPARENT)%" FROM "%(TABLEPARENT)%" WHERE "%(ATTPARENT)%" = NEW."%(ATTCHILD)%") IS NULL; "\
203      "END"\
204      << QString()%"DROP TRIGGER IF EXISTS fku_"%(TABLECHILD)%"_"%(TABLEPARENT)%"_"%(ATTCHILD)%"_"%(ATTPARENT) \
205      << QString()%"CREATE TRIGGER fku_"%(TABLECHILD)%"_"%(TABLEPARENT)%"_"%(ATTCHILD)%"_"%(ATTPARENT)%" "\
206      "BEFORE UPDATE ON "%(TABLECHILD)%" "\
207      "FOR EACH ROW BEGIN "\
208      "    SELECT RAISE(ABORT, '"%SKGServices::stringToSqlString(i18nc("Error message", "Impossible to update object (%1 is used by %2).\nConstraint name: %3",TABLEPARENT, TABLECHILD, "fku_"%(TABLECHILD)%"_"%(TABLEPARENT)%"_"%(ATTCHILD)%"_"%(ATTPARENT)))%"') "\
209      "      WHERE NEW."%(ATTCHILD)%"!=0 AND NEW."%(ATTCHILD)%"!='' AND (SELECT "%(ATTPARENT)%" FROM "%(TABLEPARENT)%" WHERE "%(ATTPARENT)%" = NEW."%(ATTCHILD)%") IS NULL; "\
210      "END")
211 
212 /**
213  * @def FOREIGNCONSTRAINT
214  * Define a standard trigger for foreign constraint
215  */
216 #define FOREIGNCONSTRAINT(TABLEPARENT,ATTPARENT,TABLECHILD,ATTCHILD)\
217     (INSERTUPDATECONSTRAINT(TABLEPARENT,ATTPARENT,TABLECHILD,ATTCHILD)\
218      << QString()%"DROP TRIGGER IF EXISTS fkd_"%(TABLECHILD)%"_"%(TABLEPARENT)%"_"%(ATTCHILD)%"_"%(ATTPARENT) \
219      << QString()%"CREATE TRIGGER fkd_"%(TABLECHILD)%"_"%(TABLEPARENT)%"_"%(ATTCHILD)%"_"%(ATTPARENT)%" "\
220      "BEFORE DELETE ON "%(TABLEPARENT)%" "\
221      "FOR EACH ROW BEGIN "\
222      "    SELECT RAISE(ABORT, '"%SKGServices::stringToSqlString(i18nc("Error message", "Impossible to delete used object (%1 is used by %2).\nConstraint name: %3",TABLEPARENT, TABLECHILD, "fkd_"%(TABLECHILD)%"_"%(TABLEPARENT)%"_"%(ATTCHILD)%"_"%(ATTPARENT)))%"') "\
223      "    WHERE (SELECT "%(ATTCHILD)%" FROM "%(TABLECHILD)%" WHERE "%(ATTCHILD)%" = OLD."%(ATTPARENT)%") IS NOT NULL; "\
224      "END")
225 
226 /**
227  * @def FOREIGNCONSTRAINTUPDATE
228  * Define a standard trigger for foreign constraint
229  */
230 #define FOREIGNCONSTRAINTUPDATE(TABLEPARENT,ATTPARENT,TABLECHILD,ATTCHILD)\
231     (INSERTUPDATECONSTRAINT(TABLEPARENT,ATTPARENT,TABLECHILD,ATTCHILD)\
232      << QString()%"DROP TRIGGER IF EXISTS fkd_"%(TABLECHILD)%"_"%(TABLEPARENT)%"_"%(ATTCHILD)%"_"%(ATTPARENT) \
233      << QString()%"CREATE TRIGGER fkd_"%(TABLECHILD)%"_"%(TABLEPARENT)%"_"%(ATTCHILD)%"_"%(ATTPARENT)%" "\
234      "BEFORE DELETE ON "%(TABLEPARENT)%" "\
235      "FOR EACH ROW BEGIN "\
236      "    UPDATE "%(TABLECHILD)%" SET "%(ATTCHILD)%"=0 WHERE "%(ATTCHILD)%"=OLD."%(ATTPARENT)%"; "\
237      "END")
238 
239 /**
240  * @def FOREIGNCONSTRAINTCASCADE
241  * Define a standard trigger for foreign constraint cascade delete
242  */
243 #define FOREIGNCONSTRAINTCASCADE(TABLEPARENT,ATTPARENT,TABLECHILD,ATTCHILD)\
244     INSERTUPDATECONSTRAINT(TABLEPARENT,ATTPARENT,TABLECHILD,ATTCHILD)\
245             << DELETECASCADE(TABLEPARENT,ATTPARENT,TABLECHILD,ATTCHILD)
246 
247 /**
248  * @def DELETECASCADEPARAMETER
249  * Define a cascaded delete to delete parameters associated with an object
250  */
251 #define DELETECASCADEPARAMETER(TABLE) \
252     (QStringList() << QString()%"DROP TRIGGER IF EXISTS fkdc_"%(TABLE)%"_parameters_uuid" \
253      << QString()%"CREATE TRIGGER fkdc_"%(TABLE)%"_parameters_uuid "\
254      "BEFORE DELETE ON "%(TABLE)%" "\
255      "FOR EACH ROW BEGIN "\
256      "    DELETE FROM parameters WHERE parameters.t_uuid_parent=OLD.id||'-'||'"%(TABLE)%"'; "\
257      "END")
258 
259 #endif
260