digiKam
Loading...
Searching...
No Matches
dbenginebackend_p.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-04-15
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#include "dbenginebackend.h"
19
20// Qt includes
21
22#include <QHash>
23#include <QSqlDatabase>
24#include <QThread>
25#include <QThreadStorage>
26#include <QWaitCondition>
27
28// Local includes
29
30#include "digikam_export.h"
31#include "dbengineparameters.h"
33
34namespace Digikam
35{
36
37class Q_DECL_HIDDEN DbEngineThreadData
38{
39public:
40
41 DbEngineThreadData() = default;
43
44 void closeDatabase();
45
46public:
47
48 int valid = 0;
49 int transactionCount = 0;
51 QSqlError lastError;
52
53private:
54
55 // Disable
57 DbEngineThreadData& operator=(const DbEngineThreadData&) = delete;
58};
59
60// ------------------------------------------------------------------------
61
62class DIGIKAM_EXPORT BdEngineBackendPrivate : public DbEngineErrorAnswer
63{
64public:
65
66 explicit BdEngineBackendPrivate(BdEngineBackend* const backend);
67 ~BdEngineBackendPrivate() override;
68
69 void init(const QString& connectionName, DbEngineLocking* const locking);
70
71 QSqlDatabase databaseForThread();
72 QSqlError databaseErrorForThread();
73 bool resetDatabaseForThread();
74 void setDatabaseErrorForThread(const QSqlError& lastError);
75
76 QString connectionName();
77 QSqlDatabase createDatabaseConnection();
78
79 void closeDatabaseForThread();
80 bool incrementTransactionCount();
81 bool decrementTransactionCount();
82
83 bool isInMainThread() const;
84 bool isInUIThread() const;
85
86 bool reconnectOnError() const;
87 bool isSQLiteLockError(const DbEngineSqlQuery& query) const;
88 bool isSQLiteLockTransactionError(const QSqlError& lastError) const;
89 bool isConnectionError(const DbEngineSqlQuery& query) const;
90 bool needToConsultUserForError(const DbEngineSqlQuery& query) const;
91 bool needToHandleWithErrorHandler(const DbEngineSqlQuery& query) const;
92 void debugOutputFailedQuery(const QSqlQuery& query) const;
93 void debugOutputFailedTransaction(const QSqlError& error) const;
94
95 bool checkRetrySQLiteLockError(int retries);
96 bool checkOperationStatus();
97 bool handleWithErrorHandler(const DbEngineSqlQuery* const query);
98 void setQueryOperationFlag(BdEngineBackend::QueryOperationStatus status);
99 void queryOperationWakeAll(BdEngineBackend::QueryOperationStatus status);
100
104 void connectionErrorContinueQueries() override;
105 void connectionErrorAbortQueries() override;
106
107 virtual void transactionFinished();
108
109public:
110
111 QThreadStorage<DbEngineThreadData*> threadDataStorage;
112
117 int currentValidity = 0;
118
119 bool isInTransaction = false;
120
121 QString backendName;
122
124
125 BdEngineBackend::Status status = BdEngineBackend::Unavailable;
126
127 DbEngineLocking* lock = nullptr;
128
129 BdEngineBackend::QueryOperationStatus operationStatus = BdEngineBackend::ExecuteNormal;
130
132 QWaitCondition errorLockCondVar;
133 BdEngineBackend::QueryOperationStatus errorLockOperationStatus = BdEngineBackend::ExecuteNormal;
134
136 QWaitCondition busyWaitCondVar;
137
138 DbEngineErrorHandler* errorHandler = nullptr;
139
140public:
141
142 class Q_DECL_HIDDEN AbstractUnlocker
143 {
144 public:
145
146 explicit AbstractUnlocker(BdEngineBackendPrivate* const dd);
148
149 void finishAcquire();
150
151 protected:
152
153 int count = 0;
154 BdEngineBackendPrivate* const d = nullptr;
155 };
156
157 friend class AbstractUnlocker;
158
159 // ------------------------------------------------------------------
160
161 class Q_DECL_HIDDEN AbstractWaitingUnlocker : public AbstractUnlocker
162 {
163 public:
164
166 QMutex* const mutex,
167 QWaitCondition* const condVar);
169
170 bool wait(unsigned long time = ULONG_MAX);
171
172 protected:
173
174 QMutex* const mutex = nullptr;
175 QWaitCondition* const condVar = nullptr;
176 };
177
178 // ------------------------------------------------------------------
179
180 class Q_DECL_HIDDEN ErrorLocker : public AbstractWaitingUnlocker
181 {
182 public:
183
184 explicit ErrorLocker(BdEngineBackendPrivate* const d);
185 void wait();
186 };
187
188 // ------------------------------------------------------------------
189
190 class Q_DECL_HIDDEN BusyWaiter : public AbstractWaitingUnlocker
191 {
192 public:
193
194 explicit BusyWaiter(BdEngineBackendPrivate* const d);
195 };
196
197public:
198
199 BdEngineBackend* const q = nullptr;
200};
201
202} // namespace Digikam
Definition dbenginebackend_p.h:143
Definition dbenginebackend_p.h:191
Definition dbenginebackend_p.h:181
Definition dbenginebackend_p.h:63
QString backendName
Definition dbenginebackend_p.h:121
DbEngineParameters parameters
Definition dbenginebackend_p.h:123
QWaitCondition busyWaitCondVar
Definition dbenginebackend_p.h:136
QMutex errorLockMutex
Definition dbenginebackend_p.h:131
QThreadStorage< DbEngineThreadData * > threadDataStorage
Definition dbenginebackend_p.h:111
QMutex busyWaitMutex
Definition dbenginebackend_p.h:135
QWaitCondition errorLockCondVar
Definition dbenginebackend_p.h:132
Definition dbenginebackend.h:57
Status
Definition dbenginebackend.h:81
QueryOperationStatus
Definition dbenginebackend.h:105
Definition dbengineerrorhandler.h:32
Definition dbengineerrorhandler.h:50
Definition dbenginebackend.h:43
Definition dbengineparameters.h:39
Definition dbenginesqlquery.h:31
Definition dbenginebackend_p.h:38
QString connectionName
Definition dbenginebackend_p.h:50
QSqlError lastError
Definition dbenginebackend_p.h:51
Definition datefolderview.cpp:34