ImagingTools Core SDK
CMongoDatabaseEngineComp.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// mongocxx includes
5#include <bsoncxx/json.hpp>
6#include <mongocxx/client.hpp>
7#include <mongocxx/instance.hpp>
8
9
10// ACF includes
11#include <imod/TModelWrap.h>
12#include <ilog/TLoggerCompWrap.h>
13#include <ifile/IFileNameParam.h>
14
15// ImtCore includes
16#include <imtbase/TModelUpdateBinder.h>
17#include <imtdb/CDatabaseAccessSettings.h>
18#include <imtmongo/IMongoDatabaseEngine.h>
19
20
21namespace imtmongo
22{
23
24
25class CMongoDatabaseEngineAttr: public ilog::CLoggerComponentBase
26{
27public:
28 typedef ilog::CLoggerComponentBase BaseClass;
29 I_BEGIN_COMPONENT(CMongoDatabaseEngineAttr);
30 I_END_COMPONENT;
31};
32
33
34class CMongoDatabaseEngineComp:
35 virtual public IMongoDatabaseEngine,
36 virtual public CMongoDatabaseEngineAttr
37{
38public:
39 typedef CMongoDatabaseEngineAttr BaseClass;
40
41 I_BEGIN_COMPONENT(CMongoDatabaseEngineComp);
42 I_REGISTER_INTERFACE(imtmongo::IMongoDatabaseEngine)
43 I_REGISTER_SUBELEMENT(DatabaseAccessSettings);
44 I_REGISTER_SUBELEMENT_INTERFACE(DatabaseAccessSettings, imtdb::IDatabaseLoginSettings, ExtractDatabaseAccessSettings);
45 I_REGISTER_SUBELEMENT_INTERFACE(DatabaseAccessSettings, istd::IChangeable, ExtractDatabaseAccessSettings);
46 I_REGISTER_SUBELEMENT_INTERFACE(DatabaseAccessSettings, imod::IModel, ExtractDatabaseAccessSettings);
47 I_ASSIGN(m_databaseAccessSettingsCompPtr, "DatabaseAccessSettings", "Settings for database access", false, "DatabaseAccessSettings");
48 I_ASSIGN(m_dbTypeAttrPtr, "DbType", "The property holds database connections using the driver", true, "MongoDB");
49 I_ASSIGN(m_dbNameAttrPtr, "DbName", "The property holds connection's database name", true, "agisbil");
50 I_ASSIGN(m_userNameAttrPtr, "UserName", "The property holds connection's user name", true, "postgres");
51 I_ASSIGN(m_paswordAttrPtr, "Pasword", "The property holds connection's password.", true, "12345");
52 I_ASSIGN(m_hostNameAttrPtr, "HostName", "The property holds connection's host name.", true, "localhost");
53 I_ASSIGN(m_maintenanceDatabaseNameAttrPtr, "MaintainanceDatabase", "Name of Maintenance database. It's necessary for creating database if it not exists", true, "postgres");
54 I_ASSIGN(m_migrationFolderPathCompPtr, "MigrationFolderPath", "The property holds the folder contains SQL migraton script", false, "MigrationFolderPath");
55 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);
56 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);
57 I_ASSIGN(m_portAttrPtr, "Port", "The property holds connection's port number", true, 270);
58 I_END_COMPONENT;
59
60 CMongoDatabaseEngineComp();
61
62 static void DrectBindValue(QByteArray* string, const QByteArray& what, const QByteArray& expr);
63 static void DrectBindValueInsertDefault(QByteArray* string, const QByteArray& what);
64 static void DrectBindValueUpdateDefault(QByteArray* string, const QByteArray& what);
65
66 virtual mongocxx::database* GetDatabase() override;
67
68protected:
69
70 void OnDatabaseAccessChanged(const istd::IChangeable::ChangeSet& changeSet, const imtdb::IDatabaseLoginSettings* databaseAccessSettingsPtr);
71
72 // reimplemented (icomp::CComponentBase)
73 virtual void OnComponentCreated() override;
74 virtual void OnComponentDestroyed() override;
75
76private:
77
81 //bool IsDatabaseServerConnected() const;
82
83 QString GetDatabaseName() const;
84 QString GetHostName() const;
85 int GetPort() const;
86 QString GetUserName() const;
87 QString GetPassword() const;
88
89
90 template <typename Interface>
91 static Interface* ExtractDatabaseAccessSettings(CMongoDatabaseEngineComp& component)
92 {
93 return &component.m_workingAccessSettings;
94 }
95
96private:
97 I_REF(imtdb::IDatabaseLoginSettings, m_databaseAccessSettingsCompPtr);
98 I_ATTR(QByteArray, m_dbTypeAttrPtr);
99 I_ATTR(QByteArray, m_dbNameAttrPtr);
100 I_ATTR(QByteArray, m_userNameAttrPtr);
101 I_ATTR(QByteArray, m_paswordAttrPtr);
102 I_ATTR(QByteArray, m_hostNameAttrPtr);
103 I_ATTR(QByteArray, m_maintenanceDatabaseNameAttrPtr);
104 I_ATTR(QByteArray, m_databaseCreationScriptPathAttrPtr);
105 I_REF(ifile::IFileNameParam, m_migrationFolderPathCompPtr);
106 I_ATTR(int, m_autoCreateDatabaseAttrPtr);
107 I_ATTR(int, m_autoCreateTablesAttrPtr);
108 I_ATTR(int, m_portAttrPtr);
109
111
112 imod::TModelWrap<imtdb::CDatabaseAccessSettings> m_workingAccessSettings;
113
114 mongocxx::client * m_client;
115 mongocxx::database* m_database;
116
117};
118
119
120} // namespace imtmongo
121
122
Configuration interface for database connection credentials and parameters.