From 8fb3fb5abadfcde379892aa0befdc2f815498d3f Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 15 Feb 2017 00:10:02 +0300 Subject: [PATCH] LimeReport will not delete external connections --- limereport/lrdatadesignintf.cpp | 6 +++-- limereport/lrdatadesignintf.h | 3 +++ limereport/lrdatasourcemanager.cpp | 36 ++++++++++++++++++------------ limereport/lrdatasourcemanager.h | 2 +- 4 files changed, 30 insertions(+), 17 deletions(-) diff --git a/limereport/lrdatadesignintf.cpp b/limereport/lrdatadesignintf.cpp index f20f891..daea32e 100644 --- a/limereport/lrdatadesignintf.cpp +++ b/limereport/lrdatadesignintf.cpp @@ -350,12 +350,14 @@ void ModelToDataSource::slotModelDestroed() ConnectionDesc::ConnectionDesc(QSqlDatabase db, QObject *parent) : QObject(parent), m_connectionName(db.connectionName()), m_connectionHost(db.hostName()), m_connectionDriver(db.driverName()), - m_databaseName(db.databaseName()), m_user(db.userName()), m_password(db.password()), m_autoconnect(false) + m_databaseName(db.databaseName()), m_user(db.userName()), m_password(db.password()), m_autoconnect(false), + m_internal(false) {} ConnectionDesc::ConnectionDesc(QObject *parent) :QObject(parent),m_connectionName(""),m_connectionHost(""),m_connectionDriver(""), - m_databaseName(""), m_user(""), m_password(""), m_autoconnect(false) + m_databaseName(""), m_user(""), m_password(""), m_autoconnect(false), + m_internal(false) {} ConnectionDesc::Ptr ConnectionDesc::create(QSqlDatabase db, QObject *parent) diff --git a/limereport/lrdatadesignintf.h b/limereport/lrdatadesignintf.h index abe26bb..7323f80 100644 --- a/limereport/lrdatadesignintf.h +++ b/limereport/lrdatadesignintf.h @@ -130,6 +130,8 @@ public: void setAutoconnect(bool value){m_autoconnect=value;} bool autoconnect(){return m_autoconnect;} bool isEqual(const QSqlDatabase& db); + bool isInternal(){ return m_internal; } + void setInternal(bool value) {m_internal = value;} signals: void nameChanged(const QString& oldName,const QString& newName); private: @@ -140,6 +142,7 @@ private: QString m_user; QString m_password; bool m_autoconnect; + bool m_internal; }; class IConnectionController{ diff --git a/limereport/lrdatasourcemanager.cpp b/limereport/lrdatasourcemanager.cpp index 2fb0d40..ea7e6e0 100644 --- a/limereport/lrdatasourcemanager.cpp +++ b/limereport/lrdatasourcemanager.cpp @@ -620,13 +620,15 @@ void DataSourceManager::removeDatasource(const QString &name) emit datasourcesChanged(); } -void DataSourceManager::removeConnection(const QString &name) +void DataSourceManager::removeConnection(const QString &connectionName) { for(int i=0;iname()==name){ - QSqlDatabase db = QSqlDatabase::database(name); - db.close(); - QSqlDatabase::removeDatabase(name); + if (m_connections.at(i)->name()==connectionName){ + if (m_connections.at(i)->isInternal()){ + QSqlDatabase db = QSqlDatabase::database(connectionName); + db.close(); + QSqlDatabase::removeDatabase(connectionName); + } delete m_connections.at(i); m_connections.removeAt(i); } @@ -654,10 +656,12 @@ void DataSourceManager::addConnectionDesc(ConnectionDesc * connection) bool DataSourceManager::checkConnectionDesc(ConnectionDesc *connection) { if (connectConnection(connection)){ - QSqlDatabase::removeDatabase(connection->name()); + if (connection->isInternal()) + QSqlDatabase::removeDatabase(connection->name()); return true; } - QSqlDatabase::removeDatabase(connection->name()); + if (connection->isInternal()) + QSqlDatabase::removeDatabase(connection->name()); return false; } @@ -721,6 +725,7 @@ bool DataSourceManager::initAndOpenDB(QSqlDatabase& db, ConnectionDesc& connecti } connected=db.open(); + connectionDesc.setInternal(true); if (!connected) setLastError(db.lastError().text()); return connected; } @@ -760,19 +765,19 @@ bool DataSourceManager::connectConnection(ConnectionDesc *connectionDesc) } } else { QSqlDatabase db = QSqlDatabase::database(connectionDesc->name()); - if (!connectionDesc->isEqual(db)){ + if (!connectionDesc->isEqual(db) && connectionDesc->isInternal()){ db.close(); connected = initAndOpenDB(db, *connectionDesc); } else { - //connected = db.isOpen(); connected = checkConnection(db); - if (!connected) + if (!connected && connectionDesc->isInternal()) connected = initAndOpenDB(db, *connectionDesc); } } if (!connected) { - QSqlDatabase::removeDatabase(connectionDesc->name()); + if (connectionDesc->isInternal()) + QSqlDatabase::removeDatabase(connectionDesc->name()); return false; } else { foreach(QString datasourceName, dataSourceNames()){ @@ -884,11 +889,13 @@ void DataSourceManager::disconnectConnection(const QString& connectionName) } } } - { + + ConnectionDesc* connectionDesc = connectionByName(connectionName); + if (connectionDesc->isInternal()){ QSqlDatabase db = QSqlDatabase::database(connectionName); if (db.isOpen()) db.close(); + if (QSqlDatabase::contains(connectionName)) QSqlDatabase::removeDatabase(connectionName); } - if (QSqlDatabase::contains(connectionName)) QSqlDatabase::removeDatabase(connectionName); } @@ -1185,7 +1192,8 @@ void DataSourceManager::clear(ClearMethod method) QList::iterator cit = m_connections.begin(); while( cit != m_connections.end() ){ - QSqlDatabase::removeDatabase( (*cit)->name() ); + if ( (*cit)->isInternal() ) + QSqlDatabase::removeDatabase( (*cit)->name() ); delete (*cit); cit = m_connections.erase(cit); } diff --git a/limereport/lrdatasourcemanager.h b/limereport/lrdatasourcemanager.h index a0efaaf..c60bfa5 100644 --- a/limereport/lrdatasourcemanager.h +++ b/limereport/lrdatasourcemanager.h @@ -131,7 +131,7 @@ public: QString queryText(const QString& dataSourceName); QString connectionName(const QString& dataSourceName); void removeDatasource(const QString& name); - void removeConnection(const QString& name); + void removeConnection(const QString& connectionName); bool isQuery(const QString& dataSourceName); bool containsDatasource(const QString& dataSourceName); bool isSubQuery(const QString& dataSourceName);