Advertisement
popov-aa

Atm::DbProvider::Concurrent.h

Feb 7th, 2020
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.93 KB | None | 0 0
  1. #pragma once
  2.  
  3. class ConnectionParameters;
  4. class QReadWriteLock;
  5.  
  6. #include "../ConnectionParameters.h"
  7.  
  8. #include <QLoggingCategory>
  9. #include <QSqlDatabase>
  10. #include <memory>
  11.  
  12. Q_DECLARE_LOGGING_CATEGORY( sqlDatabaseFactory )
  13.  
  14. namespace Atm { namespace DbProvider { namespace Concurrent {
  15.  
  16. /**
  17.  * @brief Фабрика подключений к СУБД, предоставлящая для потока, из которого производится вызов
  18.  * getSqlDatabase свой собственный экземпляр QSqlDatabase.
  19.  */
  20. class SqlDatabaseFactory : public QObject
  21. {
  22.     Q_OBJECT
  23.   public:
  24.     explicit SqlDatabaseFactory( QObject * parent = nullptr );
  25.     explicit SqlDatabaseFactory( const ConnectionParameters & connectionParameters, QObject * parent = nullptr );
  26.     virtual ~SqlDatabaseFactory();
  27.  
  28.     const ConnectionParameters & connectionParameters() const;
  29.     void setConnectionParameters( const ConnectionParameters & connectionParameters );
  30.  
  31.     /**
  32.      * @brief Если для вызывающего потока нет своего экземпляра QSqlDatabase,
  33.      * он создается с настройками из connectionParameters. После этого производится
  34.      * попытка подключения.
  35.      * Если для вызывающего потока есть свой экземпляр QSqlDatabase,
  36.      * проверяется не изменились параметры подключения и не закрылось ли подключение.
  37.      * В этом случае старое подключение закрываются, применяются новые параметры и снова происходит
  38.      * подключение. Если подключение было закрыто без изменения параметров подключения,
  39.      * происходит только новой подключение.
  40.      * @return Экземпляр QSqlDatabase для данного потоак.
  41.      * Если в процессе подключения/переподключения к СУБД позникает ошибка, выбрасывается исключение
  42.      * OpenDatabaseException
  43.      */
  44.     QSqlDatabase getSqlDatabase();
  45.  
  46.   private slots:
  47.     void removeSqlDatabase();
  48.  
  49.   private:
  50.     QString getConnectionName( Qt::HANDLE threadId ) const;
  51.     QString threadIdToString( Qt::HANDLE threadId ) const;
  52.     QString reconnectionComment( Qt::HANDLE threadId,
  53.                                  bool connectionWasClosed,
  54.                                  bool connectionParametersWasChanged ) const;
  55.  
  56.   private:
  57.     ConnectionParameters m_connectionParameters;
  58.     QMap<Qt::HANDLE, QString> m_connectionNames;
  59.     QHash<Qt::HANDLE, QMetaObject::Connection> m_threadConnections;
  60.     std::unique_ptr<QReadWriteLock> m_lock;
  61. };
  62.  
  63. }}} // namespace Atm::DbProvider::Concurrent
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement