digiKam
Loading...
Searching...
No Matches
dbenginebackend.h
Go to the documentation of this file.
1/* ============================================================
2 *
3 * This file is a part of digiKam project
4 * https://www.digikam.org
5 *
6 * Date : 2007-06-07
7 * Description : Database engine abstract database backend
8 *
9 * SPDX-FileCopyrightText: 2007-2010 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
10 * SPDX-FileCopyrightText: 2010-2024 by Gilles Caulier <caulier dot gilles at gmail dot com>
11 *
12 * SPDX-License-Identifier: GPL-2.0-or-later
13 *
14 * ============================================================ */
15
16#pragma once
17
18// Qt includes
19
20#include <QMap>
21#include <QObject>
22#include <QString>
23#include <QStringList>
24#include <QSqlQuery>
25#include <QSqlError>
26#include <QDateTime>
27#include <QRecursiveMutex>
28
29// Local includes
30
31#include "digikam_export.h"
32#include "dbengineparameters.h"
33#include "dbenginesqlquery.h"
34
35namespace Digikam
36{
37
38class DbEngineConfigSettings;
39class BdEngineBackendPrivate;
40class DbEngineErrorHandler;
41
42class DIGIKAM_EXPORT DbEngineLocking
43{
44public:
45
46 DbEngineLocking() = default;
47
48public:
49
50 QRecursiveMutex mutex;
51 int lockCount = 0;
52};
53
54// -----------------------------------------------------------------
55
56class DIGIKAM_EXPORT BdEngineBackend : public QObject
57{
58 Q_OBJECT
59
60public:
61
63 {
68
73
77 ConnectionError
78 };
79
80 enum Status
81 {
87
96
101 OpenSchemaChecked
102 };
103
105 {
108 AbortQueries
109 };
110
112 {
114 MySQL
115 };
116
117public:
118
124 explicit BdEngineBackend(const QString& backendName, DbEngineLocking* const locking);
125 BdEngineBackend(const QString& backendName, DbEngineLocking* const locking, BdEngineBackendPrivate& dd);
126 ~BdEngineBackend() override;
127
131 bool isCompatible(const DbEngineParameters& parameters);
132
137 bool checkOrSetWALMode();
138
143 bool open(const DbEngineParameters& parameters);
144
149 void close();
150
151public:
152
154 {
155 public:
156
157 QueryState() = default;
158
159 explicit QueryState(const QueryStateEnum value) // krazy:exclude=explicit
160 : value(value)
161 {
162 }
163
164 operator QueryStateEnum() const
165 {
166 return value;
167 }
168
169 operator bool() const
170 {
171 return (value == BdEngineBackend::NoErrors);
172 }
173
174 private:
175
176 QueryStateEnum value = BdEngineBackend::NoErrors;
177 };
178
179public:
180
184 Status status() const;
185
186 bool isOpen() const
187 {
188 return (status() > Unavailable);
189 }
190
191 bool isReady() const
192 {
193 return (status() == OpenSchemaChecked);
194 }
195
200 void setDbEngineErrorHandler(DbEngineErrorHandler* const handler);
201
206 DbEngineConfigSettings configElement() const;
207
211 DbType databaseType() const;
212
217 DbEngineAction getDBAction(const QString& actionName) const;
218
224 QueryState execDBAction(const DbEngineAction& action, QList<QVariant>* const values = nullptr,
225 QVariant* const lastInsertId = nullptr);
226
227 QueryState execDBAction(const QString& action, QList<QVariant>* const values = nullptr,
228 QVariant* const lastInsertId = nullptr);
229
236 QueryState execDBAction(const DbEngineAction& action, const QMap<QString, QVariant>& bindingMap,
237 QList<QVariant>* const values = nullptr, QVariant* const lastInsertId = nullptr);
238
239 QueryState execDBAction(const QString& action, const QMap<QString, QVariant>& bindingMap,
240 QList<QVariant>* const values = nullptr, QVariant* const lastInsertId = nullptr);
241
250 QueryState execUpsertDBAction(const DbEngineAction& action, const QVariant& id,
251 const QStringList& fieldNames, const QList<QVariant>& values);
252 QueryState execUpsertDBAction(const QString& action, const QVariant& id,
253 const QStringList& fieldNames, const QList<QVariant>& values);
254
262 QSqlQuery execDBActionQuery(const DbEngineAction& action, const QMap<QString, QVariant>& bindingMap);
263
264 QSqlQuery execDBActionQuery(const QString& action, const QMap<QString, QVariant>& bindingMap);
265
273 QueryState execSql(const QString& sql,
274 QList<QVariant>* const values = nullptr,
275 QVariant* const lastInsertId = nullptr);
276 QueryState execSql(const QString& sql,
277 const QVariant& boundValue1,
278 QList<QVariant>* const values = nullptr,
279 QVariant* const lastInsertId = nullptr);
280 QueryState execSql(const QString& sql,
281 const QVariant& boundValue1,
282 const QVariant& boundValue2,
283 QList<QVariant>* const values = nullptr,
284 QVariant* const lastInsertId = nullptr);
285 QueryState execSql(const QString& sql,
286 const QVariant& boundValue1,
287 const QVariant& boundValue2,
288 const QVariant& boundValue3,
289 QList<QVariant>* const values = nullptr,
290 QVariant* const lastInsertId = nullptr);
291 QueryState execSql(const QString& sql,
292 const QVariant& boundValue1,
293 const QVariant& boundValue2,
294 const QVariant& boundValue3,
295 const QVariant& boundValue4,
296 QList<QVariant>* const values = nullptr,
297 QVariant* const lastInsertId = nullptr);
298 QueryState execSql(const QString& sql,
299 const QList<QVariant>& boundValues,
300 QList<QVariant>* const values = nullptr,
301 QVariant* const lastInsertId = nullptr);
302
303 QueryState execSql(DbEngineSqlQuery& preparedQuery,
304 QList<QVariant>* const values = nullptr,
305 QVariant* const lastInsertId = nullptr);
306 QueryState execSql(DbEngineSqlQuery& preparedQuery,
307 const QVariant& boundValue1,
308 QList<QVariant>* const values = nullptr,
309 QVariant* const lastInsertId = nullptr);
310 QueryState execSql(DbEngineSqlQuery& preparedQuery,
311 const QVariant& boundValue1,
312 const QVariant& boundValue2,
313 QList<QVariant>* const values = nullptr,
314 QVariant* const lastInsertId = nullptr);
315 QueryState execSql(DbEngineSqlQuery& preparedQuery,
316 const QVariant& boundValue1,
317 const QVariant& boundValue2,
318 const QVariant& boundValue3,
319 QList<QVariant>* const values = nullptr,
320 QVariant* const lastInsertId = nullptr);
321 QueryState execSql(DbEngineSqlQuery& preparedQuery,
322 const QVariant& boundValue1,
323 const QVariant& boundValue2,
324 const QVariant& boundValue3,
325 const QVariant& boundValue4,
326 QList<QVariant>* const values = nullptr,
327 QVariant* const lastInsertId = nullptr);
328 QueryState execSql(DbEngineSqlQuery& preparedQuery,
329 const QList<QVariant>& boundValues,
330 QList<QVariant>* const values = nullptr,
331 QVariant* const lastInsertId = nullptr);
332
339 QueryState handleQueryResult(DbEngineSqlQuery& query,
340 QList<QVariant>* const values,
341 QVariant* const lastInsertId);
342
353 QueryState execSql(const QString& sql,
354 const QMap<QString, QVariant>& bindingMap,
355 QList<QVariant>* const values = nullptr,
356 QVariant* const lastInsertId = nullptr);
362 QueryState execDirectSql(const QString& query);
363
369 QueryState execDirectSqlWithResult(const QString& query,
370 QList<QVariant>* const values = nullptr,
371 QVariant* const lastInsertId = nullptr);
372
377 DbEngineSqlQuery execQuery(const QString& sql);
378 DbEngineSqlQuery execQuery(const QString& sql,
379 const QVariant& boundValue1);
380 DbEngineSqlQuery execQuery(const QString& sql,
381 const QVariant& boundValue1,
382 const QVariant& boundValue2);
383 DbEngineSqlQuery execQuery(const QString& sql,
384 const QVariant& boundValue1,
385 const QVariant& boundValue2,
386 const QVariant& boundValue3);
387 DbEngineSqlQuery execQuery(const QString& sql,
388 const QVariant& boundValue1,
389 const QVariant& boundValue2,
390 const QVariant& boundValue3,
391 const QVariant& boundValue4);
392 DbEngineSqlQuery execQuery(const QString& sql,
393 const QList<QVariant>& boundValues);
394
398 void execQuery(DbEngineSqlQuery& preparedQuery,
399 const QVariant& boundValue1);
400 void execQuery(DbEngineSqlQuery& preparedQuery,
401 const QVariant& boundValue1,
402 const QVariant& boundValue2);
403 void execQuery(DbEngineSqlQuery& preparedQuery,
404 const QVariant& boundValue1,
405 const QVariant& boundValue2,
406 const QVariant& boundValue3);
407 void execQuery(DbEngineSqlQuery& preparedQuery,
408 const QVariant& boundValue1,
409 const QVariant& boundValue2,
410 const QVariant& boundValue3,
411 const QVariant& boundValue4);
412 void execQuery(DbEngineSqlQuery& preparedQuery,
413 const QList<QVariant>& boundValues);
414
418 DbEngineSqlQuery execQuery(const QString& sql,
419 const QMap<QString, QVariant>& bindingMap);
420
424 bool exec(DbEngineSqlQuery& query);
425 bool execBatch(DbEngineSqlQuery& query);
426
430 DbEngineSqlQuery prepareQuery(const QString& sql);
434 DbEngineSqlQuery getQuery();
438 DbEngineSqlQuery copyQuery(const DbEngineSqlQuery& old);
439
445 bool queryErrorHandling(DbEngineSqlQuery& query, int retries);
446 bool transactionErrorHandling(const QSqlError& lastError, int retries);
447
453 bool connectionErrorHandling(int retries);
454
461 QList<QVariant> readToList(DbEngineSqlQuery& query);
462
466 BdEngineBackend::QueryState beginTransaction();
470 BdEngineBackend::QueryState commitTransaction();
474 void rollbackTransaction();
475
482 bool isInTransaction() const;
483
487 QStringList tables();
488
495 QString lastError();
496
502 QSqlError lastSQLError();
503
508 int maximumBoundValues() const;
509
514 void setForeignKeyChecks(bool check);
515
521 QDateTime asDBDateTime(const QDateTime& dateTime) const;
522
523 /*
524 Qt SQL driver supported features
525 SQLITE3:
526 BLOB
527 Transactions
528 Unicode
529 LastInsertId
530 PreparedQueries
531 PositionalPlaceholders
532 SimpleLocking
533 MySQL:
534 Transactions (3.?)
535 QuerySize
536 BLOB
537 LastInsertId
538 Unicode
539 PreparedQueries (4.1)
540 PositionalPlaceholders (4.1)
541 Postgresql:
542 Transactions
543 QuerySize
544 LastInsertId
545 */
546
547protected:
548
549 BdEngineBackendPrivate* const d_ptr = nullptr;
550
551private:
552
553 Q_DECLARE_PRIVATE(BdEngineBackend)
554
555 // Disable
556 BdEngineBackend(QObject*) = delete;
557};
558
559} // namespace Digikam
560
561Q_DECLARE_METATYPE(QSqlError)
Definition dbenginebackend_p.h:63
Definition dbenginebackend.h:154
QueryState(const QueryStateEnum value)
Definition dbenginebackend.h:159
Definition dbenginebackend.h:57
Status
Definition dbenginebackend.h:81
@ Unavailable
Definition dbenginebackend.h:86
@ Open
Definition dbenginebackend.h:95
QueryStateEnum
Definition dbenginebackend.h:63
@ SQLError
Definition dbenginebackend.h:72
@ NoErrors
Definition dbenginebackend.h:67
QueryOperationStatus
Definition dbenginebackend.h:105
@ Wait
Definition dbenginebackend.h:107
@ ExecuteNormal
Definition dbenginebackend.h:106
DbType
Definition dbenginebackend.h:112
@ SQLite
Definition dbenginebackend.h:113
bool isReady() const
Definition dbenginebackend.h:191
bool isOpen() const
Definition dbenginebackend.h:186
Definition dbengineaction.h:44
Definition dbengineconfigsettings.h:30
Definition dbengineerrorhandler.h:50
Definition dbenginebackend.h:43
QRecursiveMutex mutex
Definition dbenginebackend.h:50
Definition dbengineparameters.h:39
Definition dbenginesqlquery.h:31
qulonglong value
Definition itemviewutilities.cpp:585
Definition datefolderview.cpp:34