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