6#include <QtSql/QSqlDatabase>
9#include <imod/TModelWrap.h>
10#include <ilog/TLoggerCompWrap.h>
11#include <ifile/IFileNameParam.h>
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>
24class CDatabaseEngineAttr:
public ilog::CLoggerComponentBase
27 typedef ilog::CLoggerComponentBase BaseClass;
28 I_BEGIN_COMPONENT(CDatabaseEngineAttr);
33class CDatabaseEngineComp:
35 virtual public CDatabaseEngineAttr,
36 virtual public IDatabaseEngine,
37 virtual public IDatabaseServerConnectionChecker
41 typedef CDatabaseEngineAttr BaseClass;
43 I_BEGIN_COMPONENT(CDatabaseEngineComp);
44 I_REGISTER_INTERFACE(IDatabaseEngine)
45 I_REGISTER_INTERFACE(IDatabaseServerConnectionChecker)
46 I_REGISTER_SUBELEMENT(DatabaseAccessSettings);
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");
64 CDatabaseEngineComp();
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;
77 virtual bool CheckDatabaseConnection(QString& errorMessage)
const override;
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);
83 QString GetConnectionName()
const;
86 enum DatabaseCreationFlags
88 DCF_CREATE_DATABASE = 1,
89 DCF_CREATE_DATABASE_META = 2,
90 DCF_EXECUTE_PATCHES = 4,
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;
98 QSqlDatabase InitDatabase(
const QByteArray& databaseDriverTypeId)
const;
101 virtual void OnComponentCreated()
override;
102 virtual void OnComponentDestroyed()
override;
110 bool EnsureDatabaseConnected(QSqlError* sqlError =
nullptr)
const;
115 bool EnsureDatabaseCreated()
const;
120 bool EnsureDatabaseConsistency()
const;
125 bool CreateDatabaseInstance()
const;
130 bool CreateDatabaseMetaInfo()
const;
132 QString GetDatabaseName()
const;
133 QString GetDatabasePath()
const;
134 bool IsSslConnectionRequired()
const;
135 QString GetHostName()
const;
137 QString GetUserName()
const;
138 QString GetPassword()
const;
139 int GetDatabaseVersion()
const;
141 QString GetConnectionOptionsString(
const QByteArray& databaseDriverId)
const;
143 template <
typename Interface>
144 static Interface* ExtractDatabaseAccessSettings(CDatabaseEngineComp& component)
146 return &component.m_workingAccessSettings;
150 void OnThreadFinished();
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);
169 imod::TModelWrap<imtdb::CDatabaseAccessSettings> m_workingAccessSettings;
Configuration interface for database connection credentials and parameters.
Controls database schema versioning and migration execution.
Database Abstraction Layer (ORM Framework) for ImtCore applications.