diff --git a/FunctionalClientTest/maindialog.cpp b/FunctionalClientTest/maindialog.cpp index 796fb8c26a46e381bae0bfa491758e2ddb8ade46..453bdbaeee10446c84dbc217b20e48b4156f90f0 100644 --- a/FunctionalClientTest/maindialog.cpp +++ b/FunctionalClientTest/maindialog.cpp @@ -461,7 +461,8 @@ int MainDialog::deal_current_message_block() ); } else - QMessageBox::information(this,tr("Failed!"),tr("Log in failed!")); + displayMessage(tr("Log in failed!")); + displayMessage(tr("Res = %1") .arg(pApp->MsgUnion.msg_ClientLoginRsp.DoneCode) ); @@ -471,7 +472,7 @@ int MainDialog::deal_current_message_block() if (pApp->MsgUnion.msg_UploadUserListRsp.DoneCode==0) QMessageBox::information(this,tr("Succeed!"),tr("upload succeed!")); else - QMessageBox::information(this,tr("Failed!"),tr("upload in Failed!")); + displayMessage(tr("Upload failed!")); displayMessage(tr("Res = %1") .arg(pApp->MsgUnion.msg_UploadUserListRsp.DoneCode) ); @@ -490,7 +491,7 @@ int MainDialog::deal_current_message_block() ui->plainTextEdit_box_userids->setPlainText(strRes); } else - QMessageBox::information(this,tr("Failed!"),tr("download in Failed!")); + displayMessage(tr("Download failed!")); displayMessage(tr("Res = %1") .arg(pApp->MsgUnion.msg_DownloadUserListRsp.DoneCode) ); @@ -501,11 +502,7 @@ int MainDialog::deal_current_message_block() if (pApp->MsgUnion.msg_ClientLogoutRsp.DoneCode==0) QMessageBox::information(this,tr("Succeed!"),tr("log out succeed!")); else - QMessageBox::information(this,tr("Failed!"),tr("download in Failed!")); - displayMessage(tr("Res = %1") - .arg(pApp->MsgUnion.msg_ClientLogoutRsp.DoneCode) - ); - this->client->abort(); + displayMessage(tr("Download failed!")); } else { diff --git a/ZoomPipeline_FuncSvr/cluster/zp_clusterterm.cpp b/ZoomPipeline_FuncSvr/cluster/zp_clusterterm.cpp index 750486a03ee8bcfd2d1032a881dbb4f455170548..c7f36100a91f42c57d2c74a978eecce7d35f0e14 100644 --- a/ZoomPipeline_FuncSvr/cluster/zp_clusterterm.cpp +++ b/ZoomPipeline_FuncSvr/cluster/zp_clusterterm.cpp @@ -1,6 +1,7 @@ #include "zp_clusterterm.h" #include "zp_clusternode.h" #include +#include namespace ZP_Cluster{ using namespace std::placeholders; zp_ClusterTerm::zp_ClusterTerm(QString name,QObject *parent ) : diff --git a/ZoomPipeline_FuncSvr/database/databaseresource.cpp b/ZoomPipeline_FuncSvr/database/databaseresource.cpp index 6378b41ea73158262829403bd05da8324761c173..c06f418b358620b3291450e74550035cb1fd69bb 100644 --- a/ZoomPipeline_FuncSvr/database/databaseresource.cpp +++ b/ZoomPipeline_FuncSvr/database/databaseresource.cpp @@ -28,7 +28,67 @@ namespace ZPDatabase{ emit evt_Message(this,msg); return QSqlDatabase(); } - return QSqlDatabase::database(strDBName); + //We need a thread owner db , instead of the main DB template + QString threadName = QString("%1_%2").arg(strDBName).arg((quint64)currentThreadId()); + if (false==QSqlDatabase::contains(threadName)) + { + QSqlDatabase db = QSqlDatabase::cloneDatabase(QSqlDatabase::database(strDBName),threadName); + if (db.open()==false) + { + QString msg = "Database:"+tr(" Connection name ")+threadName+ + tr(" Can not be cloned from database %1.").arg(strDBName)+ + tr(" Err String:") + db.lastError().text(); + emit evt_Message(this,msg); + return QSqlDatabase(); + } + m_ThreadsDB[strDBName].insert(threadName); + } + //Confirm the thread-owned db is still open + QSqlDatabase db = QSqlDatabase::database(threadName); + tagConnectionPara & para = m_dbNames[strDBName]; + bool bNeedReconnect = false; + if (db.isOpen()==true) + { + if (para.testSQL.length()) + { + QSqlQuery query(db); + query.exec(para.testSQL); + if (query.lastError().type()!=QSqlError::NoError) + { + QString msg = "Database:"+tr(" Connection ")+threadName+ tr(" confirm failed. MSG="); + msg += query.lastError().text(); + emit evt_Message(this,msg); + bNeedReconnect = true; + } + } + if (bNeedReconnect==true) + { + db.close(); + QSqlDatabase::removeDatabase(threadName); + } + } + else + bNeedReconnect = true; + if (bNeedReconnect==true) + { + db = QSqlDatabase::cloneDatabase(QSqlDatabase::database(strDBName),threadName); + if (db.open()==true) + { + QString msg = "Database:"+tr(" Connection ")+threadName+ tr(" Re-Established."); + emit evt_Message(this,msg); + } + else + { + QString msg = "Database:"+tr(" Connection name ")+threadName+ + tr(" Can not be cloned from database %1.").arg(strDBName)+ + tr(" Err String:") + db.lastError().text(); + emit evt_Message(this,msg); + m_ThreadsDB[strDBName].remove(threadName); + return QSqlDatabase(); + + } + } + return db; } void DatabaseResource::remove_connections() { @@ -37,9 +97,10 @@ namespace ZPDatabase{ QMutexLocker locker(&m_mutex_reg); sets = currentDatabaseConnections(); } - foreach (QString name, sets.keys()) - this->remove_connection(name); + { + this->remove_connection(name); + } } //!Remove Database @@ -54,7 +115,8 @@ namespace ZPDatabase{ QSqlDatabase::removeDatabase(strDBName); QString msg = "Database:"+tr(" Connection removed ")+strDBName+ tr(" ."); emit evt_Message(this,msg); - + RemoveTreadsConnections(strDBName); + m_ThreadsDB[strDBName].clear(); } else { @@ -64,6 +126,23 @@ namespace ZPDatabase{ m_dbNames.remove(strDBName) ; } + void DatabaseResource::RemoveTreadsConnections(QString mainName) + { + if (m_ThreadsDB.contains(mainName)) + { + QSet & sethreadNames = m_ThreadsDB[mainName]; + foreach(QString str, sethreadNames) + { + QSqlDatabase db = QSqlDatabase::database(str); + if (db.isOpen()==true) + db.close(); + QSqlDatabase::removeDatabase(str); + QString msg = "Database:"+tr(" Connection removed ")+str+ tr(" ."); + emit evt_Message(this,msg); + } + } + } + /** * @brief add a database connection resource * diff --git a/ZoomPipeline_FuncSvr/database/databaseresource.h b/ZoomPipeline_FuncSvr/database/databaseresource.h index 8a48afc15d45b2d28efd4228023a08f34d932e0d..2a89783d257bc466621204fd78df605088a2aad8 100644 --- a/ZoomPipeline_FuncSvr/database/databaseresource.h +++ b/ZoomPipeline_FuncSvr/database/databaseresource.h @@ -7,12 +7,15 @@ #include #include #include - +#include namespace ZPDatabase{ /** * @brief this class provide an database reource pool.In different thread, workers can get existing db connections * immediately without re-creation operations. The working thread does not maintain db connections, instead of * maintaining, it just using db resources from DatabaseResource + * Important!! When Ever a thread calls DatabaseResource::databse(), a thread-owned dbconnection + * will be cloned from main db connection. be careful, this class does not auto remove connections + * unless main connection has been removed by DatabaseResource::remove_connection(s) * @class DatabaseResource databaseresource.h "ZoomPipeline_FuncSvr/database/databaseresource.h" */ class DatabaseResource : public QThread @@ -67,6 +70,8 @@ namespace ZPDatabase{ bool bTerm; QMutex m_mutex_reg; QMap m_dbNames; + QMap > m_ThreadsDB; + void RemoveTreadsConnections(QString mainName); signals: void evt_Message(QObject *,QString ); public slots: diff --git a/ZoomPipeline_FuncSvr/smartlink/st_client_table.cpp b/ZoomPipeline_FuncSvr/smartlink/st_client_table.cpp index d1f63365346d9dea93e2a0041fabfbc97e4da4eb..14a9278085d5ac0077e39c3663eda26b376f69f1 100644 --- a/ZoomPipeline_FuncSvr/smartlink/st_client_table.cpp +++ b/ZoomPipeline_FuncSvr/smartlink/st_client_table.cpp @@ -5,6 +5,7 @@ #include "st_cross_svr_msg.h" #include #include +#include namespace ExampleServer{ using namespace std::placeholders; st_client_table::st_client_table( diff --git a/ZoomPipeline_FuncSvr/zpmainframe.ui b/ZoomPipeline_FuncSvr/zpmainframe.ui index 07b7b5a761c348bb0d4760c7bd8d1586dd9476e9..2adbfde147c8438c78978db2f8c425a2b09099c9 100644 --- a/ZoomPipeline_FuncSvr/zpmainframe.ui +++ b/ZoomPipeline_FuncSvr/zpmainframe.ui @@ -13,9 +13,6 @@ ZPMainFrame - - -1 - 16 @@ -31,6 +28,9 @@ QTabWidget::Rounded + + -1 + @@ -995,7 +995,7 @@ 0 0 640 - 19 + 23