ImagingTools Core SDK
CDatabaseEngineComp.h
1// SPDX-License-Identifier: LGPL-2.1-or-later OR GPL-2.0-or-later OR GPL-3.0-or-later OR LicenseRef-ImtCore-Commercial
2#pragma once
3
4
5// Qt includes
6#include <QtSql/QSqlDatabase>
7
8// ACF includes
9#include <imod/TModelWrap.h>
10#include <ilog/TLoggerCompWrap.h>
11#include <ifile/IFileNameParam.h>
12
13// ImtCore includes
14#include <imtbase/TModelUpdateBinder.h>
15#include <imtdb/IDatabaseEngine.h>
16#include <imtdb/IDatabaseServerConnectionChecker.h>
17#include <imtdb/CDatabaseAccessSettings.h>
18#include <imtdb/IMigrationController.h>
19
20
21namespace imtdb
22{
23
24class CDatabaseEngineAttr: public ilog::CLoggerComponentBase
25{
26public:
27 typedef ilog::CLoggerComponentBase BaseClass;
28 I_BEGIN_COMPONENT(CDatabaseEngineAttr);
29 I_END_COMPONENT;
30};
31
32
33class CDatabaseEngineComp:
34 public QObject,
35 virtual public CDatabaseEngineAttr,
36 virtual public IDatabaseEngine,
37 virtual public IDatabaseServerConnectionChecker
38{
39 Q_OBJECT
40public:
41 typedef CDatabaseEngineAttr BaseClass;
42
43 I_BEGIN_COMPONENT(CDatabaseEngineComp);
44 I_REGISTER_INTERFACE(IDatabaseEngine)
45 I_REGISTER_INTERFACE(IDatabaseServerConnectionChecker)
46 I_REGISTER_SUBELEMENT(DatabaseAccessSettings);
47 I_REGISTER_SUBELEMENT_INTERFACE(DatabaseAccessSettings, imtdb::IDatabaseLoginSettings, ExtractDatabaseAccessSettings);
48 I_REGISTER_SUBELEMENT_INTERFACE(DatabaseAccessSettings, istd::IChangeable, ExtractDatabaseAccessSettings);
49 I_REGISTER_SUBELEMENT_INTERFACE(DatabaseAccessSettings, imod::IModel, ExtractDatabaseAccessSettings);
50 I_ASSIGN(m_databaseAccessSettingsCompPtr, "DatabaseAccessSettings", "Settings for database access", false, "DatabaseAccessSettings");
51 I_ASSIGN(m_dbTypeAttrPtr, "DbType", "The property holds database connections using the driver", true, "QPSQL");
52 I_ASSIGN(m_dbNameAttrPtr, "DbName", "The property holds connection's database name", true, "");
53 I_ASSIGN(m_dbFilePathCompPtr, "DbPath", "Database path for a file-based database", false, "");
54 I_ASSIGN(m_userNameAttrPtr, "UserName", "The property holds connection's user name", true, "postgres");
55 I_ASSIGN(m_paswordAttrPtr, "Pasword", "The property holds connection's password.", true, "12345");
56 I_ASSIGN(m_hostNameAttrPtr, "HostName", "The property holds connection's host name.", true, "localhost");
57 I_ASSIGN(m_maintenanceDatabaseNameAttrPtr, "MaintainanceDatabase", "Name of Maintenance database. It's necessary for creating database if it not exists", true, "postgres");
58 I_ASSIGN(m_autoCreateDatabaseAttrPtr, "AutoCreateDatabase", "The property holds behavior to create database on startup.\n Possible values:\n0 - will not create new database;\n1 - will create database once;\n2 - will create database at each startup", true, 1);
59 I_ASSIGN(m_autoCreateTablesAttrPtr, "AutoCreateTables", "The property holds behavior to create tables on startup.\n Possible values:\n0 - will not create new tables;\n1 - will create tables once;\n2 - will create tables at each startup", true, 1);
60 I_ASSIGN(m_portAttrPtr, "Port", "The property holds connection's port number", true, 5432);
61 I_ASSIGN(m_migrationControllerCompPtr, "MigrationController", "Migration controller", false, "MigrationController");
62 I_END_COMPONENT;
63
64 CDatabaseEngineComp();
65
66 // reimplemented (IDatabaseEngine)
67 virtual bool BeginTransaction() const override;
68 virtual bool FinishTransaction() const override;
69 virtual bool CancelTransaction() const override;
70 virtual QByteArray GetDatabaseDriverId() const override;
71 virtual QSqlQuery ExecSqlQuery(const QByteArray& queryString, QSqlError* sqlError = nullptr, bool isForwardOnly = false) const override;
72 virtual QSqlQuery ExecSqlQuery(const QByteArray& queryString, const QVariantMap& bindValues, QSqlError* sqlError = nullptr, bool isForwardOnly = false) const override;
73 virtual QSqlQuery ExecSqlQueryFromFile(const QString& filePath, QSqlError* sqlError = nullptr, bool isForwardOnly = false) const override;
74 virtual QSqlQuery ExecSqlQueryFromFile(const QString& filePath, const QVariantMap& bindValues, QSqlError* sqlError = nullptr, bool isForwardOnly = false) const override;
75
76 // reimplemented (IDatabaseServerConnectionChecker)
77 virtual bool CheckDatabaseConnection(QString& errorMessage) const override;
78
79 static void DrectBindValue(QByteArray* string, const QByteArray& what, const QByteArray& expr);
80 static void DrectBindValueInsertDefault(QByteArray* string, const QByteArray& what);
81 static void DrectBindValueUpdateDefault(QByteArray* string, const QByteArray& what);
82
83 QString GetConnectionName() const;
84
85protected:
86 enum DatabaseCreationFlags
87 {
88 DCF_CREATE_DATABASE = 1,
89 DCF_CREATE_DATABASE_META = 2,
90 DCF_EXECUTE_PATCHES = 4,
91 DCF_ALL = 0xffff
92 };
93 virtual bool OpenDatabase() const;
94 virtual bool CreateDatabase(int flags) const;
95 virtual bool ExecuteDatabasePatches() const;
96 virtual bool ExecuteTransaction(const QByteArray& sqlQuery) const;
97 void OnDatabaseAccessChanged(const istd::IChangeable::ChangeSet& changeSet, const imtdb::IDatabaseLoginSettings* databaseAccessSettingsPtr);
98 QSqlDatabase InitDatabase(const QByteArray& databaseDriverTypeId) const;
99
100 // reimplemented (icomp::CComponentBase)
101 virtual void OnComponentCreated() override;
102 virtual void OnComponentDestroyed() override;
103
104private:
110 bool EnsureDatabaseConnected(QSqlError* sqlError = nullptr) const;
111
115 bool EnsureDatabaseCreated() const;
116
120 bool EnsureDatabaseConsistency() const;
121
125 bool CreateDatabaseInstance() const;
126
130 bool CreateDatabaseMetaInfo() const;
131
132 QString GetDatabaseName() const;
133 QString GetDatabasePath() const;
134 bool IsSslConnectionRequired() const;
135 QString GetHostName() const;
136 int GetPort() const;
137 QString GetUserName() const;
138 QString GetPassword() const;
139 int GetDatabaseVersion() const;
140
141 QString GetConnectionOptionsString(const QByteArray& databaseDriverId) const;
142
143 template <typename Interface>
144 static Interface* ExtractDatabaseAccessSettings(CDatabaseEngineComp& component)
145 {
146 return &component.m_workingAccessSettings;
147 }
148
149private Q_SLOTS:
150 void OnThreadFinished();
151
152private:
153 I_REF(imtdb::IDatabaseLoginSettings, m_databaseAccessSettingsCompPtr);
154 I_ATTR(QByteArray, m_dbTypeAttrPtr);
155 I_ATTR(QByteArray, m_dbNameAttrPtr);
156 I_REF(ifile::IFileNameParam, m_dbFilePathCompPtr);
157 I_ATTR(QByteArray, m_userNameAttrPtr);
158 I_ATTR(QByteArray, m_paswordAttrPtr);
159 I_ATTR(QByteArray, m_hostNameAttrPtr);
160 I_ATTR(QByteArray, m_maintenanceDatabaseNameAttrPtr);
161 I_ATTR(QByteArray, m_databaseCreationScriptPathAttrPtr);
162 I_ATTR(int, m_autoCreateDatabaseAttrPtr);
163 I_ATTR(int, m_autoCreateTablesAttrPtr);
164 I_ATTR(int, m_portAttrPtr);
165 I_REF(imtdb::IMigrationController, m_migrationControllerCompPtr);
166
168
169 imod::TModelWrap<imtdb::CDatabaseAccessSettings> m_workingAccessSettings;
170};
171
172
173} // namespace imtdb
174
Configuration interface for database connection credentials and parameters.
Controls database schema versioning and migration execution.
Database Abstraction Layer (ORM Framework) for ImtCore applications.