File indexing completed on 2024-04-28 16:30:28

0001 /***************************************************************************
0002  * SPDX-FileCopyrightText: 2022 S. MANKOWSKI stephane@mankowski.fr
0003  * SPDX-FileCopyrightText: 2022 G. DE BURE support@mankowski.fr
0004  * SPDX-License-Identifier: GPL-3.0-or-later
0005  ***************************************************************************/
0006 #ifndef SKGDEFINE_H
0007 #define SKGDEFINE_H
0008 /** @file
0009  * This file defines some macros.
0010  *
0011  * @author Stephane MANKOWSKI / Guillaume DE BURE
0012  */
0013 #include <qstring.h>
0014 #include <qstringbuilder.h>
0015 
0016 #include <klocalizedstring.h>
0017 
0018 #include "skgbasemodeler_export.h"
0019 
0020 #if QT_VERSION < QT_VERSION_CHECK(5, 14, 0)
0021 #define SKGENDL endl
0022 #define SKGFLUSH flush
0023 #else
0024 #define SKGENDL Qt::endl
0025 #define SKGFLUSH Qt::flush
0026 #endif
0027 
0028 /**
0029  * @var OBJECTSEPARATOR
0030  * Define the separator between object and subobject
0031  */
0032 #define OBJECTSEPARATOR QStringLiteral(" > ")
0033 
0034 /**
0035  * @var DUMPSQLITE
0036  * To display SQLLITE internals (tables, views, indexes, …)
0037  * @see dump
0038  */
0039 #define DUMPSQLITE (2 << 0)
0040 
0041 /**
0042  * @var DUMPPARAMETERS
0043  * To display parameters
0044  * @see dump
0045  */
0046 #define DUMPPARAMETERS (2 << 1)
0047 
0048 /**
0049  * @var DUMPTRANSACTIONS
0050  * To display transactions
0051  * @see dump
0052  */
0053 #define DUMPTRANSACTIONS (2 << 2)
0054 
0055 /**
0056  * @var DUMPNODES
0057  * To display nodes
0058  * @see dump
0059  */
0060 #define DUMPNODES (2 << 3)
0061 
0062 /**
0063  * @var DUMPALL
0064  * To display display all=@p DUMPSQLITE +@p DUMPPARAMETERS +@p DUMPTRANSACTIONS
0065  * @see dump
0066  */
0067 
0068 #define DUMPALL ((2 << 10) - 1)
0069 
0070 /**
0071  * @var SKG_UNDO_MAX_DEPTH
0072  * Default value for the max depth for the undo / redo mechanism
0073  */
0074 #define SKG_UNDO_MAX_DEPTH 50
0075 
0076 /**
0077  * @var ERR_NOTIMPL
0078  * Error number
0079  */
0080 #define ERR_NOTIMPL 1
0081 
0082 /**
0083  * @var ERR_NOINTERFACE
0084  * Error number
0085  */
0086 #define ERR_NOINTERFACE 2
0087 
0088 /**
0089  * @var ERR_POINTER
0090  * Error number
0091  */
0092 #define ERR_POINTER 3
0093 
0094 /**
0095  * @var ERR_ABORT
0096  * Error number
0097  */
0098 #define ERR_ABORT 4
0099 
0100 /**
0101  * @var ERR_FAIL
0102  * Error number
0103  */
0104 #define ERR_FAIL 5
0105 
0106 /**
0107  * @var ERR_HANDLE
0108  * Error number
0109  */
0110 #define ERR_HANDLE 6
0111 
0112 /**
0113  * @var ERR_OUTOFMEMORY
0114  * Error number
0115  */
0116 #define ERR_OUTOFMEMORY 7
0117 
0118 /**
0119  * @var ERR_INVALIDARG
0120  * Error number
0121  */
0122 #define ERR_INVALIDARG 8
0123 
0124 /**
0125  * @var ERR_UNEXPECTED
0126  * Error number
0127  */
0128 #define ERR_UNEXPECTED 9
0129 
0130 /**
0131  * @var ERR_WRITEACCESS
0132  * Error number
0133  */
0134 #define ERR_WRITEACCESS 10
0135 
0136 /**
0137  * @var ERR_FORCEABLE
0138  * Error number
0139  */
0140 #define ERR_FORCEABLE 11
0141 
0142 /**
0143  * @var ERR_ENCRYPTION
0144  * Error number
0145  */
0146 #define ERR_ENCRYPTION 12
0147 
0148 /**
0149  * @var ERR_INSTALL
0150  * Error number
0151  */
0152 #define ERR_INSTALL 13
0153 
0154 /**
0155  * @var ERR_CORRUPTION
0156  * Error number
0157  */
0158 #define ERR_CORRUPTION 14
0159 
0160 /**
0161  * @var ERR_READACCESS
0162  * Error number
0163  */
0164 #define ERR_READACCESS 15
0165 
0166 /**
0167  * @brief For a not modified field
0168  **/
0169 #define NOUPDATE QStringLiteral("-------")
0170 
0171 /**
0172   * @var EPSILON
0173   * Epsilon (for comparison)
0174   */
0175 #define EPSILON 0.00001
0176 
0177 /**
0178  * @def DELETECASCADE
0179  * Define a standard trigger for cascaded delete
0180  */
0181 #define DELETECASCADE(TABLEPARENT,ATTPARENT,TABLECHILD,ATTCHILD)\
0182     (QStringList() << QString()%"DROP TRIGGER IF EXISTS fkdc_"%(TABLEPARENT)%"_"%(TABLECHILD)%"_"%(ATTPARENT)%"_"%(ATTCHILD) \
0183      << QString()%"CREATE TRIGGER fkdc_"%(TABLEPARENT)%"_"%(TABLECHILD)%"_"%(ATTPARENT)%"_"%(ATTCHILD)%" "\
0184      "BEFORE DELETE ON "%(TABLEPARENT)%" "\
0185      "FOR EACH ROW BEGIN "\
0186      "    DELETE FROM "%(TABLECHILD)%" WHERE "%(TABLECHILD)%"."%(ATTCHILD)%" = OLD."%(ATTPARENT)%"; "\
0187      "END")
0188 
0189 /**
0190  * @def INSERTUPDATECONSTRAINT
0191  * Define a standard trigger for foreign constraint
0192  */
0193 
0194 
0195 // Should these strings be translated ??? They look far too SQLish for that purpose
0196 #define INSERTUPDATECONSTRAINT(TABLEPARENT,ATTPARENT,TABLECHILD,ATTCHILD)\
0197     (QStringList() << QString()%"DROP TRIGGER IF EXISTS fki_"%(TABLECHILD)%"_"%(TABLEPARENT)%"_"%(ATTCHILD)%"_"%(ATTPARENT) \
0198      << QString()%"CREATE TRIGGER fki_"%(TABLECHILD)%"_"%(TABLEPARENT)%"_"%(ATTCHILD)%"_"%(ATTPARENT)%" "\
0199      "BEFORE INSERT ON "%(TABLECHILD)%" "\
0200      "FOR EACH ROW BEGIN "\
0201      "  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)))%"') "\
0202      "  WHERE NEW."%(ATTCHILD)%"!=0 AND NEW."%(ATTCHILD)%"!='' AND (SELECT "%(ATTPARENT)%" FROM "%(TABLEPARENT)%" WHERE "%(ATTPARENT)%" = NEW."%(ATTCHILD)%") IS NULL; "\
0203      "END"\
0204      << QString()%"DROP TRIGGER IF EXISTS fku_"%(TABLECHILD)%"_"%(TABLEPARENT)%"_"%(ATTCHILD)%"_"%(ATTPARENT) \
0205      << QString()%"CREATE TRIGGER fku_"%(TABLECHILD)%"_"%(TABLEPARENT)%"_"%(ATTCHILD)%"_"%(ATTPARENT)%" "\
0206      "BEFORE UPDATE ON "%(TABLECHILD)%" "\
0207      "FOR EACH ROW BEGIN "\
0208      "    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)))%"') "\
0209      "      WHERE NEW."%(ATTCHILD)%"!=0 AND NEW."%(ATTCHILD)%"!='' AND (SELECT "%(ATTPARENT)%" FROM "%(TABLEPARENT)%" WHERE "%(ATTPARENT)%" = NEW."%(ATTCHILD)%") IS NULL; "\
0210      "END")
0211 
0212 /**
0213  * @def FOREIGNCONSTRAINT
0214  * Define a standard trigger for foreign constraint
0215  */
0216 #define FOREIGNCONSTRAINT(TABLEPARENT,ATTPARENT,TABLECHILD,ATTCHILD)\
0217     (INSERTUPDATECONSTRAINT(TABLEPARENT,ATTPARENT,TABLECHILD,ATTCHILD)\
0218      << QString()%"DROP TRIGGER IF EXISTS fkd_"%(TABLECHILD)%"_"%(TABLEPARENT)%"_"%(ATTCHILD)%"_"%(ATTPARENT) \
0219      << QString()%"CREATE TRIGGER fkd_"%(TABLECHILD)%"_"%(TABLEPARENT)%"_"%(ATTCHILD)%"_"%(ATTPARENT)%" "\
0220      "BEFORE DELETE ON "%(TABLEPARENT)%" "\
0221      "FOR EACH ROW BEGIN "\
0222      "    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)))%"') "\
0223      "    WHERE (SELECT "%(ATTCHILD)%" FROM "%(TABLECHILD)%" WHERE "%(ATTCHILD)%" = OLD."%(ATTPARENT)%") IS NOT NULL; "\
0224      "END")
0225 
0226 /**
0227  * @def FOREIGNCONSTRAINTUPDATE
0228  * Define a standard trigger for foreign constraint
0229  */
0230 #define FOREIGNCONSTRAINTUPDATE(TABLEPARENT,ATTPARENT,TABLECHILD,ATTCHILD)\
0231     (INSERTUPDATECONSTRAINT(TABLEPARENT,ATTPARENT,TABLECHILD,ATTCHILD)\
0232      << QString()%"DROP TRIGGER IF EXISTS fkd_"%(TABLECHILD)%"_"%(TABLEPARENT)%"_"%(ATTCHILD)%"_"%(ATTPARENT) \
0233      << QString()%"CREATE TRIGGER fkd_"%(TABLECHILD)%"_"%(TABLEPARENT)%"_"%(ATTCHILD)%"_"%(ATTPARENT)%" "\
0234      "BEFORE DELETE ON "%(TABLEPARENT)%" "\
0235      "FOR EACH ROW BEGIN "\
0236      "    UPDATE "%(TABLECHILD)%" SET "%(ATTCHILD)%"=0 WHERE "%(ATTCHILD)%"=OLD."%(ATTPARENT)%"; "\
0237      "END")
0238 
0239 /**
0240  * @def FOREIGNCONSTRAINTCASCADE
0241  * Define a standard trigger for foreign constraint cascade delete
0242  */
0243 #define FOREIGNCONSTRAINTCASCADE(TABLEPARENT,ATTPARENT,TABLECHILD,ATTCHILD)\
0244     INSERTUPDATECONSTRAINT(TABLEPARENT,ATTPARENT,TABLECHILD,ATTCHILD)\
0245             << DELETECASCADE(TABLEPARENT,ATTPARENT,TABLECHILD,ATTCHILD)
0246 
0247 /**
0248  * @def DELETECASCADEPARAMETER
0249  * Define a cascaded delete to delete parameters associated with an object
0250  */
0251 #define DELETECASCADEPARAMETER(TABLE) \
0252     (QStringList() << QString()%"DROP TRIGGER IF EXISTS fkdc_"%(TABLE)%"_parameters_uuid" \
0253      << QString()%"CREATE TRIGGER fkdc_"%(TABLE)%"_parameters_uuid "\
0254      "BEFORE DELETE ON "%(TABLE)%" "\
0255      "FOR EACH ROW BEGIN "\
0256      "    DELETE FROM parameters WHERE parameters.t_uuid_parent=OLD.id||'-'||'"%(TABLE)%"'; "\
0257      "END")
0258 
0259 #endif