[ref]同步
This commit is contained in:
parent
fbfa28fc2e
commit
b8c1101693
@ -20,7 +20,10 @@ bool CDbKingbaseApi::doAfterOpen()
|
||||
* SET search_path TO ISCS6000_FSNH;--设置,会话级
|
||||
* ALTER database ISCS6000_FSNH SET search_path TO ISCS6000_FSNH,“$USER”, public;--设置,永久
|
||||
*/
|
||||
QString sSql = "SET search_path TO iscs6000;";
|
||||
/* 为以后搜索方便,保留此注释
|
||||
* QString sSql = QString("SET search_path TO %1;").arg(EMS_DEFAULT_DATABASE) ;
|
||||
*/
|
||||
QString sSql = QString("SET search_path TO %1;").arg(m_objDbPara.getDatabaseName()) ;
|
||||
if ( !execute(sSql) )
|
||||
return false;
|
||||
|
||||
|
||||
@ -1,161 +1,161 @@
|
||||
#include "CDbMySQLApi.h"
|
||||
|
||||
using namespace iot_dbms;
|
||||
|
||||
CDbMySQLApi::CDbMySQLApi()
|
||||
: CDbBaseApi_impl()
|
||||
{
|
||||
}
|
||||
|
||||
CDbMySQLApi::CDbMySQLApi( const CDbPara& objDbPara )
|
||||
: CDbBaseApi_impl( objDbPara )
|
||||
{
|
||||
}
|
||||
|
||||
CDbMySQLApi::~CDbMySQLApi()
|
||||
{
|
||||
}
|
||||
|
||||
QString CDbMySQLApi::getDriverStr() const
|
||||
{
|
||||
return QString( "QMYSQL" );
|
||||
}
|
||||
|
||||
void CDbMySQLApi::setConnectOptions()
|
||||
{
|
||||
// model_studio 调用存储过程的时候会导致超过60s无返回,故不设置超时参数,todo 应该让它优化
|
||||
QString sAppName = QCoreApplication::applicationName().toLower();
|
||||
if ( sAppName=="model_studio" || sAppName=="db_manager" )
|
||||
return;
|
||||
|
||||
//< 经实验,setConnectOptions()必须一次性设置(不可分多行),再次执行setConnectOptions()会覆盖掉之前的
|
||||
//< 在此参数下,60%网络丢包率环境,测试9474次打开数据库:
|
||||
//< 526次大于61秒,其中70~79秒47次,80~89秒4次,90秒1次,112秒1次
|
||||
//< 因此,极端情况下可能触发死锁检测(默认3分钟)自杀,todo 可以考虑增加死锁检测默认值到5分钟
|
||||
m_pDb->setConnectOptions("MYSQL_OPT_CONNECT_TIMEOUT=10;MYSQL_OPT_READ_TIMEOUT=60;MYSQL_OPT_WRITE_TIMEOUT=60");
|
||||
}
|
||||
|
||||
bool CDbMySQLApi::doAfterOpen()
|
||||
{
|
||||
QString sSql = "use " + m_objDbPara.getDatabaseName();
|
||||
if ( !execute(sSql) )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( !execute("set names 'utf8'") )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
//< 历史原因,有些表的长度超长,在MySQL5时代可以的,但现在不行,报错如下:
|
||||
//< SQL EXECUTE ERROR, REASON:Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
|
||||
//< 执行此设置以作兼容,在MySQL5上是默认OFF的
|
||||
execute("SET SESSION innodb_strict_mode = 'OFF'");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CDbMySQLApi::needReconnect()
|
||||
{
|
||||
if ( 2006 == m_nErrorNum )
|
||||
{
|
||||
// 2006错误:MySQL server has gone away,与服务器连接中断
|
||||
return true;
|
||||
}
|
||||
if ( 2013 == m_nErrorNum )
|
||||
{
|
||||
// 2013错误:Lost connection to MySQL server during query
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CDbMySQLApi::drop( const QString& sTableName )
|
||||
{
|
||||
if ( !isOpen() )
|
||||
return false;
|
||||
|
||||
m_sLastSql = QString( "drop table if exists %1;" )
|
||||
.arg( addQuoteMarks(sTableName) );
|
||||
|
||||
QSqlQuery objQuery( m_sLastSql, *m_pDb );
|
||||
m_sErrorStr = objQuery.lastError().text();
|
||||
m_nErrorNum = objQuery.lastError().number();
|
||||
return objQuery.isActive();
|
||||
}
|
||||
|
||||
QString CDbMySQLApi::addQuoteMarks( const QString& sStr ) const
|
||||
{
|
||||
QString strDest( sStr.trimmed() );
|
||||
if ( !strDest.startsWith("`") )
|
||||
strDest = QString("`%1").arg(strDest);
|
||||
if ( !strDest.endsWith("`") )
|
||||
strDest = QString("%1`").arg(strDest);
|
||||
return strDest;
|
||||
}
|
||||
|
||||
QString CDbMySQLApi::convertQuoteMarks( const QString& sStr ) const
|
||||
{
|
||||
QString sTmp = sStr;
|
||||
sTmp = sTmp.replace("\\","\\\\"); /* \ -> \\ */
|
||||
sTmp = sTmp.replace("'","\\'"); /* ' -> \' */
|
||||
//sTmp = sTmp.replace("\"","\\\"");
|
||||
return sTmp;
|
||||
}
|
||||
|
||||
QString CDbMySQLApi::convertToSqlString( const QDateTime& dt ) const
|
||||
{
|
||||
QString strDateTime = dt.toString( "yyyy-MM-dd hh:mm:ss" );
|
||||
strDateTime = QString( "\'%1\'" ).arg( strDateTime );
|
||||
return strDateTime;
|
||||
}
|
||||
|
||||
QString CDbMySQLApi::getHostName()
|
||||
{
|
||||
QString sHostName = "";
|
||||
if ( m_pDb != NULL && m_pDb->isOpen() )
|
||||
{
|
||||
QSqlQuery objQuery = m_pDb->exec("select @@global.hostname");
|
||||
m_sErrorStr = objQuery.lastError().text();
|
||||
m_nErrorNum = objQuery.lastError().number();
|
||||
if ( objQuery.next())
|
||||
sHostName = objQuery.value( 0 ).toString();
|
||||
}
|
||||
return sHostName;
|
||||
}
|
||||
|
||||
bool CDbMySQLApi::lockTable( const QString& sTabelName )
|
||||
{
|
||||
if ( m_pDb != NULL && m_pDb->isOpen() && sTabelName.size()>0 )
|
||||
{
|
||||
QSqlQuery objQuery = m_pDb->exec("LOCK TABLES "+sTabelName+" WRITE");
|
||||
m_sErrorStr = objQuery.lastError().text();
|
||||
m_nErrorNum = objQuery.lastError().number();
|
||||
return objQuery.isActive();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CDbMySQLApi::unlockTable()
|
||||
{
|
||||
if ( m_pDb != NULL && m_pDb->isOpen() )
|
||||
{
|
||||
QSqlQuery objQuery = m_pDb->exec("UNLOCK TABLES");
|
||||
m_sErrorStr = objQuery.lastError().text();
|
||||
m_nErrorNum = objQuery.lastError().number();
|
||||
return objQuery.isActive();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#include "CDbMySQLApi.h"
|
||||
|
||||
using namespace iot_dbms;
|
||||
|
||||
CDbMySQLApi::CDbMySQLApi()
|
||||
: CDbBaseApi_impl()
|
||||
{
|
||||
}
|
||||
|
||||
CDbMySQLApi::CDbMySQLApi( const CDbPara& objDbPara )
|
||||
: CDbBaseApi_impl( objDbPara )
|
||||
{
|
||||
}
|
||||
|
||||
CDbMySQLApi::~CDbMySQLApi()
|
||||
{
|
||||
}
|
||||
|
||||
QString CDbMySQLApi::getDriverStr() const
|
||||
{
|
||||
return QString( "QMYSQL" );
|
||||
}
|
||||
|
||||
void CDbMySQLApi::setConnectOptions()
|
||||
{
|
||||
// model_studio 调用存储过程的时候会导致超过60s无返回,故不设置超时参数,todo 应该让它优化
|
||||
QString sAppName = QCoreApplication::applicationName().toLower();
|
||||
if ( sAppName=="model_studio" || sAppName=="db_manager" )
|
||||
return;
|
||||
|
||||
//< 经实验,setConnectOptions()必须一次性设置(不可分多行),再次执行setConnectOptions()会覆盖掉之前的
|
||||
//< 在此参数下,60%网络丢包率环境,测试9474次打开数据库:
|
||||
//< 526次大于61秒,其中70~79秒47次,80~89秒4次,90秒1次,112秒1次
|
||||
//< 因此,极端情况下可能触发死锁检测(默认3分钟)自杀,todo 可以考虑增加死锁检测默认值到5分钟
|
||||
m_pDb->setConnectOptions("MYSQL_OPT_CONNECT_TIMEOUT=10;MYSQL_OPT_READ_TIMEOUT=60;MYSQL_OPT_WRITE_TIMEOUT=60;MYSQL_OPT_RECONNECT=1");
|
||||
}
|
||||
|
||||
bool CDbMySQLApi::doAfterOpen()
|
||||
{
|
||||
QString sSql = "use " + m_objDbPara.getDatabaseName();
|
||||
if ( !execute(sSql) )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( !execute("set names 'utf8'") )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
//< 历史原因,有些表的长度超长,在MySQL5时代可以的,但现在不行,报错如下:
|
||||
//< SQL EXECUTE ERROR, REASON:Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
|
||||
//< 执行此设置以作兼容,在MySQL5上是默认OFF的
|
||||
execute("SET SESSION innodb_strict_mode = 'OFF'");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CDbMySQLApi::needReconnect()
|
||||
{
|
||||
if ( 2006 == m_nErrorNum )
|
||||
{
|
||||
// 2006错误:MySQL server has gone away,与服务器连接中断
|
||||
return true;
|
||||
}
|
||||
if ( 2013 == m_nErrorNum )
|
||||
{
|
||||
// 2013错误:Lost connection to MySQL server during query
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CDbMySQLApi::drop( const QString& sTableName )
|
||||
{
|
||||
if ( !isOpen() )
|
||||
return false;
|
||||
|
||||
m_sLastSql = QString( "drop table if exists %1;" )
|
||||
.arg( addQuoteMarks(sTableName) );
|
||||
|
||||
QSqlQuery objQuery( m_sLastSql, *m_pDb );
|
||||
m_sErrorStr = objQuery.lastError().text();
|
||||
m_nErrorNum = objQuery.lastError().number();
|
||||
return objQuery.isActive();
|
||||
}
|
||||
|
||||
QString CDbMySQLApi::addQuoteMarks( const QString& sStr ) const
|
||||
{
|
||||
QString strDest( sStr.trimmed() );
|
||||
if ( !strDest.startsWith("`") )
|
||||
strDest = QString("`%1").arg(strDest);
|
||||
if ( !strDest.endsWith("`") )
|
||||
strDest = QString("%1`").arg(strDest);
|
||||
return strDest;
|
||||
}
|
||||
|
||||
QString CDbMySQLApi::convertQuoteMarks( const QString& sStr ) const
|
||||
{
|
||||
QString sTmp = sStr;
|
||||
sTmp = sTmp.replace("\\","\\\\"); /* \ -> \\ */
|
||||
sTmp = sTmp.replace("'","\\'"); /* ' -> \' */
|
||||
//sTmp = sTmp.replace("\"","\\\"");
|
||||
return sTmp;
|
||||
}
|
||||
|
||||
QString CDbMySQLApi::convertToSqlString( const QDateTime& dt ) const
|
||||
{
|
||||
QString strDateTime = dt.toString( "yyyy-MM-dd hh:mm:ss" );
|
||||
strDateTime = QString( "\'%1\'" ).arg( strDateTime );
|
||||
return strDateTime;
|
||||
}
|
||||
|
||||
QString CDbMySQLApi::getHostName()
|
||||
{
|
||||
QString sHostName = "";
|
||||
if ( m_pDb != NULL && m_pDb->isOpen() )
|
||||
{
|
||||
QSqlQuery objQuery = m_pDb->exec("select @@global.hostname");
|
||||
m_sErrorStr = objQuery.lastError().text();
|
||||
m_nErrorNum = objQuery.lastError().number();
|
||||
if ( objQuery.next())
|
||||
sHostName = objQuery.value( 0 ).toString();
|
||||
}
|
||||
return sHostName;
|
||||
}
|
||||
|
||||
bool CDbMySQLApi::lockTable( const QString& sTabelName )
|
||||
{
|
||||
if ( m_pDb != NULL && m_pDb->isOpen() && sTabelName.size()>0 )
|
||||
{
|
||||
QSqlQuery objQuery = m_pDb->exec("LOCK TABLES "+sTabelName+" WRITE");
|
||||
m_sErrorStr = objQuery.lastError().text();
|
||||
m_nErrorNum = objQuery.lastError().number();
|
||||
return objQuery.isActive();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CDbMySQLApi::unlockTable()
|
||||
{
|
||||
if ( m_pDb != NULL && m_pDb->isOpen() )
|
||||
{
|
||||
QSqlQuery objQuery = m_pDb->exec("UNLOCK TABLES");
|
||||
m_sErrorStr = objQuery.lastError().text();
|
||||
m_nErrorNum = objQuery.lastError().number();
|
||||
return objQuery.isActive();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -21,7 +21,10 @@ bool CDbOpenGaussApi::doAfterOpen()
|
||||
* SET search_path TO ISCS6000_FSNH;--设置,会话级
|
||||
* ALTER database ISCS6000_FSNH SET search_path TO ISCS6000_FSNH,“$USER”, public;--设置,永久
|
||||
*/
|
||||
QString sSql = "SET search_path TO iscs6000;";
|
||||
/*为以后搜索方便,保留此注释
|
||||
* QString sSql = QString("SET search_path TO %1;").arg(EMS_DEFAULT_DATABASE) ;
|
||||
*/
|
||||
QString sSql = QString("SET search_path TO %1;").arg(m_objDbPara.getDatabaseName()) ;
|
||||
if ( !execute(sSql) )
|
||||
return false;
|
||||
|
||||
|
||||
@ -19,8 +19,6 @@
|
||||
|
||||
|
||||
#define CONNECTION_NAME PROCESS_NAME
|
||||
#define DATABASE_NAME "iscs6000"
|
||||
#define TSDB_DB_NAME "iscs6000"
|
||||
#define DB_FILE_NAME "db_export.sql"
|
||||
#define TSDB_FILE_NAME "tsdb_export.sql.gz"
|
||||
|
||||
@ -79,7 +77,11 @@ bool CDumpUtils::getDbConn(const CDbHisCfg &dbCfg,iot_dbms::CDbBaseApi &objDb)
|
||||
objPara.setPort(3306);
|
||||
objPara.setDbType(iot_dbms::EDbType::DB_MYSQL);
|
||||
}
|
||||
objPara.setDatabaseName(DATABASE_NAME);
|
||||
|
||||
/* 为以后搜索方便,保留此注释
|
||||
* objPara.setDatabaseName(EMS_DEFAULT_DATABASE);
|
||||
*/
|
||||
objPara.setDatabaseName(dbCfg.strDbName);
|
||||
objDb.setDbPara(objPara);
|
||||
|
||||
bool ok = objDb.open();
|
||||
@ -90,6 +92,11 @@ bool CDumpUtils::getDbConn(const CDbHisCfg &dbCfg,iot_dbms::CDbBaseApi &objDb)
|
||||
//获取首链接连接
|
||||
{
|
||||
iot_public::CSysInfoInterfacePtr ptrSysInfo;
|
||||
if(!iot_public::createSysInfoInstance(ptrSysInfo))
|
||||
{
|
||||
LOGERROR( "createSysInfoInstance 返回失败" );
|
||||
return false;
|
||||
}
|
||||
iot_public::SDatabaseInfo stFirstConnectInfo; //数据库连接信息
|
||||
std::vector<iot_public::SDatabaseInfo> vecLocalDbInfo;
|
||||
std::vector<iot_public::SDatabaseInfo> vecRemoteDbInfo;
|
||||
@ -180,8 +187,11 @@ bool CDumpUtils::doBackup(const CDbHisCfg &dbCfg)
|
||||
qint64 expired_days_timestamp = expired_days.toMSecsSinceEpoch();
|
||||
//====================================================================
|
||||
|
||||
/* 为以后搜索方便,保留此注释
|
||||
* hismng.exportHisPartV2(objDb.getDatabase(),"127.0.0.1",EMS_DEFAULT_DATABASE,0,expired_days_timestamp,dbFilePath,tsdbFilePath);
|
||||
*/
|
||||
iot_dbms::CHisMngApi hismng;
|
||||
hismng.exportHisPartV2(objDb.getDatabase(),"127.0.0.1",TSDB_DB_NAME,0,expired_days_timestamp,dbFilePath,tsdbFilePath);
|
||||
hismng.exportHisPartV2(objDb.getDatabase(),"127.0.0.1",objDb.getDbPara().getDatabaseName(),0,expired_days_timestamp,dbFilePath,tsdbFilePath);
|
||||
|
||||
//< 生成配置
|
||||
LOGINFO("start to generate config");
|
||||
@ -211,7 +221,10 @@ bool CDumpUtils::doBackup(const CDbHisCfg &dbCfg)
|
||||
|
||||
|
||||
//< 数据库
|
||||
entry.setAttribute("databaseName", DATABASE_NAME);
|
||||
/* 为以后搜索方便,保留此注释
|
||||
* entry.setAttribute("databaseName", EMS_DEFAULT_DATABASE);
|
||||
*/
|
||||
entry.setAttribute("databaseName", objDb.getDbPara().getDatabaseName());
|
||||
|
||||
//< 备份名称
|
||||
entry.setAttribute("configName", QDateTime::currentDateTime().toString(QObject::tr("yyyy年M月d日h时m分s秒")));
|
||||
@ -252,7 +265,10 @@ bool CDumpUtils::doClean(const CDbHisCfg &dbCfg, bool isAll)
|
||||
//====================================================================
|
||||
|
||||
iot_dbms::CHisMngApi hismng;
|
||||
hismng.delHis(objDb.getDatabase(),"127.0.0.1",TSDB_DB_NAME,expired_days_timestamp);
|
||||
/* 为以后搜索方便,保留此注释
|
||||
* hismng.delHis(objDb.getDatabase(),"127.0.0.1",EMS_DEFAULT_DATABASE,expired_days_timestamp);
|
||||
*/
|
||||
hismng.delHisV2(objDb.getDatabase(),"127.0.0.1",objDb.getDbPara().getDatabaseName(),expired_days_timestamp);
|
||||
|
||||
QString logPath = QCoreApplication::applicationDirPath() + "/../../log/";
|
||||
// 清理日志
|
||||
|
||||
@ -52,6 +52,7 @@ bool CDbHisCfg::loadFromFile()
|
||||
strUsername = node.attribute("username");
|
||||
strPasswd = node.attribute("passwd");
|
||||
strDbType = node.attribute("dbType");
|
||||
strDbName = node.attribute("dbName");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -13,9 +13,15 @@ public:
|
||||
int nTrigWeekDay = 7; // 在星期几触发
|
||||
int nTrigHour = 1; // 触发小时数 24小时制
|
||||
int nTrigMin = 0; // 触发分钟数
|
||||
QString strUsername = "root";
|
||||
QString strPasswd = "kbdct@0755";
|
||||
QString strDbType = "QMYSQL";
|
||||
/* 为方便检索,暂时保留此注释,同时为避免出错,取消默认参数
|
||||
* QString strUsername = "root";
|
||||
* QString strPasswd = EMS_DEFAULT_PASSWD;
|
||||
* QString strDbType = "QMYSQL";
|
||||
*/
|
||||
QString strUsername = "";
|
||||
QString strPasswd = "";
|
||||
QString strDbType = "";
|
||||
QString strDbName = "";
|
||||
int nTrigType = 1;
|
||||
int nTrigAction = 1;
|
||||
int nTrigVolume = 90;
|
||||
|
||||
@ -31,7 +31,7 @@ win32-msvc:contains(QMAKE_HOST.arch, x86_64){
|
||||
|
||||
LIBS += -lboost_system -lboost_filesystem \
|
||||
-llog4cplus -lpub_logger_api \
|
||||
-lpub_utility_api -ldb_his_mng_api -ldb_base_api
|
||||
-lpub_utility_api -ldb_his_mng_api -ldb_base_api -lpub_sysinfo_api
|
||||
|
||||
HEADERS += \
|
||||
CDumpUtils.h \
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
|
||||
|
||||
CChunkedJsonHandler::CChunkedJsonHandler(QString strFilePath):
|
||||
CChunkedJsonHandler::CChunkedJsonHandler(const QString &strDbName,const QString &strFilePath):
|
||||
state_(kExpectObjectStart),
|
||||
nIndex(0),
|
||||
m_gGzipOs(strFilePath)
|
||||
@ -13,7 +13,7 @@ CChunkedJsonHandler::CChunkedJsonHandler(QString strFilePath):
|
||||
return ;
|
||||
}
|
||||
|
||||
genDMLHeader(m_gGzipOs);
|
||||
genDMLHeader(strDbName,m_gGzipOs);
|
||||
}
|
||||
|
||||
|
||||
@ -259,11 +259,12 @@ bool CChunkedJsonHandler::RawNumber(const Ch *str, SizeType length, bool copy){
|
||||
}
|
||||
}
|
||||
|
||||
void CChunkedJsonHandler::genDMLHeader(CChunkedJsonHandler::CGZipOStream &os)
|
||||
void CChunkedJsonHandler::genDMLHeader(const QString &strDbName,CChunkedJsonHandler::CGZipOStream &os)
|
||||
{
|
||||
/* 为以后搜索方便,保留此注释 EMS_DEFAULT_DATABASE */
|
||||
os << "# DDL\n"
|
||||
<< "CREATE DATABASE iscs6000 WITH NAME autogen\n";
|
||||
os << "# DML\n" << "# CONTEXT-DATABASE:iscs6000\n"
|
||||
<< "CREATE DATABASE " << strDbName.toStdString().c_str() << " WITH NAME autogen\n";
|
||||
os << "# DML\n" << "# CONTEXT-DATABASE:" << strDbName.toStdString().c_str() <<"\n"
|
||||
<< "# CONTEXT-RETENTION-POLICY:autogen\n"
|
||||
<< "# writing tsm data\n";
|
||||
}
|
||||
|
||||
@ -73,7 +73,7 @@ struct CChunkedJsonHandler : public rapidjson::BaseReaderHandler<rapidjson::UTF8
|
||||
const size_t m_nBufSize;
|
||||
size_t m_nInLen; //当前缓冲区需要压缩的数据长度
|
||||
};
|
||||
CChunkedJsonHandler(QString strFilePath);
|
||||
CChunkedJsonHandler(const QString &strDbName, const QString &strFilePath);
|
||||
bool StartObject();
|
||||
bool EndObject(SizeType memberCount);
|
||||
|
||||
@ -120,7 +120,7 @@ struct CChunkedJsonHandler : public rapidjson::BaseReaderHandler<rapidjson::UTF8
|
||||
kExpectResultObjectValueBool,
|
||||
}state_;
|
||||
|
||||
static void genDMLHeader(CGZipOStream& os);
|
||||
static void genDMLHeader(const QString &strDbName,CGZipOStream& os);
|
||||
|
||||
|
||||
std::string m_strCurMeasurementName;
|
||||
|
||||
@ -97,6 +97,22 @@ void iot_dbms::CHisMngApi::delHis(QSqlDatabase *conn, const QString &ip, const Q
|
||||
emit delHisFinished(false);
|
||||
}
|
||||
|
||||
void iot_dbms::CHisMngApi::delHisAllV2(QSqlDatabase *conn, const QString &ip, const QString &databaseName)
|
||||
{
|
||||
if(m_pImp->delHisAllV2(*conn,ip,databaseName))
|
||||
emit delHisAllFinished(true);
|
||||
else
|
||||
emit delHisAllFinished(false);
|
||||
}
|
||||
|
||||
void iot_dbms::CHisMngApi::delHisV2(QSqlDatabase *conn, const QString &ip, const QString &databaseName, qint64 endTimeStamp)
|
||||
{
|
||||
if(m_pImp->delHisV2(*conn,ip,databaseName,endTimeStamp))
|
||||
emit delHisFinished(true);
|
||||
else
|
||||
emit delHisFinished(false);
|
||||
}
|
||||
|
||||
void iot_dbms::CHisMngApi::needTerminate()
|
||||
{
|
||||
m_pImp->needTerminate();
|
||||
|
||||
@ -111,7 +111,8 @@ bool iot_dbms::CHisMngApiImp::getColumnMySQL(QSqlDatabase &conn, const QString &
|
||||
|
||||
bool iot_dbms::CHisMngApiImp::getColumnPostgres(QSqlDatabase &conn, const QString &sTableName, QList<iot_dbms::CHisMngApiImp::SColumn> &listColumn)
|
||||
{
|
||||
QString sSql = "SELECT * from "
|
||||
/* 为以后搜索方便,保留此注释 EMS_DEFAULT_DATABASE */
|
||||
QString sSql = QString("SELECT * from "
|
||||
"(SELECT "
|
||||
" DISTINCT ON (pg_attribute.attname) pg_attribute.attname, "
|
||||
"format_type(pg_attribute.atttypid, pg_attribute.atttypmod), "
|
||||
@ -119,11 +120,11 @@ bool iot_dbms::CHisMngApiImp::getColumnPostgres(QSqlDatabase &conn, const QStrin
|
||||
"attnotnull,attnum "
|
||||
"FROM pg_index, pg_class, pg_attribute, pg_namespace "
|
||||
"WHERE pg_attribute.attnum > 0 AND "
|
||||
"pg_class.oid = '" + sTableName + "'::regclass "
|
||||
"AND nspname = 'iscs6000' "
|
||||
"pg_class.oid = '%1'::regclass "
|
||||
"AND nspname = '%2' "
|
||||
"AND pg_class.relnamespace = pg_namespace.oid "
|
||||
"AND pg_attribute.attrelid = pg_class.oid "
|
||||
"AND pg_attribute.attisdropped = false) as ts order by attnum;";
|
||||
"AND pg_attribute.attisdropped = false) as ts order by attnum;").arg(sTableName).arg(conn.databaseName());
|
||||
QSqlQuery query( conn );
|
||||
if ( query.exec( sSql ) == false ){
|
||||
logError(query.lastError().text());
|
||||
@ -280,8 +281,20 @@ bool iot_dbms::CHisMngApiImp::exportTables(QSqlDatabase &conn, qint64 startTimeS
|
||||
|
||||
bool iot_dbms::CHisMngApiImp::exportTsdbBin(const QString &ip, const QString &dbName, const QString &dirPath, qint64 startTime, qint64 endTime)
|
||||
{
|
||||
QString program = "influxd";//备份工具
|
||||
|
||||
|
||||
QStringList arguments;
|
||||
QString program;//备份工具
|
||||
|
||||
#ifdef OS_WINDOWS
|
||||
program = "influxd";
|
||||
#endif
|
||||
|
||||
#ifdef OS_LINUX
|
||||
program = "pkexec";
|
||||
arguments << "influxd";
|
||||
#endif
|
||||
|
||||
arguments << "backup" << "-host" << ip+":8088" << "-portable" << "-database" << dbName;
|
||||
if(startTime != 0){
|
||||
arguments << "-start" << QDateTime::fromMSecsSinceEpoch(startTime).toTimeSpec(Qt::OffsetFromUTC).toString(Qt::ISODate);
|
||||
@ -290,38 +303,47 @@ bool iot_dbms::CHisMngApiImp::exportTsdbBin(const QString &ip, const QString &db
|
||||
arguments << "-end" << QDateTime::fromMSecsSinceEpoch(endTime).toTimeSpec(Qt::OffsetFromUTC).toString(Qt::ISODate);
|
||||
}
|
||||
|
||||
arguments << dirPath;
|
||||
arguments << QDir::toNativeSeparators(dirPath);
|
||||
LOGINFO("arguments is [%s]",arguments.join(" ").toStdString().c_str());
|
||||
m_pExportProc->start(program,arguments);
|
||||
|
||||
if(!m_pExportProc->waitForFinished(-1))
|
||||
{
|
||||
//< todo 导出错误
|
||||
logStatus("log here #1023");
|
||||
QString errorLog = m_pExportProc->errorString();
|
||||
QString stdOut = m_pExportProc->readAllStandardOutput();
|
||||
QString stdErr = m_pExportProc->readAllStandardError();
|
||||
logError("Export failed: " + errorLog + "\nOutput: " + stdOut + "\nError: " + stdErr);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool iot_dbms::CHisMngApiImp::exportTsdbByInspect(const QString &dbName, const QString &dstFilePath, qint64 startTime, qint64 endTime)
|
||||
bool iot_dbms::CHisMngApiImp::exportTsdbByInspect(const STsdbConnParam &connParam, const QString &dstFilePath, qint64 startTime, qint64 endTime)
|
||||
{
|
||||
|
||||
if(!isTsdbDbExist(dbName,"127.0.0.1"))
|
||||
if(!isTsdbDbExist(connParam))
|
||||
return false;
|
||||
|
||||
m_pExportProc->terminate();
|
||||
m_pExportProc->kill();
|
||||
QString program = "influx_inspect";
|
||||
|
||||
QString program;
|
||||
QStringList arguments;
|
||||
|
||||
arguments << "export" << "-compress" << "-database" << dbName ;
|
||||
|
||||
#ifdef OS_WINDOWS
|
||||
program = "influx_inspect";
|
||||
QString influxdb_home = qgetenv("INFLUXDB_HOME");
|
||||
|
||||
arguments << "export" << "-compress" << "-database" << connParam.strDbName.c_str() ;
|
||||
arguments << QString() + "-datadir=" + influxdb_home + "influxdb_data\\data";
|
||||
arguments << QString() + "-waldir=" + influxdb_home + "influxdb_data\\wal";
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef OS_LINUX
|
||||
program = "pkexec";
|
||||
arguments << "influx_inspect";
|
||||
arguments << "export" << "-compress" << "-database" << connParam.strDbName.c_str() ;
|
||||
arguments << "-datadir=/var/lib/influxdb/data";
|
||||
arguments << "-waldir=/var/lib/influxdb/wal";
|
||||
#endif
|
||||
@ -334,11 +356,13 @@ bool iot_dbms::CHisMngApiImp::exportTsdbByInspect(const QString &dbName, const Q
|
||||
|
||||
while(!m_pExportProc->waitForFinished(1))
|
||||
{
|
||||
QProcess::ProcessError error = m_pExportProc->error();
|
||||
QCoreApplication::processEvents(QEventLoop::AllEvents,100);
|
||||
if(is_stop)
|
||||
if(is_stop || (error != QProcess::UnknownError && error != QProcess::Timedout))
|
||||
{
|
||||
is_stop = false;
|
||||
logStatus(tr("停止转储"));
|
||||
logError("Export failed: " + m_pExportProc->errorString());
|
||||
m_pExportProc->terminate();
|
||||
m_pExportProc->kill();
|
||||
return false;
|
||||
@ -362,7 +386,7 @@ void iot_dbms::CHisMngApiImp::slotBackupProgressHandler()
|
||||
}
|
||||
else if(result.contains("backup failed: EOF"))
|
||||
{
|
||||
logError(tr("备份历史数据失败,检查iscs6000是否正确配置"));
|
||||
logError(tr("备份历史数据失败,检查数据库是否正确配置"));
|
||||
m_pExportProc->kill();
|
||||
}
|
||||
else if(result.contains("Download shard 0 failed"))
|
||||
@ -393,9 +417,9 @@ void iot_dbms::CHisMngApiImp::slotBackupFinishedHandler(int exitCode, QProcess::
|
||||
// logStatus(tr("导出完成"));
|
||||
}
|
||||
|
||||
bool iot_dbms::CHisMngApiImp::isTsdbDbExist(const QString &database, const QString &ip)
|
||||
bool iot_dbms::CHisMngApiImp::isTsdbDbExist(const STsdbConnParam &connParam)
|
||||
{
|
||||
iot_dbms::CTsdbConn db_conn(ip.toStdString().c_str());
|
||||
iot_dbms::CTsdbConn db_conn(connParam);
|
||||
if(!db_conn.pingServer())
|
||||
{
|
||||
logError(tr("数据库测试连接失败"));
|
||||
@ -407,7 +431,7 @@ bool iot_dbms::CHisMngApiImp::isTsdbDbExist(const QString &database, const QStri
|
||||
|
||||
if(db_conn.doQuery(sql, &result, 1000))
|
||||
{
|
||||
if (result.find(database.toStdString()) != std::string::npos) {
|
||||
if (result.find(connParam.strDbName) != std::string::npos) {
|
||||
return true;
|
||||
}
|
||||
logError(tr("时序库不存在"));
|
||||
@ -431,6 +455,83 @@ bool iot_dbms::CHisMngApiImp::isLocalhost(const QString &addr)
|
||||
return false;
|
||||
}
|
||||
|
||||
bool iot_dbms::CHisMngApiImp::hasDataByPeriod(const STsdbConnParam& connParam,const QString& measurement, qint64 startTime, qint64 endTime,QString& queryErr)
|
||||
{
|
||||
QProcess process;
|
||||
QString delProgram = "influx";
|
||||
QString sql=QString("SELECT COUNT(*) FROM %1 WHERE time >= %2ms AND time <= %3ms LIMIT 1").arg(measurement).arg(startTime).arg(endTime);
|
||||
QStringList arguments;
|
||||
arguments << "-username" << QString::fromStdString(connParam.strUserName)
|
||||
<< "-password" << QString::fromStdString(connParam.strUserPassword)
|
||||
<< "-host"
|
||||
<< QString::fromStdString(connParam.strIP)
|
||||
<< "-execute"
|
||||
<< sql
|
||||
<< QString("-database=")+ QString::fromStdString(connParam.strDbName);
|
||||
process.start(delProgram, arguments);
|
||||
if (!process.waitForFinished(-1)) {
|
||||
QByteArray errorOutput = process.readAllStandardError();
|
||||
queryErr=QString::fromUtf8(errorOutput);
|
||||
LOGERROR("exec-influxdb-cleanData-ERR: %s %s err(%s)",delProgram.toStdString().c_str(),arguments.join(" ").toStdString().c_str(),queryErr.toStdString().c_str());
|
||||
return false;
|
||||
}
|
||||
QByteArray standardOutput = process.readAllStandardOutput();
|
||||
QByteArray errorOutput = process.readAllStandardError();
|
||||
if(!errorOutput.isEmpty())
|
||||
{
|
||||
queryErr=QString::fromUtf8(errorOutput);
|
||||
LOGERROR("exec-influxdb-cleanData-ERR: %s %s err(%s)",delProgram.toStdString().c_str(),arguments.join(" ").toStdString().c_str(),queryErr.toStdString().c_str());
|
||||
return false;
|
||||
}
|
||||
LOGTRACE("exec-influxdb-cleanData-ifHasData-ok: %s %s",delProgram.toStdString().c_str(),arguments.join(" ").toStdString().c_str());
|
||||
if(!standardOutput.isEmpty())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
void iot_dbms::CHisMngApiImp::deleteDataByPeriod(const STsdbConnParam& connParam,const QString& measurement, qint64 startTime, qint64 endTime,QString& queryErr)
|
||||
{
|
||||
QProcess process;
|
||||
QString delProgram = "influx";
|
||||
QString sql=QString("delete from %1 WHERE time >= %2ms AND time <= %3ms ").arg(measurement).arg(startTime).arg(endTime);
|
||||
QStringList arguments;
|
||||
arguments << "-username" << QString::fromStdString(connParam.strUserName)
|
||||
<< "-password" << QString::fromStdString(connParam.strUserPassword)
|
||||
<< "-host"
|
||||
<< QString::fromStdString(connParam.strIP)
|
||||
<< "-execute"
|
||||
<< sql
|
||||
<< QString("-database=")+ QString::fromStdString(connParam.strDbName);
|
||||
process.start(delProgram, arguments);
|
||||
if (!process.waitForFinished(-1)) {
|
||||
QByteArray errorOutput = process.readAllStandardError();
|
||||
queryErr=QString::fromUtf8(errorOutput);
|
||||
LOGERROR("exec-influxdb-cleanData-ERR: %s %s err(%s)",delProgram.toStdString().c_str(),arguments.join(" ").toStdString().c_str(),queryErr.toStdString().c_str());
|
||||
return ;
|
||||
}
|
||||
QByteArray standardOutput = process.readAllStandardOutput();
|
||||
QByteArray errorOutput = process.readAllStandardError();
|
||||
if(!errorOutput.isEmpty())
|
||||
{
|
||||
queryErr=QString::fromUtf8(errorOutput);
|
||||
LOGERROR("exec-influxdb-deleteData-ERR: %s %s err(%s)",delProgram.toStdString().c_str(),arguments.join(" ").toStdString().c_str(),queryErr.toStdString().c_str());
|
||||
return ;
|
||||
}
|
||||
LOGTRACE("exec-influxdb-deleteData-ok: %s %s",delProgram.toStdString().c_str(),arguments.join(" ").toStdString().c_str());
|
||||
if(!standardOutput.isEmpty())
|
||||
{
|
||||
//正常不应该有标准输出
|
||||
queryErr=QString::fromUtf8(standardOutput);
|
||||
LOGERROR("exec-influxdb-deleteData-out: %s %s out(%s)",delProgram.toStdString().c_str(),arguments.join(" ").toStdString().c_str(),queryErr.toStdString().c_str());
|
||||
return ;
|
||||
}
|
||||
}
|
||||
|
||||
std::string iot_dbms::CHisMngApiImp::genUrlHisEvent(const QString &ip, const QString &databaseName, qint64 startTime, qint64 endTime)
|
||||
{
|
||||
QString strStartTime = QString::number(startTime);
|
||||
@ -548,6 +649,10 @@ std::string iot_dbms::CHisMngApiImp::genUrlHis(const QString &ip, const QString
|
||||
|
||||
bool iot_dbms::CHisMngApiImp::optimizeTable(QSqlDatabase &conn, const QString &tableName)
|
||||
{
|
||||
if(!isMySqL(conn))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
QString sql = "optimize table "+ tableName;
|
||||
return executeSql(conn,sql);
|
||||
}
|
||||
@ -819,7 +924,7 @@ bool iot_dbms::CHisMngApiImp::exportHisEventTsdb(const QString &ip,
|
||||
rapidjson::Reader reader;
|
||||
|
||||
{
|
||||
CChunkedJsonHandler handler(dstFilePath);
|
||||
CChunkedJsonHandler handler(databaseName,dstFilePath);
|
||||
while(1)
|
||||
{
|
||||
if(reader.Parse<rapidjson::kParseNumbersAsStringsFlag>(stream,handler))
|
||||
@ -864,7 +969,7 @@ bool iot_dbms::CHisMngApiImp::exportTsdbByQuery(const QString &ip, const QString
|
||||
rapidjson::Reader reader;
|
||||
|
||||
{
|
||||
CChunkedJsonHandler handler(dstFilePath);
|
||||
CChunkedJsonHandler handler(dbName,dstFilePath);
|
||||
while(1)
|
||||
{
|
||||
if(reader.Parse<rapidjson::kParseNumbersAsStringsFlag>(stream,handler))
|
||||
@ -896,7 +1001,7 @@ bool iot_dbms::CHisMngApiImp::exportHisData(const QString &ip, const QString &da
|
||||
rapidjson::Reader reader;
|
||||
|
||||
{
|
||||
CChunkedJsonHandler handler(dstFilePath);
|
||||
CChunkedJsonHandler handler(databaseName,dstFilePath);
|
||||
while(1)
|
||||
{
|
||||
if(reader.Parse<rapidjson::kParseNumbersAsStringsFlag>(stream,handler))
|
||||
@ -956,8 +1061,13 @@ bool iot_dbms::CHisMngApiImp::exportHisDump(QSqlDatabase &conn, const QString &d
|
||||
|
||||
logStatus("正在导出时序库内容");
|
||||
|
||||
STsdbConnParam connParam; //ip和port不指定则默认本机默认端口8086
|
||||
connParam.strUserName = tsdbName.toStdString();
|
||||
connParam.strUserPassword = conn.password().toStdString(); //todo:此处有风险,如果QSqlDatabase直接调用的open(user,password)接口,则此函数获取不到密码
|
||||
connParam.strDbName = tsdbName.toStdString();
|
||||
|
||||
//< 历史事件时序库
|
||||
if(!exportTsdbByInspect(tsdbName,tsdbFilePath,1,endTimeStamp))
|
||||
if(!exportTsdbByInspect(connParam,tsdbFilePath,1,endTimeStamp))
|
||||
{
|
||||
logError(tr("无法导出时序库内容"));
|
||||
return false;
|
||||
@ -1033,12 +1143,16 @@ bool iot_dbms::CHisMngApiImp::exportHisPartV2(QSqlDatabase conn, const QString &
|
||||
}
|
||||
logStatus(tr("关系库历史事件导出完成"));
|
||||
|
||||
|
||||
logStatus(tr("开始导出时序库历史"));
|
||||
if( isLocalhost(ip) )
|
||||
{
|
||||
// 本地接口导出
|
||||
if(!exportTsdbByInspect(tsdbDbName,tsdbFilePath,starttime,endtime))
|
||||
STsdbConnParam connParam; //ip和port不指定则默认本机默认端口8086
|
||||
connParam.strUserName = conn.databaseName().toStdString();
|
||||
connParam.strUserPassword = conn.password().toStdString(); //todo:此处有风险,如果QSqlDatabase直接调用的open(user,password)接口,则此函数获取不到密码
|
||||
connParam.strDbName = conn.databaseName().toStdString();
|
||||
|
||||
if(!exportTsdbByInspect(connParam,tsdbFilePath,starttime,endtime))
|
||||
{
|
||||
logError(tr("导出时序库历史错误"));
|
||||
return false;
|
||||
@ -1081,7 +1195,7 @@ bool iot_dbms::CHisMngApiImp::importHisPart(QSqlDatabase &conn,
|
||||
|
||||
//< 导入时序库历史事件
|
||||
logStatus(tr("开始导入时序库历史事件"));
|
||||
if(!importTsdbSQL(ip,tsdbDbName,tsdbEventFilePath,true))
|
||||
if(!importTsdbSQL(ip,tsdbDbName,conn.password(),tsdbDbName,tsdbEventFilePath,true))
|
||||
{
|
||||
logError(tr("导出时序库历史事件错误"));
|
||||
return false;
|
||||
@ -1094,7 +1208,7 @@ bool iot_dbms::CHisMngApiImp::importHisPart(QSqlDatabase &conn,
|
||||
{
|
||||
//< 导入时序库采样数据
|
||||
logStatus(tr("开始导入时序库采样数据"));
|
||||
if(!importTsdbSQL(ip,tsdbDbName,tsdbDataFilePath,true))
|
||||
if(!importTsdbSQL(ip,tsdbDbName,conn.password(),tsdbDbName,tsdbDataFilePath,true))
|
||||
{
|
||||
logError(tr("导入时序库采样数据错误"));
|
||||
return false;
|
||||
@ -1117,7 +1231,7 @@ bool iot_dbms::CHisMngApiImp::importHisPartV2(QSqlDatabase conn, const QString &
|
||||
|
||||
//< 导入时序库采样数据
|
||||
logStatus(tr("开始导入时序库采样数据"));
|
||||
if(!importTsdbSQL(ip,tsdbDbName,tsdbFilePath,false))
|
||||
if(!importTsdbSQL(ip,tsdbDbName,conn.password(),tsdbDbName,tsdbFilePath,false))
|
||||
{
|
||||
logError(tr("导入时序库数据错误"));
|
||||
return false;
|
||||
@ -1126,19 +1240,44 @@ bool iot_dbms::CHisMngApiImp::importHisPartV2(QSqlDatabase conn, const QString &
|
||||
return true;
|
||||
}
|
||||
|
||||
bool iot_dbms::CHisMngApiImp::delHisTsdb(const QString &ip, const QString &databaseName, qint64 endTimeStamp)
|
||||
bool iot_dbms::CHisMngApiImp::delHisTsdb(const QString &ip,const QString &userName, const QString &password, const QString &databaseName, qint64 endTimeStamp)
|
||||
{
|
||||
QString delProgram("influx");
|
||||
STsdbConnParam connParam;
|
||||
connParam.strIP = ip.toStdString();
|
||||
connParam.strUserName = userName.toStdString();
|
||||
connParam.strUserPassword = password.toStdString();
|
||||
connParam.strDbName = databaseName.toStdString();
|
||||
|
||||
int result = 0;
|
||||
if(isTsdbDbExist(connParam))
|
||||
{
|
||||
QString delProgram("influx");
|
||||
|
||||
// example influx -execute "DELETE WHERE time < '2016-01-01'" -database="xxx"
|
||||
QStringList arguments;
|
||||
QString sql = "DELETE WHERE time < " + QString::number(endTimeStamp) +"ms";
|
||||
|
||||
/* 为以后搜索方便,保留此注释
|
||||
* arguments << "-username" << EMS_DEFAULT_DATABASE
|
||||
* << "-password" << EMS_DEFAULT_PASSWD
|
||||
* << "-host"
|
||||
* << ip
|
||||
* << "-execute"
|
||||
* << sql
|
||||
* << QString("-database=")+ databaseName;
|
||||
*/
|
||||
arguments << "-username" << userName
|
||||
<< "-password" << password
|
||||
<< "-host"
|
||||
<< ip
|
||||
<< "-execute"
|
||||
<< sql
|
||||
<< QString("-database=")+ databaseName;
|
||||
|
||||
result = QProcess::execute(delProgram,arguments);
|
||||
LOGINFO("执行清理时序数据: %s %s",delProgram.toStdString().c_str(),arguments.join(" ").toStdString().c_str());
|
||||
}
|
||||
|
||||
// example influx -execute "DELETE WHERE time < '2016-01-01'" -database="iscs6000"
|
||||
QStringList arguments;
|
||||
QString sql = "DELETE WHERE time < " + QString::number(endTimeStamp) +"ms";
|
||||
arguments << "-host"
|
||||
<< ip
|
||||
<< "-execute"
|
||||
<< sql
|
||||
<< QString("-database=")+ databaseName;
|
||||
int result = QProcess::execute(delProgram,arguments);
|
||||
if( 0 == result)
|
||||
{
|
||||
//< to-do
|
||||
@ -1163,6 +1302,110 @@ bool iot_dbms::CHisMngApiImp::delHisTsdb(const QString &ip, const QString &datab
|
||||
return true;
|
||||
}
|
||||
|
||||
bool iot_dbms::CHisMngApiImp::delHisTsdbV2(const QString &ip, const QString &userName, const QString &password, const QString &databaseName, qint64 endTimeStamp)
|
||||
{
|
||||
STsdbConnParam connParam;
|
||||
connParam.strIP = ip.toStdString();
|
||||
connParam.strUserName = userName.toStdString();
|
||||
connParam.strUserPassword = password.toStdString();
|
||||
connParam.strDbName = databaseName.toStdString();
|
||||
QDateTime endDateTime = QDateTime::fromMSecsSinceEpoch(endTimeStamp);
|
||||
bool handlResult=true;
|
||||
QString queryErr="";
|
||||
QStringList tableNames;
|
||||
tableNames<<"acc_sample_result";
|
||||
tableNames<<"ai_sample_result";
|
||||
tableNames<<"di_sample_result";
|
||||
tableNames<<"his_event_point";
|
||||
for(int i = 0; i < tableNames.size(); ++i)
|
||||
{
|
||||
QString currentTable=tableNames[i];
|
||||
QDateTime startDeleteTime;
|
||||
bool hasDeleteStartTime=false;
|
||||
//按月跨度找到第一个月有数据的时间(即使找到1970也才655次循环)
|
||||
for(int i=0;i<700;++i)
|
||||
{
|
||||
QDateTime endTime=endDateTime.addMonths(-i);
|
||||
QDateTime startTime=endDateTime.addMonths(-i-1);
|
||||
if(!hasDataByPeriod(connParam,currentTable,startTime.toMSecsSinceEpoch(),endTime.toMSecsSinceEpoch(),queryErr)&&(queryErr.isEmpty()))
|
||||
{
|
||||
startDeleteTime=endTime;
|
||||
hasDeleteStartTime=true;
|
||||
LOGINFO("delHisTsdbV2 %s get startDeleteTime: %s ",currentTable.toStdString().c_str(),startDeleteTime.toString(Qt::ISODate).toStdString().c_str());
|
||||
break;
|
||||
}
|
||||
if(!queryErr.isEmpty())
|
||||
{
|
||||
LOGERROR("deleteDataByPeriod-queryStart-err %s start(%s) end(%s) ",currentTable.toStdString().c_str(),startTime.toString(Qt::ISODate).toStdString().c_str(),endTime.toString(Qt::ISODate).toStdString().c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//按天跨度删除数据
|
||||
if(hasDeleteStartTime)
|
||||
{
|
||||
int daysDifference = qAbs(endDateTime.daysTo(startDeleteTime));
|
||||
for(int i=0;i<daysDifference;++i)
|
||||
{
|
||||
QDateTime endTime=endDateTime.addDays(-i);
|
||||
QDateTime startTime=endDateTime.addDays(-i-1);
|
||||
deleteDataByPeriod(connParam,currentTable,startTime.toMSecsSinceEpoch(),endTime.toMSecsSinceEpoch(),queryErr);
|
||||
if(!queryErr.isEmpty())
|
||||
{
|
||||
LOGERROR("deleteDataByPeriod-err %s start(%s) end(%s) ",currentTable.toStdString().c_str(),startTime.toString(Qt::ISODate).toStdString().c_str(),endTime.toString(Qt::ISODate).toStdString().c_str());
|
||||
queryErr="";
|
||||
handlResult=false;
|
||||
}
|
||||
}
|
||||
//当天的删除
|
||||
if(0==daysDifference)
|
||||
{
|
||||
QDateTime endTime=endDateTime;
|
||||
QDateTime startTime=endDateTime.addDays(-1);
|
||||
deleteDataByPeriod(connParam,currentTable,startTime.toMSecsSinceEpoch(),endTime.toMSecsSinceEpoch(),queryErr);
|
||||
if(!queryErr.isEmpty())
|
||||
{
|
||||
LOGERROR("deleteDataByPeriod-err %s start(%s) end(%s) ",currentTable.toStdString().c_str(),startTime.toString(Qt::ISODate).toStdString().c_str(),endTime.toString(Qt::ISODate).toStdString().c_str());
|
||||
queryErr="";
|
||||
handlResult=false;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LOGINFO("delHisTsdbV2 %s not find startDeleteTime before %s ",currentTable.toStdString().c_str(),endDateTime.toString(Qt::ISODate).toStdString().c_str());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if( handlResult)
|
||||
{
|
||||
//< to-do
|
||||
// 清除统计缓存
|
||||
std::string curDir = iot_public::CFileUtil::getCurModuleDir();
|
||||
QDir dir(curDir.c_str());
|
||||
dir.cdUp();
|
||||
dir.cdUp();
|
||||
if(dir.cd("data"))
|
||||
{
|
||||
if(dir.cd("stat_server"))
|
||||
{
|
||||
dir.removeRecursively();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(handlResult)
|
||||
{
|
||||
LOGINFO("Tsdb-clean-ok: %s %s",databaseName.toStdString().c_str(),tableNames.join(" ").toStdString().c_str());
|
||||
}
|
||||
return handlResult;
|
||||
|
||||
|
||||
}
|
||||
|
||||
bool iot_dbms::CHisMngApiImp::delHisEventDb(QSqlDatabase &conn, qint64 endTimeStamp)
|
||||
{
|
||||
std::vector<std::string> tables = getHisEventTables();
|
||||
@ -1171,14 +1414,21 @@ bool iot_dbms::CHisMngApiImp::delHisEventDb(QSqlDatabase &conn, qint64 endTimeSt
|
||||
{
|
||||
if(!trashMysqlTableByPartition(conn,tables[i].c_str(),endTimeStamp))
|
||||
{
|
||||
return false;
|
||||
logError(tr("通过分区删除") + tables[i].c_str() + tr("旧数据失败") );
|
||||
}
|
||||
|
||||
if(!trashTableByTimestamp(conn,tables[i].c_str(),endTimeStamp))
|
||||
{
|
||||
logError(tr("通过时间删除") + tables[i].c_str() + tr("旧数据失败") );
|
||||
}
|
||||
|
||||
if(!optimizeTable(conn,tables[i].c_str())) //极端情况下优化表空间
|
||||
{
|
||||
logError(tr("优化") + tables[i].c_str() + tr("表空间失败") );
|
||||
logError(tr("删除") + tables[i].c_str() + tr("旧数据失败") );
|
||||
return false;
|
||||
}
|
||||
|
||||
logStatus(tr("删除") + tables[i].c_str() + tr("旧数据成功"));
|
||||
}
|
||||
return true;
|
||||
@ -1192,7 +1442,8 @@ bool iot_dbms::CHisMngApiImp::delHis(QSqlDatabase &conn, const QString &ip, cons
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!delHisTsdb(ip,databaseName,endTimeStamp))
|
||||
//时序库暂用了数据库同样的用户名密码
|
||||
if(!delHisTsdb(ip,conn.databaseName(),conn.password(),databaseName,endTimeStamp))
|
||||
{
|
||||
logError(tr("清空时序库失败"));
|
||||
return false;
|
||||
@ -1201,6 +1452,23 @@ bool iot_dbms::CHisMngApiImp::delHis(QSqlDatabase &conn, const QString &ip, cons
|
||||
return true;
|
||||
}
|
||||
|
||||
bool iot_dbms::CHisMngApiImp::delHisV2(QSqlDatabase &conn, const QString &ip, const QString &databaseName, qint64 endTimeStamp)
|
||||
{
|
||||
if(!delHisEventDb(conn,endTimeStamp))
|
||||
{
|
||||
logError(tr("清空关系库历史事件失败"));
|
||||
return false;
|
||||
}
|
||||
|
||||
//时序库暂用了数据库同样的用户名密码
|
||||
if(!delHisTsdbV2(ip,conn.databaseName(),conn.password(),databaseName,endTimeStamp))
|
||||
{
|
||||
logError(tr("清空时序库失败"));
|
||||
return false;
|
||||
}
|
||||
logStatus(tr("清空时序库成功"));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool iot_dbms::CHisMngApiImp::delHisAll(QSqlDatabase &conn, const QString &ip, const QString &databaseName)
|
||||
{
|
||||
@ -1210,7 +1478,26 @@ bool iot_dbms::CHisMngApiImp::delHisAll(QSqlDatabase &conn, const QString &ip, c
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!delHisTsdb(ip,databaseName,QDateTime::currentMSecsSinceEpoch()))
|
||||
//时序库暂用了数据库同样的用户名密码
|
||||
if(!delHisTsdb(ip,conn.databaseName(),conn.password(),databaseName,QDateTime::currentMSecsSinceEpoch()))
|
||||
{
|
||||
logError(tr("清空时序库失败"));
|
||||
return false;
|
||||
}
|
||||
logStatus(tr("清空时序库成功"));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool iot_dbms::CHisMngApiImp::delHisAllV2(QSqlDatabase &conn, const QString &ip, const QString &databaseName)
|
||||
{
|
||||
if(!delHisDbAll(conn))
|
||||
{
|
||||
logError(tr("清空关系库历史事件失败"));
|
||||
return false;
|
||||
}
|
||||
|
||||
//时序库暂用了数据库同样的用户名密码
|
||||
if(!delHisTsdbV2(ip,conn.databaseName(),conn.password(),databaseName,QDateTime::currentMSecsSinceEpoch()))
|
||||
{
|
||||
logError(tr("清空时序库失败"));
|
||||
return false;
|
||||
@ -1235,18 +1522,18 @@ bool iot_dbms::CHisMngApiImp::delHisDbAll(QSqlDatabase &conn)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool iot_dbms::CHisMngApiImp::importTsdbBin(const QString &ip, const QString &databaseName, const QString &srcDirPath)
|
||||
bool iot_dbms::CHisMngApiImp::importTsdbBin(const STsdbConnParam &connParam, const QString &srcDirPath)
|
||||
{
|
||||
if( ip.isEmpty() || databaseName.isEmpty() || srcDirPath.isEmpty())
|
||||
if(connParam.strIP.empty() || connParam.strDbName.empty() || srcDirPath.isEmpty())
|
||||
return false;
|
||||
|
||||
// 检查路径权限 读权限
|
||||
QFileInfo fi(srcDirPath);
|
||||
if (fi.permission(QFile::ReadUser) == false)
|
||||
{
|
||||
logError(tr("无法对目录") + srcDirPath + tr("进行读操作,请检查操作用户权限,备份失败"));
|
||||
return false;
|
||||
}
|
||||
// QFileInfo fi(srcDirPath);
|
||||
// if (fi.permission(QFile::ReadUser) == false)
|
||||
// {
|
||||
// logError(tr("无法对目录") + srcDirPath + tr("进行读操作,请检查操作用户权限,备份失败"));
|
||||
// return false;
|
||||
// }
|
||||
|
||||
if(iot_dbms::initTsdbApi() == false)
|
||||
{
|
||||
@ -1256,7 +1543,7 @@ bool iot_dbms::CHisMngApiImp::importTsdbBin(const QString &ip, const QString &da
|
||||
|
||||
// 连接influxdb,delete and create database
|
||||
{
|
||||
iot_dbms::CTsdbConn db_conn(ip.toStdString().c_str());
|
||||
iot_dbms::CTsdbConn db_conn(connParam);
|
||||
if(db_conn.pingServer() == false)
|
||||
{
|
||||
logError(tr("数据库连接失败"));
|
||||
@ -1264,9 +1551,9 @@ bool iot_dbms::CHisMngApiImp::importTsdbBin(const QString &ip, const QString &da
|
||||
}
|
||||
|
||||
// 1. 删除数据库
|
||||
if(db_conn.deleteDatabase(databaseName.toStdString().c_str()) == false)
|
||||
if(db_conn.deleteDatabase(connParam.strDbName.c_str()) == false)
|
||||
{
|
||||
logError(tr("无法删除influxDB数据库:")+ databaseName);
|
||||
logError(tr("无法删除influxDB数据库:")+ QString(connParam.strDbName.c_str()));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -1281,48 +1568,75 @@ bool iot_dbms::CHisMngApiImp::importTsdbBin(const QString &ip, const QString &da
|
||||
// 2.导入备份
|
||||
QString program = "influxd";
|
||||
QStringList arguments;
|
||||
arguments << "restore" << "-host" << ip+":8088" << "-portable" << "-db" << databaseName << srcDirPath;
|
||||
|
||||
#ifdef OS_LINUX
|
||||
program = "pkexec"; //提升权限
|
||||
arguments << "influxd";
|
||||
#endif
|
||||
|
||||
arguments << "restore" << "-host" << (connParam.strIP + ":8088").c_str() << "-portable" << "-db" << connParam.strDbName.c_str() << srcDirPath;
|
||||
LOGINFO("arguments is [%s]",arguments.join(" ").toStdString().c_str());
|
||||
//开始导入备份进程
|
||||
m_pImportProc->start(program,arguments);
|
||||
|
||||
if(!m_pImportProc->waitForFinished(-1))
|
||||
{
|
||||
//todo 解决错误
|
||||
QString errorLog = m_pImportProc->errorString();
|
||||
logError("import failed! errorlog: " + errorLog );
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool iot_dbms::CHisMngApiImp::importTsdbSQL(const QString &ip, const QString &databaseName, const QString &srcFilePath, bool isPrecisionMs)
|
||||
bool iot_dbms::CHisMngApiImp::importTsdbSQL(const QString &ip,const QString &userName, const QString &password, const QString &databaseName, const QString &srcFilePath, bool isPrecisionMs)
|
||||
{
|
||||
if( ip.isEmpty() || databaseName.isEmpty() || srcFilePath.isEmpty())
|
||||
if( ip.isEmpty() || userName.isEmpty() || password.isEmpty() || databaseName.isEmpty() || srcFilePath.isEmpty())
|
||||
return false;
|
||||
|
||||
// 检查路径权限 读权限
|
||||
QFileInfo fi(srcFilePath);
|
||||
if (fi.permission(QFile::ReadUser) == false)
|
||||
{
|
||||
logError(tr("无法对目录") + srcFilePath + tr("进行读操作,请检查操作用户权限,备份失败"));
|
||||
return false;
|
||||
}
|
||||
|
||||
QString program = "influx";
|
||||
// QFileInfo fi(srcFilePath);
|
||||
// if (fi.permission(QFile::ReadUser) == false)
|
||||
// {
|
||||
// logError(tr("无法对目录") + srcFilePath + tr("进行读操作,请检查操作用户权限,备份失败"));
|
||||
// return false;
|
||||
// }
|
||||
|
||||
QString program;
|
||||
QStringList arguments;
|
||||
|
||||
#ifdef OS_WINDOWS
|
||||
program = "influx";
|
||||
#endif
|
||||
|
||||
#ifdef OS_LINUX
|
||||
program = "pkexec"; //提升权限
|
||||
arguments << "influx";
|
||||
#endif
|
||||
|
||||
//< 导出实例influx -import -host 192.168.77.200 -compressed -path=export.txt.gz -precision=ms
|
||||
QString tmpPath = QString("-path=") + srcFilePath;
|
||||
arguments << "-import" << "-host" << ip << "-compressed";
|
||||
|
||||
/* 为以后搜索方便,保留此注释
|
||||
* arguments << "-username" << EMS_DEFAULT_DATABASE
|
||||
* << "-password" << EMS_DEFAULT_PASSWD
|
||||
* << "-import" << "-host" << ip << "-compressed";
|
||||
*/
|
||||
arguments << "-username" << userName
|
||||
<< "-password" << password
|
||||
<< "-import" << "-host" << ip << "-compressed";
|
||||
|
||||
if(isPrecisionMs)
|
||||
arguments << "-precision=ms";
|
||||
arguments << tmpPath;
|
||||
LOGINFO("arguments is [%s]",arguments.join(" ").toStdString().c_str());
|
||||
|
||||
//开始导入备份进程
|
||||
m_pImportProc->start(program,arguments);
|
||||
|
||||
if(!m_pImportProc->waitForFinished(-1))
|
||||
{
|
||||
//todo 解决错误
|
||||
QString errorLog = m_pImportProc->errorString();
|
||||
logError("import failed! errorlog: " + errorLog );
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
@ -1420,7 +1734,13 @@ bool iot_dbms::CHisMngApiImp::importHis(QSqlDatabase &conn, const QString &srcFi
|
||||
}
|
||||
logStatus(tr("导入历史记录备份成功"));
|
||||
|
||||
if(!importTsdbBin(ip,databaseName,srcDirPath))
|
||||
STsdbConnParam connParam; //ip和port不指定则默认本机默认端口8086
|
||||
connParam.strIP = ip.toStdString();
|
||||
connParam.strUserName = databaseName.toStdString();
|
||||
connParam.strUserPassword = conn.password().toStdString(); //todo:此处有风险,如果QSqlDatabase直接调用的open(user,password)接口,则此函数获取不到密码
|
||||
connParam.strDbName = databaseName.toStdString();
|
||||
|
||||
if(!importTsdbBin(connParam,srcDirPath))
|
||||
{
|
||||
logError(tr("导入采样数据备份失败"));
|
||||
return false;
|
||||
@ -1444,7 +1764,7 @@ bool iot_dbms::CHisMngApiImp::importHisDump(QSqlDatabase &conn,
|
||||
logStatus(tr("导入历史事件备份成功"));
|
||||
|
||||
logStatus(tr("开始导入采样数据备份"));
|
||||
if(!importTsdbSQL(ip,databaseName,tsdbFilePath,false))
|
||||
if(!importTsdbSQL(ip,databaseName,conn.password(),databaseName,tsdbFilePath,false))
|
||||
{
|
||||
logError(tr("导入采样数据备份失败"));
|
||||
return false;
|
||||
|
||||
@ -5,6 +5,7 @@
|
||||
#include <QSqlDatabase>
|
||||
#include <QTextStream>
|
||||
#include <QProcess>
|
||||
#include "tsdb_api/CTsdbConn.h"
|
||||
|
||||
namespace iot_dbms {
|
||||
|
||||
@ -125,8 +126,10 @@ public:
|
||||
* @param endTimeStamp
|
||||
* @return
|
||||
*/
|
||||
bool delHisTsdb(const QString &ip,const QString &databaseName,qint64 endTimeStamp);
|
||||
bool delHisTsdb(const QString &ip,const QString &userName, const QString &password,const QString &databaseName,qint64 endTimeStamp);
|
||||
|
||||
|
||||
bool delHisTsdbV2(const QString &ip,const QString &userName, const QString &password,const QString &databaseName,qint64 endTimeStamp);
|
||||
/**
|
||||
* @brief delHisEventDb 删除关系库的历史数据,根据时间戳删除
|
||||
* @param conn
|
||||
@ -144,7 +147,15 @@ public:
|
||||
* @return
|
||||
*/
|
||||
bool delHis(QSqlDatabase& conn,const QString &ip,const QString &databaseName,qint64 endTimeStamp);
|
||||
|
||||
/**
|
||||
* @brief delHis 删除历史数据,包括关系库和时序库。根据时间戳删除(大批量数据按天删除)
|
||||
* @param conn
|
||||
* @param ip
|
||||
* @param databaseName
|
||||
* @param endTimeStamp
|
||||
* @return
|
||||
*/
|
||||
bool delHisV2(QSqlDatabase& conn,const QString &ip,const QString &databaseName,qint64 endTimeStamp);
|
||||
/**
|
||||
* @brief delHisAll 删除全部的历史数据,包括关系库和时序库
|
||||
* @param conn
|
||||
@ -154,6 +165,15 @@ public:
|
||||
*/
|
||||
bool delHisAll(QSqlDatabase& conn,const QString &ip,const QString &databaseName);
|
||||
|
||||
/**
|
||||
* @brief delHisAll 删除全部的历史数据,包括关系库和时序库(大批量数据按天删除)
|
||||
* @param conn
|
||||
* @param ip
|
||||
* @param databaseName
|
||||
* @return
|
||||
*/
|
||||
bool delHisAllV2(QSqlDatabase& conn,const QString &ip,const QString &databaseName);
|
||||
|
||||
/**
|
||||
* @brief delHisDbAll 删除全部的关系数据库的数据
|
||||
* @param conn
|
||||
@ -164,10 +184,10 @@ public:
|
||||
|
||||
//< import 部分
|
||||
//< import tsdb bin influxd restore
|
||||
bool importTsdbBin(const QString &ip, const QString &databaseName,const QString & srcDirPath);
|
||||
bool importTsdbBin(const STsdbConnParam &connParam,const QString & srcDirPath);
|
||||
|
||||
//< import tsdb sql influx -import -compressed
|
||||
bool importTsdbSQL(const QString &ip, const QString &databaseName,const QString & srcFilePath,bool isPrecisionMs);
|
||||
bool importTsdbSQL(const QString &ip,const QString &userName, const QString &password, const QString &databaseName,const QString & srcFilePath,bool isPrecisionMs);
|
||||
|
||||
//< import db sql 执行sql文件
|
||||
bool importDbSQL(QSqlDatabase &conn, const QString &srcFilePath);
|
||||
@ -228,7 +248,7 @@ private:
|
||||
bool exportTables(QSqlDatabase &conn, qint64 startTimeStamp, qint64 endTimeStamp, const std::string &tableName, QTextStream &textStream);
|
||||
|
||||
bool exportTsdbBin(const QString &ip, const QString & dbName,const QString &dirPath,qint64 startTime = 0,qint64 endTime = 0);
|
||||
bool exportTsdbByInspect(const QString & dbName, const QString & dstFilePath, qint64 startTime,qint64 endTime);
|
||||
bool exportTsdbByInspect(const STsdbConnParam &connParam, const QString & dstFilePath, qint64 startTime,qint64 endTime);
|
||||
std::string genUrlHisEvent(const QString &ip, const QString &databaseName,qint64 startTime,qint64 endTime);
|
||||
std::string genUrlHisData(const QString &ip,const QString &databaseName,qint64 startTime,qint64 endTime,const std::vector<std::string> &vecTables);
|
||||
std::string genUrlHis(const QString &ip,const QString &databaseName,qint64 startTime,qint64 endTime);
|
||||
@ -251,12 +271,13 @@ private slots:
|
||||
void slotBackupFinishedHandler(int exitCode, QProcess::ExitStatus exitStatus);
|
||||
|
||||
private:
|
||||
bool isTsdbDbExist(const QString & database, const QString &ip);
|
||||
bool isTsdbDbExist(const STsdbConnParam &connParam);
|
||||
bool isLocalhost(const QString& addr);
|
||||
|
||||
bool is_stop = false;
|
||||
|
||||
|
||||
bool hasDataByPeriod(const STsdbConnParam& connParam,const QString& measurement,qint64 startTime,const qint64 endTime,QString& queryErr);
|
||||
void deleteDataByPeriod(const STsdbConnParam& connParam,const QString& measurement,qint64 startTime,qint64 endTime,QString& queryErr);
|
||||
};
|
||||
|
||||
} //< namespace iot_dbms;
|
||||
|
||||
@ -4,37 +4,39 @@
|
||||
<context>
|
||||
<name>QObject</name>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="122"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="165"/>
|
||||
<source>数据库连接未打开</source>
|
||||
<translation>Database connection not open</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="131"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="176"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="184"/>
|
||||
<source>获取表</source>
|
||||
<translation>Get the table</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="131"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="176"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="184"/>
|
||||
<source>列信息失败</source>
|
||||
<translation>Column information failed</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="151"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="205"/>
|
||||
<source>无法查询表</source>
|
||||
<translation>The table could not be querien</translation>
|
||||
<translation>The table could not be queried</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="575"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="759"/>
|
||||
<source>开始备份表:</source>
|
||||
<translation>Start backing up the table:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="578"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="762"/>
|
||||
<source>无法备份该表:</source>
|
||||
<translation>The table could not be backed up:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="581"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="765"/>
|
||||
<source>完成备份表:</source>
|
||||
<translation>Complete the backup table:</translation>
|
||||
</message>
|
||||
@ -42,7 +44,7 @@
|
||||
<context>
|
||||
<name>iot_dbms::CHisMngApi</name>
|
||||
<message>
|
||||
<location filename="CHisMngApi.cpp" line="190"/>
|
||||
<location filename="CHisMngApi.cpp" line="133"/>
|
||||
<source>开始转储</source>
|
||||
<translation>Start dump</translation>
|
||||
</message>
|
||||
@ -50,347 +52,430 @@
|
||||
<context>
|
||||
<name>iot_dbms::CHisMngApiImp</name>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="151"/>
|
||||
<source>的列数量</source>
|
||||
<translation>Number of columns</translation>
|
||||
<translation type="vanished">Number of columns</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="196"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="253"/>
|
||||
<source>错误,未处理的数据类型:</source>
|
||||
<translation>Error, unprocessed data type:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="271"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="360"/>
|
||||
<source>该服务器备份服务未开启,请配置</source>
|
||||
<oldsource>该服务器备份服务未开启,请配置</oldsource>
|
||||
<translation>The server backup service is not turned on, please configure</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="276"/>
|
||||
<source>备份历史数据失败,检查iscs6000是否正确配置</source>
|
||||
<translation>Failed to back up historical data to check that iscs6000 is configured correctly</translation>
|
||||
<location filename="CHisMngApiImp.cpp" line="365"/>
|
||||
<source>备份历史数据失败,检查数据库是否正确配置</source>
|
||||
<oldsource>备份历史数据失败,检查iscs6000是否正确配置</oldsource>
|
||||
<translation type="unfinished">Failed to back up historical data, please check if rqeh6000 is configured correctly</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="281"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="370"/>
|
||||
<source>备份历史数据失败,检查网络是否正常连接以及备份服务8088端口是否开启</source>
|
||||
<translation>Backup history data failed to check if the network is properly connected and if port 8088 of the backup service is on</translation>
|
||||
<oldsource>备份历史数据失败,请检查网络是否正常连接以及备份服务8088端口是否开启</oldsource>
|
||||
<translation>Backup history data failed, please check if the network is properly connected and if port 8088 of the backup service is on</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="416"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="473"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="589"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="646"/>
|
||||
<source>数据库不能连接</source>
|
||||
<translation>The database cannot be connected</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="459"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="461"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="632"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="634"/>
|
||||
<source>表</source>
|
||||
<translation>Table</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="459"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="461"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="632"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="634"/>
|
||||
<source>删除分区</source>
|
||||
<translation>Delete a partition</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="459"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1003"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1244"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="632"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1278"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1527"/>
|
||||
<source>失败</source>
|
||||
<translation>Failed</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="461"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="634"/>
|
||||
<source>成功</source>
|
||||
<translation>Success</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="585"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="769"/>
|
||||
<source>路径不可写</source>
|
||||
<translation>Path is not writeable</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="600"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="617"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="652"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="781"/>
|
||||
<source>备份历史事件出错</source>
|
||||
<translation>Backup history event error</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="671"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="728"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="818"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="863"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="895"/>
|
||||
<source>无法连接influxDB</source>
|
||||
<translation>Unable to connect to influxDB</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="778"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="957"/>
|
||||
<source>无法导出历史事件关系库</source>
|
||||
<translation>The Historical Event Relationship Library cannot be exported</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="786"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="971"/>
|
||||
<source>无法导出时序库内容</source>
|
||||
<translation>Time Database was unable to be exported</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="825"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1000"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1037"/>
|
||||
<source>开始导出关系库历史事件</source>
|
||||
<translation>Start exporting history events of relation database</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="828"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1003"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1040"/>
|
||||
<source>导出关系库历史事件错误</source>
|
||||
<translation>cannot export history events of relation database</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="831"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1006"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1043"/>
|
||||
<source>关系库历史事件导出完成</source>
|
||||
<translation>history events of relation history export completed</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="834"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1009"/>
|
||||
<source>开始导出时序库历史事件</source>
|
||||
<translation>Start exporting time-series library history events</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="837"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="883"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1012"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1099"/>
|
||||
<source>导出时序库历史事件错误</source>
|
||||
<translation>Export history events of Time-series database failed</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="840"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1015"/>
|
||||
<source>时序库历史事件导出完成</source>
|
||||
<translation>Export history events of Time-series database completed</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="847"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1022"/>
|
||||
<source>开始导出时序库采样数据</source>
|
||||
<translation>start export sample points of time-series database</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="850"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1025"/>
|
||||
<source>导出时序库采样数据错误</source>
|
||||
<translation>Export sample points of time-series database failed</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="853"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1028"/>
|
||||
<source>时序库采样数据导出完成</source>
|
||||
<translation>Export sample points of time-series database done</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="871"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1087"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1123"/>
|
||||
<source>开始导入关系库历史事件</source>
|
||||
<translation>Start import history events of relation database</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="874"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1090"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1126"/>
|
||||
<source>导入关系库历史事件错误</source>
|
||||
<translation>Import history events of relation database failed</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="877"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1093"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1129"/>
|
||||
<source>关系库历史事件导入完成</source>
|
||||
<translation>Import history events of relation database done</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="880"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1096"/>
|
||||
<source>开始导入时序库历史事件</source>
|
||||
<translation>Start import history events of time-series database</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="886"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1102"/>
|
||||
<source>时序库历史事件导入完成</source>
|
||||
<translation>Import history events of time-series done</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="893"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1109"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1132"/>
|
||||
<source>开始导入时序库采样数据</source>
|
||||
<translation>Import sample points of time-series database</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="896"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1112"/>
|
||||
<source>导入时序库采样数据错误</source>
|
||||
<translation>Import sample poins of time-series database failed</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="899"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1115"/>
|
||||
<source>时序库采样数据导入完成</source>
|
||||
<translation>Import sample points of time-series database done</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="947"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="950"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1223"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1227"/>
|
||||
<source>删除</source>
|
||||
<translation>delete </translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="947"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1212"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1217"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1223"/>
|
||||
<source>旧数据失败</source>
|
||||
<translation>old data failed</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="950"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="205"/>
|
||||
<source>的行数量</source>
|
||||
<translation>Number of rows</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="274"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="341"/>
|
||||
<source>停止转储</source>
|
||||
<translation>Stop dump</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="401"/>
|
||||
<source>数据库测试连接失败</source>
|
||||
<translation>Database test connection failed</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="413"/>
|
||||
<source>时序库不存在</source>
|
||||
<translation>Time-series database does not exist</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="416"/>
|
||||
<source>查询数据库错误</source>
|
||||
<translation>query db error</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1045"/>
|
||||
<source>开始导出时序库历史</source>
|
||||
<translation>Start exporting time-series database history</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1056"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1066"/>
|
||||
<source>导出时序库历史错误</source>
|
||||
<translation>Error exporting time-series database history</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1059"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1069"/>
|
||||
<source>时序库历史导出完成</source>
|
||||
<translation>Time-series database history export completed</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1135"/>
|
||||
<source>导入时序库数据错误</source>
|
||||
<translation>Error importing time-series database data</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1138"/>
|
||||
<source>时序库数据导入完成</source>
|
||||
<translation>Time-series database data import completed</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1212"/>
|
||||
<source>通过分区删除</source>
|
||||
<translation>Delete by partition</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1217"/>
|
||||
<source>通过时间删除</source>
|
||||
<translation>Delete by time</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1222"/>
|
||||
<source>优化</source>
|
||||
<translation>Optimize</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1222"/>
|
||||
<source>表空间失败</source>
|
||||
<translation>Tablespace failed</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1227"/>
|
||||
<source>旧数据成功</source>
|
||||
<translation>old data successfully</translation>
|
||||
<translation>Old data successfully</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="959"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="977"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1236"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1255"/>
|
||||
<source>清空关系库历史事件失败</source>
|
||||
<translation>clear history events of relation database failed</translation>
|
||||
<translation>Failed to clear history events of relational database</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="965"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="983"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1243"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1262"/>
|
||||
<source>清空时序库失败</source>
|
||||
<translation>clear time-series database failed</translation>
|
||||
<translation>Failed to clear time-series database</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="968"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="986"/>
|
||||
<source>清空时序库成功</source>
|
||||
<translation>clear time-series database done</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1000"/>
|
||||
<source>开始清空(truncate)表</source>
|
||||
<translation>start truncate table</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1003"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1005"/>
|
||||
<source>清空表</source>
|
||||
<translation>truncate table</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1005"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1246"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1265"/>
|
||||
<source>清空时序库成功</source>
|
||||
<translation>Successfully cleared time-series database</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1275"/>
|
||||
<source>开始清空(truncate)表</source>
|
||||
<translation>Start truncating table</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1278"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1280"/>
|
||||
<source>清空表</source>
|
||||
<translation>Truncate table</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1280"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1529"/>
|
||||
<source>完成</source>
|
||||
<translation>done</translation>
|
||||
<translation>Completed</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1019"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1078"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1294"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1353"/>
|
||||
<source>无法对目录</source>
|
||||
<translation>Cannot cope with table</translation>
|
||||
<translation>Cannot operate on the directory</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1019"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1078"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1294"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1353"/>
|
||||
<source>进行读操作,请检查操作用户权限,备份失败</source>
|
||||
<translation>To read, please check the operation user permissions, the backup failed</translation>
|
||||
<translation>Please check the operation user permissions to perform read operations, backup failed</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1025"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1300"/>
|
||||
<source>无法初始化influx数据库连接条件,请检查软件依赖是否安装正确</source>
|
||||
<translation>Unable to initialize the influx database connection condition, check that the software dependency is installed correctly</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1034"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1309"/>
|
||||
<source>数据库连接失败</source>
|
||||
<translation>Database connection failed</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1041"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1316"/>
|
||||
<source>无法删除influxDB数据库:</source>
|
||||
<translation>The influxDB database could not be deleted:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1049"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1324"/>
|
||||
<source>无法销毁influx数据库连接资源</source>
|
||||
<translation>Could not destroy the influx database connection resource</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1113"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1394"/>
|
||||
<source>开始导入数据文件</source>
|
||||
<translation>Start importing data files</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1118"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1399"/>
|
||||
<source>打开导入文件失败</source>
|
||||
<translation>Failed to open import file</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1160"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1441"/>
|
||||
<source>导入历史事件失败</source>
|
||||
<translation>Failed to import history events</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1174"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1455"/>
|
||||
<source>导入已完成:</source>
|
||||
<translation>Importing done:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1187"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1468"/>
|
||||
<source>删除旧历史记录失败</source>
|
||||
<translation>Failed to delete old history</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1190"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1471"/>
|
||||
<source>删除旧历史记录成功</source>
|
||||
<translation>Removing old history successfully</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1193"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1474"/>
|
||||
<source>导入历史记录备份失败</source>
|
||||
<translation>Import history backup failed</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1196"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1477"/>
|
||||
<source>导入历史记录备份成功</source>
|
||||
<translation>Import history backup successful</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1200"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1224"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1487"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1511"/>
|
||||
<source>导入采样数据备份失败</source>
|
||||
<translation>Importing sampledata backup failed</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1203"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1227"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1490"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1514"/>
|
||||
<source>导入采样数据备份成功</source>
|
||||
<translation>Import edited data backup successfully</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1213"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1500"/>
|
||||
<source>开始导入历史事件</source>
|
||||
<translation>Start importing history events</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1216"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1503"/>
|
||||
<source>导入历史事件备份失败</source>
|
||||
<translation>failed to import history events backup</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1219"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1506"/>
|
||||
<source>导入历史事件备份成功</source>
|
||||
<translation>Import history events backup successfully</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1221"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1508"/>
|
||||
<source>开始导入采样数据备份</source>
|
||||
<translation>Start importing sample data backups</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1241"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1524"/>
|
||||
<source>开始清理表</source>
|
||||
<translation>Start cleaning up the table</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1244"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1246"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1527"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1529"/>
|
||||
<source>清理表</source>
|
||||
<translation>Clean up the table</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1255"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1539"/>
|
||||
<source>导出历史失败</source>
|
||||
<translation>Export history failed</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="CHisMngApiImp.cpp" line="1261"/>
|
||||
<location filename="CHisMngApiImp.cpp" line="1545"/>
|
||||
<source>删除历史失败</source>
|
||||
<translation>Failed to delete history</translation>
|
||||
</message>
|
||||
|
||||
@ -512,16 +512,6 @@ static void testEventQuery()
|
||||
|
||||
static int doTest()
|
||||
{
|
||||
if (!iot_dbms::initTsdbApi())
|
||||
{
|
||||
LOGERROR("initTsdbApi() failed !");
|
||||
return 1;
|
||||
}
|
||||
|
||||
g_pTsdbConn = new iot_dbms::CTsdbConn("127.0.0.1", 8086, g_pszDbName, "", "");
|
||||
|
||||
g_pvecTagName = new std::vector<std::string>;
|
||||
|
||||
if (!g_pTsdbConn->pingServer(1000))
|
||||
{
|
||||
LOGERROR("pingServer() return false !");
|
||||
@ -563,20 +553,35 @@ int main(/*int argc, char *argv[]*/)
|
||||
LOGINFO("sizeof(iot_dbms::VarMeasPiontVal) == %lu", sizeof(iot_dbms::VarMeasPiontVal));
|
||||
LOGINFO("sizeof(iot_dbms::SHisSamplePointVar) == %lu", sizeof(iot_dbms::SVarHisSamplePoint));
|
||||
|
||||
|
||||
nRc = doTest();
|
||||
|
||||
delete g_pTsdbConn;
|
||||
g_pTsdbConn = NULL;
|
||||
|
||||
delete g_pvecTagName;
|
||||
g_pvecTagName = NULL;
|
||||
|
||||
if (!iot_dbms::releaseTsdbApi())
|
||||
if (!iot_dbms::initTsdbApi())
|
||||
{
|
||||
LOGERROR("releaseTsdbApi() failed !");
|
||||
LOGERROR("initTsdbApi() failed !");
|
||||
nRc = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_pvecTagName = new std::vector<std::string>;
|
||||
|
||||
// g_pTsdbConn = new iot_dbms::CTsdbConn( "127.0.0.1", 8086, g_pszDbName,
|
||||
// EMS_DEFAULT_DATABASE, EMS_DEFAULT_PASSWD );
|
||||
|
||||
auto spTsdbConn = iot_dbms::getOneUseableConn( true );
|
||||
g_pTsdbConn = spTsdbConn.get();
|
||||
|
||||
nRc = doTest();
|
||||
|
||||
// delete g_pTsdbConn;
|
||||
g_pTsdbConn = NULL;
|
||||
|
||||
delete g_pvecTagName;
|
||||
g_pvecTagName = NULL;
|
||||
|
||||
if (!iot_dbms::releaseTsdbApi())
|
||||
{
|
||||
LOGERROR("releaseTsdbApi() failed !");
|
||||
nRc = 1;
|
||||
}
|
||||
}
|
||||
|
||||
//< 停止日志系统
|
||||
iot_public::StopLogSystem();
|
||||
|
||||
@ -69,6 +69,6 @@ bool CHisUtil::isDataExported(const QDomElement &elem)
|
||||
QString CHisUtil::getBackupType(const QDomElement &eleDbSet)
|
||||
{
|
||||
if(isDump(eleDbSet))
|
||||
return "转储";
|
||||
return QObject::tr("转储");
|
||||
return eleDbSet.attribute( "isAll" ) == "1"?QObject::tr("全量备份"):QObject::tr("增量备份");
|
||||
}
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
#include <QCheckBox>
|
||||
#include <QDir>
|
||||
#include <QFileInfo>
|
||||
#include <QMessageBox>
|
||||
#include "pub_widget/MessageBox.h"
|
||||
#include <QFileDialog>
|
||||
#include <public/pub_sysinfo_api/SysInfoApi.h>
|
||||
#include <CExportZipWorker.h>
|
||||
@ -131,7 +131,7 @@ void CLogMngWidget::exportLog()
|
||||
{
|
||||
if(ui->app->layout()->count() == 0 )
|
||||
{
|
||||
QMessageBox::warning(this,tr("提醒"),tr("请先选择导出类型"));
|
||||
N_MessageBox::warning(this,tr("提醒"),tr("请先选择导出类型"));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#include "CStationReuseForm.h"
|
||||
#include "ui_CStationReuseForm.h"
|
||||
#include <QMessageBox>
|
||||
#include "pub_widget/MessageBox.h"
|
||||
#include "db_manager_api/db_manager_api.h"
|
||||
#include "conndig.h"
|
||||
#include "common/Common.h"
|
||||
@ -75,7 +75,7 @@ void CStationReuseForm::onSetIpPort(QString ip, QString db, db_opt* pDbOpt)
|
||||
m_pSrcDbOpt = pDbOpt ;
|
||||
ui->comboBoxdataServiceSrv->clear();
|
||||
ui->comboBoxdataServiceSrv->addItem(m_pSrcDbOpt->getHostName());
|
||||
ui->comboBoxdataServiceSrv->addItem(("选择厂站复用源数据源 "));
|
||||
ui->comboBoxdataServiceSrv->addItem((tr("选择厂站复用源数据源 ")));
|
||||
ui->comboBoxdataBaseSrv->addItems(listDatabase);
|
||||
ui->comboBoxdataBaseSrv->setCurrentText(strCurDatabase);
|
||||
}
|
||||
@ -84,7 +84,7 @@ void CStationReuseForm::onSetIpPort(QString ip, QString db, db_opt* pDbOpt)
|
||||
m_pDstDbOpt = pDbOpt ;
|
||||
ui->comboBoxdataServiceDst->clear();
|
||||
ui->comboBoxdataServiceDst->addItem(m_pDstDbOpt->getHostName());
|
||||
ui->comboBoxdataServiceDst->addItem(("选择厂站复用目标数据源 "));
|
||||
ui->comboBoxdataServiceDst->addItem((tr("选择厂站复用目标数据源 ")));
|
||||
ui->comboBoxdataBaseDst->addItems(listDatabase);
|
||||
ui->comboBoxdataBaseDst->setCurrentText(strCurDatabase);
|
||||
|
||||
@ -167,11 +167,11 @@ void CStationReuseForm::slotComboBoxDataBaseDstChanged(const QString &sText)
|
||||
|
||||
void CStationReuseForm::soltPushButtonReuseClicked()
|
||||
{
|
||||
QMessageBox::StandardButton resultButton = QMessageBox::information(this,
|
||||
int resultButton = N_MessageBox::information(this,
|
||||
tr("提示"), tr("请确保源数据库和目标数据库的所有表结构一致,否则会出错!"),
|
||||
QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
|
||||
N_MessageBox::Yes | N_MessageBox::No, N_MessageBox::Yes);
|
||||
|
||||
if(resultButton == QMessageBox::No){ return; }
|
||||
if(resultButton == N_MessageBox::No){ return; }
|
||||
|
||||
QString sDataServiceSrc = ui->comboBoxdataServiceSrv->currentText();
|
||||
QString sDataBaseSrc = ui->comboBoxdataBaseSrv->currentText();
|
||||
@ -180,50 +180,50 @@ void CStationReuseForm::soltPushButtonReuseClicked()
|
||||
|
||||
if ( sDataServiceSrc == "" )
|
||||
{
|
||||
QMessageBox::warning( this, tr("警告"), tr("未选择源数据服务 ") );
|
||||
N_MessageBox::warning( this, tr("警告"), tr("未选择源数据服务 ") );
|
||||
return;
|
||||
}
|
||||
if ( sDataBaseSrc == "" )
|
||||
{
|
||||
QMessageBox::warning( this, tr("警告"), tr("未选择源数据库 ") );
|
||||
N_MessageBox::warning( this, tr("警告"), tr("未选择源数据库 ") );
|
||||
return;
|
||||
}
|
||||
if ( sDataServiceDst == "" )
|
||||
{
|
||||
QMessageBox::warning( this, tr("警告"), tr("未选择目标数据服务 ") );
|
||||
N_MessageBox::warning( this, tr("警告"), tr("未选择目标数据服务 ") );
|
||||
return;
|
||||
}
|
||||
if ( sDataBaseDst == "" )
|
||||
{
|
||||
QMessageBox::warning( this, tr("警告"), tr("未选择目标数据库 ") );
|
||||
N_MessageBox::warning( this, tr("警告"), tr("未选择目标数据库 ") );
|
||||
return;
|
||||
}
|
||||
if ( m_pSrcDbOpt == NULL )
|
||||
{
|
||||
QMessageBox::warning( this, tr("警告"), tr("源数据服务未连接 ") );
|
||||
N_MessageBox::warning( this, tr("警告"), tr("源数据服务未连接 ") );
|
||||
return;
|
||||
}
|
||||
if ( m_pDstDbOpt == NULL )
|
||||
{
|
||||
QMessageBox::warning( this, tr("警告"), tr("目标数据服务未连接 ") );
|
||||
N_MessageBox::warning( this, tr("警告"), tr("目标数据服务未连接 ") );
|
||||
return;
|
||||
}
|
||||
if ( sDataServiceSrc == sDataServiceDst && sDataBaseSrc == sDataBaseDst )
|
||||
{
|
||||
QMessageBox::warning( this, tr("警告"), tr("源和目标不能相同") );
|
||||
N_MessageBox::warning( this, tr("警告"), tr("源和目标不能相同") );
|
||||
return;
|
||||
}
|
||||
|
||||
QString sSubStationSrc = ui->comboBoxStationSrv->currentText();
|
||||
if ( sSubStationSrc == "" )
|
||||
{
|
||||
QMessageBox::warning( this, tr("警告"), tr("未选择源车站 ") );
|
||||
N_MessageBox::warning( this, tr("警告"), tr("未选择源车站 ") );
|
||||
return;
|
||||
}
|
||||
QString sSubStationDst = ui->comboBoxStationDst->currentText();
|
||||
if ( sSubStationDst == "" )
|
||||
{
|
||||
QMessageBox::warning( this, tr("警告"), tr("未选择目标车站") );
|
||||
N_MessageBox::warning( this, tr("警告"), tr("未选择目标车站") );
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@ -19,7 +19,7 @@ enum dbType
|
||||
};
|
||||
|
||||
ConnDig::ConnDig(QWidget *parent) :
|
||||
QDialog(parent),
|
||||
CustomUiDialog(parent),
|
||||
ui(new Ui::ConnDig)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
@ -29,6 +29,7 @@ ConnDig::ConnDig(QWidget *parent) :
|
||||
connect(ui->pushButton_cancel, SIGNAL(clicked(bool)), this, SLOT(onCancel()));
|
||||
connect(ui->comboBox_type, SIGNAL(currentTextChanged(QString)), this, SLOT(onDbTypeChanged(QString)));
|
||||
|
||||
setAutoLayout(true);
|
||||
}
|
||||
|
||||
ConnDig::~ConnDig()
|
||||
@ -62,12 +63,12 @@ void ConnDig::initUi()
|
||||
|
||||
|
||||
ui->lineEdit_user->setText(settings.value("login/user","root").toString());
|
||||
ui->lineEdit_pwd->setText(settings.value("login/psw",CN_PASSWD).toString());
|
||||
ui->lineEdit_pwd->setText(settings.value("login/psw",EMS_DEFAULT_PASSWD).toString());
|
||||
ui->lineEdit_ip->setText(settings.value("login/ip","127.0.0.1").toString());
|
||||
ui->lineEdit_port->setText(settings.value("login/port","3306").toString());
|
||||
ui->comboBox_type->setCurrentIndex(settings.value("login/type","0").toInt());
|
||||
|
||||
ui->lineEdit_name->setText(settings.value("login/dbname","iscs6000").toString());
|
||||
ui->lineEdit_name->setText(settings.value("login/dbname",EMS_DEFAULT_DATABASE).toString());
|
||||
|
||||
|
||||
QRegExp regExp("^[1-9]*[1-9][0-9]*$");
|
||||
@ -87,12 +88,12 @@ void ConnDig::onAccept()
|
||||
{
|
||||
if(!connectDb())
|
||||
return;
|
||||
QDialog::accept();
|
||||
CustomUiDialog::accept();
|
||||
}
|
||||
|
||||
void ConnDig::onCancel()
|
||||
{
|
||||
QDialog::reject();
|
||||
CustomUiDialog::reject();
|
||||
}
|
||||
|
||||
void ConnDig::onDbTypeChanged(const QString &dbType)
|
||||
|
||||
@ -1,14 +1,14 @@
|
||||
#ifndef CONNDIG_H
|
||||
#define CONNDIG_H
|
||||
|
||||
#include <QDialog>
|
||||
#include "pub_widget/CustomDialog.h"
|
||||
|
||||
namespace Ui {
|
||||
class ConnDig;
|
||||
}
|
||||
|
||||
class db_opt;
|
||||
class ConnDig : public QDialog
|
||||
class ConnDig : public CustomUiDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
|
||||
@ -6,206 +6,195 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>350</width>
|
||||
<height>338</height>
|
||||
<width>235</width>
|
||||
<height>262</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Dialog</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<layout class="QGridLayout" name="gridLayout_2">
|
||||
<item row="0" column="0">
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<item>
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>用户 </string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="lineEdit_user">
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="maxLength">
|
||||
<number>50</number>
|
||||
</property>
|
||||
<property name="placeholderText">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>用户 </string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>密码 </string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="lineEdit_pwd">
|
||||
<property name="maxLength">
|
||||
<number>50</number>
|
||||
</property>
|
||||
<property name="echoMode">
|
||||
<enum>QLineEdit::Password</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLineEdit" name="lineEdit_user">
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="maxLength">
|
||||
<number>50</number>
|
||||
</property>
|
||||
<property name="placeholderText">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>IP地址</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="lineEdit_ip"/>
|
||||
</item>
|
||||
</layout>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>密码 </string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_5">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>端口 </string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="lineEdit_port"/>
|
||||
</item>
|
||||
</layout>
|
||||
<item row="1" column="1">
|
||||
<widget class="QLineEdit" name="lineEdit_pwd">
|
||||
<property name="maxLength">
|
||||
<number>50</number>
|
||||
</property>
|
||||
<property name="echoMode">
|
||||
<enum>QLineEdit::Password</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_6">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_5">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>数据库类型</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QComboBox" name="comboBox_type">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>240</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>240</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>IP地址</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_7">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_6">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>数据库名称</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="lineEdit_name"/>
|
||||
</item>
|
||||
</layout>
|
||||
<item row="2" column="1">
|
||||
<widget class="QLineEdit" name="lineEdit_ip"/>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>端口 </string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QLineEdit" name="lineEdit_port"/>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QLabel" name="label_5">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>数据库类型</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<widget class="QComboBox" name="comboBox_type"/>
|
||||
</item>
|
||||
<item row="5" column="0">
|
||||
<widget class="QLabel" name="label_6">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>数据库名称</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="1">
|
||||
<widget class="QLineEdit" name="lineEdit_name"/>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButton_conn">
|
||||
<property name="minimumSize">
|
||||
@ -244,6 +233,19 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
|
||||
@ -2,10 +2,9 @@
|
||||
#include "db_manager_api/db_opt.h"
|
||||
#include <QApplication>
|
||||
#include <QSqlRecord>
|
||||
#include <QMessageBox>
|
||||
#include "db_manager_api/kbdwaitprgdlg.h"
|
||||
#include <QPushButton>
|
||||
#include <QMessageBox>
|
||||
#include "pub_widget/MessageBox.h"
|
||||
#include "db_manager_common.h"
|
||||
#include "db_sysinfo_api/CDbSysInfo.h"
|
||||
|
||||
@ -111,7 +110,7 @@ void db_compare::dataReuse(db_opt* pSrcDbOpt, QString sDataBaseOrg, db_opt* pDst
|
||||
|
||||
if( m_sDstStaTagName.isEmpty() || m_sDstStaDesc.isEmpty() )
|
||||
{
|
||||
emit mergeRes("目标车站信息为空,请检查数据库", 1);
|
||||
emit mergeRes(tr("目标车站信息为空,请检查数据库"), 1);
|
||||
emit signalEnable();
|
||||
return;
|
||||
}
|
||||
@ -171,7 +170,7 @@ void db_compare::reuseFunc()
|
||||
// 目标中找不到的表直接忽略
|
||||
else if(false == CDbSysInfo::getTableModeByTableName(curTableName.toStdString(),stTableModelInfo) )
|
||||
{
|
||||
emit mergeRes("数据库表[" + curTableName + "]复用忽略.", 0);
|
||||
emit mergeRes(tr("数据库表[%1]复用忽略.").arg(curTableName), 0);
|
||||
continue;
|
||||
} else if( tableMergeMap[curTableName] == "skip" )
|
||||
{
|
||||
@ -208,8 +207,8 @@ void db_compare::reuseFunc()
|
||||
QString sSelectError = "";
|
||||
if ( m_pSrcDbOpt->executeSql( sSqlSelect, objSqlQuery, sSelectError ) == false )
|
||||
{
|
||||
emit mergeRes("从源数据库查询记录查询失败:" + sSelectError, 1);
|
||||
emit mergeRes("表 :" + curTableName + ", 复用失败!", 1);
|
||||
emit mergeRes(tr("从源数据库查询记录查询失败:%1").arg(sSelectError), 1);
|
||||
emit mergeRes(tr("表 :%1, 复用失败!").arg(curTableName), 1);
|
||||
continue;
|
||||
}
|
||||
if(objSqlQuery.size() <=0 ){
|
||||
@ -235,11 +234,11 @@ void db_compare::reuseFunc()
|
||||
objSqlQuery.clear();
|
||||
if(bReuseRet)
|
||||
{
|
||||
emit mergeRes("表:" + curTableName + ", 复用成功!", 0);
|
||||
emit mergeRes(tr("表:%1, 复用成功!").arg(curTableName), 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
emit mergeRes("表:" + curTableName + ", 复用失败!", 1);
|
||||
emit mergeRes(tr("表:%1, 复用失败!").arg(curTableName), 1);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@ -258,7 +257,7 @@ bool db_compare::checkTable( QString& sTableName )
|
||||
//判断表是否存在
|
||||
if(!ifExistTable(m_pDstDbOpt, m_sDatabaseDst, sTableName ) )
|
||||
{
|
||||
emit mergeRes("目标数据库中不存在表:" + sTableName, 1);
|
||||
emit mergeRes(tr("目标数据库中不存在表:%1").arg(sTableName), 1);
|
||||
return false;
|
||||
}
|
||||
//判断源表与目标表字段是否一致
|
||||
@ -266,7 +265,7 @@ bool db_compare::checkTable( QString& sTableName )
|
||||
int columnNum_dst = getColumnNum(m_pDstDbOpt, m_sDatabaseDst, sTableName);
|
||||
if(columnNum_org != columnNum_dst)
|
||||
{
|
||||
emit mergeRes("源数据库与目标数据库的表:" + sTableName + "字段结构不一致!", 1);
|
||||
emit mergeRes(tr("源数据库与目标数据库的表:%1字段结构不一致!").arg(sTableName), 1);
|
||||
return false;
|
||||
}
|
||||
//判断源表与目标表主键是否一致
|
||||
@ -276,7 +275,7 @@ bool db_compare::checkTable( QString& sTableName )
|
||||
int key_num_dst = keys_dst.size();
|
||||
if(key_num_org != key_num_dst)
|
||||
{
|
||||
emit mergeRes("源数据库与目标数据库的表:" + sTableName + "主键数量不一致!", 1);
|
||||
emit mergeRes(tr("源数据库与目标数据库的表:%1主键数量不一致!").arg(sTableName), 1);
|
||||
return false;
|
||||
}
|
||||
else
|
||||
@ -292,7 +291,7 @@ bool db_compare::checkTable( QString& sTableName )
|
||||
}
|
||||
if(keysColums)
|
||||
{
|
||||
emit mergeRes("源数据库与目标数据库的表:" + sTableName + "主键字段不一致!", 1);
|
||||
emit mergeRes(tr("源数据库与目标数据库的表:%1主键字段不一致!").arg(sTableName), 1);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -306,7 +305,7 @@ bool db_compare::hasColumn(db_opt *pDb_opt, QString &sDatabaseName, QString &sTa
|
||||
QString error;
|
||||
if ( pDb_opt->executeSql( sql, result, error ) == false )
|
||||
{
|
||||
emit mergeRes("判断表是否存在字段失败" + error, 1);
|
||||
emit mergeRes(tr("判断表是否存在字段失败 %1").arg(error), 1);
|
||||
qDebug() << "判断表是否存在字段失败: sql == " << sql;
|
||||
return false;
|
||||
}
|
||||
@ -356,7 +355,7 @@ int db_compare::mergeTable(db_opt* pSrcDbOpt, QString dataBaseOrg, db_opt* pDstD
|
||||
QString sSelectError = "";
|
||||
if ( pSrcDbOpt->executeSql( sSqlSelect, objSqlQuery, sSelectError ) == false )
|
||||
{
|
||||
emit mergeRes("判断表是否没有主键查询失败:" + sSelectError, 1);
|
||||
emit mergeRes(tr("判断表是否没有主键查询失败:%1").arg(sSelectError), 1);
|
||||
return -1;
|
||||
}
|
||||
int size_Org = objSqlQuery.size();
|
||||
@ -382,7 +381,7 @@ int db_compare::mergeTable(db_opt* pSrcDbOpt, QString dataBaseOrg, db_opt* pDstD
|
||||
if ( pSrcDbOpt->executeSql( sSqlSelect, objSqlQuery, sSelectError ) == false )
|
||||
{
|
||||
qDebug() << "src db select error ============================ sql == " << sSqlSelect;
|
||||
emit mergeRes("查找源数据库失败" + sSelectError, 1);
|
||||
emit mergeRes(tr("查找源数据库失败%1").arg(sSelectError), 1);
|
||||
return -1;
|
||||
}
|
||||
m_max61850Id = 0;
|
||||
@ -439,7 +438,7 @@ void db_compare::clearAllDataByTableName(db_opt *pDstDbOpt, QString dataBaseDst,
|
||||
if( pDstDbOpt->executeSql(sqlDel, error ) == false )
|
||||
{
|
||||
emit mergeRes(tr("删除表:%1数据失败").arg(tableName) + error, 1);
|
||||
emit mergeRes("SQL语句为:" + sqlDel, 1);
|
||||
emit mergeRes(tr("SQL语句为:%1").arg(sqlDel), 1);
|
||||
qDebug() << sqlDel;
|
||||
// emit mergeRes(sSql_Insert, 0);
|
||||
}
|
||||
@ -538,7 +537,7 @@ bool db_compare::insertRecord(db_opt* pDb_option, QString dataBase, QString tabl
|
||||
|
||||
if( pDb_option->executeSql(sSql_allColumnName, query_allColumnName, sError_allColumnName) == false )
|
||||
{
|
||||
emit mergeRes( "获取表的所有字段名失败:" + sError_allColumnName, 1 );
|
||||
emit mergeRes( tr("获取表的所有字段名失败:%1").arg(sError_allColumnName), 1 );
|
||||
return false;
|
||||
}
|
||||
while(query_allColumnName.next())
|
||||
@ -593,8 +592,8 @@ bool db_compare::insertRecord(db_opt* pDb_option, QString dataBase, QString tabl
|
||||
QString sError_Insert = "";
|
||||
if( pDb_option->executeSql(sSql_Insert, query_Insert, sError_Insert ) == false )
|
||||
{
|
||||
emit mergeRes("插入记录语句执行失败:" + sError_Insert, 1);
|
||||
emit mergeRes("SQL语句为:" + sSql_Insert, 1);
|
||||
emit mergeRes(tr("插入记录语句执行失败:%1").arg(sError_Insert), 1);
|
||||
emit mergeRes(tr("SQL语句为:%1").arg(sSql_Insert), 1);
|
||||
qDebug() << sSql_Insert;
|
||||
// emit mergeRes(sSql_Insert, 0);
|
||||
return false;
|
||||
@ -771,7 +770,7 @@ bool db_compare::ifExistColumn(db_opt* pDb_opt, QString sDataBase, QString table
|
||||
QString sError;
|
||||
if( pDb_opt->executeSql(sSql, query, sError) == false )
|
||||
{
|
||||
emit mergeRes("判断" + columnName + "字段是否存在:" + sError, 1);
|
||||
emit mergeRes(tr("判断%1字段是否存在:%2").arg(columnName).arg(sError), 1);
|
||||
return ret;
|
||||
}
|
||||
while(query.next())
|
||||
@ -864,7 +863,7 @@ bool db_compare::ifKeysConflict(db_opt* pDb_opt, QString sDataBase, QString sTab
|
||||
QString sError_u = "";
|
||||
if( pDb_opt->executeSql(sSql_u, query_u, sError_u) == false )
|
||||
{
|
||||
emit mergeRes("判断UNIQUE记录冲突查询失败:" + sError_u, 1);
|
||||
emit mergeRes(tr("判断UNIQUE记录冲突查询失败:%1").arg(sError_u), 1);
|
||||
return false;
|
||||
}
|
||||
if(query_u.size() > 0)
|
||||
@ -896,7 +895,7 @@ bool db_compare::ifKeysConflict(db_opt* pDb_opt, QString sDataBase, QString sTab
|
||||
QString sError_k = "";
|
||||
if( pDb_opt->executeSql(sSql_k, query_k, sError_k) == false )
|
||||
{
|
||||
emit mergeRes("判断主键冲突查询失败:" + sError_k, 1);
|
||||
emit mergeRes(tr("判断主键冲突查询失败:%1").arg(sError_k), 1);
|
||||
}
|
||||
if(query_k.size() > 0)
|
||||
{
|
||||
@ -932,7 +931,7 @@ void db_compare::deleteConflictRecord(db_opt* pDb_opt, QString sDataBase, QStrin
|
||||
QString sError_u = "";
|
||||
if( pDb_opt->executeSql(sSql_u, query_u, sError_u) == false )
|
||||
{
|
||||
emit mergeRes("删除UNIQUE冲突记录失败:" + sError_u, 1);
|
||||
emit mergeRes(tr("删除UNIQUE冲突记录失败:%1").arg(sError_u), 1);
|
||||
}
|
||||
query_u.clear();
|
||||
}
|
||||
@ -955,7 +954,7 @@ void db_compare::deleteConflictRecord(db_opt* pDb_opt, QString sDataBase, QStrin
|
||||
QString sError_k = "";
|
||||
if( pDb_opt->executeSql(sSql_k, query_k, sError_k) == false )
|
||||
{
|
||||
emit mergeRes("删除主键冲突记录失败:" + sError_k, 1);
|
||||
emit mergeRes(tr("删除主键冲突记录失败:%1").arg(sError_k), 1);
|
||||
}
|
||||
query_k.clear();
|
||||
}
|
||||
@ -968,7 +967,7 @@ int db_compare::getColumnNum(db_opt* pDb_opt, QString sDataBase, QString sTableN
|
||||
QString sError;
|
||||
if( pDb_opt->executeSql(sSql, query, sError) == false )
|
||||
{
|
||||
emit mergeRes("查询字段数量失败:" + sError, 1);
|
||||
emit mergeRes(tr("查询字段数量失败:%1").arg(sError), 1);
|
||||
}
|
||||
while(query.next())
|
||||
{
|
||||
@ -988,7 +987,7 @@ QStringList db_compare::getMainKeys(db_opt* pDb_opt, QString sDataBase, QString
|
||||
QString sError = "";
|
||||
if( pDb_opt->executeSql(sSql, query, sError) == false )
|
||||
{
|
||||
emit mergeRes("获取主键查询失败:" + sError, 1);
|
||||
emit mergeRes(tr("获取主键查询失败:%1").arg(sError), 1);
|
||||
}
|
||||
|
||||
while(query.next())
|
||||
@ -1012,7 +1011,7 @@ QStringList db_compare::getUniques(db_opt* pDb_opt, QString sDataBaseName, QStri
|
||||
QString sError = "";
|
||||
if( pDb_opt->executeSql(sSql, query, sError) == false )
|
||||
{
|
||||
emit mergeRes("查询UNIQUE字段失败:" + sError, 1);
|
||||
emit mergeRes(tr("查询UNIQUE字段失败:%1").arg(sError), 1);
|
||||
}
|
||||
|
||||
while(query.next())
|
||||
@ -1033,7 +1032,7 @@ bool db_compare::ifExistTable(db_opt* pDb_opt, QString sDataBase, QString sTable
|
||||
QString sError = "";
|
||||
if( pDb_opt->executeSql(sSql, query, sError) == false )
|
||||
{
|
||||
emit mergeRes("获取主键查询失败:" + sError, 1);
|
||||
emit mergeRes(tr("获取主键查询失败:%1").arg(sError), 1);
|
||||
}
|
||||
while(query.next())
|
||||
{
|
||||
@ -1053,7 +1052,7 @@ bool db_compare::ifSubSystemSame( db_opt* pDb_opt, QString& sDatabaseName, QStri
|
||||
QString sError = "";
|
||||
if( pDb_opt->executeSql(sSql, query, sError) == false )
|
||||
{
|
||||
emit mergeRes("查询专业是否匹配出错," + sError, 1);
|
||||
emit mergeRes(tr("查询专业是否匹配出错,%1").arg(sError), 1);
|
||||
return false;
|
||||
}
|
||||
while(query.next())
|
||||
@ -1071,7 +1070,7 @@ bool db_compare::ifSubSystemSame( db_opt* pDb_opt, QString& sDatabaseName, QStri
|
||||
QString sError = "";
|
||||
if( pDb_opt->executeSql(sSql, query, sError) == false )
|
||||
{
|
||||
emit mergeRes("查询专业是否匹配出错," + sError, 1);
|
||||
emit mergeRes(tr("查询专业是否匹配出错,%1").arg(sError), 1);
|
||||
return false;
|
||||
}
|
||||
while(query.next())
|
||||
@ -1089,7 +1088,7 @@ bool db_compare::ifDistinguishStation( db_opt* pDb_opt, QString& sDatabaseName,
|
||||
QString sError = "";
|
||||
if( pDb_opt->executeSql(sSql, query, sError) == false )
|
||||
{
|
||||
emit mergeRes("查询专业是否匹配出错," + sError, 1);
|
||||
emit mergeRes(tr("查询专业是否匹配出错,%1").arg(sError), 1);
|
||||
return false;
|
||||
}
|
||||
while(query.next())
|
||||
@ -1107,7 +1106,7 @@ bool db_compare::ifDistinguishSubSystem( db_opt* pDb_opt, QString& sDatabaseName
|
||||
QString sError = "";
|
||||
if( pDb_opt->executeSql(sSql, query, sError) == false )
|
||||
{
|
||||
emit mergeRes("查询专业是否匹配出错," + sError, 1);
|
||||
emit mergeRes(tr("查询专业是否匹配出错,%1").arg(sError), 1);
|
||||
return false;
|
||||
}
|
||||
while(query.next())
|
||||
|
||||
@ -1,107 +1,111 @@
|
||||
#-------------------------------------------------
|
||||
#
|
||||
# Project created by QtCreator 2018-06-28T13:47:06
|
||||
#
|
||||
#-------------------------------------------------
|
||||
|
||||
QT += core gui sql xml network
|
||||
|
||||
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
||||
|
||||
TARGET = db_manager
|
||||
TEMPLATE = app
|
||||
|
||||
#CONFIG += c++11
|
||||
|
||||
# The following define makes your compiler emit warnings if you use
|
||||
# any feature of Qt which has been marked as deprecated (the exact warnings
|
||||
# depend on your compiler). Please consult the documentation of the
|
||||
# deprecated API in order to know how to port your code away from it.
|
||||
DEFINES += QT_DEPRECATED_WARNINGS
|
||||
|
||||
|
||||
SOURCES += \
|
||||
main.cpp \
|
||||
db_set.cpp \
|
||||
db_compare.cpp \
|
||||
mytreewidget.cpp \
|
||||
pj_manager.cpp \
|
||||
conndig.cpp \
|
||||
his_widgets/new_his_backup_dialog.cpp \
|
||||
his_widgets/import_his_backup_dialog.cpp \
|
||||
his_widgets/new_his_dump_dialog.cpp \
|
||||
pj_manager_his/pj_manager_his.cpp \
|
||||
pj_manager_his/pj_manager_his_data_srv.cpp \
|
||||
CHisUtil.cpp \
|
||||
CLogMngWidget.cpp \
|
||||
CExportZipWorker.cpp\
|
||||
SingleApplication.cpp \
|
||||
SingleApplication_p.cpp \
|
||||
CStationReuseForm.cpp
|
||||
|
||||
HEADERS += \
|
||||
db_manager_common.h \
|
||||
db_set.h \
|
||||
db_compare.h \
|
||||
mytreewidget.h \
|
||||
pj_manager.h \
|
||||
conndig.h \
|
||||
his_widgets/new_his_backup_dialog.h \
|
||||
his_widgets/import_his_backup_dialog.h \
|
||||
his_widgets/new_his_dump_dialog.h \
|
||||
CHisUtil.h \
|
||||
CLogMngWidget.h \
|
||||
CExportZipWorker.h \
|
||||
SingleApplication.h \
|
||||
SingleApplication_p.h \
|
||||
CStationReuseForm.h
|
||||
|
||||
FORMS += \
|
||||
db_set.ui \
|
||||
pj_manager.ui \
|
||||
conndig.ui \
|
||||
his_widgets/new_his_backup_dialog.ui \
|
||||
his_widgets/import_his_backup_dialog.ui \
|
||||
his_widgets/new_his_dump_dialog.ui \
|
||||
logMngWidget.ui \
|
||||
CStationReuseForm.ui
|
||||
|
||||
|
||||
LIBS += -lboost_thread \
|
||||
-lboost_chrono \
|
||||
-lboost_system
|
||||
|
||||
|
||||
LIBS += -lpub_logger_api -llog4cplus -lz -lcurl -lpub_sysinfo_api -ltsdb_api -ldb_base_api -ldb_manager_api -ldb_his_mng_api -lpub_utility_api -ldb_sysinfo_api
|
||||
|
||||
DEFINES += QAPPLICATION_CLASS=QApplication
|
||||
|
||||
win32{
|
||||
LIBS += -ladvapi32
|
||||
QMAKE_CXXFLAGS += /wd"4003"
|
||||
QMAKE_CXXFLAGS_WARN_ON -= -w34189
|
||||
RC_ICONS = res/db_manager.ico
|
||||
|
||||
CONFIG(debug, debug|release) {
|
||||
LIBS += -lquazipd
|
||||
}
|
||||
CONFIG(release, debug|release) {
|
||||
LIBS += -lquazip
|
||||
}
|
||||
|
||||
}
|
||||
else{
|
||||
LIBS += -lquazip
|
||||
}
|
||||
|
||||
TRANSLATIONS = $$PWD/en.ts
|
||||
RESOURCES += res.qrc
|
||||
|
||||
#-0-----------------------------------------------------------------
|
||||
COMMON_PRI=$$PWD/../../common.pri
|
||||
exists($$COMMON_PRI) {
|
||||
include($$COMMON_PRI)
|
||||
}else {
|
||||
error("FATAL error: can not find common.pri")
|
||||
}
|
||||
|
||||
#-------------------------------------------------
|
||||
#
|
||||
# Project created by QtCreator 2018-06-28T13:47:06
|
||||
#
|
||||
#-------------------------------------------------
|
||||
|
||||
QT += core gui sql xml network
|
||||
|
||||
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
||||
|
||||
TARGET = db_manager
|
||||
TEMPLATE = app
|
||||
|
||||
#CONFIG += c++11
|
||||
|
||||
# The following define makes your compiler emit warnings if you use
|
||||
# any feature of Qt which has been marked as deprecated (the exact warnings
|
||||
# depend on your compiler). Please consult the documentation of the
|
||||
# deprecated API in order to know how to port your code away from it.
|
||||
DEFINES += QT_DEPRECATED_WARNINGS
|
||||
|
||||
|
||||
SOURCES += \
|
||||
main.cpp \
|
||||
db_set.cpp \
|
||||
db_compare.cpp \
|
||||
mytreewidget.cpp \
|
||||
pj_manager.cpp \
|
||||
conndig.cpp \
|
||||
his_widgets/new_his_backup_dialog.cpp \
|
||||
his_widgets/import_his_backup_dialog.cpp \
|
||||
his_widgets/new_his_dump_dialog.cpp \
|
||||
pj_manager_his/pj_manager_his.cpp \
|
||||
pj_manager_his/pj_manager_his_data_srv.cpp \
|
||||
CHisUtil.cpp \
|
||||
CLogMngWidget.cpp \
|
||||
CExportZipWorker.cpp\
|
||||
SingleApplication.cpp \
|
||||
SingleApplication_p.cpp \
|
||||
CStationReuseForm.cpp \
|
||||
CCreateInfluxDBUserDlg.cpp
|
||||
|
||||
HEADERS += \
|
||||
db_manager_common.h \
|
||||
db_set.h \
|
||||
db_compare.h \
|
||||
mytreewidget.h \
|
||||
pj_manager.h \
|
||||
conndig.h \
|
||||
his_widgets/new_his_backup_dialog.h \
|
||||
his_widgets/import_his_backup_dialog.h \
|
||||
his_widgets/new_his_dump_dialog.h \
|
||||
CHisUtil.h \
|
||||
CLogMngWidget.h \
|
||||
CExportZipWorker.h \
|
||||
SingleApplication.h \
|
||||
SingleApplication_p.h \
|
||||
CStationReuseForm.h \
|
||||
CCreateInfluxDBUserDlg.h
|
||||
|
||||
FORMS += \
|
||||
db_set.ui \
|
||||
pj_manager.ui \
|
||||
conndig.ui \
|
||||
his_widgets/new_his_backup_dialog.ui \
|
||||
his_widgets/import_his_backup_dialog.ui \
|
||||
his_widgets/new_his_dump_dialog.ui \
|
||||
logMngWidget.ui \
|
||||
CStationReuseForm.ui \
|
||||
CCreateInfluxDBUserDlg.ui
|
||||
|
||||
|
||||
LIBS += -lboost_thread \
|
||||
-lboost_chrono \
|
||||
-lboost_system
|
||||
|
||||
|
||||
LIBS += -lpub_logger_api -llog4cplus -lz -lcurl -lpub_sysinfo_api -ltsdb_api -ldb_base_api -ldb_manager_api -ldb_his_mng_api -lpub_utility_api -ldb_sysinfo_api
|
||||
LIBS += -lpub_widget
|
||||
|
||||
DEFINES += QAPPLICATION_CLASS=QApplication
|
||||
|
||||
win32{
|
||||
LIBS += -ladvapi32
|
||||
QMAKE_CXXFLAGS += /wd"4003"
|
||||
QMAKE_CXXFLAGS_WARN_ON -= -w34189
|
||||
RC_ICONS = res/db_manager.ico
|
||||
|
||||
CONFIG(debug, debug|release) {
|
||||
LIBS += -lquazipd
|
||||
}
|
||||
CONFIG(release, debug|release) {
|
||||
LIBS += -lquazip
|
||||
}
|
||||
|
||||
}
|
||||
else{
|
||||
LIBS += -lquazip
|
||||
}
|
||||
|
||||
TRANSLATIONS = $$PWD/en.ts
|
||||
RESOURCES += res.qrc
|
||||
|
||||
#-0-----------------------------------------------------------------
|
||||
COMMON_PRI=$$PWD/../../common.pri
|
||||
exists($$COMMON_PRI) {
|
||||
include($$COMMON_PRI)
|
||||
}else {
|
||||
error("FATAL error: can not find common.pri")
|
||||
}
|
||||
|
||||
|
||||
@ -16,14 +16,10 @@
|
||||
|
||||
|
||||
|
||||
#define TSDB_DB_NAME "iscs6000"
|
||||
#define DB_FILE_NAME "db_export.sql"
|
||||
#define TSDB_FILE_NAME "tsdb_export.sql.gz"
|
||||
#define TSDB_FILE_EVENT_NAME "tsdb_export_event.sql.gz"
|
||||
#define TSDB_FILE_DATA_NAME "tsdb_export_data.sql.gz"
|
||||
#define TSDB_BIN_DIR "tsdb_bin_export"
|
||||
|
||||
#define CN_PASSWD "kbdct@0755"
|
||||
|
||||
|
||||
#endif // DB_MANAGER_COMMON_H
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#include "db_set.h"
|
||||
#include "ui_db_set.h"
|
||||
#include <QMessageBox>
|
||||
#include "pub_widget/MessageBox.h"
|
||||
#include <QSqlDatabase>
|
||||
#include <QSqlError>
|
||||
#include <db_manager_common.h>
|
||||
@ -9,11 +9,13 @@
|
||||
|
||||
using namespace iot_dbms;
|
||||
db_set::db_set( QWidget* parent )
|
||||
: QDialog( parent )
|
||||
: CustomUiDialog( parent )
|
||||
, ui( new Ui::db_set )
|
||||
{
|
||||
ui->setupUi( this );
|
||||
ui->le_passwd->setText(CN_PASSWD);
|
||||
ui->le_passwd->setText(EMS_DEFAULT_PASSWD);
|
||||
|
||||
setAutoLayout(true);
|
||||
}
|
||||
|
||||
db_set::~db_set()
|
||||
@ -135,14 +137,11 @@ void db_set::accept()
|
||||
{
|
||||
if( ui->le_name->text() == "" || ui->le_ip->text() == "" || ui->le_port->text() == "")
|
||||
{
|
||||
QMessageBox msg(this);
|
||||
msg.setText(tr("不准选择空路径"));
|
||||
msg.setWindowTitle(tr("提示"));
|
||||
msg.exec();
|
||||
N_MessageBox::information(this,tr("提示"),tr("不准选择空路径"));
|
||||
return;
|
||||
}
|
||||
else
|
||||
return QDialog::accept();
|
||||
return CustomUiDialog::accept();
|
||||
}
|
||||
|
||||
|
||||
@ -174,7 +173,7 @@ void db_set::on_rb_kingbase_clicked()
|
||||
void db_set::on_pushButton_clicked()
|
||||
{
|
||||
if( ui->le_user->text() == "" || ui->le_ip->text() == "" || ui->le_port->text() == "" || ui->le_passwd->text() == ""){
|
||||
QMessageBox::warning(this,tr("警告"),tr("请把信息填写完整"));
|
||||
N_MessageBox::warning(this,tr("警告"),tr("请把信息填写完整"));
|
||||
return;
|
||||
}
|
||||
|
||||
@ -208,11 +207,11 @@ void db_set::on_pushButton_clicked()
|
||||
|
||||
if(ok)
|
||||
{
|
||||
QMessageBox::information(this,tr("测试结果"),tr("连接成功"));
|
||||
N_MessageBox::information(this,tr("测试结果"),tr("连接成功"));
|
||||
}
|
||||
else
|
||||
{
|
||||
QMessageBox::warning(this,tr("测试结果"),QString(tr("连接失败:")) + objDb.getLastErrorString());
|
||||
N_MessageBox::warning(this,tr("测试结果"),QString(tr("连接失败:")) + objDb.getLastErrorString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,16 +1,15 @@
|
||||
#ifndef DBSET_H
|
||||
#define DBSET_H
|
||||
|
||||
#include <QDialog>
|
||||
#include "db_base_api/CDbPara.h"
|
||||
|
||||
#include "pub_widget/CustomDialog.h"
|
||||
|
||||
namespace Ui
|
||||
{
|
||||
class db_set;
|
||||
}
|
||||
|
||||
class db_set : public QDialog
|
||||
class db_set : public CustomUiDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
|
||||
@ -6,73 +6,15 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>359</width>
|
||||
<height>290</height>
|
||||
<width>283</width>
|
||||
<height>354</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Dialog</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>数据库类型:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QRadioButton" name="rb_mysql">
|
||||
<property name="text">
|
||||
<string>MySQL</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<attribute name="buttonGroup">
|
||||
<string notr="true">buttonGroup</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QRadioButton" name="rb_opengauss">
|
||||
<property name="text">
|
||||
<string>openGauss</string>
|
||||
</property>
|
||||
<attribute name="buttonGroup">
|
||||
<string notr="true">buttonGroup</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QRadioButton" name="rb_oracle">
|
||||
<property name="text">
|
||||
<string>Oracle</string>
|
||||
</property>
|
||||
<attribute name="buttonGroup">
|
||||
<string notr="true">buttonGroup</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QRadioButton" name="rb_kingbase">
|
||||
<property name="text">
|
||||
<string>KingBase</string>
|
||||
</property>
|
||||
<attribute name="buttonGroup">
|
||||
<string notr="true">buttonGroup</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QGridLayout" name="gridLayout_2">
|
||||
<item row="1" column="0">
|
||||
<layout class="QFormLayout" name="formLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label_2">
|
||||
@ -140,7 +82,7 @@
|
||||
<item row="4" column="1">
|
||||
<widget class="QLineEdit" name="le_passwd">
|
||||
<property name="text">
|
||||
<string>kbdct@0755</string>
|
||||
<string>ems@byd23</string>
|
||||
</property>
|
||||
<property name="echoMode">
|
||||
<enum>QLineEdit::Password</enum>
|
||||
@ -149,36 +91,110 @@
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButton">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<family>微软雅黑</family>
|
||||
<pointsize>10</pointsize>
|
||||
<weight>50</weight>
|
||||
<bold>false</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>测试连接是否正常</string>
|
||||
</property>
|
||||
</widget>
|
||||
<item row="0" column="0">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>数据库类型:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QRadioButton" name="rb_mysql">
|
||||
<property name="text">
|
||||
<string>MySQL</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<attribute name="buttonGroup">
|
||||
<string notr="true">buttonGroup</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QRadioButton" name="rb_opengauss">
|
||||
<property name="text">
|
||||
<string>openGauss</string>
|
||||
</property>
|
||||
<attribute name="buttonGroup">
|
||||
<string notr="true">buttonGroup</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QRadioButton" name="rb_oracle">
|
||||
<property name="text">
|
||||
<string>Oracle</string>
|
||||
</property>
|
||||
<attribute name="buttonGroup">
|
||||
<string notr="true">buttonGroup</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QRadioButton" name="rb_kingbase">
|
||||
<property name="text">
|
||||
<string>KingBase</string>
|
||||
</property>
|
||||
<attribute name="buttonGroup">
|
||||
<string notr="true">buttonGroup</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<item row="2" column="0">
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButton">
|
||||
<property name="text">
|
||||
<string>测试连接</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,6 +1,7 @@
|
||||
#include "import_his_backup_dialog.h"
|
||||
#include "ui_import_his_backup_dialog.h"
|
||||
#include "public/pub_utility_api/FileUtil.h"
|
||||
#include "public/pub_utility_api/TimeUtil.h"
|
||||
#include "db_manager_common.h"
|
||||
#include "CHisUtil.h"
|
||||
|
||||
@ -9,18 +10,21 @@
|
||||
#include <QDomDocument>
|
||||
#include <QDomElement>
|
||||
#include <QDateTime>
|
||||
#include <QMessageBox>
|
||||
#include "pub_widget/MessageBox.h"
|
||||
|
||||
|
||||
import_his_backup_dialog::import_his_backup_dialog(QWidget *parent) :
|
||||
QDialog(parent),
|
||||
CustomUiDialog(parent),
|
||||
ui(new Ui::import_his_backup_dialog)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
initUi();
|
||||
initHisMng();
|
||||
setCloseBtnVisible(false);
|
||||
m_lLastImportTsdbPrintInfo = 0L;
|
||||
|
||||
setAutoLayout(true);
|
||||
}
|
||||
|
||||
import_his_backup_dialog::~import_his_backup_dialog()
|
||||
@ -61,6 +65,20 @@ void import_his_backup_dialog::addMsg(const QString &msg)
|
||||
isDbErr = true;
|
||||
return;
|
||||
}
|
||||
|
||||
qint64 lCurTime = iot_public::getMonotonicMsec();
|
||||
if(msg.contains("(PPS)")) //针对influxdb特例化处理,否则消息框消息太多,临时解决为:1分钟输出1条过程信息
|
||||
{
|
||||
if(lCurTime - m_lLastImportTsdbPrintInfo < 60 * 1000)
|
||||
{
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_lLastImportTsdbPrintInfo = lCurTime;
|
||||
}
|
||||
}
|
||||
|
||||
ui->listWidget->addItem(msg);
|
||||
}
|
||||
|
||||
@ -72,8 +90,6 @@ void import_his_backup_dialog::initUi()
|
||||
|
||||
this->setWindowTitle(tr("导入备份"));
|
||||
// ui->tabWidget->setCurrentIndex(0);
|
||||
ui->listWidget->setStyleSheet("QListWidget::item{height:20px;color:#0a0a0a}");
|
||||
this->setWindowFlags(Qt::Window | Qt::WindowTitleHint | Qt::CustomizeWindowHint); //< 取消关闭按钮
|
||||
|
||||
ui->label_dumpdate_tag->setHidden(true);
|
||||
ui->label_dumpdate->setHidden(true);
|
||||
@ -221,25 +237,29 @@ QString import_his_backup_dialog::getTsdbDataFilePath()
|
||||
|
||||
void import_his_backup_dialog::startImport()
|
||||
{
|
||||
m_lLastImportTsdbPrintInfo = 0L;
|
||||
/* 为以后搜索方便,保留此注释
|
||||
* 本函数多处EMS_DEFAULT_DATABASE
|
||||
*/
|
||||
if(isDump)
|
||||
{
|
||||
emit importHisDump(m_pConn,getDbFilePath(),m_pConn->hostName(),TSDB_DB_NAME,getTsdbFilePath());
|
||||
emit importHisDump(m_pConn,getDbFilePath(),m_pConn->hostName(),m_pConn->databaseName(),getTsdbFilePath());
|
||||
return;
|
||||
}
|
||||
|
||||
if(isAll)
|
||||
{
|
||||
emit importHis(m_pConn,getDbFilePath(),m_pConn->hostName(),TSDB_DB_NAME,getTsdbBinDir());
|
||||
emit importHis(m_pConn,getDbFilePath(),m_pConn->hostName(),m_pConn->databaseName(),getTsdbBinDir());
|
||||
return;
|
||||
}
|
||||
|
||||
if(isPart)
|
||||
{
|
||||
if(partVersion == 1) {
|
||||
emit importPart(m_pConn,m_pConn->hostName(),TSDB_DB_NAME,isEventExported,isDataExported,getDbFilePath(),getTsdbEventFilePath(),getTsdbDataFilePath());
|
||||
emit importPart(m_pConn,m_pConn->hostName(),m_pConn->databaseName(),isEventExported,isDataExported,getDbFilePath(),getTsdbEventFilePath(),getTsdbDataFilePath());
|
||||
}
|
||||
else{
|
||||
emit importPartV2(m_pConn,m_pConn->hostName(),TSDB_DB_NAME,getDbFilePath(),getTsdbFilePath());
|
||||
emit importPartV2(m_pConn,m_pConn->hostName(),m_pConn->databaseName(),getDbFilePath(),getTsdbFilePath());
|
||||
}
|
||||
|
||||
}
|
||||
@ -256,7 +276,8 @@ void import_his_backup_dialog::on_buttonBox_clicked(QAbstractButton *button)
|
||||
{
|
||||
if(button->text() == tr("开始"))
|
||||
{
|
||||
if(QMessageBox::question(this,tr("提醒"),tr("是否恢复备份?(如果是恢复全量备份则会覆盖原始数据!)")) != QMessageBox::Yes)
|
||||
if(N_MessageBox::question(this,tr("提醒"),tr("是否恢复备份?(如果是恢复全量备份则会覆盖原始数据!)"))
|
||||
!= N_MessageBox::Ok)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
@ -3,18 +3,18 @@
|
||||
|
||||
#include <dbms/db_his_mng_api/CHisMngApi.h>
|
||||
|
||||
#include <QDialog>
|
||||
#include <QSqlDatabase>
|
||||
#include <QThread>
|
||||
#include <QTimer>
|
||||
#include <QAbstractButton>
|
||||
#include <QDomElement>
|
||||
#include "pub_widget/CustomDialog.h"
|
||||
|
||||
namespace Ui {
|
||||
class import_his_backup_dialog;
|
||||
}
|
||||
|
||||
class import_his_backup_dialog : public QDialog
|
||||
class import_his_backup_dialog : public CustomUiDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
@ -70,7 +70,7 @@ private:
|
||||
int partVersion;
|
||||
bool isEventExported = false;
|
||||
bool isDataExported = false;
|
||||
|
||||
qint64 m_lLastImportTsdbPrintInfo; //最后一次打印tsdb导入信息的日志时间,1分钟打印一次,防止qlistwidget行数太多
|
||||
|
||||
void initUi();
|
||||
void initHisMng();
|
||||
|
||||
@ -14,19 +14,6 @@
|
||||
<string>Dialog</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="1" column="0">
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="styleSheet">
|
||||
<string notr="true"> button-layout: 2</string>
|
||||
</property>
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Apply|QDialogButtonBox::Cancel</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QTabWidget" name="tabWidget">
|
||||
<property name="currentIndex">
|
||||
@ -280,6 +267,19 @@
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="styleSheet">
|
||||
<string notr="true"> button-layout: 2</string>
|
||||
</property>
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Apply|QDialogButtonBox::Cancel</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
|
||||
#include <QDateTime>
|
||||
#include <QPushButton>
|
||||
#include <QMessageBox>
|
||||
#include "pub_widget/MessageBox.h"
|
||||
#include <public/pub_utility_api/FileUtil.h>
|
||||
#include <QDir>
|
||||
#include <QHostInfo>
|
||||
@ -15,7 +15,7 @@
|
||||
|
||||
Q_DECLARE_METATYPE(std::vector<std::string>)
|
||||
new_his_backup_dialog::new_his_backup_dialog(QWidget *parent) :
|
||||
QDialog(parent),
|
||||
CustomUiDialog(parent),
|
||||
ui(new Ui::new_his_backup_dialog)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
@ -28,6 +28,9 @@ new_his_backup_dialog::new_his_backup_dialog(QWidget *parent) :
|
||||
qRegisterMetaType< std::vector<int> >();
|
||||
qRegisterMetaType< std::vector<std::string> >();
|
||||
|
||||
setCloseBtnVisible(false);
|
||||
|
||||
setAutoLayout(true);
|
||||
}
|
||||
|
||||
new_his_backup_dialog::~new_his_backup_dialog()
|
||||
@ -73,8 +76,6 @@ void new_his_backup_dialog::init()
|
||||
|
||||
ui->tabWidget->setCurrentIndex(0);
|
||||
|
||||
this->setWindowFlags(Qt::Window | Qt::WindowTitleHint | Qt::CustomizeWindowHint); //< 取消关闭按钮
|
||||
|
||||
ui->dateTimeEdit_start->setDateTime(QDateTime::currentDateTime().addYears(-1));
|
||||
|
||||
ui->dateTimeEdit_end->setDateTime(QDateTime::currentDateTime());
|
||||
@ -116,7 +117,6 @@ void new_his_backup_dialog::initConnect()
|
||||
|
||||
void new_his_backup_dialog::initStyleSheet()
|
||||
{
|
||||
ui->listWidget->setStyleSheet("QListWidget::item{height:20px;color:#0a0a0a}");
|
||||
}
|
||||
|
||||
void new_his_backup_dialog::initHisMng()
|
||||
@ -262,13 +262,13 @@ void new_his_backup_dialog::checkTimeValid()
|
||||
if(ui->dateTimeEdit_end->dateTime() > QDateTime::currentDateTime())
|
||||
{
|
||||
ui->dateTimeEdit_end->setDateTime(QDateTime::currentDateTime());
|
||||
QMessageBox::information(this,tr("提醒"),tr("结束时间请先设置小于当前时间"));
|
||||
N_MessageBox::information(this,tr("提醒"),tr("结束时间请先设置小于当前时间"));
|
||||
return;
|
||||
}
|
||||
if(ui->dateTimeEdit_start->dateTime() > ui->dateTimeEdit_end->dateTime())
|
||||
{
|
||||
ui->dateTimeEdit_start->setDateTime(ui->dateTimeEdit_end->dateTime().addDays(-1));
|
||||
QMessageBox::information(this,tr("提醒"),tr("开始时间请先设置小于结束时间"));
|
||||
N_MessageBox::information(this,tr("提醒"),tr("开始时间请先设置小于结束时间"));
|
||||
}
|
||||
|
||||
}
|
||||
@ -296,7 +296,10 @@ void new_his_backup_dialog::startBackupAll()
|
||||
endtime = ui->dateTimeEdit_end->dateTime().toMSecsSinceEpoch();
|
||||
}
|
||||
|
||||
emit exportHis(m_pConn,m_dbFilePath,TSDB_DB_NAME,m_tsdbBinDir,starttime,endtime );
|
||||
/* 为以后搜索方便,保留此注释
|
||||
* emit exportHis(m_pConn,m_dbFilePath,EMS_DEFAULT_DATABASE,m_tsdbBinDir,starttime,endtime );
|
||||
*/
|
||||
emit exportHis(m_pConn,m_dbFilePath,m_pConn->databaseName(),m_tsdbBinDir,starttime,endtime );
|
||||
}
|
||||
|
||||
void new_his_backup_dialog::startBackupPart()
|
||||
@ -310,11 +313,12 @@ void new_his_backup_dialog::startBackupPart()
|
||||
endtime = ui->dateTimeEdit_end->dateTime().toMSecsSinceEpoch();
|
||||
}
|
||||
|
||||
emit exportPart(m_pConn,m_pConn->hostName(),TSDB_DB_NAME,
|
||||
|
||||
/* 为以后搜索方便,保留此注释
|
||||
* emit exportPart(m_pConn,m_pConn->hostName(),EMS_DEFAULT_DATABASE,
|
||||
*/
|
||||
emit exportPart(m_pConn,m_pConn->hostName(),m_pConn->databaseName(),
|
||||
starttime,
|
||||
endtime,
|
||||
|
||||
m_dbFilePath,
|
||||
m_tsdbFilePath
|
||||
);
|
||||
|
||||
@ -3,18 +3,17 @@
|
||||
|
||||
#include <dbms/db_his_mng_api/CHisMngApi.h>
|
||||
|
||||
#include <QDialog>
|
||||
#include <QThread>
|
||||
#include <QSqlDatabase>
|
||||
#include <QAbstractButton>
|
||||
#include <QTimer>
|
||||
|
||||
#include "pub_widget/CustomDialog.h"
|
||||
|
||||
namespace Ui {
|
||||
class new_his_backup_dialog;
|
||||
}
|
||||
|
||||
class new_his_backup_dialog : public QDialog
|
||||
class new_his_backup_dialog : public CustomUiDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
|
||||
@ -13,11 +13,8 @@
|
||||
#include <public/pub_utility_api/FileUtil.h>
|
||||
#include "CHisUtil.h"
|
||||
|
||||
|
||||
|
||||
|
||||
new_his_dump_dialog::new_his_dump_dialog(QWidget *parent) :
|
||||
QDialog(parent),
|
||||
CustomUiDialog(parent),
|
||||
ui(new Ui::new_his_dump_dialog)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
@ -25,6 +22,10 @@ new_his_dump_dialog::new_his_dump_dialog(QWidget *parent) :
|
||||
initUi();
|
||||
initHisMng();
|
||||
init();
|
||||
|
||||
setCloseBtnVisible(false);
|
||||
|
||||
setAutoLayout(true);
|
||||
}
|
||||
|
||||
new_his_dump_dialog::~new_his_dump_dialog()
|
||||
@ -60,12 +61,12 @@ void new_his_dump_dialog::handleDumpHisFinished(bool result)
|
||||
{
|
||||
if(result)
|
||||
{
|
||||
addMsg("转储完成");
|
||||
addMsg(tr("转储完成"));
|
||||
genConfig();
|
||||
}
|
||||
else
|
||||
{
|
||||
addMsg("转储失败");
|
||||
addMsg(tr("转储失败"));
|
||||
}
|
||||
finish();
|
||||
}
|
||||
@ -80,10 +81,6 @@ void new_his_dump_dialog::setDumpDateTime(qint64 timestamp)
|
||||
void new_his_dump_dialog::initUi()
|
||||
{
|
||||
ui->listWidget->setUniformItemSizes(true);
|
||||
|
||||
this->setWindowFlags(Qt::Window | Qt::WindowTitleHint | Qt::CustomizeWindowHint); //< 取消关闭按钮
|
||||
ui->listWidget->setStyleSheet("QListWidget::item{height:20px;color:#0a0a0a}");
|
||||
|
||||
this->setWindowTitle(tr("手动转储"));
|
||||
|
||||
ui->buttonBox->button(QDialogButtonBox::Apply)->setText(tr("开始"));
|
||||
@ -130,9 +127,10 @@ void new_his_dump_dialog::updateTime()
|
||||
|
||||
void new_his_dump_dialog::startDump()
|
||||
{
|
||||
emit dumpHis(m_pConn,m_dbFilePath,
|
||||
TSDB_DB_NAME,m_tsdbFilePath,
|
||||
m_dumpTimestamp);
|
||||
/* 为以后搜索方便,保留此注释
|
||||
* emit dumpHis(m_pConn,m_dbFilePath,EMS_DEFAULT_DATABASE,m_tsdbFilePath,m_dumpTimestamp);
|
||||
*/
|
||||
emit dumpHis(m_pConn,m_dbFilePath,m_pConn->databaseName(),m_tsdbFilePath,m_dumpTimestamp);
|
||||
}
|
||||
|
||||
void new_his_dump_dialog::finish()
|
||||
@ -218,7 +216,7 @@ void new_his_dump_dialog::on_buttonBox_clicked(QAbstractButton *button)
|
||||
connect(&timer,&QTimer::timeout,this,&new_his_dump_dialog::updateTime);
|
||||
timer.setInterval(100);
|
||||
timer.start();
|
||||
button->setText("取消");
|
||||
button->setText(tr("取消"));
|
||||
|
||||
ui->buttonBox->button(QDialogButtonBox::Cancel)->setEnabled(false);
|
||||
ui->buttonBox->button(QDialogButtonBox::Cancel)->setDown(true);
|
||||
|
||||
@ -1,17 +1,17 @@
|
||||
#ifndef NEW_HIS_DUMP_DIALOG_H
|
||||
#define NEW_HIS_DUMP_DIALOG_H
|
||||
|
||||
#include <QDialog>
|
||||
#include <dbms/db_his_mng_api/CHisMngApi.h>
|
||||
#include <QAbstractButton>
|
||||
#include <QThread>
|
||||
#include <QTimer>
|
||||
#include "pub_widget/CustomDialog.h"
|
||||
|
||||
namespace Ui {
|
||||
class new_his_dump_dialog;
|
||||
}
|
||||
|
||||
class new_his_dump_dialog : public QDialog
|
||||
class new_his_dump_dialog : public CustomUiDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
|
||||
@ -10,6 +10,7 @@
|
||||
#include "pub_utility_api/I18N.h"
|
||||
#include "pub_utility_api/FileUtil.h"
|
||||
#include "pub_utility_api/SingleProcInstance.h"
|
||||
#include "pub_widget/PubWidgetInit.h"
|
||||
|
||||
using namespace iot_public;
|
||||
class SingleApplication;
|
||||
@ -42,6 +43,8 @@ void initI8n()
|
||||
pTrans->load( strQmFile.c_str());
|
||||
QApplication::installTranslator( pTrans );
|
||||
}
|
||||
|
||||
iot_public::installTranslator(strLanguage);
|
||||
}
|
||||
|
||||
|
||||
@ -53,8 +56,8 @@ int main( int argc, char *argv[] )
|
||||
|
||||
SingleApplication a( argc, argv );
|
||||
|
||||
QCoreApplication::setOrganizationName( "KbdSoft.ZHJK" );
|
||||
QCoreApplication::setOrganizationDomain( "KbdTech.com" );
|
||||
QCoreApplication::setOrganizationName( "IOT" );
|
||||
QCoreApplication::setOrganizationDomain( "iot.com" );
|
||||
QCoreApplication::setApplicationName( "db_manager" );
|
||||
|
||||
iot_public::StartLogSystem( "PUBLIC", "db_manager" );
|
||||
@ -66,7 +69,7 @@ int main( int argc, char *argv[] )
|
||||
|
||||
QObject::connect( &a, &SingleApplication::instanceStarted, [&w]()
|
||||
{
|
||||
LOGINFO( "重新打开应用程序,开始工作!" );
|
||||
LOGINFO( QObject::tr("重新打开应用程序,开始工作!").toStdString().c_str() );
|
||||
w.show();
|
||||
w.showNormal();
|
||||
w.activateWindow();
|
||||
|
||||
@ -1,11 +1,11 @@
|
||||
#include <QDateTime>
|
||||
#include <QMessageBox>
|
||||
#include "pub_widget/MessageBox.h"
|
||||
#include <QFileDialog>
|
||||
#include <QThread>
|
||||
#include <QInputDialog>
|
||||
#include <QDockWidget>
|
||||
#include <QPlainTextEdit>
|
||||
|
||||
#include <QMenu>
|
||||
|
||||
#include "pub_utility_api/I18N.h"
|
||||
#include "public/pub_utility_api/FileUtil.h"
|
||||
@ -23,12 +23,17 @@
|
||||
#include "db_set.h"
|
||||
#include"db_manager_common.h"
|
||||
#include "../db_manager_api/db_manager_api_common.h"
|
||||
|
||||
#include "pub_utility_api/FileStyle.h"
|
||||
#include "CCreateInfluxDBUserDlg.h"
|
||||
|
||||
using namespace iot_public;
|
||||
#define INDEX_NONDB_LOG 0
|
||||
#define INDEX_LOG_STACK_PROJECT 3
|
||||
|
||||
const int CN_MainTabIndex_Project = 0;
|
||||
const int CN_MainTabIndex_DB = 1;
|
||||
const int CN_MainTabIndex_Log = 2;
|
||||
|
||||
|
||||
quint32 getDefaultImportExportType()
|
||||
{
|
||||
@ -55,7 +60,7 @@ enum EN_ITEM_DATA_INDEX_TYPE
|
||||
};
|
||||
|
||||
pj_manager::pj_manager(QWidget *parent) :
|
||||
QMainWindow(parent),
|
||||
CustomUiMainWindow(parent),
|
||||
ui(new Ui::pj_manager),
|
||||
m_his_backup_dockWidiget(NULL)
|
||||
{
|
||||
@ -80,6 +85,8 @@ pj_manager::pj_manager(QWidget *parent) :
|
||||
appendTableInfoFromXml(sPlatFilePath, m_tableInfoMap );
|
||||
appendTableInfoFromXml(sProdFilePath, m_tableInfoMap );
|
||||
|
||||
|
||||
setTitleWidget(ui->mainmenu);
|
||||
}
|
||||
|
||||
pj_manager::~pj_manager()
|
||||
@ -102,30 +109,49 @@ void pj_manager::initPath()
|
||||
|
||||
void pj_manager::loadQss()
|
||||
{
|
||||
QString qss;
|
||||
QFile qssFile(":/res/pj_manager.qss");
|
||||
qssFile.open(QFile::ReadOnly);
|
||||
if (qssFile.isOpen())
|
||||
QString qss = QString();
|
||||
std::string strFullPath = iot_public::CFileStyle::getPathOfStyleFile("public.qss","zh","light");
|
||||
|
||||
QFile qssfile1(QString::fromStdString(strFullPath));
|
||||
qssfile1.open(QFile::ReadOnly);
|
||||
if (qssfile1.isOpen())
|
||||
{
|
||||
qss = QLatin1String(qssFile.readAll());
|
||||
qApp->setStyleSheet(qss);
|
||||
qssFile.close();
|
||||
qss += QLatin1String(qssfile1.readAll());
|
||||
qssfile1.close();
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
qDebug() << "public.qss 无法打开!";
|
||||
}
|
||||
|
||||
strFullPath = iot_public::CFileStyle::getPathOfStyleFile("db_manager.qss","zh","light");
|
||||
QFile qssfile2(QString::fromStdString(strFullPath));
|
||||
qssfile2.open(QFile::ReadOnly);
|
||||
if (qssfile2.isOpen())
|
||||
{
|
||||
qss += QLatin1String(qssfile2.readAll());
|
||||
qssfile2.close();
|
||||
}
|
||||
else
|
||||
{
|
||||
qDebug() << "pj_manager.qss 无法打开!";
|
||||
qDebug() << "db_manager.qss 无法打开!";
|
||||
}
|
||||
|
||||
if (!qss.isEmpty())
|
||||
{
|
||||
qApp->setStyleSheet(qss);
|
||||
}
|
||||
}
|
||||
|
||||
void pj_manager::initUi()
|
||||
{
|
||||
setWindowTitle(tr("工程管理工具"));
|
||||
setWindowTitle(tr("工程管理"));
|
||||
#ifdef OS_LINUX
|
||||
setWindowIcon( QIcon( ":res/db_manager.png" ) );
|
||||
#endif
|
||||
|
||||
ui->statusbar->hide();
|
||||
ui->menubar->hide();
|
||||
// ui->statusbar->hide();
|
||||
setDisabled();
|
||||
|
||||
ui->listWidget_error->setUniformItemSizes(true);
|
||||
@ -147,7 +173,7 @@ void pj_manager::initUi()
|
||||
initBackupTableWidget();
|
||||
initLabels();
|
||||
|
||||
ui->tabWidget_main->setCurrentIndex(0);
|
||||
ui->stackedWidget_main->setCurrentIndex(CN_MainTabIndex_Project);
|
||||
ui->stackedWidget_project->setCurrentIndex(0);
|
||||
ui->stackedWidget_database->setCurrentIndex(0);
|
||||
ui->tab_his->setCurrentIndex(0);
|
||||
@ -159,10 +185,11 @@ void pj_manager::initUi()
|
||||
ui->tabWidget_info->setTabIcon( 0, QIcon( ":res/msg_info.png" ) );
|
||||
ui->tabWidget_info->setTabIcon( 1, QIcon( ":res/msg_error.png" ) );
|
||||
|
||||
QListWidgetItem *itemSelected1 = ui->listWidget->item(0);
|
||||
QListWidgetItem *itemSelected2 = ui->listWidget_db->item(0);
|
||||
itemSelected1->setSelected(true);
|
||||
itemSelected2->setSelected(true);
|
||||
|
||||
ui->listWidget->setCurrentRow(0);
|
||||
ui->listWidget_db->setCurrentRow(0);
|
||||
ui->listWidget_db->item(1)->setHidden(true); //厂站复用
|
||||
ui->listWidget_db->item(2)->setHidden(true); //厂站合并
|
||||
|
||||
loadQss();
|
||||
|
||||
@ -174,10 +201,29 @@ void pj_manager::initUi()
|
||||
|
||||
//< 更改英文ui适配
|
||||
if(isEn())
|
||||
{
|
||||
initEnUi();
|
||||
}
|
||||
|
||||
initLogMngWidget();
|
||||
|
||||
QPushButton* btn;
|
||||
btn = new QPushButton();
|
||||
btn->setObjectName("btn_project");
|
||||
btn->setText(tr("工程管理"));
|
||||
ui->memuForm->addToolBtn(btn);
|
||||
|
||||
btn = new QPushButton();
|
||||
btn->setObjectName("btn_dbManager");
|
||||
btn->setText(tr("数据库管理"));
|
||||
ui->memuForm->addToolBtn(btn);
|
||||
|
||||
btn = new QPushButton();
|
||||
btn->setObjectName("btn_logManager");
|
||||
btn->setText(tr("日志管理"));
|
||||
ui->memuForm->addToolBtn(btn);
|
||||
|
||||
connect(ui->memuForm, SIGNAL(buttonClicked(int)),ui->stackedWidget_main, SLOT(setCurrentIndex(int)));
|
||||
|
||||
}
|
||||
|
||||
@ -298,6 +344,8 @@ void pj_manager::onCreateTriggerDone()
|
||||
|
||||
void pj_manager::initConnect()
|
||||
{
|
||||
connect(ui->stackedWidget_main,SIGNAL(currentChanged(int)),this,SLOT(slotMainTableWidgetCurrentChanged(int)));
|
||||
|
||||
connect(m_pDma, SIGNAL(sig_showMsg(QString, int)), this, SLOT(onShowMsg(QString,int)));
|
||||
connect(m_pDma, SIGNAL(signalPercent(int)), this, SLOT(onSetPercent(int)));
|
||||
|
||||
@ -340,6 +388,7 @@ void pj_manager::initConnect()
|
||||
connect(this, SIGNAL(sigCreateTriggerDone()), this, SLOT(onCreateTriggerDone() ) );
|
||||
connect(this, SIGNAL(sigDeploy()), this, SLOT(slotDeploy() ) );
|
||||
connect(ui->listWidget_db,SIGNAL(clicked(QModelIndex)),this,SLOT(onListWidgetDbChanged(QModelIndex)));
|
||||
connect(ui->listWidget_logMng,SIGNAL(clicked(QModelIndex)),this,SLOT(onListWidgetLogMngChanged(QModelIndex)));
|
||||
connect(ui->treeWidget, SIGNAL( customContextMenuRequested(const QPoint&)), this, SLOT( slotTreeWidgetContextMenuRequest(const QPoint&) ) );
|
||||
connect(ui->treeWidget, SIGNAL( itemClicked(QTreeWidgetItem*, int)), this, SLOT( slotItemClicked(QTreeWidgetItem*, int)) );
|
||||
connect(this, SIGNAL( sigSetDbProgressBar(int) ), ui->progressBar_db, SLOT( setValue(int) ) );
|
||||
@ -406,6 +455,11 @@ void pj_manager::onListWidgetDbChanged(QModelIndex index)
|
||||
}
|
||||
}
|
||||
|
||||
void pj_manager::onListWidgetLogMngChanged(QModelIndex)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void pj_manager::onShowBackup()
|
||||
{
|
||||
ui->stackedWidget_project->setCurrentIndex(0);
|
||||
@ -482,7 +536,6 @@ void pj_manager::setDisabled(bool value)
|
||||
ui->page_backup->setDisabled(value);
|
||||
ui->page_update->setDisabled(value);
|
||||
ui->page_hisdata->setDisabled(value);
|
||||
ui->menubar->setDisabled(value);
|
||||
ui->listWidget->setDisabled(value);
|
||||
if(value)
|
||||
pjUi = false;
|
||||
@ -492,14 +545,14 @@ void pj_manager::setDisabled(bool value)
|
||||
|
||||
void pj_manager::onConnDb()
|
||||
{
|
||||
if(ui->tabWidget_main->currentIndex() == 0)
|
||||
if(ui->stackedWidget_main->currentIndex() == CN_MainTabIndex_Project)
|
||||
{
|
||||
if(ui->stackedWidget_project->currentIndex() == 0)
|
||||
{
|
||||
int value = ui->progressBar_backup->text().split("%")[0].toInt();
|
||||
if( value > 0 && value < 100 )
|
||||
{
|
||||
QMessageBox::warning(this, tr("警告"), tr("正在执行操作,请勿重新连接!") );
|
||||
N_MessageBox::warning(this, tr("警告"), tr("正在执行操作,请勿重新连接!") );
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -508,7 +561,7 @@ void pj_manager::onConnDb()
|
||||
int value = ui->progressBar_update->text().split("%")[0].toInt();
|
||||
if( value > 0 && value < 100 )
|
||||
{
|
||||
QMessageBox::warning(this, tr("警告"), tr("正在执行操作,请勿重新连接!") );
|
||||
N_MessageBox::warning(this, tr("警告"), tr("正在执行操作,请勿重新连接!") );
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -606,7 +659,7 @@ void pj_manager::onBackup()
|
||||
Qt::WindowMaximizeButtonHint );
|
||||
if(!ok)
|
||||
return;
|
||||
if(ui->tabWidget_main->currentIndex() == 0 && ui->stackedWidget_project->currentIndex() == 0)
|
||||
if(ui->stackedWidget_main->currentIndex() == CN_MainTabIndex_Project && ui->stackedWidget_project->currentIndex() == 0)
|
||||
{
|
||||
if(ui->radioButton_db->isChecked())
|
||||
{
|
||||
@ -625,10 +678,11 @@ void pj_manager::onBackup()
|
||||
|
||||
void pj_manager::onRestore()
|
||||
{
|
||||
if(QMessageBox::question(this,tr("恢复提醒"),tr("请确认连接的数据库所配置的所有系统已经离线,本工具只支持离线恢复,是否继续")) != QMessageBox::Yes)
|
||||
if(N_MessageBox::question(this,tr("恢复提醒"),tr("请确认连接的数据库所配置的所有系统已经离线,本工具只支持离线恢复,是否继续"))
|
||||
!= N_MessageBox::Ok)
|
||||
return;
|
||||
|
||||
if(ui->tabWidget_main->currentIndex() == 0 && ui->stackedWidget_project->currentIndex() == 0)
|
||||
if(ui->stackedWidget_main->currentIndex() == CN_MainTabIndex_Project && ui->stackedWidget_project->currentIndex() == 0)
|
||||
{
|
||||
if(ui->radioButton_db->isChecked())
|
||||
{
|
||||
@ -640,8 +694,9 @@ void pj_manager::onRestore()
|
||||
}
|
||||
else if(ui->radioButton_comp->isChecked())
|
||||
{
|
||||
QMessageBox::StandardButton resultButton = QMessageBox::information(this, "提示", "请先关闭所有系统运行程序,\n包含net_keep_alived和db_his_data_srv.\n拷贝完成后,会关闭当前软件!\n是否继续", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
|
||||
if(resultButton == QMessageBox::No)
|
||||
int resultButton = N_MessageBox::information(this, tr("提示"), tr("请先关闭所有系统运行程序,\n包含net_keep_alived和db_his_data_srv.\n拷贝完成后,会关闭当前软件!\n是否继续"),
|
||||
N_MessageBox::Yes | N_MessageBox::No, N_MessageBox::Yes);
|
||||
if(resultButton == N_MessageBox::No)
|
||||
{
|
||||
return;
|
||||
}
|
||||
@ -656,8 +711,8 @@ void pj_manager::backupDb()
|
||||
quint32 nExportType = getDefaultImportExportType();
|
||||
if(!m_pDma->backupDb(m_pDbOpt, m_sDatabaseName, nExportType,m_currentBackupName))
|
||||
{
|
||||
QMessageBox::StandardButton resultButton = QMessageBox::information(this, tr("提示"), tr("备份失败!"), QMessageBox::Yes);
|
||||
if(resultButton == QMessageBox::Yes)
|
||||
int resultButton = N_MessageBox::information(this, tr("提示"), tr("备份失败!"), N_MessageBox::Yes);
|
||||
if(resultButton == N_MessageBox::Yes)
|
||||
{
|
||||
emit sigSetBackupProgressBar(0);
|
||||
|
||||
@ -667,8 +722,8 @@ void pj_manager::backupDb()
|
||||
}
|
||||
else
|
||||
{
|
||||
QMessageBox::StandardButton resultButton = QMessageBox::information(this, tr("提示"), tr("备份完成!"), QMessageBox::Yes);
|
||||
if(resultButton == QMessageBox::Yes)
|
||||
int resultButton = N_MessageBox::information(this, tr("提示"), tr("备份完成!"), N_MessageBox::Yes);
|
||||
if(resultButton == N_MessageBox::Yes)
|
||||
{
|
||||
emit sigSetBackupProgressBar(0);
|
||||
genBakCfg();
|
||||
@ -679,7 +734,7 @@ void pj_manager::backupDb()
|
||||
|
||||
void pj_manager::onSetPercent(int nPercent)
|
||||
{
|
||||
int index1 = ui->tabWidget_main->currentIndex();
|
||||
int index1 = ui->stackedWidget_main->currentIndex();
|
||||
if(index1 == 0)
|
||||
{
|
||||
int index2 = ui->stackedWidget_project->currentIndex();
|
||||
@ -788,11 +843,7 @@ void pj_manager::initUpdateTableWidget()
|
||||
|
||||
void pj_manager::initLogMngWidget()
|
||||
{
|
||||
QGridLayout* layout = new QGridLayout;
|
||||
m_logMngWidget = new CLogMngWidget;
|
||||
ui->page_logmng->setLayout(layout);
|
||||
ui->page_logmng->layout()->addWidget(m_logMngWidget);
|
||||
connect(m_logMngWidget,&CLogMngWidget::showMsg,this,&pj_manager::onShowMsg);
|
||||
connect(ui->logMngWidget,&CLogMngWidget::showMsg,this,&pj_manager::onShowMsg);
|
||||
}
|
||||
|
||||
void pj_manager::onRadioButtonChanged()
|
||||
@ -806,8 +857,8 @@ void pj_manager::backupSimp()
|
||||
|
||||
if(!m_pDma->backupSimp(m_pDbOpt, m_sDatabaseName, nExportType,m_currentBackupName ) )
|
||||
{
|
||||
QMessageBox::StandardButton resultButton = QMessageBox::information(this, tr("提示"), tr("备份失败!"), QMessageBox::Yes);
|
||||
if(resultButton == QMessageBox::Yes)
|
||||
int resultButton = N_MessageBox::information(this, tr("提示"), tr("备份失败!"), N_MessageBox::Yes);
|
||||
if(resultButton == N_MessageBox::Yes)
|
||||
{
|
||||
emit sigSetBackupProgressBar(0);
|
||||
|
||||
@ -817,8 +868,8 @@ void pj_manager::backupSimp()
|
||||
}
|
||||
else
|
||||
{
|
||||
QMessageBox::StandardButton resultButton = QMessageBox::information(this, tr("提示"), tr("备份完成!"), QMessageBox::Yes);
|
||||
if(resultButton == QMessageBox::Yes)
|
||||
int resultButton = N_MessageBox::information(this, tr("提示"), tr("备份完成!"), N_MessageBox::Yes);
|
||||
if(resultButton == N_MessageBox::Yes)
|
||||
{
|
||||
emit sigSetBackupProgressBar(0);
|
||||
genBakCfg();
|
||||
@ -832,8 +883,8 @@ void pj_manager::backupComp()
|
||||
quint32 nExportType = getDefaultImportExportType();
|
||||
if(!m_pDma->backupComp(m_pDbOpt, m_sDatabaseName, nExportType,m_currentBackupName) )
|
||||
{
|
||||
QMessageBox::StandardButton resultButton = QMessageBox::information(this, tr("提示"), tr("备份失败!"), QMessageBox::Yes);
|
||||
if(resultButton == QMessageBox::Yes)
|
||||
int resultButton = N_MessageBox::information(this, tr("提示"), tr("备份失败!"), N_MessageBox::Yes);
|
||||
if(resultButton == N_MessageBox::Yes)
|
||||
{
|
||||
emit sigSetBackupProgressBar(0);
|
||||
|
||||
@ -843,8 +894,8 @@ void pj_manager::backupComp()
|
||||
}
|
||||
else
|
||||
{
|
||||
QMessageBox::StandardButton resultButton = QMessageBox::information(this, tr("提示"), tr("备份完成!"), QMessageBox::Yes);
|
||||
if(resultButton == QMessageBox::Yes)
|
||||
int resultButton = N_MessageBox::information(this, tr("提示"), tr("备份完成!"), N_MessageBox::Yes);
|
||||
if(resultButton == N_MessageBox::Yes)
|
||||
{
|
||||
emit sigSetBackupProgressBar(0);
|
||||
genBakCfg();
|
||||
@ -859,7 +910,7 @@ void pj_manager::restoreDb()
|
||||
QList<QTableWidgetItem*> ptableItem = ui->tableWidget_backup->selectedItems();
|
||||
if( ptableItem.count() <= 0 )
|
||||
{
|
||||
QMessageBox::warning( this, tr("警告"), tr("请在备份记录中选择一项备份的工程!") );
|
||||
N_MessageBox::warning( this, tr("警告"), tr("请在备份记录中选择一项备份的工程!") );
|
||||
return;
|
||||
}
|
||||
|
||||
@ -872,8 +923,8 @@ void pj_manager::restoreDb()
|
||||
}
|
||||
if( !m_pDma->restoreDb( m_pDbOpt ,m_sDatabaseName, sBackupContent, nImportType ) )
|
||||
{
|
||||
QMessageBox::StandardButton resultButton = QMessageBox::information(this, tr("提示"), tr("恢复失败!"), QMessageBox::Yes);
|
||||
if(resultButton == QMessageBox::Yes)
|
||||
int resultButton = N_MessageBox::information(this, tr("提示"), tr("恢复失败!"), N_MessageBox::Yes);
|
||||
if(resultButton == N_MessageBox::Yes)
|
||||
{
|
||||
emit sigSetBackupProgressBar(0);
|
||||
|
||||
@ -883,8 +934,8 @@ void pj_manager::restoreDb()
|
||||
}
|
||||
else
|
||||
{
|
||||
QMessageBox::StandardButton resultButton = QMessageBox::information(this, tr("提示"), tr("恢复成功!"), QMessageBox::Yes);
|
||||
if(resultButton == QMessageBox::Yes)
|
||||
int resultButton = N_MessageBox::information(this, tr("提示"), tr("恢复成功!"), N_MessageBox::Yes);
|
||||
if(resultButton == N_MessageBox::Yes)
|
||||
{
|
||||
emit sigSetBackupProgressBar(0);
|
||||
|
||||
@ -898,7 +949,7 @@ void pj_manager::restoreSimp()
|
||||
QList<QTableWidgetItem*> ptableItem = ui->tableWidget_backup->selectedItems();
|
||||
if( ptableItem.count() <= 0 )
|
||||
{
|
||||
QMessageBox::warning( this, tr("警告"), tr("请在备份记录中选择一项备份的工程!") );
|
||||
N_MessageBox::warning( this, tr("警告"), tr("请在备份记录中选择一项备份的工程!") );
|
||||
return;
|
||||
}
|
||||
|
||||
@ -911,8 +962,8 @@ void pj_manager::restoreSimp()
|
||||
}
|
||||
if( !m_pDma->restoreSimp( m_pDbOpt ,m_sDatabaseName, sBackupContent, nImportType ) )
|
||||
{
|
||||
QMessageBox::StandardButton resultButton = QMessageBox::information(this, tr("提示"), tr("恢复失败!"), QMessageBox::Yes);
|
||||
if(resultButton == QMessageBox::Yes)
|
||||
int resultButton = N_MessageBox::information(this, tr("提示"), tr("恢复失败!"), N_MessageBox::Yes);
|
||||
if(resultButton == N_MessageBox::Yes)
|
||||
{
|
||||
emit sigSetBackupProgressBar(0);
|
||||
|
||||
@ -922,8 +973,8 @@ void pj_manager::restoreSimp()
|
||||
}
|
||||
else
|
||||
{
|
||||
QMessageBox::StandardButton resultButton = QMessageBox::information(this, tr("提示"), tr("恢复成功!"), QMessageBox::Yes);
|
||||
if(resultButton == QMessageBox::Yes)
|
||||
int resultButton = N_MessageBox::information(this, tr("提示"), tr("恢复成功!"), N_MessageBox::Yes);
|
||||
if(resultButton == N_MessageBox::Yes)
|
||||
{
|
||||
emit sigSetBackupProgressBar(0);
|
||||
|
||||
@ -937,7 +988,7 @@ void pj_manager::restoreComp()
|
||||
QList<QTableWidgetItem*> ptableItem = ui->tableWidget_backup->selectedItems();
|
||||
if( ptableItem.count() <= 0 )
|
||||
{
|
||||
QMessageBox::warning( this, tr("警告"), tr("请在备份记录中选择一项备份的工程!") );
|
||||
N_MessageBox::warning( this, tr("警告"), tr("请在备份记录中选择一项备份的工程!") );
|
||||
return;
|
||||
}
|
||||
|
||||
@ -950,8 +1001,8 @@ void pj_manager::restoreComp()
|
||||
}
|
||||
if( !m_pDma->restoreComp( m_pDbOpt ,m_sDatabaseName, sBackupContent, nImportType ) )
|
||||
{
|
||||
QMessageBox::StandardButton resultButton = QMessageBox::information(this, tr("提示"), tr("恢复失败!"), QMessageBox::Yes);
|
||||
if(resultButton == QMessageBox::Yes)
|
||||
int resultButton = N_MessageBox::information(this, tr("提示"), tr("恢复失败!"), N_MessageBox::Yes);
|
||||
if(resultButton == N_MessageBox::Yes)
|
||||
{
|
||||
emit sigSetBackupProgressBar(0);
|
||||
|
||||
@ -961,8 +1012,8 @@ void pj_manager::restoreComp()
|
||||
}
|
||||
else
|
||||
{
|
||||
QMessageBox::StandardButton resultButton = QMessageBox::information(this, tr("提示"), tr("恢复成功!"), QMessageBox::Yes);
|
||||
if(resultButton == QMessageBox::Yes)
|
||||
int resultButton = N_MessageBox::information(this, tr("提示"), tr("恢复成功!"), N_MessageBox::Yes);
|
||||
if(resultButton == N_MessageBox::Yes)
|
||||
{
|
||||
emit sigSetBackupProgressBar(0);
|
||||
|
||||
@ -976,7 +1027,7 @@ void pj_manager::onUpdateExe()
|
||||
int index = ui->tabWidget_update->currentIndex();
|
||||
if( index == 0 )
|
||||
{
|
||||
if(QMessageBox::question(this,tr("升级提醒"),tr("升级操作将会对当前工程数据和数据库进行覆盖,请确认是否继续?")) != QMessageBox::Yes)
|
||||
if(N_MessageBox::question(this,tr("升级提醒"),tr("升级操作将会对当前工程数据和数据库进行覆盖,请确认是否继续?"), N_MessageBox::Yes) != N_MessageBox::Yes)
|
||||
return;
|
||||
updateProject();
|
||||
}
|
||||
@ -990,7 +1041,7 @@ void pj_manager::updateProject()
|
||||
QList<QTableWidgetItem*> ptableItem = ui->tableWidget_update->selectedItems();
|
||||
if( ptableItem.count() <= 0 )
|
||||
{
|
||||
QMessageBox::warning( this, tr("警告"), tr("请在备份记录中选择一项备份的工程!") );
|
||||
N_MessageBox::warning( this, tr("警告"), tr("请在备份记录中选择一项备份的工程!") );
|
||||
return;
|
||||
}
|
||||
|
||||
@ -998,8 +1049,8 @@ void pj_manager::updateProject()
|
||||
QString sBackupContent = "/" + ptItem->text();
|
||||
if(!m_pDma->updateProject(m_pDbOpt, m_sDatabaseName, sBackupContent))
|
||||
{
|
||||
QMessageBox::StandardButton resultButton = QMessageBox::information(this, tr("提示"), tr("升级失败!"), QMessageBox::Yes);
|
||||
if(resultButton == QMessageBox::Yes)
|
||||
int resultButton = N_MessageBox::information(this, tr("提示"), tr("升级失败!"), N_MessageBox::Yes);
|
||||
if(resultButton == N_MessageBox::Yes)
|
||||
{
|
||||
emit sigSetUpdateProgressBar(0);
|
||||
initLabels();
|
||||
@ -1009,8 +1060,8 @@ void pj_manager::updateProject()
|
||||
}
|
||||
else
|
||||
{
|
||||
QMessageBox::StandardButton resultButton = QMessageBox::information(this, tr("提示"), tr("升级成功!"), QMessageBox::Yes);
|
||||
if(resultButton == QMessageBox::Yes)
|
||||
int resultButton = N_MessageBox::information(this, tr("提示"), tr("升级成功!"), N_MessageBox::Yes);
|
||||
if(resultButton == N_MessageBox::Yes)
|
||||
{
|
||||
emit sigSetUpdateProgressBar(0);
|
||||
initLabels();
|
||||
@ -1023,8 +1074,8 @@ void pj_manager::updateDatabase()
|
||||
{
|
||||
if(!m_pDma->updateDatabase(m_pDbOpt, m_sDatabaseName))
|
||||
{
|
||||
QMessageBox::StandardButton resultButton = QMessageBox::information(this, tr("提示"), tr("升级失败!"), QMessageBox::Yes);
|
||||
if(resultButton == QMessageBox::Yes)
|
||||
int resultButton = N_MessageBox::information(this, tr("提示"), tr("升级失败!"), N_MessageBox::Yes);
|
||||
if(resultButton == N_MessageBox::Yes)
|
||||
{
|
||||
emit sigSetUpdateProgressBar(0);
|
||||
initLabels();
|
||||
@ -1033,8 +1084,8 @@ void pj_manager::updateDatabase()
|
||||
}
|
||||
else
|
||||
{
|
||||
QMessageBox::StandardButton resultButton = QMessageBox::information(this, tr("提示"), tr("升级成功!"), QMessageBox::Yes);
|
||||
if(resultButton == QMessageBox::Yes)
|
||||
int resultButton = N_MessageBox::information(this, tr("提示"), tr("升级成功!"), N_MessageBox::Yes);
|
||||
if(resultButton == N_MessageBox::Yes)
|
||||
{
|
||||
emit sigSetUpdateProgressBar(0);
|
||||
initLabels();
|
||||
@ -1151,6 +1202,7 @@ void pj_manager::slotTreeWidgetContextMenuRequest( const QPoint& )
|
||||
menu.addAction( tr("删除数据服务配置"), this, SLOT( slotDeleteDatabaseServiceSet() ) );
|
||||
menu.addSeparator();
|
||||
menu.addAction( tr("新建数据库"), this, SLOT(onCreateDatabase() ) );
|
||||
menu.addAction( tr("新建influxDB用户") ,this , SLOT( slotCreateInflucDBUser()));
|
||||
}
|
||||
else if ( nItemType == EN_ITEM_DATABASE )
|
||||
{
|
||||
@ -1294,8 +1346,8 @@ void pj_manager::slotDisConnectDatabaseService()
|
||||
void pj_manager::slotAddDatabaseServiceSet()
|
||||
{
|
||||
db_set* pDbSet = new db_set( this );
|
||||
pDbSet->setTitle( tr("增加数据配置") );
|
||||
if ( pDbSet && pDbSet->exec() == QDialog::Accepted )
|
||||
pDbSet->setTitle( tr("增加数据库配置") );
|
||||
if ( pDbSet && pDbSet->exec() == CustomUiDialog::Accepted )
|
||||
{
|
||||
QTreeWidgetItem* pItem = new QTreeWidgetItem;
|
||||
pItem->setText( 0, pDbSet->getName() );
|
||||
@ -1323,8 +1375,8 @@ void pj_manager::slotModifyDatabaseServiceSet()
|
||||
|
||||
if ( pItem->childCount() > 0 )
|
||||
{
|
||||
QMessageBox::StandardButton button = QMessageBox::information( this, tr("提示"), tr("修改配置需要断开数据库连接,是否断开?"), QMessageBox::Yes, QMessageBox::No );
|
||||
if ( button == QMessageBox::StandardButton::Yes )
|
||||
int button = N_MessageBox::information( this, tr("提示"), tr("修改配置需要断开数据库连接,是否断开?"), N_MessageBox::Yes, N_MessageBox::No );
|
||||
if ( button == N_MessageBox::Yes )
|
||||
slotDisConnectDatabaseService();
|
||||
else
|
||||
return;
|
||||
@ -1339,7 +1391,7 @@ void pj_manager::slotModifyDatabaseServiceSet()
|
||||
pDbSet->setUser( pItem->data( 0, Qt::UserRole + EN_ITEM_DATA_INDEX_USER ).toString() );
|
||||
pDbSet->setPasswd( pItem->data( 0, Qt::UserRole + EN_ITEM_DATA_INDEX_PASSWD ).toString() );
|
||||
|
||||
if ( pDbSet->exec() == QDialog::Accepted )
|
||||
if ( pDbSet->exec() == CustomUiDialog::Accepted )
|
||||
{
|
||||
pItem->setText( 0, pDbSet->getName() );
|
||||
pItem->setData( 0, Qt::UserRole + EN_ITEM_DATA_INDEX_DBTYPE, pDbSet->getDbType() );
|
||||
@ -1359,7 +1411,7 @@ void pj_manager::slotDeleteDatabaseServiceSet()
|
||||
db_opt* pDbOpt = getDbOpt( ui->treeWidget->currentItem() );
|
||||
if ( pDbOpt != NULL )
|
||||
{
|
||||
QMessageBox::information( this, tr("提示"), tr("请先断开数据服务") );
|
||||
N_MessageBox::information( this, tr("提示"), tr("请先断开数据服务") );
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1389,8 +1441,8 @@ void pj_manager::slotImportBaseData()
|
||||
if(strLanguage.empty())
|
||||
return;
|
||||
|
||||
QMessageBox::StandardButton resultButton = QMessageBox::information(this, tr("提示"), tr("导入基础数据将会清空原来表中的数据,是否导入?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
|
||||
if(resultButton == QMessageBox::No)
|
||||
int resultButton = N_MessageBox::information(this, tr("提示"), tr("导入基础数据将会清空原来表中的数据,是否导入?"), N_MessageBox::Yes | N_MessageBox::No, N_MessageBox::Yes);
|
||||
if(resultButton == N_MessageBox::No)
|
||||
{
|
||||
return;
|
||||
}
|
||||
@ -1408,7 +1460,7 @@ void pj_manager::slotImportBaseData()
|
||||
}
|
||||
else
|
||||
{
|
||||
QMessageBox::warning( this, tr("警告"), tr("无法打开基础数据路径!") );
|
||||
N_MessageBox::warning( this, tr("警告"), tr("无法打开基础数据路径!") );
|
||||
}
|
||||
|
||||
if( sListFile.count() == 0 )
|
||||
@ -1432,8 +1484,8 @@ void pj_manager::slotImportBaseData()
|
||||
|
||||
void pj_manager::slotUpdateDatabase()
|
||||
{
|
||||
QMessageBox::StandardButton button = QMessageBox::information( this, tr("提示"), tr("升级数据库将会修改表结构,确认升级?"), QMessageBox::Yes, QMessageBox::No );
|
||||
if ( button != QMessageBox::StandardButton::Yes )
|
||||
int button = N_MessageBox::information( this, tr("提示"), tr("升级数据库将会修改表结构,确认升级?"), N_MessageBox::Yes, N_MessageBox::No );
|
||||
if ( button != N_MessageBox::Yes )
|
||||
return;
|
||||
|
||||
QTreeWidgetItem* pItem = ui->treeWidget->currentItem();
|
||||
@ -1441,7 +1493,7 @@ void pj_manager::slotUpdateDatabase()
|
||||
return;
|
||||
if ( pItem->data( 0, Qt::UserRole + EN_ITEM_DATA_INDEX_ITEMTYPE ).toInt() != EN_ITEM_DATABASE )
|
||||
{
|
||||
QMessageBox::warning( this, tr("警告"), tr("数据库选择错误") );
|
||||
N_MessageBox::warning( this, tr("警告"), tr("数据库选择错误") );
|
||||
return;
|
||||
}
|
||||
QString sDatabaseName = pItem->text( 0 );
|
||||
@ -1484,7 +1536,7 @@ bool pj_manager::slotCreateTrigger()
|
||||
return false;
|
||||
if ( pItem->data( 0, Qt::UserRole + EN_ITEM_DATA_INDEX_ITEMTYPE ).toInt() != EN_ITEM_DATABASE )
|
||||
{
|
||||
QMessageBox::warning( this, tr("警告"), tr("数据库选择错误") );
|
||||
N_MessageBox::warning( this, tr("警告"), tr("数据库选择错误") );
|
||||
return false;
|
||||
}
|
||||
QString sDatabaseName = pItem->text( 0 );
|
||||
@ -1507,7 +1559,7 @@ bool pj_manager::slotDeleteTrigger()
|
||||
|
||||
if ( pItem->data( 0, Qt::UserRole + EN_ITEM_DATA_INDEX_ITEMTYPE ).toInt() != EN_ITEM_DATABASE )
|
||||
{
|
||||
QMessageBox::warning( this, tr("警告"), tr("数据库选择错误") );
|
||||
N_MessageBox::warning( this, tr("警告"), tr("数据库选择错误") );
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -1527,12 +1579,12 @@ bool pj_manager::slotDeleteTrigger()
|
||||
|
||||
void pj_manager::slotDeleteDatabase()
|
||||
{
|
||||
QMessageBox::StandardButton button = QMessageBox::information( this, tr("提示"), tr("确认删除数据库?"), QMessageBox::Yes, QMessageBox::No );
|
||||
if ( button != QMessageBox::StandardButton::Yes )
|
||||
int button = N_MessageBox::information( this, tr("提示"), tr("确认删除数据库?"), N_MessageBox::Yes, N_MessageBox::No );
|
||||
if ( button != N_MessageBox::Yes )
|
||||
return;
|
||||
|
||||
button = QMessageBox::information( this, tr("提示"), tr("请再次确认删除数据库?"), QMessageBox::Yes, QMessageBox::No );
|
||||
if ( button != QMessageBox::StandardButton::Yes )
|
||||
button = N_MessageBox::information( this, tr("提示"), tr("请再次确认删除数据库?"), N_MessageBox::Yes, N_MessageBox::No );
|
||||
if ( button != N_MessageBox::Yes )
|
||||
return;
|
||||
|
||||
QTreeWidgetItem* pItemService = ui->treeWidget->currentItem()->parent();
|
||||
@ -1591,7 +1643,7 @@ void pj_manager::slotExecuteSqlScript()
|
||||
|
||||
if ( pItem->data( 0, Qt::UserRole + EN_ITEM_DATA_INDEX_ITEMTYPE ).toInt() != EN_ITEM_DATABASE )
|
||||
{
|
||||
QMessageBox::warning( this, tr("警告"), tr("数据库选择错误") );
|
||||
N_MessageBox::warning( this, tr("警告"), tr("数据库选择错误") );
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1628,7 +1680,7 @@ void pj_manager::slotDeploy()
|
||||
case iot_dbms::EDbType::DB_MYSQL:
|
||||
info.db_type = "mysql"; break;
|
||||
case iot_dbms::EDbType::DB_OPENGAUSS:
|
||||
info.db_type = "openguass";
|
||||
info.db_type = "opengauss";
|
||||
m_pDbOpt->closeDatabase();
|
||||
break;
|
||||
case iot_dbms::EDbType::DB_KINGBASE:
|
||||
@ -1636,8 +1688,8 @@ void pj_manager::slotDeploy()
|
||||
m_pDbOpt->closeDatabase();
|
||||
break;
|
||||
default:
|
||||
LOGERROR("不支持的数据库类型!");
|
||||
onShowMsg("初始化完整工程失败:不支持的数据库类型!",1);
|
||||
LOGERROR(tr("不支持的数据库类型!").toStdString().c_str());
|
||||
onShowMsg(tr("初始化完整工程失败:不支持的数据库类型!"), 1);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1646,7 +1698,7 @@ void pj_manager::slotDeploy()
|
||||
onShowMsg(tr("开始初始化完整工程"));
|
||||
if(!m_pDma->initCompleteProject())
|
||||
{
|
||||
onShowMsg("初始化完整工程失败!",1);
|
||||
onShowMsg(tr("初始化完整工程失败!"),1);
|
||||
}
|
||||
switch (m_pDbOpt->getDbType())
|
||||
{
|
||||
@ -1660,8 +1712,8 @@ void pj_manager::slotDeploy()
|
||||
m_pDbOpt->openDatabase(info.address,info.port,info.username,info.password,info.db_name);
|
||||
break;
|
||||
default:
|
||||
LOGERROR("不支持的数据库类型!");
|
||||
onShowMsg("初始化完整工程失败:不支持的数据库类型!",1);
|
||||
LOGERROR(tr("不支持的数据库类型!").toStdString().c_str());
|
||||
onShowMsg(tr("初始化完整工程失败:不支持的数据库类型!"),1);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -1878,6 +1930,13 @@ void pj_manager::appendTableInfoFromXml( const QString& sFilePath,QMap<QString,
|
||||
{
|
||||
if("Table" == eleTable.tagName())
|
||||
{
|
||||
QString sUseType = eleTable.attribute("use_type");
|
||||
if(sUseType.isEmpty())
|
||||
{
|
||||
eleTable = eleTable.nextSiblingElement();
|
||||
continue; //< 为空表示禁用
|
||||
}
|
||||
|
||||
QString sTableName = eleTable.attribute("name");
|
||||
QDomElement table_db = eleTable.firstChildElement();
|
||||
sTableInfos tableInfo;
|
||||
@ -1973,7 +2032,7 @@ bool pj_manager::getImportExportType(const QString &sBackupContent,quint32 &nImp
|
||||
{
|
||||
if ( isDbTypeDiff )
|
||||
{
|
||||
if(QMessageBox::question(this,tr("提醒"),tr("检测到正在进行跨数据库恢复备份,\n将只升级数据库和导入数据,\n是否继续?")) != QMessageBox::Yes)
|
||||
if(N_MessageBox::question(this,tr("提醒"),tr("检测到正在进行跨数据库恢复备份,\n将只升级数据库和导入数据,\n是否继续?")) != N_MessageBox::Ok)
|
||||
return false;
|
||||
nImportType = 0;
|
||||
nImportType = EN_IMPORT_DATA | EN_IMPORT_UPDATE;
|
||||
@ -2161,8 +2220,8 @@ void pj_manager::slotComboBoxDataBaseDstCurrentIndexChanged(const QString &sText
|
||||
|
||||
void pj_manager::slotPushButtonMergeClicked()
|
||||
{
|
||||
QMessageBox::StandardButton resultButton = QMessageBox::information(this, tr("提示"), tr("请确保源数据库和目标数据库的所有表结构一致,否则会出错!"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
|
||||
if(resultButton == QMessageBox::No)
|
||||
int resultButton = N_MessageBox::information(this, tr("提示"), tr("请确保源数据库和目标数据库的所有表结构一致,否则会出错!"), N_MessageBox::Yes | N_MessageBox::No, N_MessageBox::Yes);
|
||||
if(resultButton == N_MessageBox::No)
|
||||
{
|
||||
return;
|
||||
}
|
||||
@ -2172,65 +2231,65 @@ void pj_manager::slotPushButtonMergeClicked()
|
||||
QString sDataBaseDst = ui->comboBox_db_dst->currentText();
|
||||
if ( sDataServiceOrg == "" )
|
||||
{
|
||||
QMessageBox::warning( this, tr("警告"), tr("未选择源数据服务") );
|
||||
N_MessageBox::warning( this, tr("警告"), tr("未选择源数据服务") );
|
||||
return;
|
||||
}
|
||||
if ( sDataBaseOrg == "" )
|
||||
{
|
||||
QMessageBox::warning( this, tr("警告"), tr("未选择源数据库") );
|
||||
N_MessageBox::warning( this, tr("警告"), tr("未选择源数据库") );
|
||||
return;
|
||||
}
|
||||
if ( sDataServiceDst == "" )
|
||||
{
|
||||
QMessageBox::warning( this, tr("警告"), tr("未选择目标数据服务") );
|
||||
N_MessageBox::warning( this, tr("警告"), tr("未选择目标数据服务") );
|
||||
return;
|
||||
}
|
||||
if ( sDataBaseDst == "" )
|
||||
{
|
||||
QMessageBox::warning( this, tr("警告"), tr("未选择目标数据库") );
|
||||
N_MessageBox::warning( this, tr("警告"), tr("未选择目标数据库") );
|
||||
return;
|
||||
}
|
||||
db_opt* pDbOpt_org = (db_opt*)ui->comboBox_sv_src->currentData( Qt::UserRole ).toULongLong();
|
||||
if ( pDbOpt_org == NULL )
|
||||
{
|
||||
QMessageBox::warning( this, tr("警告"), tr("源数据服务未连接") );
|
||||
N_MessageBox::warning( this, tr("警告"), tr("源数据服务未连接") );
|
||||
return;
|
||||
}
|
||||
db_opt* pDbOpt_dst = (db_opt*)ui->comboBox_sv_dst->currentData( Qt::UserRole ).toULongLong();
|
||||
if ( pDbOpt_dst == NULL )
|
||||
{
|
||||
QMessageBox::warning( this, tr("警告"), tr("目标数据服务未连接") );
|
||||
N_MessageBox::warning( this, tr("警告"), tr("目标数据服务未连接") );
|
||||
return;
|
||||
}
|
||||
if ( sDataServiceOrg == sDataServiceDst && sDataBaseOrg == sDataBaseDst )
|
||||
{
|
||||
QMessageBox::warning( this, tr("警告"), tr("源和目标不能相同") );
|
||||
N_MessageBox::warning( this, tr("警告"), tr("源和目标不能相同") );
|
||||
return;
|
||||
}
|
||||
|
||||
QString sSubStationSrc = ui->comboBox_station->currentText();
|
||||
if ( sSubStationSrc == "" )
|
||||
{
|
||||
QMessageBox::warning( this, tr("警告"), tr("未选择源车站") );
|
||||
N_MessageBox::warning( this, tr("警告"), tr("未选择源车站") );
|
||||
return;
|
||||
}
|
||||
int nSubStationIdSrc = ui->comboBox_station->currentData().toInt();
|
||||
QString sSubSystemSrc = ui->comboBox_subsystem->currentText();
|
||||
if ( sSubSystemSrc == "" )
|
||||
{
|
||||
QMessageBox::warning( this, tr("警告"), tr("未选择源专业") );
|
||||
N_MessageBox::warning( this, tr("警告"), tr("未选择源专业") );
|
||||
return;
|
||||
}
|
||||
int nSubSystemIdSrc = ui->comboBox_subsystem->currentData().toInt();
|
||||
if ( nSubSystemIdSrc <= 0 )
|
||||
{
|
||||
QMessageBox::warning( this, tr("警告"), tr("专业ID不正确,ID值:") + QString::number( nSubSystemIdSrc ) );
|
||||
N_MessageBox::warning( this, tr("警告"), tr("专业ID不正确,ID值:") + QString::number( nSubSystemIdSrc ) );
|
||||
return;
|
||||
}
|
||||
QString sSubStationDst = ui->comboBox_station_2->currentText();
|
||||
if ( sSubStationDst == "" )
|
||||
{
|
||||
QMessageBox::warning( this, tr("警告"), tr("未选择目标车站") );
|
||||
N_MessageBox::warning( this, tr("警告"), tr("未选择目标车站") );
|
||||
return;
|
||||
}
|
||||
int nSubStationIdDst = ui->comboBox_station_2->currentData().toInt();
|
||||
@ -2244,12 +2303,79 @@ void pj_manager::slotShowBackupFolder(int row, int /*column*/)
|
||||
showInFolder(getBackupDir() + QDir::separator() + ui->tableWidget_backup->item(row,2)->text());
|
||||
}
|
||||
|
||||
void pj_manager::slotMainTableWidgetCurrentChanged(int index)
|
||||
{
|
||||
if(index == CN_MainTabIndex_Log)
|
||||
{
|
||||
ui->stackedWidget_logMng->setCurrentIndex(0);
|
||||
ui->listWidget_logMng->setFocus();
|
||||
ui->listWidget_logMng->setCurrentRow(0);
|
||||
}
|
||||
}
|
||||
|
||||
void pj_manager::slotCreateInflucDBUser()
|
||||
{
|
||||
// 用户名及密码
|
||||
CCreateInfluxDBUserDlg dlg(this);
|
||||
dlg.setIP(QString("127.0.0.1"));
|
||||
dlg.setAdminUser(QString(EMS_DEFAULT_DATABASE));
|
||||
dlg.setUserInfo(QString("rqeh6001"));
|
||||
dlg.setPassWord(QString(EMS_DEFAULT_PASSWD));
|
||||
if( dlg.exec() == QDialog::Accepted)
|
||||
{
|
||||
QString localhost = dlg.getIP();
|
||||
QString adminUser = dlg.getAdminUser();
|
||||
QString password = dlg.getPassWordInfo();
|
||||
QString userinfo = dlg.getUserInfo();
|
||||
if (!createInfluxDBUser(adminUser,password,localhost ,userinfo))
|
||||
{
|
||||
N_MessageBox::warning( this, tr("警告"), tr("用户创建失败") );
|
||||
}else
|
||||
{
|
||||
N_MessageBox::information(this , tr("提示") , tr("用户创建成功"));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
bool pj_manager::createInfluxDBUser(const QString &adminUser, const QString &password, const QString &host, const QString &username)
|
||||
{
|
||||
bool ret = false;
|
||||
QString program = "influx";
|
||||
// 构造命令参数
|
||||
QStringList arguments;
|
||||
arguments << "-username" << adminUser
|
||||
<< "-password" << password
|
||||
<< "-host" << host
|
||||
<< "-execute"
|
||||
<< QString("create user %1 with password '%2' with all privileges").arg(username, EMS_DEFAULT_PASSWD);
|
||||
|
||||
QProcess process;
|
||||
process.start(program, arguments);
|
||||
if (!process.waitForFinished(-1)) {
|
||||
LOGERROR( "Failed to execute command: %s" , process.errorString().toStdString().c_str() );
|
||||
return ret;
|
||||
}
|
||||
|
||||
// 检查命令输出
|
||||
QString output = process.readAllStandardOutput();
|
||||
QString errorOutput = process.readAllStandardError();
|
||||
if (!errorOutput.isEmpty()) {
|
||||
LOGERROR( "Error occurred while creating user: %s", errorOutput.toStdString().c_str());
|
||||
} else {
|
||||
LOGERROR("User created successfully: %s", output.toStdString().c_str());
|
||||
ret = true;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool pj_manager::databaseCheck()
|
||||
{
|
||||
db_opt* pDbOpt = getDbOpt( ui->treeWidget->currentItem() );
|
||||
if ( pDbOpt == NULL )
|
||||
{
|
||||
QMessageBox::information( this, tr("提示"), tr("请先连接数据服务") );
|
||||
N_MessageBox::information( this, tr("提示"), tr("请先连接数据服务") );
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -2264,7 +2390,7 @@ bool pj_manager::databaseCheck()
|
||||
bool ok;
|
||||
sDatabaseName = QInputDialog::getText( this, tr( "新建数据库" ),
|
||||
tr( "数据库名:" ), QLineEdit::Normal,
|
||||
"iscs6000", &ok, Qt::MSWindowsFixedSizeDialogHint | Qt::WindowTitleHint | Qt::CustomizeWindowHint | Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint );
|
||||
EMS_DEFAULT_DATABASE, &ok, Qt::MSWindowsFixedSizeDialogHint | Qt::WindowTitleHint | Qt::CustomizeWindowHint | Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint );
|
||||
if ( !ok || sDatabaseName.isEmpty() )
|
||||
return false;
|
||||
|
||||
@ -2275,7 +2401,7 @@ bool pj_manager::databaseCheck()
|
||||
{
|
||||
if ( listDatabase.at( i ).toLower() == sDatabaseName.toLower() )
|
||||
{
|
||||
QMessageBox::critical( this, tr("错误"), tr("已有同名数据库,创建失败") );
|
||||
N_MessageBox::critical( this, tr("错误"), tr("已有同名数据库,创建失败") );
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -2286,7 +2412,7 @@ bool pj_manager::databaseCheck()
|
||||
ushort uni = cha.unicode();
|
||||
if( uni >= 0x4E00 && uni <= 0x9FA5 )
|
||||
{
|
||||
QMessageBox::warning( this, tr("警告"), tr("数据库名不能为汉字") );
|
||||
N_MessageBox::warning( this, tr("警告"), tr("数据库名不能为汉字") );
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -2295,13 +2421,13 @@ bool pj_manager::databaseCheck()
|
||||
sDatabaseName.startsWith("5") || sDatabaseName.startsWith("6") || sDatabaseName.startsWith("7") || sDatabaseName.startsWith("8") || \
|
||||
sDatabaseName.startsWith("9") || sDatabaseName.startsWith("0") )
|
||||
{
|
||||
QMessageBox::warning( this, tr("警告"), tr("数据库名不能以数字开头") );
|
||||
N_MessageBox::warning( this, tr("警告"), tr("数据库名不能以数字开头") );
|
||||
return false;
|
||||
}
|
||||
|
||||
if( sDatabaseName.contains("-") )
|
||||
{
|
||||
QMessageBox::warning( this, tr("警告"), tr("数据库名不能包含中划线") );
|
||||
N_MessageBox::warning( this, tr("警告"), tr("数据库名不能包含中划线") );
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
@ -2328,23 +2454,26 @@ bool pj_manager::createDatabase()
|
||||
else
|
||||
{
|
||||
onShowMsg( sError, 1 );
|
||||
QMessageBox::critical( this, tr("错误"), tr("数据库创建失败") );
|
||||
N_MessageBox::critical( this, tr("错误"), tr("数据库创建失败") );
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
if(pDbOpt->getDbType() == iot_dbms::DB_KINGBASE )
|
||||
{
|
||||
sSql = "CREATE SCHEMA iscs6000;" ;
|
||||
/* 为以后搜索方便,保留此注释。mysql的database实际应该对应schema
|
||||
* sSql = QString("CREATE SCHEMA %1;").arg(EMS_DEFAULT_DATABASE) ;
|
||||
*/
|
||||
sSql = QString("CREATE SCHEMA %1;").arg(sDatabaseName) ;
|
||||
if(!pDbOpt->switchDatabase(sDatabaseName))
|
||||
{
|
||||
QMessageBox::critical( this, tr("错误"), tr("无法切换到数据库") );
|
||||
N_MessageBox::critical( this, tr("错误"), tr("无法切换到数据库") );
|
||||
return false;
|
||||
}
|
||||
if( !pDbOpt->executeSql( sSql, sError ) )
|
||||
{
|
||||
onShowMsg( sError, 1 );
|
||||
QMessageBox::critical( this, tr("错误"), tr("模式创建失败") );
|
||||
N_MessageBox::critical( this, tr("错误"), tr("模式创建失败") );
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -2361,9 +2490,9 @@ void pj_manager::initHisMng()
|
||||
connect(m_pHisMng,& iot_dbms::CHisMngApi::error,this,&pj_manager::addErrMsg);
|
||||
connect(this,&pj_manager::optimizeDbSpace,m_pHisMng,& iot_dbms::CHisMngApi::optimizeDbSpace);
|
||||
connect(m_pHisMng,& iot_dbms::CHisMngApi::optimizeDbSpaceFinished,this,&pj_manager::handleOptimizeDbSpaceFinished);
|
||||
connect(this,&pj_manager::delHisAll,m_pHisMng,& iot_dbms::CHisMngApi::delHisAll);
|
||||
connect(this,&pj_manager::delHisAll,m_pHisMng,& iot_dbms::CHisMngApi::delHisAllV2);
|
||||
connect(m_pHisMng,& iot_dbms::CHisMngApi::delHisAllFinished,this,&pj_manager::handleDelHisAllFinished);
|
||||
connect(this,&pj_manager::delHis,m_pHisMng,& iot_dbms::CHisMngApi::delHis);
|
||||
connect(this,&pj_manager::delHis,m_pHisMng,& iot_dbms::CHisMngApi::delHisV2);
|
||||
connect(m_pHisMng,& iot_dbms::CHisMngApi::delHisFinished,this,&pj_manager::handleDelHisFinished);
|
||||
|
||||
hisWorkThread.start();
|
||||
@ -2493,7 +2622,7 @@ void pj_manager::onCreateDatabase()
|
||||
|
||||
void pj_manager::onMsgDlg(const QString &msg)
|
||||
{
|
||||
QMessageBox::information( this, tr("提醒"), msg );
|
||||
N_MessageBox::information( this, tr("提醒"), msg );
|
||||
}
|
||||
|
||||
void pj_manager::on_listWidget_nondb_clicked(const QModelIndex &index)
|
||||
@ -2517,7 +2646,10 @@ void pj_manager::on_comboBox_product_currentTextChanged(const QString &arg1)
|
||||
|
||||
void pj_manager::on_btn_deploy_clicked()
|
||||
{
|
||||
if(QMessageBox::question(this,tr("部署提醒"),tr("请确认连接的数据库所配置的所有系统已经离线,\n所部署的数据库将无法恢复,请注意备份,\n是否继续?")) != QMessageBox::Yes)
|
||||
if(N_MessageBox::question(this,tr("部署提醒"),tr("请确认连接的数据库所配\n"
|
||||
"置的所有系统已经离线,所\n"
|
||||
"部署的数据库将无法恢复,\n"
|
||||
"请注意备份,是否继续?")) != N_MessageBox::Ok)
|
||||
return;
|
||||
emit sigDeploy();
|
||||
}
|
||||
|
||||
@ -14,6 +14,8 @@
|
||||
#include <tchar.h>
|
||||
#include "db_manager_common.h"
|
||||
#endif
|
||||
#include "pub_widget/CustomMainWindow.h"
|
||||
|
||||
|
||||
namespace Ui {
|
||||
class pj_manager;
|
||||
@ -29,7 +31,7 @@ struct sTableInfos
|
||||
using namespace iot_dbms;
|
||||
class CLogMngWidget;
|
||||
|
||||
class pj_manager : public QMainWindow
|
||||
class pj_manager : public CustomUiMainWindow
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
@ -65,6 +67,7 @@ signals:
|
||||
private slots:
|
||||
void onListWidgetChanged(QModelIndex);
|
||||
void onListWidgetDbChanged(QModelIndex);
|
||||
void onListWidgetLogMngChanged(QModelIndex);
|
||||
void onShowBackup();
|
||||
void onShowUpdate();
|
||||
void onShowDeploy();
|
||||
@ -119,7 +122,10 @@ private slots:
|
||||
void slotPushButtonMergeClicked();
|
||||
void slotShowBackupFolder(int row,int column);
|
||||
|
||||
void slotMainTableWidgetCurrentChanged(int index);
|
||||
|
||||
void slotCreateInflucDBUser(); //创建influxdb 数据库用户
|
||||
bool createInfluxDBUser(const QString &adminUser, const QString &password, const QString &host, const QString &username); //创建influxdb 数据库用户
|
||||
|
||||
//< 历史数据相关======================================================================================================================================================
|
||||
void on_tab_his_currentChanged(int index); //历史stackwidget标签页切换
|
||||
@ -145,6 +151,7 @@ private slots:
|
||||
|
||||
//< 转储相关
|
||||
void isLocalHostPageChange();// 判断是否本地地址来决定加载转储页面
|
||||
bool isCfgExist();
|
||||
void on_btn_export_cfg_clicked(); // 导出转储配置按钮
|
||||
void on_btn_start_srv_clicked(); // 开始转储服务
|
||||
void on_btn_close_srv_clicked(); // 关闭转储服务
|
||||
@ -277,12 +284,9 @@ private:
|
||||
QSet<QString> m_setHisTabls;
|
||||
|
||||
QDockWidget* m_his_backup_dockWidiget; // 历史对象信息查看ui
|
||||
CLogMngWidget* m_logMngWidget; // 日志管理ui
|
||||
|
||||
|
||||
bool pjUi = false; //工程管理界面是否可用
|
||||
bool dbUi = true; //数据管理界面是否可用
|
||||
|
||||
};
|
||||
|
||||
#endif // PJ_MANAGER_H
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -5,7 +5,7 @@
|
||||
**/
|
||||
|
||||
#include <QDateTime>
|
||||
#include <QMessageBox>
|
||||
#include "pub_widget/MessageBox.h"
|
||||
#include <QFileDialog>
|
||||
#include <QThread>
|
||||
#include <QInputDialog>
|
||||
@ -15,6 +15,7 @@
|
||||
#include <QDesktopServices>
|
||||
#include <QHostAddress>
|
||||
#include <QNetworkInterface>
|
||||
#include <QMenu>
|
||||
|
||||
#ifdef OS_WINDOWS
|
||||
#include <windows.h>
|
||||
@ -39,7 +40,7 @@ void pj_manager::on_btn_his_new_bakup_clicked()
|
||||
{
|
||||
if(m_pDbOpt == NULL)
|
||||
{
|
||||
QMessageBox::information(this,tr("提醒"),tr("请先连接数据库"));
|
||||
N_MessageBox::information(this,tr("提醒"),tr("请先连接数据库"));
|
||||
return;
|
||||
}
|
||||
new_his_backup_dialog new_bk_dialog(this);
|
||||
@ -110,10 +111,10 @@ void pj_manager::on_btn_his_del_backup_clicked()
|
||||
{
|
||||
if(ui->treeWidget_hst_data->selectedItems().size() == 0)
|
||||
{
|
||||
QMessageBox::information(this,tr("提醒"),tr("请选择备份"));
|
||||
N_MessageBox::information(this,tr("提醒"),tr("请选择备份"));
|
||||
return;
|
||||
}
|
||||
if(QMessageBox::question(this,tr("提醒"),tr("请确认是否删除备份") + ui->treeWidget_hst_data->selectedItems()[0]->text(0)) != QMessageBox::Yes)
|
||||
if(N_MessageBox::question(this,tr("提醒"),tr("请确认是否删除备份") + ui->treeWidget_hst_data->selectedItems()[0]->text(0)) != N_MessageBox::Ok)
|
||||
{
|
||||
return;
|
||||
}
|
||||
@ -244,7 +245,7 @@ void pj_manager::delHisBackup()
|
||||
if(ui->treeWidget_hst_data->selectedItems().size() > 0)
|
||||
{
|
||||
//< 确认
|
||||
if(QMessageBox::question(this,tr("删除备份"),tr("是否删除备份")+ui->treeWidget_hst_data->selectedItems()[0]->text(0)) != QMessageBox::Yes)
|
||||
if(N_MessageBox::question(this,tr("删除备份"),tr("是否删除备份")+ui->treeWidget_hst_data->selectedItems()[0]->text(0)) != N_MessageBox::Ok)
|
||||
{
|
||||
return;
|
||||
}
|
||||
@ -269,12 +270,12 @@ void pj_manager::importHisBackup()
|
||||
{
|
||||
if(ui->treeWidget_hst_data->selectedItems().size() == 0)
|
||||
{
|
||||
QMessageBox::information(this,tr("提醒"),tr("请先选择备份对象"));
|
||||
N_MessageBox::information(this,tr("提醒"),tr("请先选择备份对象"));
|
||||
return;
|
||||
}
|
||||
if(m_pDbOpt == NULL)
|
||||
{
|
||||
QMessageBox::information(this,tr("提醒"),tr("请先连接数据库"));
|
||||
N_MessageBox::information(this,tr("提醒"),tr("请先连接数据库"));
|
||||
return;
|
||||
}
|
||||
|
||||
@ -345,13 +346,13 @@ bool pj_manager::isLocalhost(const QString& addr)
|
||||
|
||||
QString pj_manager::getHisDumpSrvWeekday(const QString& weekday)
|
||||
{
|
||||
if(weekday == "日") return "7";
|
||||
if(weekday == "一") return "1";
|
||||
if(weekday == "二") return "2";
|
||||
if(weekday == "三") return "3";
|
||||
if(weekday == "四") return "4";
|
||||
if(weekday == "五") return "5";
|
||||
if(weekday == "六") return "6";
|
||||
if(weekday == tr("日")) return "7";
|
||||
if(weekday == tr("一")) return "1";
|
||||
if(weekday == tr("二")) return "2";
|
||||
if(weekday == tr("三")) return "3";
|
||||
if(weekday == tr("四")) return "4";
|
||||
if(weekday == tr("五")) return "5";
|
||||
if(weekday == tr("六")) return "6";
|
||||
return "0";
|
||||
}
|
||||
|
||||
@ -366,8 +367,8 @@ QString pj_manager::getHisDumpSrvType(bool ischecked)
|
||||
|
||||
QString pj_manager::getHisDumpSrvAction(const QString& type)
|
||||
{
|
||||
if(type == "备份和清理") return "1";
|
||||
if(type == "仅清理") return "2";
|
||||
if(type == tr("备份和清理")) return "1";
|
||||
if(type == tr("仅清理")) return "2";
|
||||
return "0";
|
||||
}
|
||||
|
||||
@ -375,25 +376,25 @@ QString pj_manager::getHisDumpSrvWeekday(int weekday)
|
||||
{
|
||||
switch (weekday) {
|
||||
case 1:
|
||||
return "一";
|
||||
return tr("一");
|
||||
break;
|
||||
case 2:
|
||||
return "二";
|
||||
return tr("二");
|
||||
break;
|
||||
case 3:
|
||||
return "三";
|
||||
return tr("三");
|
||||
break;
|
||||
case 4:
|
||||
return "四";
|
||||
return tr("四");
|
||||
break;
|
||||
case 5:
|
||||
return "五";
|
||||
return tr("五");
|
||||
break;
|
||||
case 6:
|
||||
return "六";
|
||||
return tr("六");
|
||||
break;
|
||||
case 7:
|
||||
return "日";
|
||||
return tr("日");
|
||||
break;
|
||||
default:
|
||||
return "0";
|
||||
@ -407,10 +408,10 @@ QString pj_manager::getHisDumpSrvAction(int action)
|
||||
{
|
||||
switch (action) {
|
||||
case 1:
|
||||
return "备份和清理";
|
||||
return tr("备份和清理");
|
||||
break;
|
||||
case 2:
|
||||
return "仅清理";
|
||||
return tr("仅清理");
|
||||
break;
|
||||
default:
|
||||
return "0";
|
||||
@ -532,7 +533,7 @@ void pj_manager::on_btn_export_cfg_clicked()
|
||||
QFile file( sName );
|
||||
if ( file.open( QIODevice::WriteOnly ) == false )
|
||||
{
|
||||
onShowMsg( "打开配置文件" + sName + "失败", 1 );
|
||||
onShowMsg( tr("打开配置文件%1失败").arg(sName), 1 );
|
||||
return;
|
||||
}
|
||||
QDomDocument dom;
|
||||
@ -552,13 +553,14 @@ void pj_manager::on_btn_export_cfg_clicked()
|
||||
eleDbSet.setAttribute( "username", sCurrentUser );
|
||||
eleDbSet.setAttribute( "passwd", sCurrentPasswd );
|
||||
eleDbSet.setAttribute( "dbType", m_pDbOpt->getDbType() == EDbType::DB_MYSQL?"QMYSQL":"QPSQL" );
|
||||
eleDbSet.setAttribute( "dbName", m_pDbOpt->getDatabaseName() );
|
||||
|
||||
eleDbManagerCfg.appendChild( eleDbSet );
|
||||
|
||||
file.write( dom.toByteArray() );
|
||||
file.close();
|
||||
|
||||
QMessageBox::information(this,"提醒","配置已导出,请手动重启服务,使新配置生效");
|
||||
N_MessageBox::information(this, tr("提醒"),tr("配置已导出,请手动重启服务,使新配置生效"));
|
||||
}
|
||||
|
||||
|
||||
@ -588,22 +590,22 @@ void pj_manager::addErrMsg(const QString &msg)
|
||||
void pj_manager::handleOptimizeDbSpaceFinished(bool result)
|
||||
{
|
||||
ui->btn_optimize_his_table->setDisabled(false);
|
||||
if(result) QMessageBox::information(this,tr("提醒"),tr("表空间优化已完成"));
|
||||
else QMessageBox::information(this,tr("提醒"),tr("表空间优化失败"));
|
||||
if(result) N_MessageBox::information(this,tr("提醒"),tr("表空间优化已完成"));
|
||||
else N_MessageBox::information(this,tr("提醒"),tr("表空间优化失败"));
|
||||
}
|
||||
|
||||
void pj_manager::handleDelHisAllFinished(bool result)
|
||||
{
|
||||
ui->btn_start_trash->setDisabled(false);
|
||||
if(result) QMessageBox::information(this,tr("提醒"),tr("清理全部历史数据已完成"));
|
||||
else QMessageBox::information(this,tr("提醒"),tr("清理全部历史数据失败"));
|
||||
if(result) N_MessageBox::information(this,tr("提醒"),tr("清理全部历史数据已完成"));
|
||||
else N_MessageBox::information(this,tr("提醒"),tr("清理全部历史数据失败"));
|
||||
}
|
||||
|
||||
void pj_manager::handleDelHisFinished(bool result)
|
||||
{
|
||||
ui->btn_start_trash->setDisabled(false);
|
||||
if(result) QMessageBox::information(this,tr("提醒"),tr("清理历史数据已完成"));
|
||||
else QMessageBox::information(this,tr("提醒"),tr("清理历史数据失败"));
|
||||
if(result) N_MessageBox::information(this,tr("提醒"),tr("清理历史数据已完成"));
|
||||
else N_MessageBox::information(this,tr("提醒"),tr("清理历史数据失败"));
|
||||
}
|
||||
|
||||
void pj_manager::on_btn_look_table_space_size_clicked()
|
||||
@ -624,7 +626,10 @@ void pj_manager::on_groupBox_exportPart_toggled(bool arg1)
|
||||
|
||||
void pj_manager::on_btn_start_trash_clicked()
|
||||
{
|
||||
if(QMessageBox::question(this,tr("提醒"),tr("请确认是否删除?")) != QMessageBox::Yes)
|
||||
/* 为以后搜索方便,保留此注释
|
||||
* 本函数多次EMS_DEFAULT_DATABASE
|
||||
*/
|
||||
if(N_MessageBox::question(this,tr("提醒"),tr("请确认是否删除?")) != N_MessageBox::Ok)
|
||||
{
|
||||
return;
|
||||
}
|
||||
@ -634,10 +639,10 @@ void pj_manager::on_btn_start_trash_clicked()
|
||||
{
|
||||
return;
|
||||
}
|
||||
emit delHisAll(m_pDbOpt->getDatabaseConn(),m_pDbOpt->getHostName(),TSDB_DB_NAME);
|
||||
emit delHisAll(m_pDbOpt->getDatabaseConn(),m_pDbOpt->getHostName(),m_pDbOpt->getDatabaseName());
|
||||
}
|
||||
else
|
||||
emit delHis(m_pDbOpt->getDatabaseConn(),m_pDbOpt->getHostName(),TSDB_DB_NAME,ui->dateTimeEdit_trash_end->dateTime().toMSecsSinceEpoch());
|
||||
emit delHis(m_pDbOpt->getDatabaseConn(),m_pDbOpt->getHostName(),m_pDbOpt->getDatabaseName(),ui->dateTimeEdit_trash_end->dateTime().toMSecsSinceEpoch());
|
||||
|
||||
ui->btn_start_trash->setDisabled(true);
|
||||
}
|
||||
@ -653,7 +658,7 @@ bool pj_manager::truncateHisTbls()
|
||||
{
|
||||
QApplication::processEvents();
|
||||
onShowMsg( sError, 1 );
|
||||
QMessageBox::critical( this, tr("错误"), tr("表") + sTableName + tr("删除失败:") + sError);
|
||||
N_MessageBox::critical( this, tr("错误"), tr("表") + sTableName + tr("删除失败:") + sError);
|
||||
return false;
|
||||
}
|
||||
onShowMsg( tr("清空表: ") + sTableName );
|
||||
|
||||
@ -15,27 +15,40 @@
|
||||
#include <tchar.h>
|
||||
#endif
|
||||
|
||||
#include "pub_widget/MessageBox.h"
|
||||
#include "pj_manager.h"
|
||||
#include "ui_pj_manager.h"
|
||||
|
||||
#include"db_manager_common.h"
|
||||
#include "public/pub_utility_api/FileUtil.h"
|
||||
#include "setup/CommonDef.h"
|
||||
|
||||
bool pj_manager::isCfgExist()
|
||||
{
|
||||
if( QFile::exists( getHisDumpSrvConfigPath() ) )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void pj_manager::on_btn_start_srv_clicked()
|
||||
{
|
||||
if(! isCfgExist() )
|
||||
{
|
||||
N_MessageBox::warning(this,tr("提醒"),tr("配置文件不存在,请导出"));
|
||||
return;
|
||||
}
|
||||
#ifdef OS_LINUX
|
||||
if(QProcess::execute("pkexec systemctl start iscs6000_db_his_data_srv.service")== QProcess::NormalExit)
|
||||
QMessageBox::information(this,tr("提醒"),tr("服务已开启"));
|
||||
if(QProcess::execute(QString("pkexec systemctl start %1.service").arg(g_pszDBHisDataServiceName))== QProcess::NormalExit)
|
||||
N_MessageBox::information(this,tr("提醒"),tr("服务已开启"));
|
||||
else
|
||||
QMessageBox::warning(this,tr("提醒"),tr("服务开启失败"));
|
||||
N_MessageBox::warning(this,tr("提醒"),tr("服务开启失败"));
|
||||
refreshHisSrvState();
|
||||
#endif
|
||||
|
||||
#ifdef OS_WINDOWS
|
||||
const TCHAR *pszServiceName = _T("db_his_data_srv");
|
||||
|
||||
//< 打开服务控制管理器
|
||||
SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
|
||||
if (hSCM == NULL)
|
||||
@ -44,7 +57,7 @@ if (hSCM == NULL)
|
||||
}
|
||||
else
|
||||
{
|
||||
SC_HANDLE hService = ::OpenService(hSCM, pszServiceName, SERVICE_QUERY_STATUS | SERVICE_STOP | DELETE);
|
||||
SC_HANDLE hService = ::OpenService(hSCM, g_pTCharDBHisDataServiceName, SERVICE_QUERY_STATUS | SERVICE_STOP | DELETE);
|
||||
|
||||
if (NULL == hService)
|
||||
{
|
||||
@ -53,8 +66,8 @@ else
|
||||
}
|
||||
else
|
||||
{
|
||||
QProcess::execute("net start db_his_data_srv");
|
||||
QMessageBox::information(this,tr("提醒"),tr("服务已启动"));
|
||||
QProcess::execute(QString("net start %1").arg(g_pszDBHisDataServiceName) );
|
||||
N_MessageBox::information(this,tr("提醒"),tr("服务已启动"));
|
||||
}
|
||||
::CloseServiceHandle(hService);
|
||||
|
||||
@ -67,21 +80,26 @@ refreshHisSrvState();
|
||||
|
||||
void pj_manager::on_btn_close_srv_clicked()
|
||||
{
|
||||
|
||||
if(! isCfgExist() )
|
||||
{
|
||||
N_MessageBox::warning(this,tr("提醒"),tr("配置文件不存在,请导出"));
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef OS_LINUX
|
||||
if(QProcess::execute("pkexec systemctl stop iscs6000_db_his_data_srv.service") == QProcess::NormalExit)
|
||||
if(QProcess::execute(QString("pkexec systemctl stop %1.service").arg(g_pszDBHisDataServiceName)) == QProcess::NormalExit)
|
||||
{
|
||||
QMessageBox::information(this,tr("提醒"),tr("服务已关闭"));
|
||||
N_MessageBox::information(this,tr("提醒"),tr("服务已关闭"));
|
||||
}
|
||||
else
|
||||
{
|
||||
QMessageBox::warning(this,tr("提醒"),tr("服务关闭失败"));
|
||||
N_MessageBox::warning(this,tr("提醒"),tr("服务关闭失败"));
|
||||
}
|
||||
refreshHisSrvState();
|
||||
#endif
|
||||
|
||||
#ifdef OS_WINDOWS
|
||||
const TCHAR *pszServiceName = _T("db_his_data_srv");
|
||||
|
||||
//< 打开服务控制管理器
|
||||
SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
|
||||
if (hSCM == NULL)
|
||||
@ -90,8 +108,8 @@ if (hSCM == NULL)
|
||||
}
|
||||
else
|
||||
{
|
||||
SC_HANDLE hService = ::OpenService(hSCM, pszServiceName, SERVICE_QUERY_STATUS | SERVICE_STOP | DELETE);
|
||||
//SC_HANDLE hService = ::OpenService(hSCM, _T("iscs6000_launcher_17b5ab7"), SERVICE_QUERY_STATUS | SERVICE_STOP | DELETE);
|
||||
SC_HANDLE hService = ::OpenService(hSCM, g_pTCharDBHisDataServiceName, SERVICE_QUERY_STATUS | SERVICE_STOP | DELETE);
|
||||
//SC_HANDLE hService = ::OpenService(hSCM, _T("xxxx_launcher_17b5ab7"), SERVICE_QUERY_STATUS | SERVICE_STOP | DELETE);
|
||||
|
||||
if (NULL == hService)
|
||||
{
|
||||
@ -106,9 +124,9 @@ else
|
||||
{
|
||||
//< todo 当使用SERVICE_USER_XXX_PROCESS类型的服务注册时,停止服务存在困难
|
||||
//< 此情况下服务的真实名称是注册名加上用户会话的ID,而ID是变化的,且微软没有开发获取的方法
|
||||
//< 比如真实的服务名是“iscs6000_launcher_17b5ab7”且正在运行,如果查询“iscs6000_launcher”的状态,是停止的
|
||||
//< 也无法通过停止“iscs6000_launcher”服务来停止“iscs6000_launcher_17b5ab7”
|
||||
//< 删除“iscs6000_launcher”服务后,“iscs6000_launcher_17b5ab7”还可见,必须注销重新登录才会消失
|
||||
//< 比如真实的服务名是“xxxx_launcher_17b5ab7”且正在运行,如果查询“xxxx_launcher”的状态,是停止的
|
||||
//< 也无法通过停止“xxxx_launcher”服务来停止“xxxx_launcher_17b5ab7”
|
||||
//< 删除“xxxx_launcher”服务后,“xxxx_launcher_17b5ab7”还可见,必须注销重新登录才会消失
|
||||
|
||||
if(SERVICE_STOPPED != objStatus.dwCurrentState
|
||||
&& TRUE == ControlService(hService, SERVICE_CONTROL_STOP, &objStatus))
|
||||
@ -131,7 +149,7 @@ else
|
||||
|
||||
if (SERVICE_STOPPED == objStatus.dwCurrentState)
|
||||
{
|
||||
QMessageBox::information(this,tr("提醒"),tr("关闭服务成功"));
|
||||
N_MessageBox::information(this,tr("提醒"),tr("关闭服务成功"));
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -156,6 +174,13 @@ refreshHisSrvState();
|
||||
|
||||
void pj_manager::on_btn_enable_srv_clicked()
|
||||
{
|
||||
|
||||
if(! isCfgExist() )
|
||||
{
|
||||
N_MessageBox::warning(this,tr("提醒"),tr("配置文件不存在,请导出"));
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef OS_LINUX
|
||||
const QString strExec = QCoreApplication::applicationDirPath() + "/db_his_data_srv";
|
||||
|
||||
@ -180,16 +205,15 @@ else
|
||||
return;
|
||||
}
|
||||
|
||||
const char *pszSystemdCfgFile = "/tmp/iscs6000_db_his_data_srv.service";
|
||||
//< 生成或修改systemd服务配置文件
|
||||
{
|
||||
QSettings objIniSetting(pszSystemdCfgFile, QSettings::IniFormat);
|
||||
QSettings objIniSetting(g_pszDBHisDataServiceTempFile, QSettings::IniFormat);
|
||||
objIniSetting.setIniCodec( QTextCodec::codecForLocale() );
|
||||
|
||||
if (!objIniSetting.isWritable())
|
||||
{
|
||||
onShowMsg(tr("服务配置文件不可写,请确认是否具有权限!请以root用户打开db_manager程序, ")
|
||||
+ pszSystemdCfgFile,1);
|
||||
+ g_pszDBHisDataServiceTempFile,1);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -198,7 +222,7 @@ const char *pszSystemdCfgFile = "/tmp/iscs6000_db_his_data_srv.service";
|
||||
objIniSetting.clear();
|
||||
|
||||
objIniSetting.beginGroup("Unit");
|
||||
objIniSetting.setValue("Description", "iscs6000_db_his_data_srv");
|
||||
objIniSetting.setValue("Description", g_pszDBHisDataServiceName);
|
||||
objIniSetting.setValue("After", "network.target");
|
||||
objIniSetting.endGroup();
|
||||
|
||||
@ -219,15 +243,14 @@ const char *pszSystemdCfgFile = "/tmp/iscs6000_db_his_data_srv.service";
|
||||
if (QSettings::NoError != objIniSetting.status())
|
||||
{
|
||||
onShowMsg(tr("写入服务配置文件失败!")
|
||||
+ pszSystemdCfgFile,1);
|
||||
+ g_pszDBHisDataServiceTempFile,1);
|
||||
return ;
|
||||
}
|
||||
}
|
||||
|
||||
//const char *pszSystemdCfgFile = "/usr/lib/systemd/system/iscs6000_db_his_data_srv.service";
|
||||
|
||||
//< 设置服务开机自启动
|
||||
if (0 != system("pkexec bash -c 'cp -f /tmp/iscs6000_db_his_data_srv.service /usr/lib/systemd/system/ && systemctl daemon-reload && systemctl enable iscs6000_db_his_data_srv'"))
|
||||
QString strRegAutoStartShell = QString("pkexec bash -c 'cp -f %1 %2 && systemctl daemon-reload && systemctl enable %3'").arg(g_pszDBHisDataServiceTempFile).arg(g_pszDBHisDataServiceFile).arg(g_pszDBHisDataServiceName);
|
||||
if (0 != system(strRegAutoStartShell.toStdString().c_str()))
|
||||
{
|
||||
onShowMsg(tr("设置服务开机自启动失败!"),1);
|
||||
return;
|
||||
@ -236,11 +259,10 @@ if (0 != system("pkexec bash -c 'cp -f /tmp/iscs6000_db_his_data_srv.service /u
|
||||
|
||||
//< 刷新服务状态
|
||||
refreshHisSrvState();
|
||||
QMessageBox::information(this,tr("提醒"),tr("服务已注册并设置自启动"));
|
||||
N_MessageBox::information(this,tr("提醒"),tr("服务已注册并设置自启动"));
|
||||
#endif
|
||||
|
||||
#ifdef OS_WINDOWS
|
||||
const TCHAR *pszServiceName = _T("db_his_data_srv");
|
||||
bool bRet = false;
|
||||
const QString strExec = QDir::toNativeSeparators
|
||||
(QCoreApplication::applicationDirPath() + "/db_his_data_srv.exe");
|
||||
@ -260,7 +282,7 @@ if (NULL == hSCM)
|
||||
else
|
||||
{
|
||||
//< 判断服务是否已存在
|
||||
SC_HANDLE hService = ::OpenService(hSCM, pszServiceName, SERVICE_QUERY_CONFIG);
|
||||
SC_HANDLE hService = ::OpenService(hSCM, g_pTCharDBHisDataServiceName, SERVICE_QUERY_CONFIG);
|
||||
if (NULL == hService)
|
||||
{
|
||||
//< 创建服务
|
||||
@ -273,7 +295,7 @@ else
|
||||
//< 2、多用户登录时会启动多个实例,而实际上由于端口占用等原因,是起不来的;
|
||||
//< 3、本程序停止服务时存在困难,见下面unregSysService()中的注释。
|
||||
hService = ::CreateService(
|
||||
hSCM, pszServiceName, pszServiceName,
|
||||
hSCM, g_pTCharDBHisDataServiceName, g_pTCharDBHisDataServiceName,
|
||||
SERVICE_ALL_ACCESS, 0x00000010/*SERVICE_WIN32_OWN_PROCESS*/,
|
||||
SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
|
||||
strExec.toStdWString().c_str(), NULL, NULL, NULL, NULL, NULL);
|
||||
@ -285,7 +307,7 @@ else
|
||||
else
|
||||
{
|
||||
SERVICE_DESCRIPTION stSrvDesc;
|
||||
TCHAR szDesc[] = _T("宏茂技术监控系统自动清除过期数据服务");
|
||||
TCHAR szDesc[] = _T("自动清除过期数据服务");
|
||||
stSrvDesc.lpDescription = szDesc;
|
||||
if (::ChangeServiceConfig2(hService, SERVICE_CONFIG_DESCRIPTION, &stSrvDesc))
|
||||
{
|
||||
@ -312,18 +334,24 @@ refreshHisSrvState();
|
||||
|
||||
void pj_manager::on_btn_disable_srv_clicked()
|
||||
{
|
||||
|
||||
if(! isCfgExist() )
|
||||
{
|
||||
N_MessageBox::warning(this,tr("提醒"),tr("配置文件不存在,请导出"));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
#ifdef OS_LINUX
|
||||
if(QProcess::execute("pkexec systemctl disable iscs6000_db_his_data_srv.service") == QProcess::NormalExit)
|
||||
QMessageBox::information(this,tr("提醒"),tr("服务已关闭自启动"));
|
||||
if(QProcess::execute(QString("pkexec systemctl disable %1.service").arg(g_pszDBHisDataServiceName)) == QProcess::NormalExit)
|
||||
N_MessageBox::information(this,tr("提醒"),tr("服务已关闭自启动"));
|
||||
else
|
||||
QMessageBox::warning(this,tr("提醒"),tr("服务关闭自启动失败"));
|
||||
N_MessageBox::warning(this,tr("提醒"),tr("服务关闭自启动失败"));
|
||||
refreshHisSrvState();
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef OS_WINDOWS
|
||||
const TCHAR *pszServiceName = _T("db_his_data_srv");
|
||||
|
||||
//< 打开服务控制管理器
|
||||
SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
|
||||
if (hSCM == NULL)
|
||||
@ -332,8 +360,8 @@ if (hSCM == NULL)
|
||||
}
|
||||
else
|
||||
{
|
||||
SC_HANDLE hService = ::OpenService(hSCM, pszServiceName, SERVICE_QUERY_STATUS | SERVICE_STOP | DELETE);
|
||||
//SC_HANDLE hService = ::OpenService(hSCM, _T("iscs6000_launcher_17b5ab7"), SERVICE_QUERY_STATUS | SERVICE_STOP | DELETE);
|
||||
SC_HANDLE hService = ::OpenService(hSCM, g_pTCharDBHisDataServiceName, SERVICE_QUERY_STATUS | SERVICE_STOP | DELETE);
|
||||
//SC_HANDLE hService = ::OpenService(hSCM, _T("xxxx_launcher_17b5ab7"), SERVICE_QUERY_STATUS | SERVICE_STOP | DELETE);
|
||||
|
||||
if (NULL == hService)
|
||||
{
|
||||
@ -348,9 +376,9 @@ else
|
||||
{
|
||||
//< todo 当使用SERVICE_USER_XXX_PROCESS类型的服务注册时,停止服务存在困难
|
||||
//< 此情况下服务的真实名称是注册名加上用户会话的ID,而ID是变化的,且微软没有开发获取的方法
|
||||
//< 比如真实的服务名是“iscs6000_launcher_17b5ab7”且正在运行,如果查询“iscs6000_launcher”的状态,是停止的
|
||||
//< 也无法通过停止“iscs6000_launcher”服务来停止“iscs6000_launcher_17b5ab7”
|
||||
//< 删除“iscs6000_launcher”服务后,“iscs6000_launcher_17b5ab7”还可见,必须注销重新登录才会消失
|
||||
//< 比如真实的服务名是“xxxx_launcher_17b5ab7”且正在运行,如果查询“xxxx_launcher”的状态,是停止的
|
||||
//< 也无法通过停止“xxxx_launcher”服务来停止“xxxx_launcher_17b5ab7”
|
||||
//< 删除“xxxx_launcher”服务后,“xxxx_launcher_17b5ab7”还可见,必须注销重新登录才会消失
|
||||
|
||||
if(SERVICE_STOPPED != objStatus.dwCurrentState
|
||||
&& TRUE == ControlService(hService, SERVICE_CONTROL_STOP, &objStatus))
|
||||
@ -407,7 +435,7 @@ void pj_manager::refreshHisSrvState()
|
||||
{
|
||||
#ifdef OS_LINUX
|
||||
|
||||
if (0 == QProcess::execute("systemctl is-enabled iscs6000_db_his_data_srv.service"))
|
||||
if (0 == QProcess::execute(QString("systemctl is-enabled %1.service").arg(g_pszDBHisDataServiceName)))
|
||||
{
|
||||
ui->label_srv_is_enabled->setText(tr("开"));
|
||||
ui->label_srv_is_enabled->setStyleSheet("color: #037550");
|
||||
@ -420,7 +448,7 @@ void pj_manager::refreshHisSrvState()
|
||||
}
|
||||
|
||||
|
||||
if (0 == QProcess::execute("systemctl is-active iscs6000_db_his_data_srv.service"))
|
||||
if (0 == QProcess::execute(QString("systemctl is-active %1.service").arg(g_pszDBHisDataServiceName)))
|
||||
{
|
||||
ui->label_srv_is_active->setText(tr("开启"));
|
||||
ui->label_srv_is_active->setStyleSheet("color: #037550");
|
||||
@ -436,19 +464,18 @@ void pj_manager::refreshHisSrvState()
|
||||
|
||||
|
||||
#ifdef OS_WINDOWS
|
||||
const TCHAR *pszServiceName = _T("db_his_data_srv");
|
||||
SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
|
||||
if (NULL == hSCM)
|
||||
{
|
||||
onShowMsg(QObject::tr("打开服务管理器失败,请确认是否具有权限!建议以管理员权限打开"),1);
|
||||
}
|
||||
|
||||
if (4 == GetServiceStatus(pszServiceName))
|
||||
if (4 == GetServiceStatus(g_pTCharDBHisDataServiceName))
|
||||
{
|
||||
ui->label_srv_is_active->setText(tr("开启"));
|
||||
ui->label_srv_is_active->setStyleSheet("color: #037550");
|
||||
}
|
||||
else if(1 == GetServiceStatus(pszServiceName))
|
||||
else if(1 == GetServiceStatus(g_pTCharDBHisDataServiceName))
|
||||
{
|
||||
ui->label_srv_is_active->setText(tr("关闭"));
|
||||
ui->label_srv_is_active->setStyleSheet("color: #D74C41");
|
||||
@ -456,7 +483,7 @@ void pj_manager::refreshHisSrvState()
|
||||
}
|
||||
|
||||
|
||||
SC_HANDLE hService = ::OpenService(hSCM, pszServiceName, SERVICE_QUERY_CONFIG);
|
||||
SC_HANDLE hService = ::OpenService(hSCM, g_pTCharDBHisDataServiceName, SERVICE_QUERY_CONFIG);
|
||||
if(NULL == hService)
|
||||
{
|
||||
ui->label_srv_is_enabled->setText(tr("关"));
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 3.1 KiB |
@ -12,11 +12,11 @@
|
||||
#define LANG_CONFIG_NAME "language.xml"
|
||||
|
||||
|
||||
#define TEST_DB_NAME "iscs6000testdbganyuhang"
|
||||
#define TEST_DB_NAME "iscs6000testdb"
|
||||
#define TEST_DB_IP "127.0.0.1"
|
||||
#define TEST_DB_PORT 3306
|
||||
#define TEST_DB_USERNAME "root"
|
||||
#define TEST_DB_PASSWORD "kbdct@0755"
|
||||
#define TEST_DB_PASSWORD EMS_DEFAULT_PASSWD
|
||||
|
||||
|
||||
class project_data_veri : public QObject
|
||||
|
||||
@ -142,7 +142,7 @@ bool db_manager_api::createDatabase(SDbConnInfo db_conn, EInitProjectErr &err, Q
|
||||
db_conn.username, db_conn.password ) == false )
|
||||
{
|
||||
err = DATABASE_ERR;
|
||||
errTxt = tr("打开数据库:") + db_conn.address + tr("失败!");
|
||||
errTxt = tr("打开数据库:") + QString("%1:%2 %3@%4").arg(db_conn.address).arg(db_conn.port).arg(db_conn.username).arg(db_conn.password) + tr("失败!");
|
||||
return false;
|
||||
}
|
||||
sig_showMsg( tr("打开数据库成功...") );
|
||||
@ -450,6 +450,7 @@ void db_manager_api::backupSimpExe()
|
||||
|
||||
QSet<QString> setIgnorePattern;
|
||||
setIgnorePattern.insert("syncthing_home");
|
||||
setIgnorePattern.insert("cache");
|
||||
if( !m_pFileOpt->copyFiles(m_sAllSrc, m_sAllDst,setIgnorePattern) )
|
||||
{
|
||||
sig_showMsg(tr("拷贝文件失败!"), 1);
|
||||
@ -509,6 +510,7 @@ void db_manager_api::backupCompExe()
|
||||
|
||||
QSet<QString> setIgnorePattern;
|
||||
setIgnorePattern.insert("syncthing_home");
|
||||
setIgnorePattern.insert("cache");
|
||||
if( !m_pFileOpt->copyFiles(m_sAllSrc, m_sAllDst,setIgnorePattern) )
|
||||
{
|
||||
sig_showMsg(tr("拷贝文件失败!"), 1);
|
||||
@ -881,16 +883,24 @@ bool db_manager_api::createTrigger(db_opt* pDbOpt, QString& sDatabaseName)
|
||||
return m_ret;
|
||||
}
|
||||
|
||||
bool db_manager_api::updateDatabase(db_opt* pDbOpt, QString& sDatabaseName)
|
||||
bool db_manager_api::updateDatabase(db_opt* pDbOpt, QString& sDatabaseName,bool isNoWaitDlg)
|
||||
{
|
||||
m_pDbOpt = pDbOpt;
|
||||
m_sDatabaseName = sDatabaseName;
|
||||
m_ret = true;
|
||||
ThreadFun fun = boost::bind(&db_manager_api::updateDatabaseExe, this);
|
||||
KbdWaitPrgDlg m_WaitPrgDialog(fun);
|
||||
if (m_WaitPrgDialog.exec())
|
||||
if(!isNoWaitDlg)
|
||||
{
|
||||
ThreadFun fun = boost::bind(&db_manager_api::updateDatabaseExe, this);
|
||||
KbdWaitPrgDlg m_WaitPrgDialog(fun);
|
||||
if (m_WaitPrgDialog.exec())
|
||||
{
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
updateDatabaseExe();
|
||||
}
|
||||
|
||||
return m_ret;
|
||||
}
|
||||
|
||||
@ -965,6 +975,54 @@ bool db_manager_api::initCompleteProjectExe()
|
||||
//**************获取国际化路径,同时初始化基础数据路径************************
|
||||
initProjectI18NPath();
|
||||
|
||||
//************************拷贝common和data目录************************************
|
||||
QString strDataDstPath = CFileUtil::getSimplePath(CFileUtil::getCurModuleDir() + "../../data" ).c_str();
|
||||
QString strDataSrcPath = CFileUtil::getSimplePath(CFileUtil::getCurModuleDir() + "../../products/").c_str();
|
||||
strDataSrcPath += QDir::separator()+m_productName + QDir::separator() + m_projectName + QDir::separator()+ "data";
|
||||
QStringList srcList;
|
||||
QStringList dstList;
|
||||
|
||||
QDir dbDir;
|
||||
if (dbDir.exists(strDataSrcPath))
|
||||
{
|
||||
dstList.append(strDataDstPath);
|
||||
srcList.append(strDataSrcPath);
|
||||
}
|
||||
|
||||
QString strComDstPath = CFileUtil::getSimplePath(CFileUtil::getCurModuleDir() + "../../platform/common" ).c_str();
|
||||
QString strCommSrcPath2 = CFileUtil::getSimplePath(CFileUtil::getCurModuleDir() + "../../products/").c_str();
|
||||
strCommSrcPath2 += QDir::separator() + m_productName + QDir::separator() + m_projectName + QDir::separator() + "common";
|
||||
QString strCommSrcPath1 = CFileUtil::getSimplePath(CFileUtil::getCurModuleDir() + "../../products/").c_str();
|
||||
strCommSrcPath1 += QDir::separator() + m_productName + QDir::separator() + "common";
|
||||
if (dbDir.exists(strCommSrcPath1))
|
||||
{
|
||||
dstList.append(strComDstPath);
|
||||
srcList.append(strCommSrcPath1);
|
||||
}
|
||||
|
||||
if (dbDir.exists(strCommSrcPath2))
|
||||
{
|
||||
dstList.append(strComDstPath);
|
||||
srcList.append(strCommSrcPath2);
|
||||
}
|
||||
|
||||
QString strProductDstPath = CFileUtil::getSimplePath(CFileUtil::getCurModuleDir() + "../../product" ).c_str();
|
||||
QString strProductSrcPath = CFileUtil::getSimplePath(CFileUtil::getCurModuleDir() + "../../products/").c_str();
|
||||
strProductSrcPath += QDir::separator()+m_productName + QDir::separator() + m_projectName + QDir::separator()+ "product";
|
||||
if (dbDir.exists(strProductSrcPath))
|
||||
{
|
||||
dstList.append(strProductDstPath);
|
||||
srcList.append(strProductSrcPath);
|
||||
}
|
||||
|
||||
m_pFileOpt->deleteDir(strDataDstPath);
|
||||
if (!m_pFileOpt->copyFiles(srcList, dstList))
|
||||
{
|
||||
sig_showMsg(tr("拷贝文件失败!"), 1);
|
||||
return false;
|
||||
}
|
||||
sig_showMsg(tr("复制文件成功..."));
|
||||
|
||||
//***************************创建数据库,存在删除***************************
|
||||
sig_showMsg( tr("开始创建数据库...") );
|
||||
if(!createDatabase(m_dbConnInfo, err, errTxt)) //创建数据库
|
||||
@ -985,16 +1043,6 @@ bool db_manager_api::initCompleteProjectExe()
|
||||
sig_showMsg( tr("数据库表结构升级成功...") );
|
||||
|
||||
|
||||
//**************************恢复旧的数据库数据,不恢复脚本和触发器********************
|
||||
sig_showMsg( tr("开始创建数据库表结构...") );
|
||||
QString strProjectPath = QStringLiteral("products") + QDir::separator() + m_productName + QDir::separator() + m_projectName+"/database" ; //增加数据库路径
|
||||
if(!restoreDatabase(strProjectPath,err, errTxt))
|
||||
{
|
||||
sig_showMsg( errTxt,1); //显示错误信息
|
||||
return false;
|
||||
}
|
||||
sig_showMsg( tr("开始创建数据库表结构...") );
|
||||
|
||||
//**********************导入Excel格式基础数据******************************
|
||||
sig_showMsg( tr("开始导入基础数据...") );
|
||||
m_ret = true;
|
||||
@ -1006,6 +1054,16 @@ bool db_manager_api::initCompleteProjectExe()
|
||||
}
|
||||
sig_showMsg(tr( "导入基础数据完成...") );
|
||||
|
||||
//**************************恢复旧的数据库数据,不恢复脚本和触发器********************
|
||||
sig_showMsg( tr("开始创建数据库表结构...") );
|
||||
QString strProjectPath = QStringLiteral("products") + QDir::separator() + m_productName + QDir::separator() + m_projectName+"/database" ; //增加数据库路径
|
||||
if(!restoreDatabase(strProjectPath,err, errTxt))
|
||||
{
|
||||
sig_showMsg( errTxt,1); //显示错误信息
|
||||
return false;
|
||||
}
|
||||
sig_showMsg( tr("开始创建数据库表结构...") );
|
||||
|
||||
//************************部署+导入触发器等********************************
|
||||
sig_showMsg( tr("开始部署...") );
|
||||
if(!deployToLocal(err, errTxt,0))
|
||||
@ -1027,6 +1085,8 @@ bool db_manager_api::initCompleteProjectExe()
|
||||
|
||||
sig_showMsg( tr("初始化完整工程完成...") );
|
||||
|
||||
m_pDbOpt->closeDatabase();
|
||||
sig_showMsg( tr("断开数据库链接...") );
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#ifndef DB_MANAGER_API_COMMON_H
|
||||
#ifndef DB_MANAGER_API_COMMON_H
|
||||
#define DB_MANAGER_API_COMMON_H
|
||||
|
||||
#include "pub_utility_api/UtilityCommon.h"
|
||||
@ -25,13 +25,9 @@
|
||||
#define FUNC_DEFINE_FILE_KINGBASE "iscs6000_func_Kingbase.sql"
|
||||
|
||||
|
||||
#define KINGBASE_DEFAULT_SCHEMA "iscs6000"
|
||||
|
||||
#define DB_MANAGER_CFG_NAME "db_manager_cfg.xml"
|
||||
#define CFG_MD_BACKUP "backup"
|
||||
#define CFG_MD_BACKUP_KEY_REPORTFILE "reportFilePath"
|
||||
|
||||
#define CN_PASSWD "kbdct@0755"
|
||||
|
||||
|
||||
#endif // DB_MANAGER_API_COMMON_H
|
||||
|
||||
@ -364,44 +364,44 @@ bool db_opt::createDbNode( QString sDatabaseName )
|
||||
qDebug() << "查询数据库节点出错";
|
||||
return false;
|
||||
}
|
||||
QString username;
|
||||
QString port;
|
||||
QString username = m_sUser;
|
||||
QString port = QString("%1").arg(m_nPort);
|
||||
QString dbType;
|
||||
|
||||
switch (getDbType())
|
||||
{
|
||||
case EDbType::DB_MYSQL:
|
||||
username = "root";
|
||||
port = "3306";
|
||||
// username = "root";
|
||||
// port = "3306";
|
||||
dbType = "2";
|
||||
break;
|
||||
case EDbType::DB_OPENGAUSS:
|
||||
username = "iscs";
|
||||
port = "5432";
|
||||
// username = "iscs";
|
||||
// port = "5432";
|
||||
dbType = "3";
|
||||
break;
|
||||
case EDbType::DB_KINGBASE:
|
||||
username = "system";
|
||||
port = "54321";
|
||||
// username = "system";
|
||||
// port = "54321";
|
||||
dbType = "4";
|
||||
break;
|
||||
default:
|
||||
LOGERROR("不支持的数据库类型!");
|
||||
break;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/* 为以后搜索方便,保留此注释 EMS_DEFAULT_PASSWD*/
|
||||
QString sSql;
|
||||
if( querySel.next() )
|
||||
{
|
||||
sSql = "update sys_model_dbconfig_node set DB_TYPE = '" + dbType + "', DB_SERVICE_NAME = '" + sDatabaseName + "'," \
|
||||
"USER_NAME = '" + username + "', USER_PASSWORD = '"+ CN_PASSWD + "', NIC_CUR_ID = '1', DB_NAME = '0', DB_HOST_PRIOR = '1', IS_DB_SWITCH = '1', IS_DIRECT_ACCESS = '1', DB_PORT = '"+ port +"'" \
|
||||
"USER_NAME = '" + username + "', USER_PASSWORD = '"+ m_objDb.getDbPara().getPassword() + "', NIC_CUR_ID = '1', DB_NAME = '0', DB_HOST_PRIOR = '1', IS_DB_SWITCH = '1', IS_DIRECT_ACCESS = '1', DB_PORT = '"+ port +"'" \
|
||||
"where NODE_NAME = '" + QHostInfo::localHostName() + "';";
|
||||
}
|
||||
else
|
||||
{
|
||||
sSql = "insert into sys_model_dbconfig_node (NODE_NAME,DB_TYPE,DB_SERVICE_NAME,USER_NAME,USER_PASSWORD,NIC_CUR_ID,DB_NAME,DB_HOST_PRIOR,IS_DB_SWITCH,IS_DIRECT_ACCESS,DB_PORT)" \
|
||||
"values ('" + QHostInfo::localHostName() + "','" + dbType + "','" + sDatabaseName + "','" + username + "','"+ CN_PASSWD + "','1','0','1','1','1','" + port + "');";
|
||||
"values ('" + QHostInfo::localHostName() + "','" + dbType + "','" + sDatabaseName + "','" + username + "','"+ m_objDb.getDbPara().getPassword() + "','1','0','1','1','1','" + port + "');";
|
||||
}
|
||||
QSqlQuery query( *m_objDb.getDatabase() );
|
||||
if ( query.exec( sSql ) == false )
|
||||
@ -790,7 +790,7 @@ bool db_opt::importDatabase( QString sDatabaseName, QString sFileName, quint32 n
|
||||
|
||||
|
||||
//************************导入Excel数据******************************************
|
||||
signalSendMsg( "开始导入Excel数据文件...!" );
|
||||
signalSendMsg( tr("开始导入Excel数据文件...!") );
|
||||
if( nImportType & EN_IMPORT_DATA )
|
||||
{
|
||||
QString sExcelPath = sFileName;
|
||||
@ -1085,7 +1085,7 @@ bool db_opt::executeXmlFileUpdate( QString sDatabaseName)
|
||||
return false;
|
||||
}
|
||||
|
||||
signalSendMsg( "数据库表结构更新完成!");
|
||||
signalSendMsg(tr("数据库表结构更新完成!"));
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -1236,7 +1236,7 @@ void db_opt::filterTable( QStringList& listTable )
|
||||
if ( !QFile::exists( dir.filePath( sFilePath ) ) )
|
||||
{
|
||||
sFilePath = "";
|
||||
signalSendMsg("数据库定义配置文件不存在", 1);
|
||||
signalSendMsg(tr("数据库定义配置文件不存在"), 1);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -1274,6 +1274,13 @@ void db_opt::filterTable( QStringList& listTable )
|
||||
if("Table" == eleTable.tagName())
|
||||
{
|
||||
QString sTableName = eleTable.attribute("name");
|
||||
QString sUseType = eleTable.attribute("use_type");
|
||||
if(sUseType.isEmpty())
|
||||
{
|
||||
eleTable = eleTable.nextSiblingElement();
|
||||
continue; //< 为空表示禁用
|
||||
}
|
||||
|
||||
QDomElement table_db = eleTable.firstChildElement();
|
||||
|
||||
while (!table_db.isNull()) {
|
||||
@ -1350,6 +1357,13 @@ void db_opt::filterTable(QMap<QString, QString> &tableOptMap)
|
||||
if("Table" == eleTable.tagName())
|
||||
{
|
||||
QString sTableName = eleTable.attribute("name");
|
||||
QString sUseType = eleTable.attribute("use_type");
|
||||
if(sUseType.isEmpty())
|
||||
{
|
||||
eleTable = eleTable.nextSiblingElement();
|
||||
continue; //< 为空表示禁用
|
||||
}
|
||||
|
||||
QDomElement table_db = eleTable.firstChildElement();
|
||||
|
||||
while (!table_db.isNull()) {
|
||||
@ -1406,6 +1420,13 @@ bool db_opt::appendTableNeedBak(const QString& cfgFilePath, QStringList & listTa
|
||||
if("Table" == eleTable.tagName())
|
||||
{
|
||||
QString sTableName = eleTable.attribute("name");
|
||||
QString sUseType = eleTable.attribute("use_type");
|
||||
if(sUseType.isEmpty())
|
||||
{
|
||||
eleTable = eleTable.nextSiblingElement();
|
||||
continue; //< 为空表示禁用
|
||||
}
|
||||
|
||||
QDomElement table_db = eleTable.firstChildElement();
|
||||
|
||||
while (!table_db.isNull()) {
|
||||
@ -1534,7 +1555,7 @@ bool db_opt::deleteIndex( QString& sTableName, QSqlQuery& query )
|
||||
{
|
||||
if( !getTableIndex( sTableName, query) )
|
||||
{
|
||||
signalSendMsg( "deleteIndex函数获取表索引失败", 1 );
|
||||
signalSendMsg(tr("deleteIndex函数获取表索引失败"), 1 );
|
||||
return false;
|
||||
}
|
||||
if( query.size() <= 0 )
|
||||
@ -1610,7 +1631,10 @@ bool db_opt::createDb(QString &dbName,QString &sError)
|
||||
|
||||
if(getDbType() == EDbType::DB_KINGBASE)
|
||||
{
|
||||
sSql = "CREATE SCHEMA iscs6000;";
|
||||
/* 为以后搜索方便,保留此注释。mysql的database实际应该对应schema
|
||||
* sSql = QString("CREATE SCHEMA %1;").arg(EMS_DEFAULT_DATABASE);
|
||||
*/
|
||||
sSql = QString("CREATE SCHEMA %1;").arg(dbName);
|
||||
if(!switchDatabase(dbName))
|
||||
{
|
||||
sError = tr("无法切换到数据库") ;
|
||||
@ -1622,7 +1646,22 @@ bool db_opt::createDb(QString &dbName,QString &sError)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(getDbType() == EDbType::DB_OPENGAUSS)
|
||||
{
|
||||
/* 为以后搜索方便,保留此注释。mysql的database实际应该对应schema
|
||||
* sSql = QString("CREATE SCHEMA %1;").arg(EMS_DEFAULT_DATABASE);
|
||||
*/
|
||||
sSql = QString("CREATE SCHEMA %1;").arg(dbName);
|
||||
if(!switchDatabase(dbName))
|
||||
{
|
||||
sError = tr("无法切换到数据库") ;
|
||||
return false;
|
||||
}
|
||||
if ( !executeSql( sSql, sError ) )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -1651,7 +1690,7 @@ void db_opt::slotDeleteTrigger( QString sDatabaseName, QString sFileName )
|
||||
//先删除所有触发器,防止造成重复触发器错误
|
||||
//deleteAllTrigger_impl( sDatabaseName );
|
||||
|
||||
signalSendMsg( "开始执行SQL文件..." );
|
||||
signalSendMsg( tr("开始执行SQL文件...") );
|
||||
QFile file( sFileName );
|
||||
if ( !file.open( QIODevice::ReadOnly | QIODevice::Text ) )
|
||||
{
|
||||
@ -1808,7 +1847,7 @@ void db_opt::slotRecoverAllFunction( QString sDatabaseName )
|
||||
|
||||
bool db_opt::deleteAllTrigger_impl( QString sDatabaseName, bool getCreateTrigger )
|
||||
{
|
||||
signalSendMsg( "开始删除触发器..." );
|
||||
signalSendMsg( tr("开始删除触发器...") );
|
||||
m_listOldTriggerName.clear();
|
||||
m_listCreateTriggerString.clear();
|
||||
|
||||
@ -1908,7 +1947,7 @@ bool db_opt::deleteAllProcedure_impl( QString sDatabaseName )
|
||||
|
||||
bool db_opt::deleteAllFunction_impl( QString sDatabaseName )
|
||||
{
|
||||
signalSendMsg( "开始删除函数..." );
|
||||
signalSendMsg( tr("开始删除函数...") );
|
||||
m_listOldFunctionName.clear();
|
||||
m_listCreateFunctionString.clear();
|
||||
|
||||
@ -1991,7 +2030,7 @@ bool db_opt::recoverAllTrigger_impl( QString sDatabaseName )
|
||||
|
||||
bool db_opt::recoverAllProcedure_impl( QString sDatabaseName )
|
||||
{
|
||||
signalSendMsg( "开始恢复存储过程..." );
|
||||
signalSendMsg( tr("开始恢复存储过程...") );
|
||||
|
||||
// 将缺少的存储过程重新导入
|
||||
QString sError = "";
|
||||
@ -2136,7 +2175,7 @@ bool db_opt::deleteVoidedTable(const QStringList &tableNameDb)
|
||||
return false;
|
||||
}
|
||||
sDeleteTableString = "";
|
||||
signalSendMsg("表:" + tableNameDb[i] + "删除成功!", 0);
|
||||
signalSendMsg(tr("表:%1删除成功!").arg(tableNameDb[i]), 0);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@ -2186,14 +2225,14 @@ bool db_opt::handleEleTable(const QDomElement &eleTable, const QString &sDatabas
|
||||
signalSendMsg(tr("重新获取表")+ sTableName +tr("的所有字段失败!"), 1); return false;
|
||||
}
|
||||
if( !updatePriKey( sDatabaseName, sTableName, xmlTableKeys ) ){
|
||||
signalSendMsg( "更新表的主键失败", 1 ); return false;
|
||||
signalSendMsg( tr("更新表的主键失败"), 1 ); return false;
|
||||
}
|
||||
idxColumn += nColAdded; //调整idxColumn
|
||||
if( !deleteVoidedColumn( idxColumn,listXmlColumns, listColumn, sTableName) ){
|
||||
signalSendMsg( "删除多余的字段失败", 1 ); return false;
|
||||
signalSendMsg( tr("删除多余的字段失败"), 1 ); return false;
|
||||
}
|
||||
if( !updateTableIndex( sTableName, normalIndex, uniqueIndex, fulltextIndex ) ){
|
||||
signalSendMsg( "更新表的索引失败", 1 ); return false;
|
||||
signalSendMsg( tr("更新表的索引失败"), 1 ); return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@ -2357,7 +2396,8 @@ bool db_opt::handleDbStruct(const QDomElement &databaseStruct,const QString& sDa
|
||||
while ( !eleTable.isNull() )
|
||||
{
|
||||
QString sTableName = eleTable.attribute("name").toLower();
|
||||
if ( eleTable.attribute("use_type","") == "rdb" ) {// 筛选掉纯内存库表
|
||||
QString sUseType = eleTable.attribute("use_type","");
|
||||
if ( sUseType == "rdb" || sUseType.isEmpty() ) {// 筛选掉纯内存库表或者禁用的表
|
||||
eleTable = eleTable.nextSiblingElement();
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -2,9 +2,14 @@
|
||||
#include "pub_logger_api/logger.h"
|
||||
#include "db_manager_api_common.h"
|
||||
|
||||
/* 为以后搜索方便,保留此注释
|
||||
* 将KINGBASE_DEFAULT_SCHEMA和EMS_DEFAULT_DATABASE 替换为数据库名,也就是在pgsql数据库中数据库和模式同名
|
||||
*/
|
||||
//#define KINGBASE_DEFAULT_SCHEMA EMS_DEFAULT_DATABASE
|
||||
|
||||
using namespace iot_dbms;
|
||||
|
||||
const QString g_sDefaultSchema= QStringLiteral(KINGBASE_DEFAULT_SCHEMA);
|
||||
//const QString g_sDefaultSchema= QStringLiteral(KINGBASE_DEFAULT_SCHEMA);
|
||||
|
||||
db_opt_kingbase::db_opt_kingbase()
|
||||
{
|
||||
@ -68,7 +73,7 @@ bool db_opt_kingbase::getTableName( QString sDatabaseName, QList<STable>& listTa
|
||||
}
|
||||
|
||||
|
||||
QString sSql = "SELECT t.table_name, pg_catalog.obj_description(pgc.oid, 'pg_class') FROM information_schema.tables t INNER JOIN pg_catalog.pg_class pgc ON t.table_name = pgc.relname WHERE t.table_type='BASE TABLE' AND t.table_schema='" + g_sDefaultSchema + "';";
|
||||
QString sSql = "SELECT t.table_name, pg_catalog.obj_description(pgc.oid, 'pg_class') FROM information_schema.tables t INNER JOIN pg_catalog.pg_class pgc ON t.table_name = pgc.relname WHERE t.table_type='BASE TABLE' AND t.table_schema='" + m_objDb.getDbPara().getDatabaseName() + "';";
|
||||
QSqlQuery query( *m_objDb.getDatabase() );
|
||||
if ( query.exec( sSql ) == false )
|
||||
return false;
|
||||
@ -97,7 +102,7 @@ bool db_opt_kingbase::getTableName( QString sDatabaseName, QStringList& listTabl
|
||||
return false;
|
||||
}
|
||||
|
||||
QString sSql = "SELECT table_name FROM information_schema.tables WHERE table_schema = '"+ g_sDefaultSchema + "' AND table_type = 'BASE TABLE'";
|
||||
QString sSql = "SELECT table_name FROM information_schema.tables WHERE table_schema = '"+ m_objDb.getDbPara().getDatabaseName() + "' AND table_type = 'BASE TABLE'";
|
||||
QSqlQuery query( *m_objDb.getDatabase() );
|
||||
if ( query.exec( sSql ) == false )
|
||||
return false;
|
||||
@ -253,7 +258,7 @@ bool db_opt_kingbase::getCreateTableString( QString sDatabaseName, QString sTabl
|
||||
return false;
|
||||
}
|
||||
{
|
||||
sSql = "SELECT * FROM show_create_table('" + g_sDefaultSchema + "', '" + sTableName + "');";
|
||||
sSql = "SELECT * FROM show_create_table('" + m_objDb.getDbPara().getDatabaseName() + "', '" + sTableName + "');";
|
||||
QSqlQuery query( *m_objDb.getDatabase() );
|
||||
if ( query.exec( sSql ) == false )
|
||||
return false;
|
||||
@ -387,7 +392,7 @@ bool db_opt_kingbase::getColumn( QString sDatabaseName, QString sTableName, QLis
|
||||
"FROM pg_index, pg_class, pg_attribute, pg_namespace "
|
||||
"WHERE pg_attribute.attnum > 0 AND "
|
||||
"pg_class.oid = '" + sTableName + "'::regclass "
|
||||
"AND nspname = '" + g_sDefaultSchema + "' "
|
||||
"AND nspname = '" + m_objDb.getDbPara().getDatabaseName() + "' "
|
||||
"AND pg_class.relnamespace = pg_namespace.oid "
|
||||
"AND pg_attribute.attrelid = pg_class.oid "
|
||||
"AND pg_attribute.attisdropped = false) as ts order by attnum;";
|
||||
@ -591,7 +596,7 @@ QStringList db_opt_kingbase::getMainKeys(QString sDataBase, QString sTableName)
|
||||
" WHERE pg_attribute.attnum > 0 AND "
|
||||
" pg_class.oid = '" + sTableName + "'::regclass AND "
|
||||
" indrelid = pg_class.oid "
|
||||
" AND nspname = '" + g_sDefaultSchema + "' "
|
||||
" AND nspname = '" + m_objDb.getDbPara().getDatabaseName() + "' "
|
||||
" AND pg_class.relnamespace = pg_namespace.oid "
|
||||
" AND pg_attribute.attrelid = pg_class.oid "
|
||||
" AND pg_attribute.attnum = any(pg_index.indkey)"
|
||||
@ -633,7 +638,7 @@ bool db_opt_kingbase::getTriggerName(QString sDatabaseName, QString sTableName,
|
||||
|
||||
listTriggerName.clear();
|
||||
QString sSql = "select TRIGGER_NAME,EVENT_OBJECT_TABLE from information_schema.TRIGGERS \
|
||||
where event_object_catalog='" + g_sDefaultSchema + "' ";
|
||||
where event_object_catalog='" + m_objDb.getDbPara().getDatabaseName() + "' ";
|
||||
if ( sTableName != "" )
|
||||
sSql += "and EVENT_OBJECT_TABLE='" + sTableName + "' ";
|
||||
QSqlQuery query( *m_objDb.getDatabase() );
|
||||
@ -666,7 +671,7 @@ bool db_opt_kingbase::getCreateTriggerString( QString sDatabaseName, QString sTa
|
||||
}
|
||||
|
||||
QString sSql = "select TRIGGER_NAME,ACTION_TIMING,EVENT_MANIPULATION,EVENT_OBJECT_TABLE,ACTION_ORIENTATION,ACTION_STATEMENT from information_schema.TRIGGERS \
|
||||
where event_object_catalog='" + g_sDefaultSchema + "' and TRIGGER_NAME = '" + sTriggerName + "' ";
|
||||
where event_object_catalog='" + m_objDb.getDbPara().getDatabaseName() + "' and TRIGGER_NAME = '" + sTriggerName + "' ";
|
||||
if ( sTableName != "" )
|
||||
sSql += " and EVENT_OBJECT_TABLE='" + sTableName + "' ";
|
||||
QSqlQuery query( *m_objDb.getDatabase() );
|
||||
@ -731,7 +736,7 @@ bool db_opt_kingbase::getFunctionName( QString sDatabaseName, QStringList& listF
|
||||
}
|
||||
|
||||
listFunctionName.clear();
|
||||
QString sSql = "SELECT p.oid::regprocedure FROM pg_catalog.pg_namespace n JOIN pg_catalog.pg_proc p ON pronamespace = n.oid WHERE nspname = '" + g_sDefaultSchema +"';";
|
||||
QString sSql = "SELECT p.oid::regprocedure FROM pg_catalog.pg_namespace n JOIN pg_catalog.pg_proc p ON pronamespace = n.oid WHERE nspname = '" + m_objDb.getDbPara().getDatabaseName() +"';";
|
||||
QSqlQuery query( *m_objDb.getDatabase() );
|
||||
if ( query.exec( sSql ) == false )
|
||||
return false;
|
||||
@ -855,7 +860,8 @@ bool db_opt_kingbase::checkTrigger(const QString &sDatabaseName)
|
||||
while ( !eleTable.isNull() )
|
||||
{
|
||||
QString sTableName = eleTable.attribute("name").toLower();
|
||||
if ( eleTable.attribute("use_type","") == "rdb" ) {// 筛选掉纯内存库表
|
||||
QString sUseType = eleTable.attribute("use_type","");
|
||||
if ( sUseType == "rdb" || sUseType.isEmpty()) {// 筛选掉纯内存库表
|
||||
eleTable = eleTable.nextSiblingElement();
|
||||
continue;
|
||||
}
|
||||
@ -958,7 +964,7 @@ bool db_opt_kingbase::dropPrimaryKey(const QString &sDatabaseName, const QString
|
||||
QString sSql = "select concat('alter table " + sTableName +
|
||||
"drop constraint ', constraint_name) as my_query " +
|
||||
"from information_schema.table_constraints " +
|
||||
"where table_schema = '" + g_sDefaultSchema + "' and table_name = '" + sTableName +
|
||||
"where table_schema = '" + m_objDb.getDbPara().getDatabaseName() + "' and table_name = '" + sTableName +
|
||||
"' and constraint_type = 'PRIMARY KEY';";
|
||||
{
|
||||
QSqlQuery query( *m_objDb.getDatabase() );
|
||||
@ -989,7 +995,7 @@ bool db_opt_kingbase::getTableIndex(QString &sTableName, QSqlQuery &query)
|
||||
QString sError;
|
||||
|
||||
query.clear();
|
||||
QString sSql = "select indexname from pg_indexes where tablename not like 'pg%' and schemaname = '" + g_sDefaultSchema + "' and indexname not like '%_pkey' and tablename = '" + sTableName + "' ;";
|
||||
QString sSql = "select indexname from pg_indexes where tablename not like 'pg%' and schemaname = '" + m_objDb.getDbPara().getDatabaseName() + "' and indexname not like '%_pkey' and tablename = '" + sTableName + "' ;";
|
||||
if ( executeSql( sSql, query, sError ) == false )
|
||||
{
|
||||
qDebug() << "获取表索引出错";
|
||||
|
||||
@ -984,7 +984,7 @@ bool db_opt_mysql::importSqlFileHelper(QString sFileName, quint32 nImportType, i
|
||||
}
|
||||
restoreDatabaseParameter();
|
||||
file.close();
|
||||
signalSendMsg( "导入SQL文件完成...!" );
|
||||
signalSendMsg( tr("导入SQL文件完成...!") );
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@ -66,7 +66,7 @@ bool db_opt_opengauss::getTableName( QString sDatabaseName, QList<STable>& listT
|
||||
}
|
||||
|
||||
|
||||
QString sSql = "SELECT t.table_name, pg_catalog.obj_description(pgc.oid, 'pg_class') FROM information_schema.tables t INNER JOIN pg_catalog.pg_class pgc ON t.table_name = pgc.relname WHERE t.table_type='BASE TABLE' AND t.table_schema='public';";
|
||||
QString sSql = "SELECT t.table_name, pg_catalog.obj_description(pgc.oid, 'pg_class') FROM information_schema.tables t INNER JOIN pg_catalog.pg_class pgc ON t.table_name = pgc.relname WHERE t.table_type='BASE TABLE' AND t.table_schema='" + m_objDb.getDbPara().getDatabaseName() + "';";
|
||||
QSqlQuery query( *m_objDb.getDatabase() );
|
||||
if ( query.exec( sSql ) == false )
|
||||
return false;
|
||||
@ -95,7 +95,7 @@ bool db_opt_opengauss::getTableName( QString sDatabaseName, QStringList& listTab
|
||||
return false;
|
||||
}
|
||||
|
||||
QString sSql = "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'";
|
||||
QString sSql = "SELECT t.table_name, pg_catalog.obj_description(pgc.oid, 'pg_class') FROM information_schema.tables t INNER JOIN pg_catalog.pg_class pgc ON t.table_name = pgc.relname WHERE t.table_type='BASE TABLE' AND t.table_schema='" + m_objDb.getDbPara().getDatabaseName() + "';";
|
||||
QSqlQuery query( *m_objDb.getDatabase() );
|
||||
if ( query.exec( sSql ) == false )
|
||||
return false;
|
||||
@ -122,7 +122,7 @@ bool db_opt_opengauss::getCreateTableString( QString sDatabaseName, QString sTab
|
||||
}
|
||||
|
||||
QString sSql =
|
||||
"CREATE OR REPLACE FUNCTION public.show_create_table(\n"
|
||||
"CREATE OR REPLACE FUNCTION show_create_table(\n"
|
||||
" in_schema_name varchar,\n"
|
||||
" in_table_name varchar\n"
|
||||
")\n"
|
||||
@ -243,8 +243,8 @@ bool db_opt_opengauss::getCreateTableString( QString sDatabaseName, QString sTab
|
||||
" -- return the ddl\n"
|
||||
" RETURN v_table_ddl;\n"
|
||||
" END;\n"
|
||||
"$$;\n"
|
||||
"SELECT * FROM public.show_create_table('public', '" + sTableName + "');";
|
||||
"$$;\n";
|
||||
//"SELECT * FROM public.show_create_table('public', '" + sTableName + "');";
|
||||
|
||||
QSqlQuery query( *m_objDb.getDatabase() );
|
||||
if ( query.exec( sSql ) == false )
|
||||
@ -376,7 +376,7 @@ bool db_opt_opengauss::getColumn( QString sDatabaseName, QString sTableName, QLi
|
||||
"FROM pg_index, pg_class, pg_attribute, pg_namespace "
|
||||
"WHERE pg_attribute.attnum > 0 AND "
|
||||
"pg_class.oid = '" + sTableName + "'::regclass "
|
||||
"AND nspname = 'public' "
|
||||
"AND nspname = '" + m_objDb.getDbPara().getDatabaseName() + "' "
|
||||
"AND pg_class.relnamespace = pg_namespace.oid "
|
||||
"AND pg_attribute.attrelid = pg_class.oid "
|
||||
"AND pg_attribute.attisdropped = false) order by attnum;";
|
||||
@ -569,7 +569,7 @@ QStringList db_opt_opengauss::getMainKeys(QString sDataBase, QString sTableName)
|
||||
" WHERE pg_attribute.attnum > 0 AND "
|
||||
" pg_class.oid = '" + sTableName + "'::regclass AND "
|
||||
" indrelid = pg_class.oid "
|
||||
" AND nspname = 'public' "
|
||||
" AND nspname = '" + m_objDb.getDbPara().getDatabaseName() + "' "
|
||||
" AND pg_class.relnamespace = pg_namespace.oid "
|
||||
" AND pg_attribute.attrelid = pg_class.oid "
|
||||
" AND pg_attribute.attnum = any(pg_index.indkey)"
|
||||
@ -706,7 +706,7 @@ bool db_opt_opengauss::getFunctionName( QString sDatabaseName, QStringList& list
|
||||
}
|
||||
|
||||
listFunctionName.clear();
|
||||
QString sSql = "SELECT proname FROM pg_catalog.pg_namespace n JOIN pg_catalog.pg_proc p ON pronamespace = n.oid WHERE nspname = 'public';";
|
||||
QString sSql = "SELECT p.oid::regprocedure FROM pg_catalog.pg_namespace n JOIN pg_catalog.pg_proc p ON pronamespace = n.oid WHERE nspname = '" + m_objDb.getDbPara().getDatabaseName() +"';";
|
||||
QSqlQuery query( *m_objDb.getDatabase() );
|
||||
if ( query.exec( sSql ) == false )
|
||||
return false;
|
||||
@ -863,10 +863,10 @@ bool db_opt_opengauss::dropPrimaryKey(const QString &sDatabaseName, const QStrin
|
||||
}
|
||||
|
||||
|
||||
QString sSql = "select concat('alter table public." + sTableName +
|
||||
QString sSql = "select concat('alter table " + sTableName +
|
||||
"drop constraint ', constraint_name) as my_query " +
|
||||
"from information_schema.table_constraints " +
|
||||
"where table_schema = 'public' and table_name = '" + sTableName +
|
||||
"where table_schema = '" + m_objDb.getDbPara().getDatabaseName() + "' and table_name = '" + sTableName +
|
||||
"' and constraint_type = 'PRIMARY KEY';";
|
||||
{
|
||||
QSqlQuery query( *m_objDb.getDatabase() );
|
||||
@ -897,7 +897,7 @@ bool db_opt_opengauss::getTableIndex(QString &sTableName, QSqlQuery &query)
|
||||
QString sError;
|
||||
|
||||
query.clear();
|
||||
QString sSql = "select indexname from pg_indexes where tablename not like 'pg%' and schemaname = 'public' and indexname not like '%_pkey' and tablename = '" + sTableName + "' ;";
|
||||
QString sSql = "select indexname from pg_indexes where tablename not like 'pg%' and schemaname = '" + m_objDb.getDbPara().getDatabaseName() + "' and indexname not like '%_pkey' and tablename = '" + sTableName + "' ;";
|
||||
if ( executeSql( sSql, query, sError ) == false )
|
||||
{
|
||||
qDebug() << "获取表索引出错";
|
||||
@ -913,7 +913,7 @@ bool db_opt_opengauss::deleteTableIndex(QString &sTableName, QSqlQuery &query)
|
||||
QString sError;
|
||||
|
||||
Q_UNUSED(sTableName)
|
||||
QString sSql = "drop index " + query.value("indexname").toString();
|
||||
QString sSql = "drop index " +m_objDb.getDbPara().getDatabaseName()+"."+ query.value("indexname").toString();
|
||||
if ( executeSql( sSql, sError ) == false )
|
||||
{
|
||||
qDebug() << "删除表索引出错";
|
||||
@ -950,7 +950,7 @@ bool db_opt_opengauss::createUniqueIndex(QString &sTableName, QList<QStringList>
|
||||
{
|
||||
QString sError;
|
||||
|
||||
QString sSql = "CREATE UNIQUE INDEX IN_" + sTableName.toUpper() + " ON " + sTableName + " (";
|
||||
QString sSql = "CREATE UNIQUE INDEX Un_" + sTableName.toUpper() + " ON " + sTableName + " (";
|
||||
for(int i = 0; i < uniqueIndex.count(); i++)
|
||||
{
|
||||
sSql += uniqueIndex[i][0] + " "+ uniqueIndex[i][1] + ",";
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -15,7 +15,7 @@
|
||||
#define TEST_DB_IP "127.0.0.1"
|
||||
#define TEST_DB_PORT 3306
|
||||
#define TEST_DB_USERNAME "root"
|
||||
#define TEST_DB_PASSWORD "kbdct@0755"
|
||||
#define TEST_DB_PASSWORD EMS_DEFAULT_PASSWD
|
||||
|
||||
MainWindow::MainWindow(QWidget *parent) :
|
||||
QMainWindow(parent),
|
||||
|
||||
@ -101,8 +101,8 @@ void COStreamFile::writeMsg( const std::string &strData )
|
||||
}
|
||||
uint64 ullSize = cn_check_mask | strData.size();
|
||||
m_pStream->WriteLittleEndian64( ullSize );
|
||||
LOGDEBUG( "write little endian64 %llu", ( unsigned long long ) strData.size());
|
||||
m_pStream->WriteRaw(( const void * ) strData.data(), strData.size());
|
||||
LOGDEBUG( "write little endian64 %d", strData.size());
|
||||
m_pStream->WriteRaw(( const void * ) strData.data(), static_cast<int>(strData.size()));
|
||||
}
|
||||
|
||||
} //< namespace iot_dbms
|
||||
} //< namespace iot_dbms
|
||||
|
||||
@ -21,7 +21,7 @@ QWidget* CColumnModeDelegate::createEditor( QWidget *parent, const QStyleOptionV
|
||||
pComboBox->addItem("rdb");
|
||||
return pComboBox;
|
||||
}
|
||||
else if ( nCol == 5 || nCol == 9 || nCol == 10 || nCol == 13 || nCol ==19 || nCol == 20 || nCol == 21 )
|
||||
else if ( nCol == 5 || nCol == 9 || nCol == 10 || nCol == 13 || nCol ==19 || nCol == 20 )
|
||||
{
|
||||
QComboBox *pComboBox = new QComboBox(parent);
|
||||
pComboBox->addItem("yes");
|
||||
@ -95,7 +95,7 @@ void CColumnModeDelegate::setEditorData( QWidget *editor, const QModelIndex &ind
|
||||
pSpinBox->setValue( nValue );
|
||||
}
|
||||
else if ( nCol == 4 || nCol == 5 || nCol == 9 || nCol == 10 || nCol == 13 || nCol == 19 ||
|
||||
nCol == 20 || nCol == 21 || nCol == 6 || nCol == 11 || nCol == 12 || nCol == 15 || nCol == 16 )
|
||||
nCol == 20 || nCol == 6 || nCol == 11 || nCol == 12 || nCol == 15 || nCol == 16 )
|
||||
{
|
||||
QString text = index.model()->data(index).toString();
|
||||
QComboBox* pComboBox = static_cast<QComboBox*>(editor);
|
||||
@ -113,7 +113,7 @@ void CColumnModeDelegate::setModelData( QWidget *editor, QAbstractItemModel *mod
|
||||
model->setData(index, pSpinBox->value());
|
||||
}
|
||||
else if ( nCol == 4 || nCol == 5 || nCol == 9 || nCol == 10 || nCol == 13 || nCol == 19 ||
|
||||
nCol == 20 || nCol == 21 || nCol == 6 || nCol == 11 || nCol == 12 || nCol == 15 || nCol == 16 )
|
||||
nCol == 20 || nCol == 6 || nCol == 11 || nCol == 12 || nCol == 15 || nCol == 16 )
|
||||
{
|
||||
QComboBox* pComboBox = static_cast<QComboBox*>(editor);
|
||||
QString data = pComboBox->currentText();
|
||||
|
||||
@ -27,8 +27,7 @@ CColumnModeModel::CColumnModeModel()
|
||||
<< "数据长度(rdb)"
|
||||
<< "默认值(rdb)"
|
||||
<< "是否同步到备内存库"
|
||||
<< "是否更新到内存库"
|
||||
<< "内存库持久化";
|
||||
<< "是否更新到内存库";
|
||||
}
|
||||
|
||||
CColumnModeModel::~CColumnModeModel()
|
||||
@ -143,9 +142,6 @@ QVariant CColumnModeModel::data( const QModelIndex &index, int role ) const
|
||||
case 20:
|
||||
oVal = m_pListColumn->at(index.row())->sIsUpdateToRdb;
|
||||
break;
|
||||
case 21:
|
||||
oVal = m_pListColumn->at(index.row())->sCache;
|
||||
break;
|
||||
}
|
||||
return oVal;
|
||||
}
|
||||
@ -314,13 +310,6 @@ bool CColumnModeModel::setData( const QModelIndex& index, const QVariant &value,
|
||||
emit signalDataChanged();
|
||||
}
|
||||
break;
|
||||
case 21:
|
||||
if ( m_pListColumn->at(index.row())->sCache != value.toString() )
|
||||
{
|
||||
m_pListColumn->at(index.row())->sCache = value.toString();
|
||||
emit signalDataChanged();
|
||||
}
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -4,18 +4,21 @@
|
||||
#include "pub_sysinfo_api/SysInfoApi.h"
|
||||
#include "CFileSelect.h"
|
||||
#include <QCloseEvent>
|
||||
#include "pub_widget/MessageBox.h"
|
||||
|
||||
CDbStudio::CDbStudio(QWidget *parent) :
|
||||
QMainWindow(parent),
|
||||
CustomUiMainWindow(parent),
|
||||
ui(new Ui::CDbStudio)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
setAutoLayout(true);
|
||||
|
||||
ui->menuBar->hide();
|
||||
ui->mainToolBar->hide();
|
||||
ui->statusBar->hide();
|
||||
|
||||
if ( false == loadConfig() )
|
||||
{
|
||||
exit(0);
|
||||
return;
|
||||
}
|
||||
initUi();
|
||||
initMainMenu();
|
||||
}
|
||||
|
||||
CDbStudio::~CDbStudio()
|
||||
@ -23,30 +26,74 @@ CDbStudio::~CDbStudio()
|
||||
delete ui;
|
||||
}
|
||||
|
||||
bool CDbStudio::loadConfig()
|
||||
void CDbStudio::slotMainMenuClicked(int nIndex)
|
||||
{
|
||||
if ( false == loadConfig(nIndex) )
|
||||
{
|
||||
N_MessageBox::warning(this,tr("警告"),tr("加载配置文件失败"));
|
||||
return;
|
||||
}
|
||||
|
||||
refreshTableModeTableView();
|
||||
refreshColumnModeListWidget();
|
||||
}
|
||||
|
||||
void CDbStudio::initMainMenu()
|
||||
{
|
||||
QPushButton* platBtn = new QPushButton();
|
||||
platBtn->setObjectName("btn_platform");
|
||||
platBtn->setText(tr("平台配置"));
|
||||
ui->mainMenu->addToolBtn(platBtn);
|
||||
|
||||
QPushButton* prodBtn = new QPushButton();
|
||||
prodBtn->setObjectName("btn_product");
|
||||
prodBtn->setText(tr("产品配置"));
|
||||
ui->mainMenu->addToolBtn(prodBtn);
|
||||
|
||||
connect(ui->mainMenu, &MenuFrame::buttonClicked,this, &CDbStudio::slotMainMenuClicked);
|
||||
|
||||
slotMainMenuClicked(CN_MainMenu_Platform);
|
||||
platBtn->setChecked(true);
|
||||
}
|
||||
|
||||
void CDbStudio::clearTableInfo()
|
||||
{
|
||||
foreach (STable* pTable, m_listTable) {
|
||||
delete pTable;
|
||||
}
|
||||
|
||||
m_listTable.clear();
|
||||
m_listTable_db.clear(); //< m_listTable_db都在m_listTable
|
||||
m_listTable_rdb.clear(); //< m_listTable_rdb都在m_listTable
|
||||
m_listSubsystem.clear();
|
||||
}
|
||||
|
||||
bool CDbStudio::loadConfig(int nMenuIndex)
|
||||
{
|
||||
m_bSaved = true;
|
||||
m_sComment = "";
|
||||
clearTableInfo();
|
||||
|
||||
// 先选择编辑的文件
|
||||
CFileSelect objFileSelect;
|
||||
objFileSelect.exec();
|
||||
CFileSelect objFileSelect(nMenuIndex,this);
|
||||
// objFileSelect.exec();
|
||||
m_sFilePath = objFileSelect.getFilePath();
|
||||
if ( m_sFilePath == "" )
|
||||
return false;
|
||||
|
||||
// 设置窗口名称
|
||||
setWindowTitle( "表结构修改工具" + objFileSelect.getDesc() );
|
||||
m_strCurTitle = tr("表结构管理工具") + objFileSelect.getDesc();
|
||||
setWindowTitle( m_strCurTitle );
|
||||
|
||||
QFile oFile( m_sFilePath );
|
||||
if ( !oFile.exists() )
|
||||
{
|
||||
QMessageBox::critical( 0, "错误", QString("配置文件【%1】不存在").arg(m_sFilePath) );
|
||||
N_MessageBox::critical( 0, "错误", QString("配置文件【%1】不存在").arg(m_sFilePath) );
|
||||
return false;
|
||||
}
|
||||
if ( !oFile.open(QIODevice::ReadOnly) )
|
||||
{
|
||||
QMessageBox::critical( 0, "错误", QString("配置文件【%1】打开失败").arg(m_sFilePath) );
|
||||
N_MessageBox::critical( 0, "错误", QString("配置文件【%1】打开失败").arg(m_sFilePath) );
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -54,7 +101,7 @@ bool CDbStudio::loadConfig()
|
||||
if ( !oDoc.setContent(&oFile) )
|
||||
{
|
||||
oFile.close();
|
||||
QMessageBox::critical( 0, "错误", QString("配置文件【%1】解析内容错误").arg(m_sFilePath) );
|
||||
N_MessageBox::critical( 0, "错误", QString("配置文件【%1】解析内容错误").arg(m_sFilePath) );
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -93,7 +140,6 @@ bool CDbStudio::loadConfig()
|
||||
pTable->nSubsystemFlag = eleTableRdb.attribute( "subsystem_flag", "0" ).toULongLong();
|
||||
pTable->sSelectByLocation = eleTableRdb.attribute( "select_by_location", "" );
|
||||
pTable->sSelectBySubsystem = eleTableRdb.attribute( "select_by_subsystem", "" );
|
||||
pTable->sCache = eleTableRdb.attribute( "cache", "" );
|
||||
}
|
||||
|
||||
QDomElement eleColumn = eleTable.firstChildElement("Column");
|
||||
@ -132,7 +178,6 @@ bool CDbStudio::loadConfig()
|
||||
pColumn->sDefaultValue_rdb = eleColumnRdb.attribute( "default_value", "" );
|
||||
pColumn->sIsSynToSlave = eleColumnRdb.attribute( "is_syn_to_slave", "" );
|
||||
pColumn->sIsUpdateToRdb = eleColumnRdb.attribute( "is_update_to_rdb", "" );
|
||||
pColumn->sCache = eleColumnRdb.attribute( "cache", "" );
|
||||
}
|
||||
|
||||
pTable->listColumn.append( pColumn );
|
||||
@ -148,13 +193,13 @@ bool CDbStudio::loadConfig()
|
||||
std::vector<iot_public::SSubsystemInfo> vecSubsystemInfo;
|
||||
if ( iot_public::createSysInfoInstance( pSysInfo ) == false )
|
||||
{
|
||||
QMessageBox::warning( 0, "警告", tr("createSysInfoInstance失败,导致无法修改表所属的专业,其他功能可用") );
|
||||
N_MessageBox::warning( 0, "警告", tr("createSysInfoInstance失败,导致无法修改表所属的专业,其他功能可用") );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( 0 != pSysInfo->getAllSubsystemInfo( vecSubsystemInfo ))
|
||||
{
|
||||
QMessageBox::critical( 0, "错误", tr("获取专业信息失败") );
|
||||
N_MessageBox::critical( 0, "错误", tr("获取专业信息失败") );
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -194,10 +239,6 @@ bool CDbStudio::loadConfig()
|
||||
|
||||
void CDbStudio::initUi()
|
||||
{
|
||||
ui->menuBar->hide();
|
||||
ui->mainToolBar->hide();
|
||||
ui->statusBar->hide();
|
||||
|
||||
initTableModeUi();
|
||||
initColumnModeUi();
|
||||
}
|
||||
@ -224,7 +265,7 @@ void CDbStudio::initTableModeUi()
|
||||
ui->tableView_tableMode->setItemDelegateForColumn( 8, new CTableModeDelegate(&m_listSubsystem) );
|
||||
ui->tableView_tableMode->setItemDelegateForColumn( 9, new CTableModeDelegate(&m_listSubsystem) );
|
||||
ui->tableView_tableMode->setItemDelegateForColumn( 10, new CTableModeDelegate(&m_listSubsystem) );
|
||||
ui->tableView_tableMode->setItemDelegateForColumn( 11, new CTableModeDelegate(&m_listSubsystem) );
|
||||
|
||||
|
||||
connect( m_pTableModeModel, SIGNAL(signalTableNameChanged()), this, SLOT(slotTableNameChanged()) );
|
||||
connect( m_pTableModeModel, SIGNAL(signalDataChanged()), this, SLOT(slotDataChanged()) );
|
||||
@ -234,7 +275,7 @@ void CDbStudio::initTableModeUi()
|
||||
connect( ui->pushButton_delTable, SIGNAL(clicked(bool)), this, SLOT(slotDelTable(bool)) );
|
||||
connect( ui->pushButton_saveTable, SIGNAL(clicked(bool)), this, SLOT(slotSave(bool)) );
|
||||
|
||||
refreshTableModeTableView();
|
||||
// refreshTableModeTableView();
|
||||
}
|
||||
|
||||
void CDbStudio::initColumnModeUi()
|
||||
@ -268,7 +309,6 @@ void CDbStudio::initColumnModeUi()
|
||||
ui->tableView_columnMode->setItemDelegateForColumn( 17, new CColumnModeDelegate );
|
||||
ui->tableView_columnMode->setItemDelegateForColumn( 19, new CColumnModeDelegate );
|
||||
ui->tableView_columnMode->setItemDelegateForColumn( 20, new CColumnModeDelegate );
|
||||
ui->tableView_columnMode->setItemDelegateForColumn( 21, new CColumnModeDelegate );
|
||||
|
||||
connect( m_pColumnModeModel, SIGNAL(signalDataChanged()), this, SLOT(slotDataChanged()) );
|
||||
connect( ui->listWidget_columnMode, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(slotColumnModeListWidgetItemClicked(QListWidgetItem*)) );
|
||||
@ -280,15 +320,15 @@ void CDbStudio::initColumnModeUi()
|
||||
connect( ui->pushButton_moveUp, SIGNAL(clicked(bool)), this, SLOT(slotColumnMoveUp(bool)) );
|
||||
connect( ui->pushButton_moveDown, SIGNAL(clicked(bool)), this, SLOT(slotColumnMoveDown(bool)) );
|
||||
|
||||
refreshColumnModeListWidget();
|
||||
// refreshColumnModeListWidget();
|
||||
}
|
||||
|
||||
void CDbStudio::closeEvent(QCloseEvent *pEvent)
|
||||
{
|
||||
if ( m_bSaved == false )
|
||||
{
|
||||
int nRet = QMessageBox::information( 0, "提示", "当前修改未保存,是否保存?", QMessageBox::Yes, QMessageBox::No, QMessageBox::Cancel );
|
||||
if ( nRet == QMessageBox::Yes )
|
||||
int nRet = N_MessageBox::information( 0, "提示", "当前修改未保存,是否保存?", N_MessageBox::Yes, N_MessageBox::No, N_MessageBox::Cancel );
|
||||
if ( nRet == N_MessageBox::Yes )
|
||||
{
|
||||
bool bRet = slotSave( true );
|
||||
if ( bRet == false )
|
||||
@ -297,7 +337,7 @@ void CDbStudio::closeEvent(QCloseEvent *pEvent)
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if ( nRet == QMessageBox::Cancel )
|
||||
else if ( nRet == N_MessageBox::Cancel )
|
||||
{
|
||||
pEvent->ignore();
|
||||
return;
|
||||
@ -349,7 +389,6 @@ void CDbStudio::refreshTableModeTableView()
|
||||
ui->tableView_tableMode->setColumnHidden( 8, false );
|
||||
ui->tableView_tableMode->setColumnHidden( 9, false );
|
||||
ui->tableView_tableMode->setColumnHidden( 10, false );
|
||||
ui->tableView_tableMode->setColumnHidden( 11, false );
|
||||
|
||||
m_pTableModeModel->setTablePtr( &m_listTable );
|
||||
}
|
||||
@ -361,7 +400,6 @@ void CDbStudio::refreshTableModeTableView()
|
||||
ui->tableView_tableMode->setColumnHidden( 8, true );
|
||||
ui->tableView_tableMode->setColumnHidden( 9, true );
|
||||
ui->tableView_tableMode->setColumnHidden( 10, true );
|
||||
ui->tableView_tableMode->setColumnHidden( 11, false );
|
||||
|
||||
|
||||
m_pTableModeModel->setTablePtr( &m_listTable_db );
|
||||
@ -374,7 +412,6 @@ void CDbStudio::refreshTableModeTableView()
|
||||
ui->tableView_tableMode->setColumnHidden( 8, false );
|
||||
ui->tableView_tableMode->setColumnHidden( 9, false );
|
||||
ui->tableView_tableMode->setColumnHidden( 10, false );
|
||||
ui->tableView_tableMode->setColumnHidden( 11, true );
|
||||
|
||||
|
||||
m_pTableModeModel->setTablePtr( &m_listTable_rdb );
|
||||
@ -497,18 +534,27 @@ void CDbStudio::refreshColumnModeListWidget()
|
||||
|
||||
void CDbStudio::configChanged()
|
||||
{
|
||||
setWindowTitle( "表结构修改工具(未保存)" );
|
||||
ui->tableView_tableMode->setStyleSheet( "background-color: wheat;" );
|
||||
ui->tableView_columnMode->setStyleSheet( "background-color: wheat;" );
|
||||
setWindowTitle( m_strCurTitle + "(未保存)" );
|
||||
// ui->tableView_tableMode->setStyleSheet( "background-color: wheat;" );
|
||||
// ui->tableView_columnMode->setStyleSheet( "background-color: wheat;" );
|
||||
m_bSaved = false;
|
||||
ui->tableView_tableMode->setProperty("changed",true);
|
||||
ui->tableView_columnMode->setProperty("changed",true);
|
||||
this->style()->polish(ui->tableView_tableMode);
|
||||
this->style()->polish(ui->tableView_columnMode);
|
||||
}
|
||||
|
||||
void CDbStudio::configSaved()
|
||||
{
|
||||
setWindowTitle( "表结构修改工具" );
|
||||
setWindowTitle( m_strCurTitle );
|
||||
ui->tableView_tableMode->setStyleSheet( "" );
|
||||
ui->tableView_columnMode->setStyleSheet( "" );
|
||||
m_bSaved = true;
|
||||
|
||||
ui->tableView_tableMode->setProperty("changed",false);
|
||||
ui->tableView_columnMode->setProperty("changed",false);
|
||||
this->style()->polish(ui->tableView_tableMode);
|
||||
this->style()->polish(ui->tableView_columnMode);
|
||||
}
|
||||
|
||||
void CDbStudio::slotShowTableStateChanged( int )
|
||||
@ -537,13 +583,13 @@ void CDbStudio::slotDelTable( bool )
|
||||
int nRow = ui->tableView_tableMode->currentIndex().row();
|
||||
if ( nRow < 0 || nRow >= m_listTable.count() )
|
||||
{
|
||||
QMessageBox::critical( 0, "错误", "请先选择要删除的表" );
|
||||
N_MessageBox::critical( 0, "错误", "请先选择要删除的表" );
|
||||
return;
|
||||
}
|
||||
|
||||
STable* pTable = m_listTable.at( nRow );
|
||||
QMessageBox::StandardButton ret = QMessageBox::question( 0, "警告", "确定删除表 【"+pTable->sName+"】?");
|
||||
if ( ret == QMessageBox::StandardButton::Yes )
|
||||
int ret = N_MessageBox::question( 0, "警告", "确定删除表 【"+pTable->sName+"】?");
|
||||
if ( ret == N_MessageBox::Ok )
|
||||
{
|
||||
m_pTableModeModel->clearTablePtr();
|
||||
m_listTable.removeAt( nRow );
|
||||
@ -551,7 +597,7 @@ void CDbStudio::slotDelTable( bool )
|
||||
pTable = NULL;
|
||||
refreshTableModeTableView();
|
||||
|
||||
QMessageBox::information(0,"提示","删除成功");
|
||||
N_MessageBox::information(0,"提示","删除成功");
|
||||
}
|
||||
|
||||
refreshColumnModeListWidget();
|
||||
@ -590,7 +636,7 @@ void CDbStudio::slotAddColumn( bool )
|
||||
QListWidgetItem* pItem = ui->listWidget_columnMode->currentItem();
|
||||
if ( pItem == NULL )
|
||||
{
|
||||
QMessageBox::warning( 0, "警告", "请先选择一张表" );
|
||||
N_MessageBox::warning( 0, "警告", "请先选择一张表" );
|
||||
return;
|
||||
}
|
||||
|
||||
@ -617,7 +663,7 @@ void CDbStudio::slotDelColumn( bool )
|
||||
QListWidgetItem* pItem = ui->listWidget_columnMode->currentItem();
|
||||
if ( pItem == NULL )
|
||||
{
|
||||
QMessageBox::warning( 0, "警告", "请先选择一张表" );
|
||||
N_MessageBox::warning( 0, "警告", "请先选择一张表" );
|
||||
return;
|
||||
}
|
||||
|
||||
@ -628,13 +674,13 @@ void CDbStudio::slotDelColumn( bool )
|
||||
int nRow = ui->tableView_columnMode->currentIndex().row();
|
||||
if ( nRow < 0 || nRow >= m_listTable.at(nIndex)->listColumn.count() )
|
||||
{
|
||||
QMessageBox::critical( 0, "错误", "请先选择要删除的列" );
|
||||
N_MessageBox::critical( 0, "错误", "请先选择要删除的列" );
|
||||
return;
|
||||
}
|
||||
|
||||
SColumn* pColumn = m_listTable.at(nIndex)->listColumn.at( nRow );
|
||||
QMessageBox::StandardButton ret = QMessageBox::question( 0, "警告", "确定删除列 【"+pColumn->sName+"】?");
|
||||
if ( ret == QMessageBox::StandardButton::Yes )
|
||||
int ret = N_MessageBox::question( 0, "警告", "确定删除列 【"+pColumn->sName+"】?");
|
||||
if ( ret == N_MessageBox::Ok )
|
||||
{
|
||||
m_pColumnModeModel->clearTablePtr();
|
||||
m_listTable.at(nIndex)->listColumn.removeAt( nRow );
|
||||
@ -642,7 +688,7 @@ void CDbStudio::slotDelColumn( bool )
|
||||
pColumn = NULL;
|
||||
m_pColumnModeModel->setTablePtr( &m_listTable.at(nIndex)->listColumn );
|
||||
|
||||
QMessageBox::information(0,"提示","删除成功");
|
||||
N_MessageBox::information(0,"提示","删除成功");
|
||||
}
|
||||
configChanged();
|
||||
}
|
||||
@ -652,7 +698,7 @@ void CDbStudio::slotColumnMoveUp( bool )
|
||||
QListWidgetItem* pItem = ui->listWidget_columnMode->currentItem();
|
||||
if ( pItem == NULL )
|
||||
{
|
||||
QMessageBox::warning( 0, "警告", "请先选择一张表" );
|
||||
N_MessageBox::warning( 0, "警告", "请先选择一张表" );
|
||||
return;
|
||||
}
|
||||
int nIndex = pItem->data( Qt::UserRole ).toInt();
|
||||
@ -662,7 +708,7 @@ void CDbStudio::slotColumnMoveUp( bool )
|
||||
int nCurrentRow = ui->tableView_columnMode->currentIndex().row();
|
||||
if ( nCurrentRow < 0 )
|
||||
{
|
||||
QMessageBox::warning( 0, "警告", "请先选择要上移的列" );
|
||||
N_MessageBox::warning( 0, "警告", "请先选择要上移的列" );
|
||||
return;
|
||||
}
|
||||
else if ( nCurrentRow == 0 )
|
||||
@ -683,7 +729,7 @@ void CDbStudio::slotColumnMoveDown( bool )
|
||||
QListWidgetItem* pItem = ui->listWidget_columnMode->currentItem();
|
||||
if ( pItem == NULL )
|
||||
{
|
||||
QMessageBox::warning( 0, "警告", "请先选择一张表" );
|
||||
N_MessageBox::warning( 0, "警告", "请先选择一张表" );
|
||||
return;
|
||||
}
|
||||
int nIndex = pItem->data( Qt::UserRole ).toInt();
|
||||
@ -693,7 +739,7 @@ void CDbStudio::slotColumnMoveDown( bool )
|
||||
int nCurrentRow = ui->tableView_columnMode->currentIndex().row();
|
||||
if ( nCurrentRow < 0 )
|
||||
{
|
||||
QMessageBox::warning( 0, "警告", "请先选择要上移的列" );
|
||||
N_MessageBox::warning( 0, "警告", "请先选择要上移的列" );
|
||||
return;
|
||||
}
|
||||
else if ( nCurrentRow >= m_pColumnModeModel->rowCount()-1 )
|
||||
@ -722,12 +768,12 @@ bool CDbStudio::slotSave( bool )
|
||||
STable* pTable = m_listTable.at(nTableIndex);
|
||||
if ( pTable->sName == "" )
|
||||
{
|
||||
QMessageBox::critical( 0, "错误", QString("存在空名字的表") );
|
||||
N_MessageBox::critical( 0, "错误", QString("存在空名字的表") );
|
||||
return false;
|
||||
}
|
||||
else if ( listTableName.contains(pTable->sName.toLower()) )
|
||||
{
|
||||
QMessageBox::critical( 0, "错误", QString("存在同名字的表【%1】").arg(pTable->sName) );
|
||||
N_MessageBox::critical( 0, "错误", QString("存在同名字的表【%1】").arg(pTable->sName) );
|
||||
return false;
|
||||
}
|
||||
listTableName.append( pTable->sName.toLower() );
|
||||
@ -738,12 +784,12 @@ bool CDbStudio::slotSave( bool )
|
||||
SColumn* pColumn = pTable->listColumn.at(nColumnIndex);
|
||||
if ( pColumn->sName == "" )
|
||||
{
|
||||
QMessageBox::critical( 0, "错误", QString("表【%1】存在空名字的列").arg(pTable->sName) );
|
||||
N_MessageBox::critical( 0, "错误", QString("表【%1】存在空名字的列").arg(pTable->sName) );
|
||||
return false;
|
||||
}
|
||||
else if ( listColumnName.contains(pColumn->sName.toLower()) )
|
||||
{
|
||||
QMessageBox::critical( 0, "错误", QString("表【%1】存在同名字的列【%2】").arg(pTable->sName).arg(pColumn->sName) );
|
||||
N_MessageBox::critical( 0, "错误", QString("表【%1】存在同名字的列【%2】").arg(pTable->sName).arg(pColumn->sName) );
|
||||
return false;
|
||||
}
|
||||
listColumnName.append( pColumn->sName.toLower() );
|
||||
@ -771,12 +817,12 @@ bool CDbStudio::slotSave( bool )
|
||||
QFile oFile( m_sFilePath );
|
||||
if ( !oFile.exists() )
|
||||
{
|
||||
QMessageBox::critical( 0, "错误", QString("配置文件【%1】不存在,保存失败").arg(m_sFilePath) );
|
||||
N_MessageBox::critical( 0, "错误", QString("配置文件【%1】不存在,保存失败").arg(m_sFilePath) );
|
||||
return false;
|
||||
}
|
||||
if ( !oFile.open(QIODevice::WriteOnly | QIODevice::Text) )
|
||||
{
|
||||
QMessageBox::critical( 0, "错误", QString("配置文件【%1】打开失败,保存失败").arg(m_sFilePath) );
|
||||
N_MessageBox::critical( 0, "错误", QString("配置文件【%1】打开失败,保存失败").arg(m_sFilePath) );
|
||||
return false;
|
||||
}
|
||||
QXmlStreamWriter writer(&oFile);
|
||||
@ -812,7 +858,6 @@ bool CDbStudio::slotSave( bool )
|
||||
writer.writeAttribute( "subsystem_flag" , QString::number(pTable->nSubsystemFlag) );
|
||||
writer.writeAttribute( "select_by_location" , pTable->sSelectByLocation );
|
||||
writer.writeAttribute( "select_by_subsystem" , pTable->sSelectBySubsystem );
|
||||
writer.writeAttribute( "cache" , pTable->sCache );
|
||||
writer.writeEndElement();
|
||||
}
|
||||
|
||||
@ -905,7 +950,6 @@ bool CDbStudio::slotSave( bool )
|
||||
writer.writeAttribute( "default_value" , pColumn->sDefaultValue_rdb );
|
||||
writer.writeAttribute( "is_syn_to_slave" , pColumn->sIsSynToSlave );
|
||||
writer.writeAttribute( "is_update_to_rdb" , pColumn->sIsUpdateToRdb );
|
||||
writer.writeAttribute( "cache" , pColumn->sCache );
|
||||
writer.writeEndElement();
|
||||
}
|
||||
|
||||
@ -916,7 +960,7 @@ bool CDbStudio::slotSave( bool )
|
||||
writer.writeEndElement();
|
||||
writer.writeEndDocument();
|
||||
oFile.close();
|
||||
QMessageBox::information(0,"提示",QString("保存配置文件【%1】成功").arg(m_sFilePath));
|
||||
N_MessageBox::information(0,"提示",QString("保存配置文件【%1】成功").arg(m_sFilePath));
|
||||
configSaved();
|
||||
|
||||
return true;
|
||||
@ -931,32 +975,3 @@ void CDbStudio::slotDataChanged()
|
||||
{
|
||||
configChanged();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -22,12 +22,13 @@
|
||||
#include "CColumnModeModel.h"
|
||||
#include "CColumnModeDelegate.h"
|
||||
#include "StructDefine.h"
|
||||
#include "pub_widget/CustomMainWindow.h"
|
||||
|
||||
namespace Ui {
|
||||
class CDbStudio;
|
||||
}
|
||||
|
||||
class CDbStudio : public QMainWindow
|
||||
class CDbStudio : public CustomUiMainWindow
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
@ -37,7 +38,7 @@ public:
|
||||
|
||||
public:
|
||||
void initUi();
|
||||
bool loadConfig();
|
||||
bool loadConfig(int nMenuIndex);
|
||||
|
||||
void initTableModeUi();
|
||||
void initColumnModeUi();
|
||||
@ -65,6 +66,11 @@ public slots:
|
||||
void slotTableNameChanged();
|
||||
void slotDataChanged();
|
||||
|
||||
void slotMainMenuClicked(int nIndex);
|
||||
|
||||
private:
|
||||
void initMainMenu();
|
||||
void clearTableInfo();
|
||||
private:
|
||||
Ui::CDbStudio *ui;
|
||||
QString m_sComment; // 配置文件的注释
|
||||
@ -76,6 +82,7 @@ private:
|
||||
QList<SSubsystem*> m_listSubsystem; // 专业信息
|
||||
bool m_bSaved; // 是否保存过
|
||||
QString m_sFilePath; // 当前编辑的文件,带路径
|
||||
QString m_strCurTitle; //< 当前标题
|
||||
};
|
||||
|
||||
#endif // CDBSTUDIO_H
|
||||
|
||||
@ -14,7 +14,13 @@
|
||||
<string>CDbStudio</string>
|
||||
</property>
|
||||
<widget class="QWidget" name="centralWidget">
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="MenuFrame" name="mainMenu" native="true"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QTabWidget" name="tabWidget">
|
||||
<property name="currentIndex">
|
||||
@ -174,7 +180,7 @@
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>1030</width>
|
||||
<height>25</height>
|
||||
<height>23</height>
|
||||
</rect>
|
||||
</property>
|
||||
</widget>
|
||||
@ -189,6 +195,14 @@
|
||||
<widget class="QStatusBar" name="statusBar"/>
|
||||
</widget>
|
||||
<layoutdefault spacing="6" margin="11"/>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>MenuFrame</class>
|
||||
<extends>QWidget</extends>
|
||||
<header>pub_widget/MenuFrame.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<tabstops>
|
||||
<tabstop>tabWidget</tabstop>
|
||||
<tabstop>tableView_tableMode</tabstop>
|
||||
|
||||
@ -3,13 +3,23 @@
|
||||
#include "ui_CFileSelect.h"
|
||||
#include "StructDefine.h"
|
||||
|
||||
CFileSelect::CFileSelect(QWidget *parent) :
|
||||
QDialog(parent),
|
||||
CFileSelect::CFileSelect(int nMenuIndex,QWidget *parent) :
|
||||
CustomUiDialog(parent),
|
||||
ui(new Ui::CFileSelect)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
init();
|
||||
switch (nMenuIndex) {
|
||||
case CN_MainMenu_Platform:
|
||||
slotPlatformClicked();
|
||||
break;
|
||||
case CN_MainMenu_Product:
|
||||
slotProductClicked();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
CFileSelect::~CFileSelect()
|
||||
@ -19,6 +29,7 @@ CFileSelect::~CFileSelect()
|
||||
|
||||
void CFileSelect::init()
|
||||
{
|
||||
CustomUiDialog::setAutoLayout(true);
|
||||
this->setWindowTitle( tr("文件选择") );
|
||||
m_sFilePath = "";
|
||||
m_sDesc = "";
|
||||
|
||||
@ -1,18 +1,21 @@
|
||||
#ifndef CFILESELECT_H
|
||||
#define CFILESELECT_H
|
||||
|
||||
#include <QDialog>
|
||||
#include "pub_widget/CustomDialog.h"
|
||||
|
||||
const int CN_MainMenu_Platform = 0;
|
||||
const int CN_MainMenu_Product = 1;
|
||||
|
||||
namespace Ui {
|
||||
class CFileSelect;
|
||||
}
|
||||
|
||||
class CFileSelect : public QDialog
|
||||
class CFileSelect : public CustomUiDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit CFileSelect(QWidget *parent = 0);
|
||||
explicit CFileSelect(int nMenuIndex,QWidget *parent = 0);
|
||||
~CFileSelect();
|
||||
|
||||
public:
|
||||
|
||||
@ -2,10 +2,12 @@
|
||||
#include <QPushButton>
|
||||
|
||||
CSubsystem::CSubsystem( QWidget* pParent, QList<SSubsystem*>* pListSubsystem )
|
||||
:QDialog(pParent)
|
||||
:CustomDialog(pParent)
|
||||
{
|
||||
this->setParent( pParent );
|
||||
this->setWindowTitle( "专业选择" );
|
||||
this->setWindowTitle( tr("专业选择") );
|
||||
this->setMinimumWidth(200);
|
||||
|
||||
m_bAccepted = false;
|
||||
|
||||
m_pListSubsystem = pListSubsystem;
|
||||
@ -64,13 +66,13 @@ bool CSubsystem::isAccepted()
|
||||
void CSubsystem::slotOk()
|
||||
{
|
||||
m_bAccepted = true;
|
||||
QDialog::accept();
|
||||
CustomDialog::accept();
|
||||
}
|
||||
|
||||
void CSubsystem::slotCancel()
|
||||
{
|
||||
m_bAccepted = false;
|
||||
QDialog::reject();
|
||||
CustomDialog::reject();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -1,14 +1,14 @@
|
||||
#ifndef CSUBSYSTEM_H
|
||||
#define CSUBSYSTEM_H
|
||||
|
||||
#include <QDialog>
|
||||
#include <QCheckBox>
|
||||
#include <QVBoxLayout>
|
||||
#include <QDialogButtonBox>
|
||||
#include <QDebug>
|
||||
#include "StructDefine.h"
|
||||
#include "pub_widget/CustomDialog.h"
|
||||
|
||||
class CSubsystem : public QDialog
|
||||
class CSubsystem : public CustomDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
|
||||
@ -16,6 +16,7 @@ QWidget* CTableModeDelegate::createEditor( QWidget *parent, const QStyleOptionVi
|
||||
if ( nCol == 4 )
|
||||
{
|
||||
QComboBox *pComboBox = new QComboBox(parent);
|
||||
pComboBox->addItem("");
|
||||
pComboBox->addItem("db+rdb");
|
||||
pComboBox->addItem("db");
|
||||
pComboBox->addItem("rdb");
|
||||
@ -24,6 +25,7 @@ QWidget* CTableModeDelegate::createEditor( QWidget *parent, const QStyleOptionVi
|
||||
else if ( nCol == 5)
|
||||
{
|
||||
QComboBox *pComboBox = new QComboBox(parent);
|
||||
pComboBox->addItem("");
|
||||
pComboBox->addItem("param");
|
||||
pComboBox->addItem("his");
|
||||
pComboBox->addItem("temp");
|
||||
@ -40,9 +42,10 @@ QWidget* CTableModeDelegate::createEditor( QWidget *parent, const QStyleOptionVi
|
||||
CSubsystem* pSubsystem = new CSubsystem( parent, m_pListSubsystem );
|
||||
return pSubsystem;
|
||||
}
|
||||
else if ( nCol == 6 || nCol == 9 || nCol == 10 || nCol == 11 )
|
||||
else if ( nCol == 6 || nCol == 9 || nCol == 10 )
|
||||
{
|
||||
QComboBox *pComboBox = new QComboBox(parent);
|
||||
pComboBox->addItem("");
|
||||
pComboBox->addItem("yes");
|
||||
pComboBox->addItem("no");
|
||||
return pComboBox;
|
||||
@ -65,7 +68,7 @@ void CTableModeDelegate::setEditorData( QWidget *editor, const QModelIndex &inde
|
||||
CSubsystem* pSubsystem = static_cast<CSubsystem*>(editor);
|
||||
pSubsystem->setSubsystemId( nValue );
|
||||
}
|
||||
else if ( nCol == 4 || nCol == 5 || nCol == 6 || nCol == 9 || nCol == 10 || nCol == 11 )
|
||||
else if ( nCol == 4 || nCol == 5 || nCol == 6 || nCol == 9 || nCol == 10 )
|
||||
{
|
||||
QString text = index.model()->data(index).toString();
|
||||
QComboBox* pComboBox = static_cast<QComboBox*>(editor);
|
||||
@ -88,7 +91,7 @@ void CTableModeDelegate::setModelData( QWidget *editor, QAbstractItemModel *mode
|
||||
if ( pSubsystem->isAccepted() )
|
||||
model->setData(index, pSubsystem->getSubsystemId());
|
||||
}
|
||||
else if ( nCol == 4 || nCol == 5 || nCol == 6 || nCol == 9 || nCol == 10 || nCol == 11 )
|
||||
else if ( nCol == 4 || nCol == 5 || nCol == 6 || nCol == 9 || nCol == 10 )
|
||||
{
|
||||
QComboBox* pComboBox = static_cast<QComboBox*>(editor);
|
||||
QString text = pComboBox->currentText();
|
||||
|
||||
@ -16,9 +16,8 @@ CTableModeModel::CTableModeModel()
|
||||
|
||||
<< "最大行数"
|
||||
<< "专业标志"
|
||||
<< "是否区分车站"
|
||||
<< "是否区分专业"
|
||||
<< "内存库持久化";
|
||||
<< "是否区分位置"
|
||||
<< "是否区分专业";
|
||||
}
|
||||
|
||||
CTableModeModel::~CTableModeModel()
|
||||
@ -103,9 +102,6 @@ QVariant CTableModeModel::data( const QModelIndex &index, int role ) const
|
||||
case 10:
|
||||
oVal = m_pListTable->at(index.row())->sSelectBySubsystem;
|
||||
break;
|
||||
case 11:
|
||||
oVal = m_pListTable->at(index.row())->sCache;
|
||||
break;
|
||||
}
|
||||
return oVal;
|
||||
}
|
||||
@ -203,13 +199,6 @@ bool CTableModeModel::setData( const QModelIndex &index, const QVariant &value,
|
||||
emit signalDataChanged();
|
||||
}
|
||||
break;
|
||||
case 11:
|
||||
if ( m_pListTable->at(index.row())->sCache != value.toString() )
|
||||
{
|
||||
m_pListTable->at(index.row())->sCache = value.toString();
|
||||
emit signalDataChanged();
|
||||
}
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -35,7 +35,6 @@ struct SColumn
|
||||
QString sDefaultValue_rdb; // 默认值
|
||||
QString sIsSynToSlave; // 是否需要同步到备内存库 yes\no(是,否)
|
||||
QString sIsUpdateToRdb; // 关系库的变化是否更新到内存库 yes\no(是,否)
|
||||
QString sCache; // 是否持久化 yes\no
|
||||
|
||||
SColumn()
|
||||
{
|
||||
@ -65,7 +64,6 @@ struct SColumn
|
||||
sDefaultValue_rdb = "";
|
||||
sIsSynToSlave = "";
|
||||
sIsUpdateToRdb = "";
|
||||
sCache = "";
|
||||
}
|
||||
};
|
||||
|
||||
@ -88,7 +86,6 @@ struct STable
|
||||
quint64 nSubsystemFlag; // 专业标志
|
||||
QString sSelectByLocation; // 是否区分车站 yes\no
|
||||
QString sSelectBySubsystem; // 是否区分专业 yes\no
|
||||
QString sCache; // 是否持久化 yes\no
|
||||
|
||||
// 列
|
||||
QList<SColumn*> listColumn; // 所有列集合
|
||||
@ -110,7 +107,17 @@ struct STable
|
||||
nSubsystemFlag = 0;
|
||||
sSelectByLocation = "";
|
||||
sSelectBySubsystem = "";
|
||||
sCache = "";
|
||||
}
|
||||
|
||||
~STable()
|
||||
{
|
||||
foreach (SColumn *pCol, listColumn) {
|
||||
delete pCol;
|
||||
}
|
||||
listColumn.clear();
|
||||
|
||||
listColumn_db.clear(); //< listColumn_db都在listColumn中
|
||||
listColumn_rdb.clear(); //< listColumn_rdb都在listColumn中
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@ -21,7 +21,7 @@ DEFINES += QT_DEPRECATED_WARNINGS
|
||||
# In order to do so, uncomment the following line.
|
||||
# You can also select to disable deprecated APIs only up to a certain version of Qt.
|
||||
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
|
||||
|
||||
RC_ICONS = icons/db_studio.ico
|
||||
|
||||
SOURCES += \
|
||||
main.cpp \
|
||||
@ -47,8 +47,7 @@ FORMS += \
|
||||
CDbStudio.ui \
|
||||
CFileSelect.ui
|
||||
|
||||
LIBS += \
|
||||
-lpub_sysinfo_api \
|
||||
LIBS += -lpub_sysinfo_api -lpub_widget -lpub_utility_api
|
||||
|
||||
!include( ../../common.pri ){
|
||||
error(the file common.pri is not exist!!)
|
||||
|
||||
@ -2,12 +2,43 @@
|
||||
#include <QApplication>
|
||||
#include "common/QtAppGlobalSet.h"
|
||||
#include "CDbStudio.h"
|
||||
#include "pub_utility_api/FileStyle.h"
|
||||
#include "pub_widget/PubWidgetInit.h"
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
iot_common::doQtAppGlobalSet();
|
||||
|
||||
QApplication a(argc, argv);
|
||||
QString qss = QString();
|
||||
std::string strFullPath = iot_public::CFileStyle::getPathOfStyleFile("public.qss","zh","light");
|
||||
|
||||
QFile qssfile1(QString::fromStdString(strFullPath));
|
||||
qssfile1.open(QFile::ReadOnly);
|
||||
if (qssfile1.isOpen())
|
||||
{
|
||||
qss += QLatin1String(qssfile1.readAll());
|
||||
qssfile1.close();
|
||||
}
|
||||
|
||||
strFullPath = iot_public::CFileStyle::getPathOfStyleFile("db_studio.qss","zh","light");
|
||||
QFile qssfile2(QString::fromStdString(strFullPath));
|
||||
qssfile2.open(QFile::ReadOnly);
|
||||
if (qssfile2.isOpen())
|
||||
{
|
||||
qss += QLatin1String(qssfile2.readAll());
|
||||
qssfile2.close();
|
||||
}
|
||||
|
||||
if (!qss.isEmpty())
|
||||
{
|
||||
qApp->setStyleSheet(qss);
|
||||
}
|
||||
|
||||
iot_public::installTranslator("zh");
|
||||
|
||||
// qApp->setFont(QFont("Microsoft YaHei",10));
|
||||
|
||||
CDbStudio w;
|
||||
w.show();
|
||||
|
||||
|
||||
@ -10,7 +10,20 @@
|
||||
#include "boost/lexical_cast.hpp"
|
||||
#include "boost/format.hpp"
|
||||
#include "boost/asio/ip/host_name.hpp"
|
||||
#include "boost/algorithm/string/predicate.hpp"
|
||||
|
||||
//< 屏蔽xml_parser编译告警
|
||||
#ifdef __GNUC__
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wdeprecated-copy"
|
||||
#endif
|
||||
|
||||
#include "boost/property_tree/xml_parser.hpp"
|
||||
|
||||
#ifdef __GNUC__
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
|
||||
#include "pub_utility_api/FileUtil.h"
|
||||
#include <algorithm>
|
||||
#include <bitset>
|
||||
@ -114,7 +127,7 @@ int CDbSysInfo::getAppIdByTableName( const std::string& strAppName, const std::s
|
||||
for (BOOST_AUTO(itTable, table.begin()); itTable!=table.end(); itTable++)
|
||||
{
|
||||
std::string sUseType = itTable->second.get<std::string>("<xmlattr>.use_type");
|
||||
if ("Table" != itTable->first || sUseType == "db")
|
||||
if ("Table" != itTable->first || !boost::contains(sUseType,"rdb"))
|
||||
continue;
|
||||
BOOST_AUTO(rdb, itTable->second.get_child("Rdb"));
|
||||
if ( rdb.size() <= 0 )
|
||||
@ -150,7 +163,7 @@ int CDbSysInfo::getAppIdByTableName( const std::string& strAppName, const std::s
|
||||
for (BOOST_AUTO(itTable, table.begin()); itTable!=table.end(); itTable++)
|
||||
{
|
||||
std::string sUseType = itTable->second.get<std::string>("<xmlattr>.use_type");
|
||||
if ("Table" != itTable->first || sUseType == "db")
|
||||
if ("Table" != itTable->first || !boost::contains(sUseType,"rdb") )
|
||||
continue;
|
||||
BOOST_AUTO(rdb, itTable->second.get_child("Rdb"));
|
||||
if ( rdb.size() <= 0 )
|
||||
@ -278,9 +291,8 @@ bool CDbSysInfo::getAllRdbTableNameBySubsystemId( const int nSubsystemId, std::v
|
||||
BOOST_AUTO(table, pt.get_child("DatabaseStruct"));
|
||||
for (BOOST_AUTO(itTable, table.begin()); itTable!=table.end(); itTable++)
|
||||
{
|
||||
if ("Table" != itTable->first )
|
||||
continue;
|
||||
if ( itTable->second.get<std::string>("<xmlattr>.use_type") == "db" )
|
||||
std::string strUseType = itTable->second.get<std::string>("<xmlattr>.use_type");
|
||||
if ("Table" != itTable->first || !boost::contains(strUseType,"rdb") )
|
||||
continue;
|
||||
BOOST_AUTO(rdb, itTable->second.get_child(""));
|
||||
for (BOOST_AUTO(itRdb, rdb.begin()); itRdb!=rdb.end(); itRdb++)
|
||||
@ -306,9 +318,8 @@ bool CDbSysInfo::getAllRdbTableNameBySubsystemId( const int nSubsystemId, std::v
|
||||
BOOST_AUTO(table, pt.get_child("DatabaseStruct"));
|
||||
for (BOOST_AUTO(itTable, table.begin()); itTable!=table.end(); itTable++)
|
||||
{
|
||||
if ("Table" != itTable->first )
|
||||
continue;
|
||||
if ( itTable->second.get<std::string>("<xmlattr>.use_type") == "db" )
|
||||
std::string strUseType = itTable->second.get<std::string>("<xmlattr>.use_type");
|
||||
if ("Table" != itTable->first || !boost::contains(strUseType,"rdb") )
|
||||
continue;
|
||||
BOOST_AUTO(rdb, itTable->second.get_child(""));
|
||||
for (BOOST_AUTO(itRdb, rdb.begin()); itRdb!=rdb.end(); itRdb++)
|
||||
@ -352,9 +363,8 @@ bool CDbSysInfo::getAllRdbColumnNameByTableName( const std::string sTableName, s
|
||||
BOOST_AUTO(table, pt.get_child("DatabaseStruct"));
|
||||
for (BOOST_AUTO(itTable, table.begin()); itTable!=table.end(); itTable++)
|
||||
{
|
||||
if ("Table" != itTable->first )
|
||||
continue;
|
||||
if ( itTable->second.get<std::string>("<xmlattr>.use_type") == "db" )
|
||||
std::string strUseType = itTable->second.get<std::string>("<xmlattr>.use_type");
|
||||
if ("Table" != itTable->first || !boost::contains(strUseType,"rdb") )
|
||||
continue;
|
||||
std::vector<SColumnModeInfo> tmpVecColumn;
|
||||
BOOST_AUTO(column, itTable->second.get_child(""));
|
||||
@ -389,9 +399,8 @@ bool CDbSysInfo::getAllRdbColumnNameByTableName( const std::string sTableName, s
|
||||
BOOST_AUTO(table, pt.get_child("DatabaseStruct"));
|
||||
for (BOOST_AUTO(itTable, table.begin()); itTable!=table.end(); itTable++)
|
||||
{
|
||||
if ("Table" != itTable->first )
|
||||
continue;
|
||||
if ( itTable->second.get<std::string>("<xmlattr>.use_type") == "db" )
|
||||
std::string strUseType = itTable->second.get<std::string>("<xmlattr>.use_type");
|
||||
if ("Table" != itTable->first || !boost::contains(strUseType,"rdb") )
|
||||
continue;
|
||||
std::vector<SColumnModeInfo> tmpVecColumn;
|
||||
BOOST_AUTO(column, itTable->second.get_child(""));
|
||||
@ -451,7 +460,7 @@ bool CDbSysInfo::getTableModeByTableName( const std::string& strTableName ,STab
|
||||
for (BOOST_AUTO(itTable, table.begin()); itTable!=table.end(); itTable++)
|
||||
{
|
||||
std::string sUseType = itTable->second.get<std::string>("<xmlattr>.use_type");
|
||||
if ("Table" != itTable->first || sUseType == "rdb") continue; //过滤非关系库表
|
||||
if ("Table" != itTable->first || sUseType == "rdb" || sUseType.empty()) continue; //过滤非关系库表
|
||||
|
||||
STableModeInfo stTableInfo;
|
||||
stTableInfo.strName = itTable->second.get<std::string>("<xmlattr>.name");
|
||||
@ -501,7 +510,7 @@ bool CDbSysInfo::getTableModeByTableName( const std::string& strTableName ,STab
|
||||
for (BOOST_AUTO(itTable, table.begin()); itTable!=table.end(); itTable++)
|
||||
{
|
||||
std::string sUseType = itTable->second.get<std::string>("<xmlattr>.use_type");
|
||||
if ("Table" != itTable->first || sUseType == "rdb") continue; //过滤非关系库表
|
||||
if ("Table" != itTable->first || sUseType == "rdb" || sUseType.empty()) continue; //过滤非关系库表
|
||||
|
||||
STableModeInfo stTableInfo;
|
||||
stTableInfo.strName = itTable->second.get<std::string>("<xmlattr>.name");
|
||||
@ -571,9 +580,8 @@ bool CDbSysInfo::getSubsystemFlagByTableName( const std::string sTableName, uint
|
||||
BOOST_AUTO(table, pt.get_child("DatabaseStruct"));
|
||||
for (BOOST_AUTO(itTable, table.begin()); itTable!=table.end(); itTable++)
|
||||
{
|
||||
if ("Table" != itTable->first )
|
||||
continue;
|
||||
if ( itTable->second.get<std::string>("<xmlattr>.use_type") == "db" )
|
||||
std::string strUseType = itTable->second.get<std::string>("<xmlattr>.use_type");
|
||||
if ("Table" != itTable->first || !boost::contains(strUseType,"rdb") )
|
||||
continue;
|
||||
BOOST_AUTO(rdb, itTable->second.get_child(""));
|
||||
for (BOOST_AUTO(itRdb, rdb.begin()); itRdb!=rdb.end(); itRdb++)
|
||||
@ -599,9 +607,8 @@ bool CDbSysInfo::getSubsystemFlagByTableName( const std::string sTableName, uint
|
||||
BOOST_AUTO(table, pt.get_child("DatabaseStruct"));
|
||||
for (BOOST_AUTO(itTable, table.begin()); itTable!=table.end(); itTable++)
|
||||
{
|
||||
if ("Table" != itTable->first )
|
||||
continue;
|
||||
if ( itTable->second.get<std::string>("<xmlattr>.use_type") == "db" )
|
||||
std::string strUseType = itTable->second.get<std::string>("<xmlattr>.use_type");
|
||||
if ("Table" != itTable->first || !boost::contains(strUseType,"rdb") )
|
||||
continue;
|
||||
BOOST_AUTO(rdb, itTable->second.get_child(""));
|
||||
for (BOOST_AUTO(itRdb, rdb.begin()); itRdb!=rdb.end(); itRdb++)
|
||||
|
||||
@ -15,6 +15,8 @@ SUBDIRS += \
|
||||
tsdb_save_api \
|
||||
tsdb_api\
|
||||
tsdb_save \
|
||||
tsdb_local_save \
|
||||
tsdb_etl \
|
||||
db_his_query_api\
|
||||
db_his_mng_api \
|
||||
db_manager_api \
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
#include "CBptree.h"
|
||||
#include "RdbFunc.h"
|
||||
#include "pub_logger_api/logger.h"
|
||||
#include "boost/concept_check.hpp"
|
||||
|
||||
using namespace iot_dbms;
|
||||
|
||||
@ -39,7 +40,9 @@ int CBptree::find( const char* const pKey )
|
||||
|
||||
int CBptree::remove( const char* const pKey )
|
||||
{
|
||||
char* p = (char*)pKey;
|
||||
boost::ignore_unused_variable_warning(pKey);
|
||||
|
||||
//char* p = (char*)pKey;
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
@ -1,373 +0,0 @@
|
||||
#include "CRdbCache.h"
|
||||
#include "pub_utility_api/FileUtil.h"
|
||||
#include "pub_logger_api/logger.h"
|
||||
#include "pub_sysinfo_api/SysInfoApi.h"
|
||||
#include "CRdbDictionary.h"
|
||||
#include "CRdbLocalTable.h"
|
||||
#include "RdbServerMessage.pb.h"
|
||||
#include "rdb_api/FuncForNet.h"
|
||||
#include "rdb_api/CRdbAccessEx.h"
|
||||
#include "db_sysinfo_api/CDbSysInfo.h"
|
||||
|
||||
#define CN_RDBCACHE "RdbCache" // 缓存文件内容中预留的字符串
|
||||
#define CN_MAXROWOFONEFILE 100000 // 单个缓存文件容纳的最多行数
|
||||
#define CN_VERSIONFILE "rdb_cache_version.md5" // 内存库缓存版本
|
||||
|
||||
using namespace iot_public;
|
||||
using namespace iot_dbms;
|
||||
using namespace iot_idl;
|
||||
|
||||
CRdbCache::CRdbCache( QString sAppName )
|
||||
{
|
||||
m_sAppName = sAppName;
|
||||
}
|
||||
|
||||
CRdbCache::~CRdbCache()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
bool CRdbCache::save()
|
||||
{
|
||||
// 创建/清空缓存目录
|
||||
QString sPath = QString("%1/../../data/cache/rdb_server/%2").arg(CFileUtil::getCurModuleDir().c_str()).arg(m_sAppName);
|
||||
QDir objDir(sPath);
|
||||
sPath = objDir.absolutePath();
|
||||
if ( !objDir.exists() )// 不存在就创建
|
||||
{
|
||||
LOGINFO("缓存目录不存在,现在创建【%s】",sPath.toStdString().c_str());
|
||||
if ( !objDir.mkpath(sPath) )
|
||||
{
|
||||
LOGERROR("创建缓存目录失败【%s】",sPath.toStdString().c_str());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else// 存在就清空
|
||||
{
|
||||
// 清空会导致后续打开文件失败,暂时屏蔽
|
||||
//objDir.removeRecursively();
|
||||
|
||||
// 遍历删除文件
|
||||
QFileInfoList listFile = objDir.entryInfoList();
|
||||
for ( int i=0; i<listFile.size(); i++ )
|
||||
{
|
||||
if ( listFile.at(i).isDir() )
|
||||
continue;
|
||||
QFile objFile(listFile.at(i).absoluteFilePath());
|
||||
objFile.remove();
|
||||
}
|
||||
LOGINFO("清空缓存目录【%s】",sPath.toStdString().c_str());
|
||||
}
|
||||
|
||||
// 获取应用id
|
||||
int nAppId = CDbSysInfo::getAppIdByAppName( m_sAppName.toStdString() );
|
||||
if ( nAppId < 0 )
|
||||
{
|
||||
LOGERROR("获取应用Id失败");
|
||||
return false;
|
||||
}
|
||||
|
||||
// 写缓存文件
|
||||
CRdbDictionary objDict(nAppId);
|
||||
for ( int nTableIndex=0; nTableIndex<objDict.GetTableNums(); nTableIndex++ )
|
||||
{
|
||||
SRdbTableAttribute* pRdbTable = objDict.GetTableStruct(nTableIndex);
|
||||
SRdbColumnAttribute* pRdbColumn = objDict.GetColumnStruct(pRdbTable->nStartColumnNo);
|
||||
|
||||
// 获取指针异常
|
||||
if ( pRdbTable == NULL || pRdbColumn == NULL )
|
||||
{
|
||||
LOGERROR("获取指针异常");
|
||||
continue;
|
||||
}
|
||||
|
||||
// 未设置表持久化
|
||||
if ( pRdbTable->nCache != 1 )
|
||||
continue;
|
||||
|
||||
// 表没有主键
|
||||
if ( pRdbTable->nKeyFlag != 1 )
|
||||
{
|
||||
LOGERROR("表没有主键,不执行持久化【%s】",pRdbTable->strName);
|
||||
continue;
|
||||
}
|
||||
|
||||
// 查询当前表所有非主键且配置了持久化的列
|
||||
std::vector<SRdbColumnAttribute*> vecColumn;
|
||||
for ( int i=0; i<pRdbTable->nColumnCount; i++ )
|
||||
{
|
||||
if ( !pRdbColumn[i].bIsKey && pRdbColumn[i].bCache )
|
||||
{
|
||||
vecColumn.push_back( &pRdbColumn[i] );
|
||||
}
|
||||
}
|
||||
|
||||
// 没有配置持久化的列
|
||||
if ( vecColumn.size() <= 0 )
|
||||
continue;
|
||||
|
||||
// 打开内存表
|
||||
CRdbLocalTable objTable(nAppId);
|
||||
int nRet = objTable.OpenTable(pRdbTable->strName);
|
||||
if ( nRet != 0 )
|
||||
{
|
||||
LOGERROR("打开内存表失败【%s】",pRdbTable->strName);
|
||||
continue;
|
||||
}
|
||||
|
||||
// 读取内存表数据
|
||||
int nFileIndex = 0; // 缓存文件序号
|
||||
RdbReplace objReplace;
|
||||
objReplace.set_strsessionid(CN_RDBCACHE);
|
||||
objReplace.set_strtablename(pRdbTable->strName);
|
||||
objTable.LockTable();
|
||||
for ( int nRowIndex=0; nRowIndex<objTable.getRecordCount(); nRowIndex++ )
|
||||
{
|
||||
// 获取行地址
|
||||
char* data = 0;
|
||||
if ( !objTable.getDataAddr(nRowIndex,(const void**)&data) )
|
||||
{
|
||||
LOGERROR("获取行地址失败【%s】",pRdbTable->strName);
|
||||
break;
|
||||
}
|
||||
|
||||
// 拷贝主键
|
||||
RdbSynUpdate* pUpdate = objReplace.add_msgupdate();
|
||||
pUpdate->set_strkeys( data, pRdbTable->nKeyRecLen );
|
||||
|
||||
// 拷贝列值
|
||||
size_t i = 0;
|
||||
CVarType objValue;
|
||||
while ( i < vecColumn.size() )
|
||||
{
|
||||
RdbUpdateValue* pUpdVal = pUpdate->add_msgupdatevalue();
|
||||
pUpdVal->set_strcolumnname( vecColumn[i]->strName );
|
||||
SVariable* pVal = pUpdVal->mutable_msgvalue();
|
||||
objTable.GetColumnValue( nRowIndex, objTable.GetColumnNo(vecColumn[i]->strName), objValue );
|
||||
Vartype2SVarivale( objValue, *pVal );
|
||||
i++;
|
||||
}
|
||||
|
||||
// 适时写入文件,防止文件过大
|
||||
if ( (nRowIndex==objTable.getRecordCount()-1) || (nRowIndex!=0&&nRowIndex%CN_MAXROWOFONEFILE==0) )
|
||||
{
|
||||
// 打开缓存文件
|
||||
QString sFilePath = sPath+"/"+pRdbTable->strName+"."+QString::number(nFileIndex);
|
||||
QFile objFile(sFilePath);
|
||||
if ( !objFile.open(QIODevice::WriteOnly) )
|
||||
{
|
||||
LOGERROR("打开缓存文件失败【%s】", sFilePath.toStdString().c_str());
|
||||
break;
|
||||
}
|
||||
// 写入文件
|
||||
QDataStream objStream(&objFile);
|
||||
std::string sData = objReplace.SerializeAsString();
|
||||
objStream.writeRawData( sData.c_str(), sData.size() );
|
||||
objFile.close();
|
||||
// 清理RdbReplace中的数据
|
||||
objReplace.clear_msgupdate();
|
||||
// 文件序号加1
|
||||
nFileIndex++;
|
||||
}
|
||||
}
|
||||
objTable.UnlockTable();
|
||||
}
|
||||
|
||||
// 写版本文件
|
||||
QString sCacheVersion = getCacheVersion();
|
||||
if ( sCacheVersion == "" )
|
||||
{
|
||||
LOGERROR("获取配置版本失败");
|
||||
return false;
|
||||
}
|
||||
QFile objFile(sPath+"/"+CN_VERSIONFILE);
|
||||
if ( !objFile.open(QIODevice::WriteOnly|QIODevice::Text) )
|
||||
{
|
||||
LOGERROR("打开文件失败【%s】",CN_VERSIONFILE);
|
||||
return false;
|
||||
}
|
||||
objFile.write(sCacheVersion.toUtf8());
|
||||
objFile.close();
|
||||
|
||||
// 返回成功
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CRdbCache::load()
|
||||
{
|
||||
// 检查缓存文件夹
|
||||
QString sPath = QString("%1/../../data/cache/rdb_server/%2").arg(CFileUtil::getCurModuleDir().c_str()).arg(m_sAppName);
|
||||
QDir objDir(sPath);
|
||||
sPath = objDir.absolutePath();
|
||||
if ( !objDir.exists() )
|
||||
{
|
||||
LOGDEBUG("缓存目录不存在,不加载缓存【%s】",sPath.toStdString().c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
// 检查缓存版本
|
||||
QFile objFile(sPath+"/"+CN_VERSIONFILE);
|
||||
if ( !objFile.open(QIODevice::ReadOnly|QIODevice::Text) )
|
||||
{
|
||||
LOGDEBUG("打开文件失败【%s】",CN_VERSIONFILE);
|
||||
return false;
|
||||
}
|
||||
QString sCacheVersion_file(objFile.readAll());
|
||||
objFile.close();
|
||||
QString sCacheVersion_current = getCacheVersion();
|
||||
if ( sCacheVersion_current != sCacheVersion_file )
|
||||
{
|
||||
LOGERROR("缓存版本不正确,不加载缓存");
|
||||
return false;
|
||||
}
|
||||
|
||||
// 获取应用id
|
||||
int nAppId = CDbSysInfo::getAppIdByAppName( m_sAppName.toStdString() );
|
||||
if ( nAppId < 0 )
|
||||
{
|
||||
LOGERROR("获取应用Id失败");
|
||||
return false;
|
||||
}
|
||||
|
||||
// 读缓存文件
|
||||
CRdbDictionary objDict( nAppId );
|
||||
for ( int nTableIndex=0; nTableIndex<objDict.GetTableNums(); nTableIndex++ )
|
||||
{
|
||||
SRdbTableAttribute* pRdbTable = objDict.GetTableStruct(nTableIndex);
|
||||
if ( pRdbTable->nCache != 1 )// 不持久化
|
||||
continue;
|
||||
if ( pRdbTable->nKeyFlag == 0 )// 没有主键
|
||||
continue;
|
||||
|
||||
int nFileIndex = 0; // 缓存文件序号
|
||||
while (true)
|
||||
{
|
||||
// 打开缓存文件
|
||||
QString sFilePath = sPath+"/"+pRdbTable->strName+"."+QString::number(nFileIndex);
|
||||
nFileIndex++;
|
||||
QFile objFile(sFilePath);
|
||||
if ( !objFile.exists() || !objFile.open(QIODevice::ReadOnly) )
|
||||
break;
|
||||
|
||||
// 读取文件内容、反序列化
|
||||
QByteArray bytData = objFile.readAll();
|
||||
RdbReplace objReplace;
|
||||
objFile.close();
|
||||
if ( !objReplace.ParseFromArray(bytData.data(),bytData.size()) )
|
||||
{
|
||||
LOGERROR("反序列化失败【%s】",sFilePath.toStdString().c_str());
|
||||
continue;
|
||||
}
|
||||
|
||||
// 判断预留字符串
|
||||
if ( objReplace.strsessionid() != CN_RDBCACHE )
|
||||
{
|
||||
LOGERROR("文件内容错误【%s】",sFilePath.toStdString().c_str());
|
||||
continue;
|
||||
}
|
||||
|
||||
// 打开内存表
|
||||
CRdbAccessEx objAccessEx;
|
||||
if ( !objAccessEx.open(nAppId,objReplace.strtablename().c_str()) )
|
||||
{
|
||||
LOGERROR( "打开内存库表失败【%s】", objReplace.strtablename().c_str() );
|
||||
continue;
|
||||
}
|
||||
|
||||
// 更新数据
|
||||
objAccessEx.lock();
|
||||
int nRecord = objReplace.msgupdate_size();
|
||||
for ( int nIndex=0; nIndex<nRecord; nIndex++ )
|
||||
{
|
||||
const RdbSynUpdate& objSynUpdate = objReplace.msgupdate(nIndex);
|
||||
if ( objSynUpdate.has_strkeys() )// 有主键,则以主键更新,不判断条件,没有主键的不处理
|
||||
{
|
||||
std::vector<RSQL_UPD_COLUMN> vecUpdColumn;
|
||||
int nUpdValue = objSynUpdate.msgupdatevalue_size();
|
||||
for ( int i=0; i<nUpdValue; i++ )
|
||||
{
|
||||
RSQL_UPD_COLUMN stUpdColumn;
|
||||
const RdbUpdateValue& refUpdVal = objSynUpdate.msgupdatevalue(i);
|
||||
strncpy( stUpdColumn.updcolname, refUpdVal.strcolumnname().c_str(), sizeof(stUpdColumn.updcolname) );
|
||||
SVariable2Vartype( refUpdVal.msgvalue(), stUpdColumn.updvalue );
|
||||
vecUpdColumn.push_back( stUpdColumn );
|
||||
}
|
||||
if ( !objAccessEx.updateRecordByKey(objSynUpdate.strkeys().c_str(),vecUpdColumn) )
|
||||
{
|
||||
LOGERROR( "更新内存库表失败【%s】", objReplace.strtablename().c_str() );
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LOGERROR("不应该执行到这里,请检查程序逻辑");
|
||||
}
|
||||
}
|
||||
objAccessEx.unLock();
|
||||
objAccessEx.close();
|
||||
}
|
||||
}
|
||||
|
||||
// 返回成功
|
||||
return true;
|
||||
}
|
||||
|
||||
QString CRdbCache::getCacheVersion()
|
||||
{
|
||||
// 判断文件是否存在
|
||||
std::string strPath = iot_public::CFileUtil::getCurModuleDir();
|
||||
QString sDbConfigFile_platform = QString("%1/../../platform/common/database/initscript/iscs6000_table_struct.xml").arg(strPath.c_str());
|
||||
QString sDbConfigFile_product = QString("%1/../../product/common/database/initscript/iscs6000_table_struct.xml").arg(strPath.c_str());
|
||||
QFileInfo objFileInfo_platform( sDbConfigFile_platform );
|
||||
QFileInfo objFileInfo_product( sDbConfigFile_product );
|
||||
if ( !objFileInfo_platform.exists() || !objFileInfo_product.exists() )
|
||||
{
|
||||
LOGERROR("文件不存在【iscs6000_table_struct.xml】");
|
||||
return "";
|
||||
}
|
||||
sDbConfigFile_platform = objFileInfo_platform.absoluteFilePath();// 获取去掉../的路径
|
||||
sDbConfigFile_product = objFileInfo_product.absoluteFilePath();// 获取去掉../的路径
|
||||
|
||||
// 读取平台配置文件
|
||||
QFile objFile0(sDbConfigFile_platform);
|
||||
if ( !objFile0.open(QFile::ReadOnly|QFile::Text) )
|
||||
{
|
||||
LOGERROR("打开平台文件失败【iscs6000_table_struct.xml】");
|
||||
return "";
|
||||
}
|
||||
QCryptographicHash objHash(QCryptographicHash::Md5);
|
||||
objHash.addData(objFile0.readAll());
|
||||
objFile0.close();
|
||||
|
||||
// 读取产品配置文件
|
||||
QFile objFile1(sDbConfigFile_product);
|
||||
if ( !objFile1.open(QFile::ReadOnly|QFile::Text) )
|
||||
{
|
||||
LOGERROR("打开产品文件失败【iscs6000_table_struct.xml】");
|
||||
return "";
|
||||
}
|
||||
objHash.addData(objFile1.readAll());
|
||||
objFile1.close();
|
||||
|
||||
// 返回结果
|
||||
return objHash.result().toHex();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -1,35 +0,0 @@
|
||||
#ifndef CRDBCACHE_H
|
||||
#define CRDBCACHE_H
|
||||
|
||||
#include <QDebug>
|
||||
#include <QString>
|
||||
#include <QDir>
|
||||
#include <QFile>
|
||||
#include <QDataStream>
|
||||
#include <QFileInfo>
|
||||
#include <QFileInfoList>
|
||||
#include <QCryptographicHash>
|
||||
|
||||
// 内存库缓存类,用于持久化
|
||||
class CRdbCache
|
||||
{
|
||||
public:
|
||||
CRdbCache( QString sAppName );
|
||||
~CRdbCache();
|
||||
|
||||
public:
|
||||
// 保存缓存,由sys_ctl调用
|
||||
bool save();
|
||||
|
||||
// 加载缓存,由rdb_server调用
|
||||
bool load();
|
||||
|
||||
private:
|
||||
// 获取缓存版本
|
||||
QString getCacheVersion();// 将平台和产品的表结构配置文件加起来算md5,作为缓存的版本
|
||||
|
||||
private:
|
||||
QString m_sAppName;// 应用名称
|
||||
};
|
||||
|
||||
#endif // CRDBCACHE_H
|
||||
@ -148,7 +148,6 @@ int CRdbLoadTableAttribute::CreateTableByConfig( QString sFile )
|
||||
strncpy( stTableMode.strParaTable, stTableMode.strName, sizeof( stTableMode.strParaTable ) );
|
||||
stTableMode.nSelectByLocation = eleTableRdb.attribute("select_by_location","no")=="yes"?1:0;
|
||||
stTableMode.nSelectBySubsystem = eleTableRdb.attribute("select_by_subsystem","no")=="yes"?1:0;
|
||||
stTableMode.nCache = eleTableRdb.attribute("cache","no")=="yes"?1:0;
|
||||
stTableMode.nLastLoadTime = 0;
|
||||
|
||||
// 表需要申请的行数大于设置的最大行数时,最大行数修改为实际行数的120%
|
||||
@ -259,7 +258,6 @@ int CRdbLoadTableAttribute::CreateTableByConfig( QString sFile )
|
||||
pColumn->bIsKey = eleColumn.attribute("is_key","no")=="yes"?true:false;
|
||||
pColumn->bNeedSyn = eleColumnRdb.attribute("is_syn_to_slave","no")=="yes"?true:false;
|
||||
pColumn->bNotUpdateRtdb = eleColumnRdb.attribute("is_update_to_rdb","no")=="yes"?false:true;
|
||||
pColumn->bCache = eleColumnRdb.attribute("cache","no")=="yes"?true:false;
|
||||
if ( pColumn->bIsKey && nTableKeyNum < RDB_KEYCOLUMN_NUMS )
|
||||
{
|
||||
strncpy( stTableMode.strArrayKeyColumnName[nTableKeyNum], pColumn->strName, RDB_COLUMN_NAME_LEN );
|
||||
@ -290,13 +288,6 @@ int CRdbLoadTableAttribute::CreateTableByConfig( QString sFile )
|
||||
LOGERROR( "创建表 [%s] 失败,失败原因:%d", stTableMode.strName, nRet );
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
// QString sXml = "";
|
||||
// QTextStream objStr(&sXml);
|
||||
// eleTable.save(objStr,4);
|
||||
// LOGERROR("%s",sXml.toStdString().c_str());
|
||||
|
||||
}
|
||||
oFile.close();
|
||||
|
||||
@ -320,6 +311,8 @@ int CRdbLoadTableAttribute::CreateTableByConfig( QString sFile )
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -53,7 +53,6 @@ int CRdbLocalManager::AddTable( SRdbTableAttribute* pRdbTableAttr, int columnnum
|
||||
pDestRtdbColumnAttr[i].bNeedSyn = pSrcRtdbColumnAttr[i].bNeedSyn;
|
||||
pDestRtdbColumnAttr[i].bIsKey = pSrcRtdbColumnAttr[i].bIsKey;
|
||||
pDestRtdbColumnAttr[i].bNotUpdateRtdb = pSrcRtdbColumnAttr[i].bNotUpdateRtdb;
|
||||
pDestRtdbColumnAttr[i].bCache = pSrcRtdbColumnAttr[i].bCache;
|
||||
// pDestRtdbColumnAttr[i].eventflag=pSrcRtdbColumnAttr[i].eventflag;
|
||||
rcol.addColumn( pDestRtdbColumnAttr[i].nDataType, pDestRtdbColumnAttr[i].nDataLen,
|
||||
pDestRtdbColumnAttr[i].nBitNums, &pDestRtdbColumnAttr[i].nOffset, &pDestRtdbColumnAttr[i].nPosition );
|
||||
|
||||
@ -15,17 +15,16 @@
|
||||
#include "CRdbConfigMan.h"
|
||||
#include "CRdbDataSegMan.h"
|
||||
#include "pub_logger_api/logger.h"
|
||||
#include "CRdbCache.h"
|
||||
|
||||
using namespace iot_public;
|
||||
using namespace iot_dbms;
|
||||
using namespace std;
|
||||
|
||||
bool iot_dbms::CRdbMngIntereface::loadAppDb( const std::string& strAppName )
|
||||
bool iot_dbms::CRdbMngIntereface::loadAppDb( const std::string& strAppname )
|
||||
{
|
||||
// 创建管理段共享内存
|
||||
CRdbServerMemMan cServerMemman;
|
||||
int nRet = cServerMemman.init(strAppName);
|
||||
int nRet = cServerMemman.init( strAppname );
|
||||
if ( 0 == nRet )
|
||||
{
|
||||
LOGINFO( "共享内存已存在" );
|
||||
@ -49,7 +48,7 @@ bool iot_dbms::CRdbMngIntereface::loadAppDb( const std::string& strAppName )
|
||||
return false;
|
||||
}
|
||||
SAppInfo stAppInfo;
|
||||
nRet = ptrSysInfo->getAppInfoByName( strAppName, stAppInfo );
|
||||
nRet = ptrSysInfo->getAppInfoByName( strAppname, stAppInfo );
|
||||
if ( iotFailed == nRet )
|
||||
{
|
||||
LOGERROR( "getAppInfoByName error" );
|
||||
@ -91,41 +90,11 @@ bool iot_dbms::CRdbMngIntereface::loadAppDb( const std::string& strAppName )
|
||||
rdbtable->m_stSynParam.bNeedSyn = bTemp;
|
||||
}
|
||||
}
|
||||
|
||||
// 加载缓存
|
||||
LOGINFO("开始加载缓存");
|
||||
CRdbCache objCache(strAppName.c_str());
|
||||
if ( !objCache.load() )
|
||||
{
|
||||
LOGERROR("加载缓存失败");
|
||||
// 加载缓存失败时内存库仍可用,所以此处不返回失败
|
||||
}
|
||||
else
|
||||
{
|
||||
LOGINFO("加载缓存成功");
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
int iot_dbms::CRdbMngIntereface::deleteAppDbShm( const std::string& strAppName )
|
||||
{
|
||||
if ( isLoadAppDb(strAppName) )
|
||||
{
|
||||
// 保存缓存
|
||||
LOGINFO("开始保存缓存");
|
||||
CRdbCache objCache(strAppName.c_str());
|
||||
if ( !objCache.save() )
|
||||
{
|
||||
LOGERROR("保存缓存失败");
|
||||
// 保存缓存失败时仍需执行后续逻辑,所以此处不返回失败
|
||||
}
|
||||
else
|
||||
{
|
||||
LOGINFO("保存缓存成功");
|
||||
}
|
||||
}
|
||||
|
||||
CRdbDataSegMan objDataMan( CDbSysInfo::getAppIdByAppName( strAppName ) );
|
||||
objDataMan.deleteShm();
|
||||
CRdbServerMemMan objMemMan;
|
||||
@ -146,15 +115,3 @@ bool iot_dbms::CRdbMngIntereface::isLoadAppDb( const std::string& strAppName )
|
||||
return objMemMan.isCreatedDb( nAppId );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -15,85 +15,79 @@ DEFINES += USING_CUR_SYN
|
||||
#DEFINES += USE_HASHTABLE
|
||||
|
||||
SOURCES += \
|
||||
CBaseTable.cpp \
|
||||
CBptree.cpp \
|
||||
CPremalloc.cpp \
|
||||
CRdbAccessImpl.cpp \
|
||||
CRdbColumnInfo.cpp \
|
||||
CRdbDataSegMan.cpp \
|
||||
CRdbDictionary.cpp \
|
||||
CRdbLocalManager.cpp \
|
||||
CRdbLocalTable.cpp \
|
||||
CRdbQuickSortSrch.cpp \
|
||||
CRdbServerMemMan.cpp \
|
||||
CRdbTime.cpp \
|
||||
CShareMem.cpp \
|
||||
QuickSortSrch.cpp \
|
||||
RdbFunc.cpp \
|
||||
CVarType.cpp \
|
||||
CRdbMngInterface.cpp \
|
||||
CRdbConfigMan.cpp \
|
||||
CRdbAccess.cpp \
|
||||
CRdbQueryResultImpl.cpp \
|
||||
RdbMemMan.cpp \
|
||||
CRdbLoadTableAttribute.cpp \
|
||||
CRdbLoadTableData.cpp \
|
||||
CHashTable.cpp \
|
||||
CRdbKey.cpp \
|
||||
CRdbCache.cpp
|
||||
CBaseTable.cpp \
|
||||
CBptree.cpp \
|
||||
CPremalloc.cpp \
|
||||
CRdbAccessImpl.cpp \
|
||||
CRdbColumnInfo.cpp \
|
||||
CRdbDataSegMan.cpp \
|
||||
CRdbDictionary.cpp \
|
||||
CRdbLocalManager.cpp \
|
||||
CRdbLocalTable.cpp \
|
||||
CRdbQuickSortSrch.cpp \
|
||||
CRdbServerMemMan.cpp \
|
||||
CRdbTime.cpp \
|
||||
CShareMem.cpp \
|
||||
QuickSortSrch.cpp \
|
||||
RdbFunc.cpp \
|
||||
CVarType.cpp \
|
||||
CRdbMngInterface.cpp \
|
||||
CRdbConfigMan.cpp \
|
||||
CRdbAccess.cpp \
|
||||
CRdbQueryResultImpl.cpp \
|
||||
RdbMemMan.cpp \
|
||||
CRdbLoadTableAttribute.cpp \
|
||||
CRdbLoadTableData.cpp \
|
||||
CHashTable.cpp \
|
||||
CRdbKey.cpp
|
||||
|
||||
HEADERS += \
|
||||
../../include/dbms/rdb_api/CRdbAccess.h \
|
||||
../../include/dbms/rdb_api/CRdbMngInterface.h \
|
||||
../../include/dbms/rdb_api/RdbDefine.h \
|
||||
../../include/dbms/rdb_api/RdbExport.h \
|
||||
../../include/dbms/rdb_api/RdbMemMan.h \
|
||||
../../include/dbms/rdb_api/CVarType.h \
|
||||
../../include/dbms/rdb_api/CRdbAccessEx.h \
|
||||
../../include/dbms/rdb_api/RdbTableMng.h \
|
||||
../../include/dbms/rdb_api/FuncForNet.h \
|
||||
CPreMalloc.h \
|
||||
CRdbAccessImpl.h \
|
||||
CRdbDataSegMan.h \
|
||||
CRdbLocalManager.h \
|
||||
CRdbQuickSortSrch.h \
|
||||
CShareMem.h \
|
||||
MallocSpace.h \
|
||||
QuickSortSrch.h \
|
||||
RdbFunc.h \
|
||||
CRdbQueryResultImpl.h \
|
||||
CBaseTable.h \
|
||||
CRdbLocalTable.h \
|
||||
CRdbServerMemMan.h \
|
||||
CBptree.h \
|
||||
CHashTable.h \
|
||||
CRdbDictionary.h \
|
||||
CRdbTime.h \
|
||||
CRdbColumnInfo.h \
|
||||
CRdbLoadTableAttribute.h \
|
||||
CRdbLoadTableData.h \
|
||||
CRdbKey_impl.h \
|
||||
CRdbKey.h \
|
||||
CRdbCache.h \
|
||||
CPreMalloc.h \
|
||||
CRdbAccessImpl.h \
|
||||
CRdbDataSegMan.h \
|
||||
CRdbLocalManager.h \
|
||||
CRdbQuickSortSrch.h \
|
||||
CShareMem.h \
|
||||
MallocSpace.h \
|
||||
QuickSortSrch.h \
|
||||
RdbFunc.h \
|
||||
CRdbQueryResultImpl.h \
|
||||
CBaseTable.h \
|
||||
CRdbLocalTable.h \
|
||||
CRdbServerMemMan.h \
|
||||
CBptree.h \
|
||||
CHashTable.h \
|
||||
CRdbDictionary.h \
|
||||
CRdbTime.h \
|
||||
CRdbColumnInfo.h \
|
||||
CRdbLoadTableAttribute.h \
|
||||
CRdbLoadTableData.h \
|
||||
CRdbKey_impl.h \
|
||||
CRdbKey.h \
|
||||
../../include/dbms/rdb_api/CRdbAccess.h \
|
||||
../../include/dbms/rdb_api/CRdbMngInterface.h \
|
||||
../../include/dbms/rdb_api/RdbDefine.h \
|
||||
../../include/dbms/rdb_api/RdbExport.h \
|
||||
../../include/dbms/rdb_api/RdbMemMan.h \
|
||||
../../include/dbms/rdb_api/CVarType.h \
|
||||
../../include/dbms/rdb_api/CRdbAccessEx.h \
|
||||
../../include/dbms/rdb_api/RdbTableMng.h \
|
||||
../../include/dbms/rdb_api/FuncForNet.h \
|
||||
|
||||
LIBS += \
|
||||
-ldb_base_api \
|
||||
-ldb_api_ex \
|
||||
-lpub_logger_api \
|
||||
-lpub_sysinfo_api \
|
||||
-llog4cplus \
|
||||
-lboost_system \
|
||||
-lboost_thread \
|
||||
-ldb_sysinfo_api \
|
||||
-lpub_utility_api \
|
||||
-lprotobuf \
|
||||
LIBS += -ldb_base_api \
|
||||
-ldb_api_ex \
|
||||
-lpub_logger_api \
|
||||
-lpub_sysinfo_api \
|
||||
-llog4cplus \
|
||||
-lboost_system \
|
||||
-lboost_thread \
|
||||
-ldb_sysinfo_api \
|
||||
-lpub_utility_api
|
||||
|
||||
win32{
|
||||
LIBS += -lAdvAPI32
|
||||
LIBS += -lAdvAPI32
|
||||
}
|
||||
|
||||
include($$PWD/../../idl_files/idl_files.pri)
|
||||
|
||||
COMMON_PRI=$$PWD/../../common.pri
|
||||
exists($$COMMON_PRI) {
|
||||
include($$COMMON_PRI)
|
||||
|
||||
@ -11,8 +11,8 @@ int CRdbRedundant::redundantSwitch(bool bMaster, bool bSlave)
|
||||
|
||||
bool CRdbRedundant::initSwitch(int nAppId)
|
||||
{
|
||||
iot_dbms::CRdbConfigMan objConfigMan(nAppId);
|
||||
m_pShmRdbConfig = (iot_dbms::SRdbConfig*)objConfigMan.getConfigAddr();
|
||||
iot_dbms::CRdbConfigMan objConfigMan(nAppId);
|
||||
m_pShmRdbConfig = (iot_dbms::SRdbConfig*)objConfigMan.getConfigAddr();
|
||||
if (NULL == m_pShmRdbConfig)
|
||||
{
|
||||
return false;
|
||||
|
||||
@ -17,11 +17,11 @@ public:
|
||||
|
||||
bool bSlave() const;
|
||||
void setBSlave(bool bSlave);
|
||||
void bindProcMng(iot_sys::CProcMngInterfacePtr ptrProcMng);
|
||||
void bindProcMng(iot_sys::CProcMngInterfacePtr ptrProcMng);
|
||||
bool setStatus(bool bMaster = true);
|
||||
private:
|
||||
iot_dbms::SRdbConfig *m_pShmRdbConfig;
|
||||
iot_sys::CProcMngInterfacePtr m_ptrProcMng;
|
||||
iot_dbms::SRdbConfig *m_pShmRdbConfig;
|
||||
iot_sys::CProcMngInterfacePtr m_ptrProcMng;
|
||||
};
|
||||
|
||||
#endif // CRDBREDUNDANT_H
|
||||
|
||||
@ -1,467 +1,468 @@
|
||||
#include "CRdbUpdateThread.h"
|
||||
|
||||
#include "../rdb_api/CRdbConfigMan.h"
|
||||
#include "../rdb_api/CRdbDictionary.h"
|
||||
#include "../rdb_api/CRdbServerMemMan.h"
|
||||
#include "../rdb_api/QVariant2Vartype.inc"
|
||||
#include "pub_logger_api/logger.h"
|
||||
#include "pub_sysinfo_api/SysInfoApi.h"
|
||||
#include "db_sysinfo_api/CDbSysInfo.h"
|
||||
#include "rdb_api/CRdbAccessEx.h"
|
||||
|
||||
using namespace iot_public;
|
||||
using namespace iot_dbms;
|
||||
|
||||
CRdbUpdateThread::CRdbUpdateThread( const iot_public::SRunAppInfo stAppInfo )
|
||||
: CTimerThreadBase( "rdb_server CRdbUpdateThread 关系数据库向内存库更新线程", 1000, 1000*60*5 ),
|
||||
m_objDb(DB_CONN_MODEL_READ)
|
||||
{
|
||||
m_ptrSysInfo = nullptr;
|
||||
m_ullCurId = 0;
|
||||
m_stAppInfo = ( stAppInfo );
|
||||
m_ulAppShmIdAddr = NULL;
|
||||
m_sNodeName = "";
|
||||
}
|
||||
|
||||
CRdbUpdateThread::~CRdbUpdateThread()
|
||||
{
|
||||
quit();
|
||||
release();
|
||||
}
|
||||
|
||||
void CRdbUpdateThread::execute()
|
||||
{
|
||||
checkCurrentDatabaseChange();
|
||||
updateRtdb();
|
||||
}
|
||||
|
||||
int CRdbUpdateThread::initialize()
|
||||
{
|
||||
m_vecSynNote.clear();
|
||||
if ( false == initAppShmId() )
|
||||
{
|
||||
LOGERROR( "模型实时库同步初始化失败, initAppShmId fail." );
|
||||
return false;
|
||||
}
|
||||
m_ullCurId = getMinId();
|
||||
/*
|
||||
if(false == CDbSysInfo::initialize())
|
||||
{
|
||||
LOGERROR("模型实时库同步初始化失败,createSysInfoInstance fail.");
|
||||
return false ;
|
||||
}
|
||||
if(iot_public::createSysInfoInstance(m_ptrSysInfo) == false)
|
||||
{
|
||||
LOGERROR("模型实时库同步初始化失败,createSysInfoInstance fail.");
|
||||
return false ;
|
||||
}
|
||||
if(NULL == m_ptrSysInfo)
|
||||
{
|
||||
LOGERROR("模型实时库同步初始化失败,sysInfoPtr == null.");
|
||||
return false ;
|
||||
}*/
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CRdbUpdateThread::release()
|
||||
{
|
||||
m_vecSynNote.clear();
|
||||
//m_ptrSysInfo.reset();
|
||||
//CDbSysInfo::release();
|
||||
}
|
||||
|
||||
int CRdbUpdateThread::getDomainIdByLocaiton( int nLocationId )
|
||||
{
|
||||
SLocationInfo stLocationInfo;
|
||||
|
||||
//m_ptrSysInfo->getLocationInfoById(nLocationId, stLocationInfo) ;
|
||||
CDbSysInfo::m_ptrSysInfo->getLocationInfoById( nLocationId, stLocationInfo );
|
||||
|
||||
return stLocationInfo.nDomainId;
|
||||
}
|
||||
|
||||
int CRdbUpdateThread::initAppShmId()
|
||||
{
|
||||
CRdbServerMemMan objMemMan;
|
||||
if ( !objMemMan.isCreatedDb( m_stAppInfo.nAppId ) )
|
||||
{
|
||||
LOGERROR( "app rdb_server not start." );
|
||||
return false;
|
||||
}
|
||||
CRdbConfigMan objRtdbConfigMan( m_stAppInfo.nAppId );
|
||||
uint64* pShmCurId = &objRtdbConfigMan.getConfigAddr()->ullDb2RtdbSynId;
|
||||
//m_mapAppId2Info[m_stAppInfo.nAppId] = pShmCurId;
|
||||
m_ulAppShmIdAddr = pShmCurId;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CRdbUpdateThread::updateCurId()
|
||||
{
|
||||
/*
|
||||
for(std::map<int, uint64*>::iterator iter = m_mapAppId2Info.begin(); iter != m_mapAppId2Info.end(); ++iter){
|
||||
uint64 *pShmId = iter->second;
|
||||
*pShmId = m_ullCurId;
|
||||
}*/
|
||||
if ( m_ulAppShmIdAddr )
|
||||
{
|
||||
*m_ulAppShmIdAddr = m_ullCurId;
|
||||
}
|
||||
}
|
||||
|
||||
uint64 CRdbUpdateThread::getMinId()
|
||||
{
|
||||
uint64 ullRet = 0;
|
||||
/*
|
||||
for(std::map<int, uint64*>::iterator iter = m_mapAppId2Info.begin(); iter != m_mapAppId2Info.end(); ++iter){
|
||||
uint64 *pShmId = iter->second;
|
||||
ullRet = *(pShmId)<ullRet ? ullRet : *(pShmId);
|
||||
}
|
||||
return ullRet;*/
|
||||
|
||||
if ( m_ulAppShmIdAddr )
|
||||
{
|
||||
ullRet = *m_ulAppShmIdAddr;
|
||||
}
|
||||
return ullRet;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief CRdbUpdateThread::checkCurrentDatabaseChange
|
||||
* 因为数据库ip使用的是虚拟ip,存在切机器的可能,
|
||||
* 若果切机,数据库所在的服务器名会产生变化(基于系统内所有机器名不能重复的条件)
|
||||
* 所以每次查询变化记录之前查询机器名,
|
||||
* 若机器名产生变化则重置当前已同步到的id为sys_trigger_info表的最大id
|
||||
*/
|
||||
void CRdbUpdateThread::checkCurrentDatabaseChange()
|
||||
{
|
||||
if ( !openDb() )
|
||||
return;
|
||||
|
||||
// 检测机器名是否变化
|
||||
QString sHostName = m_objDb.getHostName();
|
||||
if ( sHostName.size() <= 0 )
|
||||
return;
|
||||
if ( m_sNodeName == "" || m_sNodeName == sHostName )
|
||||
{
|
||||
m_sNodeName = sHostName;
|
||||
return;
|
||||
}
|
||||
LOGERROR("数据库所在节点产生变化,原节点【%s】,现节点【%s】",
|
||||
m_sNodeName.toStdString().c_str(),
|
||||
sHostName.toStdString().c_str());
|
||||
m_sNodeName = sHostName;
|
||||
|
||||
// 机器名变化则将已同步到的id重新赋值
|
||||
QSqlQuery objQuery;
|
||||
QString sSql = "SELECT max(act_id) AS curid FROM sys_trigger_info";
|
||||
if ( !m_objDb.execute(sSql,objQuery) )
|
||||
return;
|
||||
uint64 ullRet = 0;
|
||||
bool bOk = false;
|
||||
if ( objQuery.isActive() && objQuery.next() )
|
||||
ullRet = objQuery.value( "curid" ).toULongLong( &bOk );
|
||||
if ( bOk )
|
||||
{
|
||||
LOGERROR("sys_trigger_info表已同步到的id产生变化,原id【%lu】,现id【%lu】",
|
||||
m_ullCurId, ullRet);
|
||||
m_ullCurId = ullRet;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief CRdbUpdateThread::updateRtdb 诸多地方存在性能问题,考虑在线组态少(或者不需要同步大量记录),先实现再优化.
|
||||
* @param vecSynNote
|
||||
*/
|
||||
void CRdbUpdateThread::updateRtdb()
|
||||
{
|
||||
if ( !getCurNote() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
CRdbAccessEx objRtdb;
|
||||
for ( size_t nSynNoteIndex = 0; nSynNoteIndex < m_vecSynNote.size(); ++nSynNoteIndex )
|
||||
{
|
||||
SSynNoteForModel& refSynNote = m_vecSynNote[nSynNoteIndex];
|
||||
m_ullCurId = m_ullCurId > refSynNote.ullActId ? m_ullCurId : refSynNote.ullActId;
|
||||
bool bSelectByLocation = false;
|
||||
//bool bSelectBySubsystem = false;
|
||||
|
||||
//判断当前应用是否和 RDB同步记录 在同一个应用
|
||||
//===========================================================================================================
|
||||
std::set<int> setAppId;
|
||||
if ( !CDbSysInfo::getAppIdBySubsystemFlag( refSynNote.unSubsystemFlag, setAppId ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
//如果是删除记录,直接处理.说明:记录已删除,无法获知属于哪个车站,也无法或者属于哪个应用,只能尝试对每个车站的每个应用进行删除,删除失败无副作用.
|
||||
if ( setAppId.size() == 0 )
|
||||
{
|
||||
continue; //此表没有再任何一个应用中加载.
|
||||
}
|
||||
//没有找到 APP
|
||||
if ( setAppId.find( m_stAppInfo.nAppId ) == setAppId.end() )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// 组装所有条件
|
||||
//===========================================================================================================
|
||||
std::vector<CONDINFO> vecCondition;
|
||||
for ( size_t i = 0; i < refSynNote.vecKeyColumnName.size() && i < refSynNote.vecKeyOldValue.size(); ++i )
|
||||
{
|
||||
CONDINFO objCondition;
|
||||
objCondition.conditionval = refSynNote.vecKeyOldValue[i].c_str();
|
||||
objCondition.logicalop = ATTRCOND_AND;
|
||||
if ( refSynNote.vecKeyColumnName[i].length() > sizeof( objCondition.name ) - 1 )
|
||||
{
|
||||
LOGERROR( "%s:%s 字段名超长", refSynNote.strTableName.c_str(), refSynNote.vecKeyColumnName[i].c_str() );
|
||||
continue;
|
||||
}
|
||||
strncpy( objCondition.name, refSynNote.vecKeyColumnName[i].c_str(), sizeof( objCondition.name ) );
|
||||
objCondition.relationop = ATTRCOND_EQU;
|
||||
vecCondition.push_back( objCondition );
|
||||
}
|
||||
|
||||
//DELETE一条同步记录处理
|
||||
//===========================================================================================================
|
||||
if ( EModelSynOptTypeDelete == refSynNote.nOptType )
|
||||
{ //DELETE
|
||||
if ( !objRtdb.open( m_stAppInfo.nAppId, refSynNote.strTableName.c_str() ) )
|
||||
{
|
||||
LOGERROR( "同步模型至实时库时,打开表失败,appid:%d, tablename:%s", m_stAppInfo.nAppId, refSynNote.strTableName.c_str() );
|
||||
continue;
|
||||
}
|
||||
objRtdb.lock();
|
||||
objRtdb.remove( vecCondition );
|
||||
objRtdb.unLock();
|
||||
continue;
|
||||
}
|
||||
|
||||
//获取应用表目录地址 是否区分站点id和应用id
|
||||
//===========================================================================================================
|
||||
CRdbDictionary objDict( m_stAppInfo.nAppId );
|
||||
SRdbTableAttribute* pTable = objDict.SearchTable( refSynNote.strTableName.c_str() );
|
||||
if ( 0 == pTable )
|
||||
{
|
||||
LOGERROR( "应用%d没有加载表%s", m_stAppInfo.nAppId, refSynNote.strTableName.c_str() );
|
||||
continue;
|
||||
}
|
||||
bSelectByLocation = pTable->nSelectByLocation; //区分车站
|
||||
//bSelectBySubsystem = pTable->nSelectBySubsystem; //区分专业
|
||||
|
||||
//不属于此站点,return,属于则,查出对应记录,然后确定需要更新此表的应用
|
||||
//===========================================================================================================
|
||||
QSqlQuery objQuery;
|
||||
if ( !openDb() )
|
||||
{
|
||||
LOGERROR( "打开数据库失败,openDb()!" );
|
||||
return;
|
||||
}
|
||||
QList<CDbCondition> listCondition;
|
||||
for ( size_t nCondIndex = 0;
|
||||
nCondIndex < refSynNote.vecKeyColumnName.size() && nCondIndex < refSynNote.vecKeyNewValue.size();
|
||||
++nCondIndex )
|
||||
{
|
||||
CDbCondition objCondition;
|
||||
objCondition.m_eCompare = CDbCondition::COMPARE_EQ;
|
||||
objCondition.m_eLogic = CDbCondition::LOGIC_AND;
|
||||
objCondition.m_sColName = refSynNote.vecKeyColumnName[nCondIndex].c_str();
|
||||
objCondition.m_value = refSynNote.vecKeyNewValue[nCondIndex].c_str();
|
||||
listCondition << objCondition;
|
||||
}
|
||||
if ( !m_objDb.select( refSynNote.strTableName.c_str(), listCondition, objQuery )
|
||||
|| !objQuery.next() )
|
||||
{
|
||||
LOGERROR( "根据key查找记录失败,act_id:%llu", (unsigned long long)refSynNote.ullActId );
|
||||
continue;
|
||||
}
|
||||
//区分车站判断
|
||||
//===========================================================================================================
|
||||
if ( bSelectByLocation )
|
||||
{
|
||||
bool bConvertRet;
|
||||
int nLocationId = objQuery.value( STR_LOCATION_ID ).toInt( &bConvertRet );
|
||||
if ( !bConvertRet )
|
||||
{
|
||||
LOGERROR( "同步的记录区分站点,但是获取站点号失败." );
|
||||
continue;
|
||||
}
|
||||
if ( getDomainIdByLocaiton( nLocationId ) != m_stAppInfo.nDomainId )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
//区分专业判断
|
||||
/*
|
||||
//===========================================================================================================
|
||||
int nSelectedAppId = m_stAppInfo.nAppId ;
|
||||
if(bSelectBySubsystem){
|
||||
bool bConvertRet;
|
||||
int nSubsystemId = objQuery.value(STR_SUB_SYSTEM).toInt(&bConvertRet);
|
||||
if(!bConvertRet){
|
||||
LOGERROR("同步记录区分专业,但是获取专业ID失败.");
|
||||
continue;
|
||||
}
|
||||
nSelectedAppId = CDbSysInfo::getAppIdBySubsystemId(nSubsystemId);
|
||||
if(m_stAppInfo.nAppId != nSelectedAppId ){
|
||||
LOGINFO("修改的记录不需要记录到实时库.id:%d", refSynNote.ullActId);
|
||||
continue;
|
||||
}
|
||||
}*/
|
||||
|
||||
//从所属任意应用查出表结构
|
||||
//===============================================================================================
|
||||
SRdbColumnAttribute* pShmColumn = objDict.GetColumnStruct( pTable->nStartColumnNo );
|
||||
std::vector<RSQL_UPD_COLUMN> vecColumnValue;
|
||||
|
||||
for ( int pColumnIndex = 0; pColumnIndex < pTable->nColumnCount; ++pColumnIndex )
|
||||
{
|
||||
if ( ( pShmColumn + pColumnIndex )->bNotUpdateRtdb )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
RSQL_UPD_COLUMN objUpdColumn;
|
||||
strncpy( objUpdColumn.updcolname, ( pShmColumn + pColumnIndex )->strName, sizeof( objUpdColumn.updcolname ) );
|
||||
QVariantToVartypeValue( objQuery.value( objUpdColumn.updcolname ),
|
||||
( pShmColumn + pColumnIndex )->nDataType, objUpdColumn.updvalue );
|
||||
vecColumnValue.push_back( objUpdColumn );
|
||||
}
|
||||
|
||||
//对对应应用进行同步
|
||||
//===============================================================================================
|
||||
if ( !objRtdb.open( m_stAppInfo.nAppId, refSynNote.strTableName.c_str() ) )
|
||||
{
|
||||
LOGERROR( "同步模型至实时库时,打开表失败,appid:%d, tablename:%s", m_stAppInfo.nAppId, refSynNote.strTableName.c_str() );
|
||||
continue;
|
||||
}
|
||||
if ( EModelSynOptTypeInsert == refSynNote.nOptType )
|
||||
{
|
||||
objRtdb.lock();
|
||||
objRtdb.insert( vecColumnValue );
|
||||
objRtdb.unLock();
|
||||
}
|
||||
else
|
||||
{
|
||||
objRtdb.lock();
|
||||
objRtdb.update( vecColumnValue, vecCondition );
|
||||
objRtdb.unLock();
|
||||
}
|
||||
//m_objRtdb.close();
|
||||
}
|
||||
|
||||
updateCurId(); //更新同步到的id到共享内存
|
||||
|
||||
m_vecSynNote.clear();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
bool CRdbUpdateThread::openDb()
|
||||
{
|
||||
if ( !m_objDb.isOpen() )
|
||||
{
|
||||
if ( !m_objDb.open() )
|
||||
{
|
||||
LOGERROR( "获取可读数据库连接失败." );
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CRdbUpdateThread::getCurNote()
|
||||
{
|
||||
m_vecSynNote.clear();
|
||||
if ( !openDb() )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
CDbCondition objCondtion0;
|
||||
objCondtion0.m_sColName = "act_id";
|
||||
objCondtion0.m_value = (qulonglong)m_ullCurId;
|
||||
objCondtion0.m_eCompare = CDbCondition::COMPARE_GT;
|
||||
objCondtion0.m_eLogic = CDbCondition::LOGIC_AND;
|
||||
CDbCondition objCondtion1;
|
||||
objCondtion1.m_sColName = "act_id";
|
||||
objCondtion1.m_value = (qulonglong)m_ullCurId+1000;
|
||||
objCondtion1.m_eCompare = CDbCondition::COMPARE_LT;
|
||||
QList<CDbCondition> listCondition;
|
||||
listCondition << objCondtion0 << objCondtion1;
|
||||
|
||||
CDbOrder objOrderBy(objCondtion0.m_sColName);
|
||||
QList<CDbOrder> listOrderBy;
|
||||
listOrderBy << objOrderBy;
|
||||
|
||||
QSqlQuery objQuery;
|
||||
if ( !m_objDb.select( "sys_trigger_info", listCondition, listOrderBy, objQuery ) )
|
||||
{
|
||||
LOGERROR( "select return non zero. %s", objQuery.lastError().databaseText().toUtf8().data() );
|
||||
return false;
|
||||
}
|
||||
while ( objQuery.next() )
|
||||
{
|
||||
SSynNoteForModel objModelNote;
|
||||
bool bConvertRet;
|
||||
objModelNote.ullActId = objQuery.value( "act_id" ).toULongLong( &bConvertRet );
|
||||
if ( false == bConvertRet )
|
||||
{
|
||||
LOGERROR( "convert ret:false" );
|
||||
continue;
|
||||
}
|
||||
int nOptType = objQuery.value( "op_type" ).toInt( &bConvertRet );
|
||||
if ( false == bConvertRet || ( nOptType < 0 || nOptType > 2 ) )
|
||||
{
|
||||
LOGERROR( "convert ret:%s, op_type:%d", bConvertRet ? "true" : "false", objModelNote.nOptType );
|
||||
continue;
|
||||
}
|
||||
objModelNote.nOptType = EModelSynOptType( nOptType );
|
||||
|
||||
objModelNote.strTableName = objQuery.value( "table_name" ).toString().toUtf8().data();
|
||||
QStringList listColumnName = objQuery.value( "key_column_name" ).toString().split( "," );
|
||||
for ( int i = 0; i < listColumnName.size(); ++i )
|
||||
{
|
||||
objModelNote.vecKeyColumnName.push_back( listColumnName[i].toUtf8().data() );
|
||||
}
|
||||
QStringList listKeyOldValue = objQuery.value( "key_old_value" ).toString().split( "," );
|
||||
for ( int i = 0; i < listKeyOldValue.size(); ++i )
|
||||
{
|
||||
objModelNote.vecKeyOldValue.push_back( listKeyOldValue[i].toUtf8().data() );
|
||||
}
|
||||
QStringList listKeyNewValue = objQuery.value( "key_new_value" ).toString().split( "," );
|
||||
for ( int i = 0; i < listKeyNewValue.size(); ++i )
|
||||
{
|
||||
objModelNote.vecKeyNewValue.push_back( listKeyNewValue[i].toUtf8().data() );
|
||||
}
|
||||
|
||||
// 由于数据库中不再有表模式和列模式这两张表,故此处从xml文件中获取subsystem_flag
|
||||
//objModelNote.unSubsystemFlag = objQuery.value( "subsystem_flag" ).toInt( &bConvertRet );
|
||||
if ( false == CDbSysInfo::getSubsystemFlagByTableName(objModelNote.strTableName,objModelNote.unSubsystemFlag) )
|
||||
{
|
||||
//LOGERROR( "获取内存表【%s】的subsystemFlag失败", objModelNote.strTableName.c_str() );
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( EModelSynOptTypeInsert == objModelNote.nOptType && objModelNote.vecKeyNewValue.size() == 0 )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( EModelSynOptTypeDelete == objModelNote.nOptType && objModelNote.vecKeyOldValue.size() == 0 )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( EModelSynOptTypeUpdate == objModelNote.nOptType
|
||||
&& ( objModelNote.vecKeyNewValue != objModelNote.vecKeyOldValue || objModelNote.vecKeyNewValue.size() == 0 ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( 0 == objModelNote.unSubsystemFlag || objModelNote.strTableName.length() == 0 )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
m_vecSynNote.push_back( objModelNote );
|
||||
}
|
||||
return true;
|
||||
}
|
||||
#include "CRdbUpdateThread.h"
|
||||
|
||||
#include "../rdb_api/CRdbConfigMan.h"
|
||||
#include "../rdb_api/CRdbDictionary.h"
|
||||
#include "../rdb_api/CRdbServerMemMan.h"
|
||||
#include "../rdb_api/QVariant2Vartype.inc"
|
||||
#include "pub_logger_api/logger.h"
|
||||
#include "pub_sysinfo_api/SysInfoApi.h"
|
||||
#include "db_sysinfo_api/CDbSysInfo.h"
|
||||
#include "rdb_api/CRdbAccessEx.h"
|
||||
|
||||
using namespace iot_public;
|
||||
using namespace iot_dbms;
|
||||
|
||||
CRdbUpdateThread::CRdbUpdateThread( const iot_public::SRunAppInfo stAppInfo )
|
||||
: CTimerThreadBase( "rdb_server CRdbUpdateThread 关系数据库向内存库更新线程", 1000, 1000*60*5 ),
|
||||
m_objDb(DB_CONN_MODEL_READ)
|
||||
{
|
||||
m_ptrSysInfo = nullptr;
|
||||
m_ullCurId = 0;
|
||||
m_stAppInfo = ( stAppInfo );
|
||||
m_ulAppShmIdAddr = NULL;
|
||||
m_sNodeName = "";
|
||||
}
|
||||
|
||||
CRdbUpdateThread::~CRdbUpdateThread()
|
||||
{
|
||||
quit();
|
||||
release();
|
||||
}
|
||||
|
||||
void CRdbUpdateThread::execute()
|
||||
{
|
||||
checkCurrentDatabaseChange();
|
||||
updateRtdb();
|
||||
}
|
||||
|
||||
int CRdbUpdateThread::initialize()
|
||||
{
|
||||
m_vecSynNote.clear();
|
||||
if ( false == initAppShmId() )
|
||||
{
|
||||
LOGERROR( "模型实时库同步初始化失败, initAppShmId fail." );
|
||||
return false;
|
||||
}
|
||||
m_ullCurId = getMinId();
|
||||
/*
|
||||
if(false == CDbSysInfo::initialize())
|
||||
{
|
||||
LOGERROR("模型实时库同步初始化失败,createSysInfoInstance fail.");
|
||||
return false ;
|
||||
}
|
||||
if(iot_public::createSysInfoInstance(m_ptrSysInfo) == false)
|
||||
{
|
||||
LOGERROR("模型实时库同步初始化失败,createSysInfoInstance fail.");
|
||||
return false ;
|
||||
}
|
||||
if(NULL == m_ptrSysInfo)
|
||||
{
|
||||
LOGERROR("模型实时库同步初始化失败,sysInfoPtr == null.");
|
||||
return false ;
|
||||
}*/
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CRdbUpdateThread::release()
|
||||
{
|
||||
m_vecSynNote.clear();
|
||||
//m_ptrSysInfo.reset();
|
||||
//CDbSysInfo::release();
|
||||
}
|
||||
|
||||
int CRdbUpdateThread::getDomainIdByLocaiton( int nLocationId )
|
||||
{
|
||||
SLocationInfo stLocationInfo;
|
||||
|
||||
//m_ptrSysInfo->getLocationInfoById(nLocationId, stLocationInfo) ;
|
||||
CDbSysInfo::m_ptrSysInfo->getLocationInfoById( nLocationId, stLocationInfo );
|
||||
|
||||
return stLocationInfo.nDomainId;
|
||||
}
|
||||
|
||||
int CRdbUpdateThread::initAppShmId()
|
||||
{
|
||||
CRdbServerMemMan objMemMan;
|
||||
if ( !objMemMan.isCreatedDb( m_stAppInfo.nAppId ) )
|
||||
{
|
||||
LOGERROR( "app rdb_server not start." );
|
||||
return false;
|
||||
}
|
||||
CRdbConfigMan objRtdbConfigMan( m_stAppInfo.nAppId );
|
||||
uint64* pShmCurId = &objRtdbConfigMan.getConfigAddr()->ullDb2RtdbSynId;
|
||||
//m_mapAppId2Info[m_stAppInfo.nAppId] = pShmCurId;
|
||||
m_ulAppShmIdAddr = pShmCurId;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CRdbUpdateThread::updateCurId()
|
||||
{
|
||||
/*
|
||||
for(std::map<int, uint64*>::iterator iter = m_mapAppId2Info.begin(); iter != m_mapAppId2Info.end(); ++iter){
|
||||
uint64 *pShmId = iter->second;
|
||||
*pShmId = m_ullCurId;
|
||||
}*/
|
||||
if ( m_ulAppShmIdAddr )
|
||||
{
|
||||
*m_ulAppShmIdAddr = m_ullCurId;
|
||||
}
|
||||
}
|
||||
|
||||
uint64 CRdbUpdateThread::getMinId()
|
||||
{
|
||||
uint64 ullRet = 0;
|
||||
/*
|
||||
for(std::map<int, uint64*>::iterator iter = m_mapAppId2Info.begin(); iter != m_mapAppId2Info.end(); ++iter){
|
||||
uint64 *pShmId = iter->second;
|
||||
ullRet = *(pShmId)<ullRet ? ullRet : *(pShmId);
|
||||
}
|
||||
return ullRet;*/
|
||||
|
||||
if ( m_ulAppShmIdAddr )
|
||||
{
|
||||
ullRet = *m_ulAppShmIdAddr;
|
||||
}
|
||||
return ullRet;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief CRdbUpdateThread::checkCurrentDatabaseChange
|
||||
* 因为数据库ip使用的是虚拟ip,存在切机器的可能,
|
||||
* 若果切机,数据库所在的服务器名会产生变化(基于系统内所有机器名不能重复的条件)
|
||||
* 所以每次查询变化记录之前查询机器名,
|
||||
* 若机器名产生变化则重置当前已同步到的id为sys_trigger_info表的最大id
|
||||
*/
|
||||
void CRdbUpdateThread::checkCurrentDatabaseChange()
|
||||
{
|
||||
if ( !openDb() )
|
||||
return;
|
||||
|
||||
// 检测机器名是否变化
|
||||
QString sHostName = m_objDb.getHostName();
|
||||
if ( sHostName.size() <= 0 )
|
||||
return;
|
||||
if ( m_sNodeName == "" || m_sNodeName == sHostName )
|
||||
{
|
||||
m_sNodeName = sHostName;
|
||||
return;
|
||||
}
|
||||
LOGERROR("数据库所在节点产生变化,原节点【%s】,现节点【%s】",
|
||||
m_sNodeName.toStdString().c_str(),
|
||||
sHostName.toStdString().c_str());
|
||||
m_sNodeName = sHostName;
|
||||
|
||||
// 机器名变化则将已同步到的id重新赋值
|
||||
QSqlQuery objQuery;
|
||||
QString sSql = "SELECT max(act_id) AS curid FROM sys_trigger_info";
|
||||
if ( !m_objDb.execute(sSql,objQuery) )
|
||||
return;
|
||||
uint64 ullRet = 0;
|
||||
bool bOk = false;
|
||||
if ( objQuery.isActive() && objQuery.next() )
|
||||
ullRet = objQuery.value( "curid" ).toULongLong( &bOk );
|
||||
if ( bOk )
|
||||
{
|
||||
LOGERROR("sys_trigger_info表已同步到的id产生变化,原id【%lu】,现id【%lu】",
|
||||
m_ullCurId, ullRet);
|
||||
m_ullCurId = ullRet;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief CRdbUpdateThread::updateRtdb 诸多地方存在性能问题,考虑在线组态少(或者不需要同步大量记录),先实现再优化.
|
||||
* @param vecSynNote
|
||||
*/
|
||||
void CRdbUpdateThread::updateRtdb()
|
||||
{
|
||||
if ( !getCurNote() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
CRdbAccessEx objRtdb;
|
||||
for ( size_t nSynNoteIndex = 0; nSynNoteIndex < m_vecSynNote.size(); ++nSynNoteIndex )
|
||||
{
|
||||
SSynNoteForModel& refSynNote = m_vecSynNote[nSynNoteIndex];
|
||||
m_ullCurId = m_ullCurId > refSynNote.ullActId ? m_ullCurId : refSynNote.ullActId;
|
||||
bool bSelectByLocation = false;
|
||||
bool bSelectBySubsystem = false;
|
||||
|
||||
//判断当前应用是否和 RDB同步记录 在同一个应用
|
||||
//===========================================================================================================
|
||||
std::set<int> setAppId;
|
||||
if ( !CDbSysInfo::getAppIdBySubsystemFlag( refSynNote.unSubsystemFlag, setAppId ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
//如果是删除记录,直接处理.说明:记录已删除,无法获知属于哪个车站,也无法或者属于哪个应用,只能尝试对每个车站的每个应用进行删除,删除失败无副作用.
|
||||
if ( setAppId.size() == 0 )
|
||||
{
|
||||
continue; //此表没有再任何一个应用中加载.
|
||||
}
|
||||
//没有找到 APP
|
||||
if ( setAppId.find( m_stAppInfo.nAppId ) == setAppId.end() )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// 组装所有条件
|
||||
//===========================================================================================================
|
||||
std::vector<CONDINFO> vecCondition;
|
||||
for ( size_t i = 0; i < refSynNote.vecKeyColumnName.size() && i < refSynNote.vecKeyOldValue.size(); ++i )
|
||||
{
|
||||
CONDINFO objCondition;
|
||||
objCondition.conditionval = refSynNote.vecKeyOldValue[i].c_str();
|
||||
objCondition.logicalop = ATTRCOND_AND;
|
||||
if ( refSynNote.vecKeyColumnName[i].length() > sizeof( objCondition.name ) - 1 )
|
||||
{
|
||||
LOGERROR( "%s:%s 字段名超长", refSynNote.strTableName.c_str(), refSynNote.vecKeyColumnName[i].c_str() );
|
||||
continue;
|
||||
}
|
||||
strncpy( objCondition.name, refSynNote.vecKeyColumnName[i].c_str(), sizeof( objCondition.name ) );
|
||||
objCondition.relationop = ATTRCOND_EQU;
|
||||
vecCondition.push_back( objCondition );
|
||||
}
|
||||
|
||||
//DELETE一条同步记录处理
|
||||
//===========================================================================================================
|
||||
if ( EModelSynOptTypeDelete == refSynNote.nOptType )
|
||||
{ //DELETE
|
||||
if ( !objRtdb.open( m_stAppInfo.nAppId, refSynNote.strTableName.c_str() ) )
|
||||
{
|
||||
LOGERROR( "同步模型至实时库时,打开表失败,appid:%d, tablename:%s", m_stAppInfo.nAppId, refSynNote.strTableName.c_str() );
|
||||
continue;
|
||||
}
|
||||
objRtdb.lock();
|
||||
objRtdb.remove( vecCondition );
|
||||
objRtdb.unLock();
|
||||
continue;
|
||||
}
|
||||
|
||||
//获取应用表目录地址 是否区分站点id和应用id
|
||||
//===========================================================================================================
|
||||
CRdbDictionary objDict( m_stAppInfo.nAppId );
|
||||
SRdbTableAttribute* pTable = objDict.SearchTable( refSynNote.strTableName.c_str() );
|
||||
if ( 0 == pTable )
|
||||
{
|
||||
LOGERROR( "应用%d没有加载表%s", m_stAppInfo.nAppId, refSynNote.strTableName.c_str() );
|
||||
continue;
|
||||
}
|
||||
bSelectByLocation = pTable->nSelectByLocation; //区分车站
|
||||
bSelectBySubsystem = pTable->nSelectBySubsystem; //区分专业
|
||||
|
||||
//不属于此站点,return,属于则,查出对应记录,然后确定需要更新此表的应用
|
||||
//===========================================================================================================
|
||||
QSqlQuery objQuery;
|
||||
if ( !openDb() )
|
||||
{
|
||||
LOGERROR( "打开数据库失败,openDb()!" );
|
||||
return;
|
||||
}
|
||||
QList<CDbCondition> listCondition;
|
||||
for ( size_t nCondIndex = 0;
|
||||
nCondIndex < refSynNote.vecKeyColumnName.size() && nCondIndex < refSynNote.vecKeyNewValue.size();
|
||||
++nCondIndex )
|
||||
{
|
||||
CDbCondition objCondition;
|
||||
objCondition.m_eCompare = CDbCondition::COMPARE_EQ;
|
||||
objCondition.m_eLogic = CDbCondition::LOGIC_AND;
|
||||
objCondition.m_sColName = refSynNote.vecKeyColumnName[nCondIndex].c_str();
|
||||
objCondition.m_value = refSynNote.vecKeyNewValue[nCondIndex].c_str();
|
||||
listCondition << objCondition;
|
||||
}
|
||||
if ( !m_objDb.select( refSynNote.strTableName.c_str(), listCondition, objQuery )
|
||||
|| !objQuery.next() )
|
||||
{
|
||||
LOGERROR( "根据key查找记录失败,act_id:%llu", (unsigned long long)refSynNote.ullActId );
|
||||
continue;
|
||||
}
|
||||
//区分车站判断
|
||||
//===========================================================================================================
|
||||
if ( bSelectByLocation )
|
||||
{
|
||||
bool bConvertRet;
|
||||
int nLocationId = objQuery.value( STR_LOCATION_ID ).toInt( &bConvertRet );
|
||||
if ( !bConvertRet )
|
||||
{
|
||||
LOGERROR( "同步的记录区分站点,但是获取站点号失败." );
|
||||
continue;
|
||||
}
|
||||
if ( getDomainIdByLocaiton( nLocationId ) != m_stAppInfo.nDomainId )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
//区分专业判断
|
||||
//===========================================================================================================
|
||||
int nSelectedAppId = m_stAppInfo.nAppId ;
|
||||
if(bSelectBySubsystem){
|
||||
bool bConvertRet;
|
||||
int nSubsystemId = objQuery.value(STR_SUB_SYSTEM).toInt(&bConvertRet);
|
||||
if(!bConvertRet){
|
||||
LOGERROR("同步记录区分专业,但是获取专业ID失败.");
|
||||
continue;
|
||||
}
|
||||
nSelectedAppId = CDbSysInfo::getAppIdBySubsystemId(nSubsystemId);
|
||||
if(m_stAppInfo.nAppId != nSelectedAppId ){
|
||||
LOGINFO("修改的记录不需要记录到实时库.id:%llu", (unsigned long long)refSynNote.ullActId);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
//从所属任意应用查出表结构
|
||||
//===============================================================================================
|
||||
SRdbColumnAttribute* pShmColumn = objDict.GetColumnStruct( pTable->nStartColumnNo );
|
||||
std::vector<RSQL_UPD_COLUMN> vecColumnValue;
|
||||
|
||||
for ( int pColumnIndex = 0; pColumnIndex < pTable->nColumnCount; ++pColumnIndex )
|
||||
{
|
||||
if ( ( pShmColumn + pColumnIndex )->bNotUpdateRtdb )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
RSQL_UPD_COLUMN objUpdColumn;
|
||||
strncpy( objUpdColumn.updcolname, ( pShmColumn + pColumnIndex )->strName, sizeof( objUpdColumn.updcolname ) );
|
||||
QVariantToVartypeValue( objQuery.value( objUpdColumn.updcolname ),
|
||||
( pShmColumn + pColumnIndex )->nDataType, objUpdColumn.updvalue );
|
||||
vecColumnValue.push_back( objUpdColumn );
|
||||
}
|
||||
|
||||
//对对应应用进行同步
|
||||
//===============================================================================================
|
||||
if ( !objRtdb.open( m_stAppInfo.nAppId, refSynNote.strTableName.c_str() ) )
|
||||
{
|
||||
LOGERROR( "同步模型至实时库时,打开表失败,appid:%d, tablename:%s", m_stAppInfo.nAppId, refSynNote.strTableName.c_str() );
|
||||
continue;
|
||||
}
|
||||
if ( EModelSynOptTypeInsert == refSynNote.nOptType )
|
||||
{
|
||||
objRtdb.lock();
|
||||
objRtdb.insert( vecColumnValue );
|
||||
objRtdb.unLock();
|
||||
}
|
||||
else
|
||||
{
|
||||
objRtdb.lock();
|
||||
objRtdb.update( vecColumnValue, vecCondition );
|
||||
objRtdb.unLock();
|
||||
}
|
||||
//m_objRtdb.close();
|
||||
}
|
||||
|
||||
updateCurId(); //更新同步到的id到共享内存
|
||||
|
||||
m_vecSynNote.clear();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
bool CRdbUpdateThread::openDb()
|
||||
{
|
||||
if ( !m_objDb.isOpen() )
|
||||
{
|
||||
if ( !m_objDb.open() )
|
||||
{
|
||||
LOGERROR( "获取可读数据库连接失败." );
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CRdbUpdateThread::getCurNote()
|
||||
{
|
||||
m_vecSynNote.clear();
|
||||
if ( !openDb() )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
CDbCondition objCondtion0;
|
||||
objCondtion0.m_sColName = "act_id";
|
||||
objCondtion0.m_value = (qulonglong)m_ullCurId;
|
||||
objCondtion0.m_eCompare = CDbCondition::COMPARE_GT;
|
||||
objCondtion0.m_eLogic = CDbCondition::LOGIC_AND;
|
||||
CDbCondition objCondtion1;
|
||||
objCondtion1.m_sColName = "act_id";
|
||||
objCondtion1.m_value = (qulonglong)m_ullCurId+1000;
|
||||
objCondtion1.m_eCompare = CDbCondition::COMPARE_LT;
|
||||
QList<CDbCondition> listCondition;
|
||||
listCondition << objCondtion0 << objCondtion1;
|
||||
|
||||
CDbOrder objOrderBy(objCondtion0.m_sColName);
|
||||
QList<CDbOrder> listOrderBy;
|
||||
listOrderBy << objOrderBy;
|
||||
|
||||
QSqlQuery objQuery;
|
||||
if ( !m_objDb.select( "sys_trigger_info", listCondition, listOrderBy, objQuery ) )
|
||||
{
|
||||
LOGERROR( "select return non zero. %s", objQuery.lastError().databaseText().toUtf8().data() );
|
||||
m_objDb.close();
|
||||
LOGINFO("close db connect,wait next time to connect");
|
||||
return false;
|
||||
}
|
||||
while ( objQuery.next() )
|
||||
{
|
||||
SSynNoteForModel objModelNote;
|
||||
bool bConvertRet;
|
||||
objModelNote.ullActId = objQuery.value( "act_id" ).toULongLong( &bConvertRet );
|
||||
if ( false == bConvertRet )
|
||||
{
|
||||
LOGERROR( "convert ret:false" );
|
||||
continue;
|
||||
}
|
||||
int nOptType = objQuery.value( "op_type" ).toInt( &bConvertRet );
|
||||
if ( false == bConvertRet || ( nOptType < 0 || nOptType > 2 ) )
|
||||
{
|
||||
LOGERROR( "convert ret:%s, op_type:%d", bConvertRet ? "true" : "false", objModelNote.nOptType );
|
||||
continue;
|
||||
}
|
||||
objModelNote.nOptType = EModelSynOptType( nOptType );
|
||||
|
||||
objModelNote.strTableName = objQuery.value( "table_name" ).toString().toUtf8().data();
|
||||
QStringList listColumnName = objQuery.value( "key_column_name" ).toString().split( "," );
|
||||
for ( int i = 0; i < listColumnName.size(); ++i )
|
||||
{
|
||||
objModelNote.vecKeyColumnName.push_back( listColumnName[i].toUtf8().data() );
|
||||
}
|
||||
QStringList listKeyOldValue = objQuery.value( "key_old_value" ).toString().split( "," );
|
||||
for ( int i = 0; i < listKeyOldValue.size(); ++i )
|
||||
{
|
||||
objModelNote.vecKeyOldValue.push_back( listKeyOldValue[i].toUtf8().data() );
|
||||
}
|
||||
QStringList listKeyNewValue = objQuery.value( "key_new_value" ).toString().split( "," );
|
||||
for ( int i = 0; i < listKeyNewValue.size(); ++i )
|
||||
{
|
||||
objModelNote.vecKeyNewValue.push_back( listKeyNewValue[i].toUtf8().data() );
|
||||
}
|
||||
|
||||
// 由于数据库中不再有表模式和列模式这两张表,故此处从xml文件中获取subsystem_flag
|
||||
//objModelNote.unSubsystemFlag = objQuery.value( "subsystem_flag" ).toInt( &bConvertRet );
|
||||
if ( false == CDbSysInfo::getSubsystemFlagByTableName(objModelNote.strTableName,objModelNote.unSubsystemFlag) )
|
||||
{
|
||||
//LOGERROR( "获取内存表【%s】的subsystemFlag失败", objModelNote.strTableName.c_str() );
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( EModelSynOptTypeInsert == objModelNote.nOptType && objModelNote.vecKeyNewValue.size() == 0 )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( EModelSynOptTypeDelete == objModelNote.nOptType && objModelNote.vecKeyOldValue.size() == 0 )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( EModelSynOptTypeUpdate == objModelNote.nOptType
|
||||
&& ( objModelNote.vecKeyNewValue != objModelNote.vecKeyOldValue || objModelNote.vecKeyNewValue.size() == 0 ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( 0 == objModelNote.unSubsystemFlag || objModelNote.strTableName.length() == 0 )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
m_vecSynNote.push_back( objModelNote );
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -2,9 +2,9 @@
|
||||
#include <QApplication>
|
||||
#include "common/QtAppGlobalSet.h"
|
||||
#include "pub_logger_api/logger.h"
|
||||
#include "net/net_msg_bus_api/MsgBusApi.h"
|
||||
#include "net/net_msg_bus_api/CMbCommunicator.h"
|
||||
#include "mainwindow.h"
|
||||
#include "pub_utility_api/FileStyle.h"
|
||||
#include "pub_widget/PubWidgetInit.h"
|
||||
|
||||
int main( int argc, char* argv[] )
|
||||
{
|
||||
@ -12,10 +12,37 @@ int main( int argc, char* argv[] )
|
||||
|
||||
iot_public::StartLogSystem( "default", "rdb_studio" );
|
||||
QApplication a( argc, argv );
|
||||
iot_net::initMsgBus( "sfda", "sdfafds" );
|
||||
iot_net::CMbCommunicator* pCom = new iot_net::CMbCommunicator();
|
||||
delete pCom;
|
||||
iot_net::releaseMsgBus();
|
||||
|
||||
QString qss = QString();
|
||||
std::string strFullPath = iot_public::CFileStyle::getPathOfStyleFile("public.qss","zh","light");
|
||||
|
||||
QFile qssfile1(QString::fromStdString(strFullPath));
|
||||
qssfile1.open(QFile::ReadOnly);
|
||||
if (qssfile1.isOpen())
|
||||
{
|
||||
qss += QLatin1String(qssfile1.readAll());
|
||||
qssfile1.close();
|
||||
}
|
||||
|
||||
strFullPath = iot_public::CFileStyle::getPathOfStyleFile("rdb_studio.qss","zh","light");
|
||||
QFile qssfile2(QString::fromStdString(strFullPath));
|
||||
qssfile2.open(QFile::ReadOnly);
|
||||
if (qssfile2.isOpen())
|
||||
{
|
||||
qss += QLatin1String(qssfile2.readAll());
|
||||
qssfile2.close();
|
||||
}
|
||||
|
||||
if (!qss.isEmpty())
|
||||
{
|
||||
qApp->setStyleSheet(qss);
|
||||
}
|
||||
iot_public::installTranslator("zh");
|
||||
|
||||
// qApp->setFont(QFont("Microsoft YaHei",10));
|
||||
|
||||
a.setWindowIcon(QIcon(":/icons/rdb_studio.ico"));
|
||||
|
||||
MainWindow w;
|
||||
w.show();
|
||||
int nRet = a.exec();
|
||||
|
||||
@ -5,9 +5,10 @@
|
||||
#include "tablemodel.h"
|
||||
#include "CMemDictionaryM.h"
|
||||
#include "CMemTableM.h"
|
||||
#include "pub_widget/MessageBox.h"
|
||||
|
||||
MainWindow::MainWindow( QWidget* parent )
|
||||
: QMainWindow( parent )
|
||||
: CustomUiMainWindow( parent )
|
||||
, ui( new Ui::MainWindow )
|
||||
{
|
||||
ui->setupUi( this );
|
||||
@ -31,7 +32,8 @@ void MainWindow::initVariable()
|
||||
|
||||
void MainWindow::initUi()
|
||||
{
|
||||
this->setWindowTitle( "内存库工具" );
|
||||
this->setWindowTitle( tr("内存库工具") );
|
||||
CustomUiMainWindow::setAutoLayout(true);
|
||||
|
||||
//隐藏无关组件
|
||||
ui->mainToolBar->hide();
|
||||
@ -257,7 +259,7 @@ void MainWindow::slotListWidgetTableClicked( QListWidgetItem* pItem )
|
||||
}
|
||||
else
|
||||
{
|
||||
QMessageBox::warning( this, tr( "Error" ), tr( "打开表失败!" ) );
|
||||
N_MessageBox::warning( this, tr( "Error" ), tr( "打开表失败!" ) );
|
||||
}
|
||||
}
|
||||
|
||||
@ -273,12 +275,12 @@ void MainWindow::slotPushButtonAddFilterClicked()
|
||||
{
|
||||
if ( ui->comboBox_column->currentText() == "" )
|
||||
{
|
||||
QMessageBox::warning( 0, "提示", "列名不能为空" );
|
||||
N_MessageBox::warning( 0, "提示", "列名不能为空" );
|
||||
return;
|
||||
}
|
||||
if ( ui->lineEdit_in->text() == "" )
|
||||
{
|
||||
QMessageBox::warning( 0, "提示", "筛选内容不能为空" );
|
||||
N_MessageBox::warning( 0, "提示", "筛选内容不能为空" );
|
||||
return;
|
||||
}
|
||||
|
||||
@ -300,7 +302,7 @@ void MainWindow::slotPushButtonDeleteFilterClicked()
|
||||
{
|
||||
if ( ui->tableWidget_filter->selectedItems().count() <= 0 )
|
||||
{
|
||||
QMessageBox::warning( 0, "提示", "请先选择一行" );
|
||||
N_MessageBox::warning( 0, "提示", "请先选择一行" );
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@ -6,6 +6,7 @@
|
||||
#include <QListWidget>
|
||||
#include "CMemTableM.h"
|
||||
#include "rdb_api/RdbTableMng.h"
|
||||
#include "pub_widget/CustomMainWindow.h"
|
||||
|
||||
namespace Ui
|
||||
{
|
||||
@ -21,7 +22,7 @@ using namespace std;
|
||||
using namespace iot_dbms;
|
||||
using namespace iot_public;
|
||||
|
||||
class MainWindow : public QMainWindow
|
||||
class MainWindow : public CustomUiMainWindow
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
|
||||
@ -19,16 +19,16 @@
|
||||
<number>2</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>2</number>
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>2</number>
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>2</number>
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>2</number>
|
||||
<number>9</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QTabWidget" name="tabWidget">
|
||||
@ -451,7 +451,7 @@
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>911</width>
|
||||
<height>25</height>
|
||||
<height>23</height>
|
||||
</rect>
|
||||
</property>
|
||||
</widget>
|
||||
|
||||
@ -22,6 +22,7 @@ DEFINES += QT_DEPRECATED_WARNINGS
|
||||
# You can also select to disable deprecated APIs only up to a certain version of Qt.
|
||||
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
|
||||
|
||||
RC_ICONS = icons/rdb_studio.ico
|
||||
|
||||
SOURCES += \
|
||||
main.cpp \
|
||||
@ -42,9 +43,11 @@ FORMS += \
|
||||
LIBS += \
|
||||
-lrdb_api \
|
||||
-lpub_logger_api \
|
||||
-lnet_msg_bus_api \
|
||||
-llog4cplus \
|
||||
-lboost_system
|
||||
-lboost_system \
|
||||
-lpub_widget \
|
||||
-lpub_utility_api
|
||||
|
||||
|
||||
COMMON_PRI=$$PWD/../../common.pri
|
||||
exists($$COMMON_PRI) {
|
||||
|
||||
@ -7,5 +7,6 @@
|
||||
<file>icons/rightArrow.png</file>
|
||||
<file>icons/save.png</file>
|
||||
<file>icons/undo.png</file>
|
||||
<file>icons/rdb_studio.ico</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
||||
@ -20,6 +20,13 @@ CTsdbConn::CTsdbConn(const char *pchHost, int nPort, const char *pchDb,
|
||||
m_pImp = new CTsdbConnImp(pchHost, nPort, pchDb, pchUser, pchPwd);
|
||||
}
|
||||
|
||||
CTsdbConn::CTsdbConn(const STsdbConnParam &stConnParam)
|
||||
{
|
||||
m_pImp = new CTsdbConnImp(stConnParam.strIP.c_str(),stConnParam.nPort,
|
||||
stConnParam.strDbName.c_str(),stConnParam.strUserName.c_str(),
|
||||
stConnParam.strUserPassword.c_str());
|
||||
}
|
||||
|
||||
CTsdbConn::~CTsdbConn()
|
||||
{
|
||||
delete m_pImp;
|
||||
|
||||
@ -133,7 +133,13 @@ CTsdbConnPtr getOneUseableConn(bool bLocalDomain)
|
||||
if (pchIp)
|
||||
{
|
||||
//< todo 端口、数据库名、用户名、密码都使用默认值
|
||||
ptrConn.reset(new CTsdbConn(pchIp));
|
||||
/* 为以后搜索方便,保留此注释 EMS_DEFAULT_DATABASE
|
||||
* 暂时使用了首链接的数据库名和密码,用户名与数据库名相同
|
||||
*/
|
||||
ptrConn.reset(new CTsdbConn(pchIp,INFLUXDB_DEFAULT_PORT,
|
||||
stFirstDbInfo.strServiceName.c_str(),
|
||||
stFirstDbInfo.strServiceName.c_str(),
|
||||
stFirstDbInfo.strUserPassword.c_str()));
|
||||
|
||||
//< 超时时间使用默认值
|
||||
if (ptrConn->pingServer())
|
||||
|
||||
@ -66,17 +66,20 @@ void tsdb_api_test()
|
||||
LOGINFO("\n******** Complete ********\n");
|
||||
|
||||
{
|
||||
std::string strResult;
|
||||
|
||||
LOGINFO("\n\n******** Test getOneUseableConn() ********");
|
||||
iot_dbms::CTsdbConnPtr ptrConn = iot_dbms::getOneUseableConn(true);
|
||||
if (!ptrConn)
|
||||
{
|
||||
LOGINFO("getOneUseableConn() return NULL !")
|
||||
LOGINFO("getOneUseableConn() return NULL !");
|
||||
}
|
||||
LOGINFO("\n******** Complete ********\n");
|
||||
|
||||
|
||||
//< 不使用getOneUseableConn()返回的正式库测试
|
||||
ptrConn.reset(new iot_dbms::CTsdbConn("127.0.0.1", -1, "ykn_test", "", ""));
|
||||
ptrConn.reset(new iot_dbms::CTsdbConn("127.0.0.1", -1, "ykn_test",
|
||||
EMS_DEFAULT_DATABASE, EMS_DEFAULT_PASSWD));
|
||||
|
||||
LOGINFO("\n\n******** Test pingServer() ********");
|
||||
if (!ptrConn->pingServer(1000))
|
||||
@ -86,6 +89,31 @@ void tsdb_api_test()
|
||||
}
|
||||
LOGINFO("\n******** Complete ********\n");
|
||||
|
||||
LOGINFO( "\n\n******** Test drop user ********" );
|
||||
if ( !ptrConn->doQuery( "drop user iscs6000", &strResult ))
|
||||
{
|
||||
//< 当开启了用户认证,又没有admin级别用户的话,只允许执行新建admin级别用户的操作
|
||||
ptrConn->doQuery( QString("create user %1 with password '%2' with all privileges").arg(EMS_DEFAULT_DATABASE).arg(EMS_DEFAULT_PASSWD), &strResult );
|
||||
}
|
||||
else
|
||||
{
|
||||
LOGINFO( "drop user sucess, result: %s", strResult.c_str());
|
||||
}
|
||||
LOGINFO( "\n******** Complete ********\n" );
|
||||
|
||||
LOGINFO( "\n\n******** Test create user ********" );
|
||||
//< 重复建立同名、同密码用户会成功,如果同名但密码不同则会失败
|
||||
if ( !ptrConn->doQuery(QString("create user %1 with password '%2' with all privileges").arg(EMS_DEFAULT_DATABASE).arg(EMS_DEFAULT_PASSWD), &strResult ))
|
||||
{
|
||||
LOGERROR( "create user return false !" );
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
LOGINFO( "create user sucess, result: %s", strResult.c_str());
|
||||
}
|
||||
LOGINFO( "\n******** Complete ********\n" );
|
||||
|
||||
LOGINFO("\n\n******** Test createDatabase() ********");
|
||||
if (!ptrConn->createDatabase("ykn_test", 1000))
|
||||
{
|
||||
@ -104,8 +132,6 @@ void tsdb_api_test()
|
||||
|
||||
LOGINFO("\n\n******** Test doQuery() ********");
|
||||
{
|
||||
std::string strResult;
|
||||
|
||||
if (!ptrConn->doQuery("select * from ai_sample_result", &strResult, 1000))
|
||||
{
|
||||
LOGERROR("doQuery() return false !");
|
||||
@ -127,7 +153,6 @@ void tsdb_api_test()
|
||||
LOGERROR("doQuery() return false !");
|
||||
}
|
||||
LOGINFO("strResult == \n%s", strResult.c_str());
|
||||
|
||||
}
|
||||
LOGINFO("\n******** Complete ********\n");
|
||||
|
||||
@ -138,6 +163,17 @@ void tsdb_api_test()
|
||||
}
|
||||
LOGINFO("\n******** Complete ********\n");
|
||||
|
||||
// LOGINFO( "\n\n******** Test drop user ********" );
|
||||
// if ( !ptrConn->doQuery( "drop user iscs6000", &strResult ))
|
||||
// {
|
||||
// LOGERROR( "drop user return false !" );
|
||||
// return;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// LOGINFO( "drop user sucess, result: %s", strResult.c_str());
|
||||
// }
|
||||
// LOGINFO( "\n******** Complete ********\n" );
|
||||
}
|
||||
|
||||
LOGINFO("\n\n******** Test releaseTsdbApi() ********");
|
||||
|
||||
@ -130,10 +130,14 @@ bool CNodeMng::init()
|
||||
}
|
||||
|
||||
//< todo 端口号、数据库名、用户名、密码 暂时写死
|
||||
/* 为以后搜索方便,保留此注释
|
||||
* 取消默认EMS_DEFAULT_DATABASE,时序库使用系统建模中关系库的首链接的数据库配置
|
||||
* 时序库用户名用的数据库名称
|
||||
*/
|
||||
CNodeThreadPtr ptrNodeThread(new CNodeThread(stDbNodeInfo.strName,
|
||||
strIpA, strIpB,
|
||||
8086, "iscs6000",
|
||||
"", ""));
|
||||
8086, stFirstDbInfo.strServiceName,
|
||||
stFirstDbInfo.strServiceName, stFirstDbInfo.strUserPassword));
|
||||
|
||||
m_vecLocalThreads.push_back(ptrNodeThread);
|
||||
|
||||
@ -169,10 +173,14 @@ bool CNodeMng::init()
|
||||
}
|
||||
|
||||
//< todo 端口号、数据库名、用户名、密码 暂时写死
|
||||
/* 为以后搜索方便,保留此注释
|
||||
* 取消默认EMS_DEFAULT_DATABASE,时序库使用系统建模中关系库的首链接的数据库配置
|
||||
* 时序库用户名用的数据库名称
|
||||
*/
|
||||
CNodeThreadPtr ptrNodeThread(new CNodeThread(stDbNodeInfo.strName,
|
||||
strIpA, strIpB,
|
||||
8086, "iscs6000",
|
||||
"", ""));
|
||||
8086, stFirstDbInfo.strServiceName,
|
||||
stFirstDbInfo.strServiceName, stFirstDbInfo.strUserPassword));
|
||||
|
||||
m_vecRemoteThreads.push_back(ptrNodeThread);
|
||||
|
||||
|
||||
@ -198,7 +198,9 @@ void CTsdbSaveApiImp::execute()
|
||||
objMbMsg.setPara2(m_nDomainID); //< 域ID
|
||||
|
||||
//< 注意: 发送后消息内容被清空
|
||||
const bool bRc = m_objComm.sendMsgToDomain(objMbMsg, -1); //< 发本域
|
||||
//const bool bRc = m_objComm.sendMsgToDomain(objMbMsg, -1); //< 发本域
|
||||
//为了提高大数据量下的处理能力,每个应用部署一个tsdb_save服务
|
||||
const bool bRc = m_objComm.sendMsgToHost(objMbMsg); //< 发本机
|
||||
|
||||
if (bRc)
|
||||
{
|
||||
|
||||
357
platform/src/example/tsdbDataSim/MainWindow.cpp
Normal file
357
platform/src/example/tsdbDataSim/MainWindow.cpp
Normal file
@ -0,0 +1,357 @@
|
||||
#include "MainWindow.h"
|
||||
#include "ui_MainWindow.h"
|
||||
#include <QDebug>
|
||||
#include <QMessageBox>
|
||||
#include <tsdb_api/CTsdbConn.h>
|
||||
#include <tsdb_api/TsdbApi.h>
|
||||
#include "dataWorker.h"
|
||||
#include "db_his_query_api/DbHisQueryApi.h"
|
||||
|
||||
#include <QThreadPool>
|
||||
using namespace iot_dbms;
|
||||
MainWindow::MainWindow(QWidget *parent) :
|
||||
QMainWindow(parent),
|
||||
ui(new Ui::MainWindow)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
dataWorker *worker = new dataWorker;
|
||||
worker->moveToThread(&workerThread);
|
||||
connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);
|
||||
|
||||
connect(this, &MainWindow::operate, worker, &dataWorker::doWork);
|
||||
connect(worker, &dataWorker::resultReady, this, &MainWindow::handleResults);
|
||||
|
||||
connect(this, &MainWindow::startTest, worker, &dataWorker::doTest);
|
||||
connect(worker, &dataWorker::testResultReady, this, &MainWindow::handleTestResults);
|
||||
|
||||
connect(this, &MainWindow::insertEvent, worker, &dataWorker::doInsertEvent);
|
||||
connect(worker, &dataWorker::InsertEventResultReady, this, &MainWindow::handleEventInsertResults);
|
||||
|
||||
|
||||
connect(this, &MainWindow::deleteWork, worker, &dataWorker::doDel);
|
||||
connect(worker, &dataWorker::deleteResultReady, this, &MainWindow::handleDeleteResults);
|
||||
|
||||
connect(worker, &dataWorker::onErrMsg, this, &MainWindow::onErrMsg);
|
||||
connect(worker, &dataWorker::onStatus, this, &MainWindow::onStatus);
|
||||
connect(worker, &dataWorker::onTestStatus, this, &MainWindow::onTestStatus);
|
||||
connect(worker, &dataWorker::onAddTestRow, this, &MainWindow::onAddTestRow);
|
||||
|
||||
|
||||
|
||||
|
||||
workerThread.start();
|
||||
ui->label_status->setHidden(true);
|
||||
|
||||
auto date = ui->calendarWidget_startDate->selectedDate();
|
||||
date.setDate(date.addYears(-3).year(),date.month(),date.day());
|
||||
ui->calendarWidget_startDate->setSelectedDate(date);
|
||||
|
||||
date = ui->calendarWidget_test->selectedDate();
|
||||
date.setDate(date.addYears(-2).year(),date.month(),date.day());
|
||||
ui->calendarWidget_test->setSelectedDate(date);
|
||||
|
||||
// QThreadPool::globalInstance()->setMaxThreadCount(10);
|
||||
|
||||
}
|
||||
|
||||
MainWindow::~MainWindow()
|
||||
{
|
||||
workerThread.quit();
|
||||
workerThread.wait();
|
||||
|
||||
delete ui;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
QString MainWindow::getPointType()
|
||||
{
|
||||
if( ui->comboBox_type->currentText() == tr("模拟量")){
|
||||
return QString("ai_sample_result");
|
||||
}else if( ui->comboBox_type->currentText() == tr("累积量")){
|
||||
return QString("acc_sample_result");
|
||||
}else if( ui->comboBox_type->currentText() == tr("混合量")){
|
||||
return QString("mix_sample_result");
|
||||
}else if( ui->comboBox_type->currentText() == tr("数字量")){
|
||||
return QString("di_sample_result");
|
||||
}else
|
||||
return "";
|
||||
}
|
||||
|
||||
int MainWindow::getDeviatType()
|
||||
{
|
||||
if (ui->comboBox_deviatType->currentText() == tr("左边")){
|
||||
return -1;
|
||||
}else if (ui->comboBox_deviatType->currentText() == tr("两边")){
|
||||
return 0;
|
||||
}else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void MainWindow::on_pushButton_insert_clicked()
|
||||
{
|
||||
if(QMessageBox::question(this,"提醒","是否插入") != QMessageBox::Yes)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
QString address = ui->lineEdit_addr->text();
|
||||
QStringList listPoint = ui->plainTextEdit_point->toPlainText().simplified().split(',');
|
||||
listPoint.removeAll("");
|
||||
for(int i = 0; i < listPoint.size(); i++)
|
||||
{
|
||||
listPoint[i] = listPoint[i].trimmed();
|
||||
}
|
||||
QString pointType = getPointType();
|
||||
quint64 interval = ui->spinBox_interval->value() * 1000; //ms
|
||||
int deviatProb = ui->spinBox_deviatProb->value();
|
||||
double normalBase = ui->doubleSpinBox_base->value();
|
||||
double normalLength = ui->doubleSpinBox_length->value();
|
||||
quint64 starttime = QDateTime(ui->calendarWidget_startDate->selectedDate(),ui->timeEdit_start->time()).toMSecsSinceEpoch();
|
||||
quint64 endtime = QDateTime(ui->calendarWidget_endDate->selectedDate(),ui->timeEdit_end->time()).toMSecsSinceEpoch(); // 结束日期加一天
|
||||
int deviatType = getDeviatType();
|
||||
|
||||
bool isDeleteInterval = ui->checkBox_delete->isChecked();
|
||||
bool isDeleteAll = ui->checkBox_delAll->isChecked();
|
||||
bool isMT = ui->checkBox_mt->isChecked();
|
||||
emit operate(listPoint,address,pointType,interval,deviatProb,normalBase,normalLength,starttime,endtime,deviatType,isDeleteInterval,isDeleteAll,isMT);
|
||||
ui->pushButton_insert->setEnabled(false);
|
||||
ui->pushButton_delete->setEnabled(false);
|
||||
ui->label_status->setHidden(false);
|
||||
}
|
||||
|
||||
void MainWindow::onErrMsg(const QString &msg)
|
||||
{
|
||||
QMessageBox::critical(this,"提醒",msg);
|
||||
}
|
||||
|
||||
void MainWindow::onStatus(const QString &msg)
|
||||
{
|
||||
ui->label_status->setText(msg);
|
||||
}
|
||||
|
||||
void MainWindow::onTestStatus(const QString &msg)
|
||||
{
|
||||
ui->plainTextEdit_test_result->appendPlainText(msg);
|
||||
}
|
||||
|
||||
void MainWindow::onAddTestRow(const QStringList &newRow)
|
||||
{
|
||||
ui->tableWidget->insertRow(ui->tableWidget->rowCount());
|
||||
QString newLine;
|
||||
for(int i = 0; i < newRow.size(); i++)
|
||||
{
|
||||
ui->tableWidget->setItem(ui->tableWidget->rowCount()-1, i, new QTableWidgetItem(newRow.at(i)));
|
||||
newLine += newRow.at(i) + ",";
|
||||
}
|
||||
newLine.chop(1);
|
||||
ui->plainTextEdit_test_result->appendPlainText(newLine);
|
||||
ui->tableWidget->resizeColumnsToContents();
|
||||
}
|
||||
|
||||
void MainWindow::on_comboBox_type_currentTextChanged(const QString &arg1)
|
||||
{
|
||||
if("数字量" == arg1)
|
||||
{
|
||||
ui->groupBox->setHidden(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
ui->groupBox->setHidden(false);
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::handleResults(const QString &msg, bool result) {
|
||||
ui->label_status->setHidden(true);
|
||||
|
||||
if(result)
|
||||
{
|
||||
QMessageBox::information(this,"提醒","插入成功");
|
||||
}
|
||||
else
|
||||
{
|
||||
onErrMsg(QString("插入失败:") + msg);
|
||||
}
|
||||
ui->pushButton_insert->setEnabled(true);
|
||||
ui->pushButton_delete->setEnabled(true);
|
||||
|
||||
}
|
||||
|
||||
void MainWindow::handleTestResults(const QString &msg, bool result)
|
||||
{
|
||||
if(result)
|
||||
{
|
||||
QMessageBox::information(this,"提醒","测试结束");
|
||||
}
|
||||
else
|
||||
{
|
||||
onErrMsg(QString("测试失败:") + msg);
|
||||
}
|
||||
ui->pushButton_start_test->setEnabled(true);
|
||||
}
|
||||
|
||||
void MainWindow::handleDeleteResults(const QString &msg, bool result)
|
||||
{
|
||||
ui->label_status->setHidden(true);
|
||||
|
||||
if(result)
|
||||
{
|
||||
QMessageBox::information(this,"提醒","删除成功");
|
||||
}
|
||||
else
|
||||
{
|
||||
onErrMsg(QString("删除失败:") + msg);
|
||||
}
|
||||
ui->pushButton_insert->setEnabled(true);
|
||||
ui->pushButton_delete->setEnabled(true);
|
||||
}
|
||||
|
||||
void MainWindow::handleEventInsertResults(const QString &msg, bool result)
|
||||
{
|
||||
if(result)
|
||||
{
|
||||
QMessageBox::information(this,"提醒","生成数据库文件已放至同目录outEvent.sql");
|
||||
}
|
||||
else
|
||||
{
|
||||
onErrMsg(QString("插入失败:") + msg);
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::on_pushButton_delete_clicked()
|
||||
{
|
||||
if(QMessageBox::question(this,"提醒","是否删除") != QMessageBox::Yes)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
QString address = ui->lineEdit_addr->text();
|
||||
QStringList listPoint = ui->plainTextEdit_point->toPlainText().simplified().split(',');
|
||||
listPoint.removeAll("");
|
||||
for(int i = 0; i < listPoint.size(); i++)
|
||||
{
|
||||
listPoint[i] = listPoint[i].trimmed();
|
||||
}
|
||||
QString pointType = getPointType();
|
||||
|
||||
quint64 starttime = QDateTime(ui->calendarWidget_startDate->selectedDate(),ui->timeEdit_start->time()).toMSecsSinceEpoch();
|
||||
quint64 endtime = QDateTime(ui->calendarWidget_endDate->selectedDate(),ui->timeEdit_end->time()).toMSecsSinceEpoch(); // 结束日期加一天
|
||||
bool isDeleteAll = ui->checkBox_delAll->isChecked();
|
||||
|
||||
emit deleteWork(address,pointType,listPoint,starttime,endtime,isDeleteAll);
|
||||
|
||||
ui->pushButton_insert->setEnabled(false);
|
||||
ui->pushButton_delete->setEnabled(false);
|
||||
ui->label_status->setHidden(false);
|
||||
|
||||
}
|
||||
|
||||
void MainWindow::on_pushButton_insert_event_clicked()
|
||||
{
|
||||
if(QMessageBox::question(this,"提醒","是否插入历史数据") != QMessageBox::Yes)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
QStringList listPoint = ui->plainTextEdit_point_event->toPlainText().simplified().split(',');
|
||||
listPoint.removeAll("");
|
||||
for(int i = 0; i < listPoint.size(); i++)
|
||||
{
|
||||
listPoint[i] = listPoint[i].trimmed();
|
||||
}
|
||||
|
||||
quint64 starttime = QDateTime(ui->calendarWidget_startDate_event->selectedDate(),ui->timeEdit_start_event->time()).toMSecsSinceEpoch();
|
||||
quint64 endtime = QDateTime(ui->calendarWidget_endDate_event->selectedDate(),ui->timeEdit_end_event->time()).toMSecsSinceEpoch(); // 结束日期加一天
|
||||
|
||||
emit insertEvent(
|
||||
QStringList()
|
||||
<< QString::number( ui->spinBox_alm_type->value() ) // 0
|
||||
<< QString::number( ui->spinBox_alm_status->value() ) // 1
|
||||
<< QString::number( ui->spinBox_alm_style->value() ) // 2
|
||||
<< QString::number( ui->spinBox_location_id->value() ) // 3
|
||||
<< QString::number( ui->spinBox_priority->value() ) // 4
|
||||
<< QString::number( ui->spinBox_sub_system->value() ) // 5
|
||||
<< QString::number( ui->spinBox_dev_type->value() ) //6
|
||||
<< QString::number( ui->spinBox_region_id->value() ) // 7
|
||||
<< QString::number( ui->spinBox_interval_event->value() ) // 8
|
||||
|
||||
,
|
||||
listPoint,ui->lineEdit_content->text(),starttime,endtime);
|
||||
}
|
||||
|
||||
void MainWindow::on_pushButton_delete_event_clicked()
|
||||
{
|
||||
onErrMsg(tr("该功能未实现"));
|
||||
}
|
||||
|
||||
|
||||
|
||||
void MainWindow::on_checkBox_delAll_clicked(bool checked)
|
||||
{
|
||||
if(checked)
|
||||
{
|
||||
ui->checkBox_delete->setChecked(false);
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::on_checkBox_delete_clicked(bool checked)
|
||||
{
|
||||
if(checked)
|
||||
{
|
||||
ui->checkBox_delAll->setChecked(false);
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::on_pushButton_start_test_clicked()
|
||||
{
|
||||
if(QMessageBox::question(this,"提醒","是否查询") != QMessageBox::Yes)
|
||||
{
|
||||
|
||||
return;
|
||||
}
|
||||
ui->plainTextEdit_test_result->clear();
|
||||
QString headerLine;
|
||||
headerLine += QString("结果") + ",";
|
||||
headerLine += QString("规模") + ",";
|
||||
headerLine += QString("周期") + ",";
|
||||
headerLine += QString("开始日期") + ",";
|
||||
headerLine += QString("结果日期") + ",";
|
||||
headerLine += QString("间隔(s)") + ",";
|
||||
headerLine += QString("结果数量") + ",";
|
||||
headerLine += QString("方法") + ",";
|
||||
headerLine += QString("用时(ms)");
|
||||
ui->plainTextEdit_test_result->appendPlainText(headerLine);
|
||||
|
||||
|
||||
while(ui->tableWidget->rowCount() > 0)
|
||||
{
|
||||
ui->tableWidget->removeRow(0);
|
||||
}
|
||||
|
||||
// 一些参数预先设定
|
||||
int timeout = ui->spinBox_timeout->value();
|
||||
int base = ui->spinBox_base->value();
|
||||
int facor = ui->spinBox_factor->value();
|
||||
|
||||
QString address = ui->lineEdit_addr_test->text();
|
||||
qint64 starttime = QDateTime(ui->calendarWidget_test->selectedDate(),QTime(0,0)).toMSecsSinceEpoch();
|
||||
|
||||
QStringList listPoint = ui->plainTextEdit_point_test->toPlainText().simplified().split(',');
|
||||
listPoint.removeAll("");
|
||||
for(int i = 0; i < listPoint.size(); i++)
|
||||
{
|
||||
listPoint[i] = listPoint[i].trimmed();
|
||||
}
|
||||
|
||||
// todo 这里时间间隔和计算方法以后再做,这里固定填充了
|
||||
|
||||
emit startTest(timeout,base,facor,listPoint,starttime,address);
|
||||
|
||||
ui->pushButton_start_test->setEnabled(false);
|
||||
|
||||
}
|
||||
86
platform/src/example/tsdbDataSim/MainWindow.h
Normal file
86
platform/src/example/tsdbDataSim/MainWindow.h
Normal file
@ -0,0 +1,86 @@
|
||||
#ifndef MAINWINDOW_H
|
||||
#define MAINWINDOW_H
|
||||
|
||||
#include <QMainWindow>
|
||||
#include <QThread>
|
||||
|
||||
namespace Ui
|
||||
{
|
||||
class MainWindow;
|
||||
}
|
||||
|
||||
class MainWindow : public QMainWindow
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit MainWindow(QWidget *parent = 0);
|
||||
~MainWindow();
|
||||
|
||||
|
||||
private slots:
|
||||
|
||||
QString getPointType();
|
||||
int getDeviatType();
|
||||
void on_pushButton_insert_clicked();
|
||||
|
||||
void on_comboBox_type_currentTextChanged(const QString &arg1);
|
||||
|
||||
void on_pushButton_delete_clicked();
|
||||
|
||||
void on_pushButton_insert_event_clicked();
|
||||
|
||||
void on_pushButton_delete_event_clicked();
|
||||
|
||||
|
||||
void on_checkBox_delAll_clicked(bool checked);
|
||||
|
||||
void on_checkBox_delete_clicked(bool checked);
|
||||
|
||||
void on_pushButton_start_test_clicked();
|
||||
|
||||
public slots:
|
||||
void handleResults(const QString &msg,bool result =true);
|
||||
void handleTestResults(const QString &msg,bool result =true);
|
||||
void handleDeleteResults(const QString &msg,bool result =true);
|
||||
void handleEventInsertResults(const QString &msg,bool result =true);
|
||||
|
||||
|
||||
void onErrMsg(const QString &msg);
|
||||
void onStatus(const QString &msg);
|
||||
void onTestStatus(const QString &msg);
|
||||
void onAddTestRow(const QStringList &newRow);
|
||||
|
||||
|
||||
signals:
|
||||
void operate(
|
||||
QStringList listpoint,
|
||||
QString address,
|
||||
QString pointType,
|
||||
quint64 interval,
|
||||
int deviatProb,
|
||||
double normalBase,
|
||||
double normalLength,
|
||||
quint64 starttime,
|
||||
quint64 endtime,
|
||||
int deviatType,
|
||||
bool isDeleteInterval,
|
||||
bool isDeleteAll,
|
||||
bool isMT);
|
||||
void startTest(
|
||||
int,int,int,QStringList,qint64,QString);
|
||||
|
||||
void deleteWork(QString address,QString pointType,QStringList listPoint,quint64 starttime,quint64 endtime,bool isDeleteAll);
|
||||
|
||||
void insertEvent(QStringList listFixedArgs,
|
||||
QStringList listPoints,
|
||||
QString content,quint64 starttime,quint64 endtime
|
||||
);
|
||||
|
||||
private:
|
||||
Ui::MainWindow *ui;
|
||||
QThread workerThread;
|
||||
};
|
||||
|
||||
|
||||
#endif // MAINWINDOW_H
|
||||
2035
platform/src/example/tsdbDataSim/MainWindow.ui
Normal file
2035
platform/src/example/tsdbDataSim/MainWindow.ui
Normal file
File diff suppressed because it is too large
Load Diff
114
platform/src/example/tsdbDataSim/RandUtil.h
Normal file
114
platform/src/example/tsdbDataSim/RandUtil.h
Normal file
@ -0,0 +1,114 @@
|
||||
#pragma once
|
||||
|
||||
|
||||
#include <QtGlobal>
|
||||
#include <QtCore>
|
||||
|
||||
#include "boost/uuid/random_generator.hpp"
|
||||
#include "boost/regex.hpp"
|
||||
|
||||
#include <random>
|
||||
|
||||
// 随机生成一个大于 0 小于 10000 的浮点数
|
||||
inline double generateRandomNumber() {
|
||||
std::random_device rnd;
|
||||
std::mt19937 gen(rnd());
|
||||
std::uniform_real_distribution<> dist(0, 10000);
|
||||
return dist(gen);
|
||||
}
|
||||
|
||||
inline quint64 quaRand(){ return qrand() * qrand() * qrand();}
|
||||
|
||||
inline bool boolGen(int trueProb = 500){
|
||||
if(trueProb == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else if (trueProb == 1000)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
int result = qrand() % 1000;
|
||||
if( result < trueProb)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
return false;
|
||||
}
|
||||
inline double doubleGen(double base,double length)
|
||||
{
|
||||
quint64 lengthx100k = length * 100000;
|
||||
|
||||
return base + (quaRand() % lengthx100k ) /100000.0;
|
||||
}
|
||||
|
||||
#define DeviateMax 1000000
|
||||
|
||||
inline double doubleGenController(double base,double length,int deviatProb,int deviatType)
|
||||
{
|
||||
if( boolGen(deviatProb)){
|
||||
// 偏离代码
|
||||
if(deviatType == 0)
|
||||
{
|
||||
if(boolGen())
|
||||
return doubleGen(0,base);
|
||||
else
|
||||
return doubleGen(base + length,DeviateMax - (base + length));
|
||||
|
||||
}else if(deviatType == -1)
|
||||
{
|
||||
return doubleGen(0,base);
|
||||
}else if(deviatType == 1)
|
||||
{
|
||||
return doubleGen(base + length,DeviateMax);
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
}else{
|
||||
return doubleGen(base,length);
|
||||
}
|
||||
}
|
||||
|
||||
void generateUuidBase64(std::string &strOut)
|
||||
{
|
||||
boost::uuids::detail::random_provider randomGen;
|
||||
boost::uint8_t baUuid[18];
|
||||
boost::uint8_t baBase64[24];
|
||||
|
||||
//< 填充随机数
|
||||
randomGen.get_random_bytes(&baUuid, 16);
|
||||
|
||||
//< 最后填充 0
|
||||
baUuid[16] = 0;
|
||||
baUuid[17] = 0;
|
||||
|
||||
//< 编码为 base64
|
||||
{
|
||||
static const char *szBase64Array = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||
|
||||
boost::uint8_t *pData = baUuid;
|
||||
int nDestIndex = 0;
|
||||
for (int i = 0; i < 18; i = i + 3)
|
||||
{
|
||||
boost::uint32_t nData = ((boost::uint32_t) *pData << 16) +
|
||||
((boost::uint32_t) *(pData + 1) << 8) + (*(pData + 2));
|
||||
baBase64[nDestIndex] = szBase64Array[nData >> 18];
|
||||
baBase64[nDestIndex + 1] = szBase64Array[nData >> 12 & (boost::uint32_t) 0x3f];
|
||||
baBase64[nDestIndex + 2] = szBase64Array[nData >> 6 & (boost::uint32_t) 0x3f];
|
||||
baBase64[nDestIndex + 3] = szBase64Array[nData & (boost::uint32_t) 0x3f];
|
||||
pData = pData + 3;
|
||||
nDestIndex = nDestIndex + 4;
|
||||
}
|
||||
baBase64[22] = 0;
|
||||
baBase64[23] = 0;
|
||||
}
|
||||
|
||||
//< 输出
|
||||
strOut.assign((const char *) baBase64, 22);
|
||||
strOut.shrink_to_fit();
|
||||
}
|
||||
|
||||
683
platform/src/example/tsdbDataSim/dataWorker.cpp
Normal file
683
platform/src/example/tsdbDataSim/dataWorker.cpp
Normal file
@ -0,0 +1,683 @@
|
||||
#include "dataWorker.h"
|
||||
#include "RandUtil.h"
|
||||
#include <tsdb_api/CTsdbConn.h>
|
||||
#include <tsdb_api/TsdbApi.h>
|
||||
#include <QDebug>
|
||||
#include <QElapsedTimer>
|
||||
#include <QThread>
|
||||
#include <QtConcurrent>
|
||||
#include <functional>
|
||||
#include "db_his_query_api/DbHisQueryApi.h"
|
||||
|
||||
enum EnTimeInterval
|
||||
{
|
||||
TI_NULL = 0, //< 无,不使用,
|
||||
TI_DAY, //< 间隔为小时,停止时间为24小时后
|
||||
TI_WEEK, //< 间隔为天,停止时间为7天后
|
||||
TI_MONTH, //< 间隔为天,停止时间为30天后
|
||||
TI_YEAR, //< 间隔为30天,停止时间为12个30天后
|
||||
};
|
||||
|
||||
void getTimeInteval(EnTimeInterval emTI,const qint64& starttime,qint64& inteval,qint64 & endtime)
|
||||
{
|
||||
switch (emTI) {
|
||||
case TI_DAY:
|
||||
inteval = 3600l * 1000l;
|
||||
endtime = starttime + (inteval * 24l);
|
||||
break;
|
||||
case TI_WEEK:
|
||||
inteval = 24l * 3600l * 1000l;
|
||||
endtime = starttime + (inteval * 7l);
|
||||
break;
|
||||
case TI_MONTH:
|
||||
inteval = 24l * 3600l * 1000l;
|
||||
endtime = starttime + (inteval * 30l);
|
||||
break;
|
||||
case TI_YEAR:
|
||||
inteval = 30ll * 24ll * 3600000ll;
|
||||
endtime = starttime + (inteval * 12ll);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
//< 通过 EnComputeMethod 获取查询的字符串
|
||||
static QString getStrFromCM(iot_dbms::EnComputeMethod enCM)
|
||||
{
|
||||
switch (enCM)
|
||||
{
|
||||
case iot_dbms::CM_MAX:
|
||||
return "最大值";
|
||||
case iot_dbms::CM_MIN:
|
||||
return "最小值";
|
||||
case iot_dbms::CM_LAST:
|
||||
return "瞬时值";
|
||||
case iot_dbms::CM_MEAN:
|
||||
return "平均值";
|
||||
case iot_dbms::CM_NULL:
|
||||
return "差值"; // TODO 这里用来临时用来占位差值
|
||||
|
||||
}
|
||||
return "无方法";
|
||||
}
|
||||
|
||||
//< 通过 EnComputeMethod 获取查询的字符串
|
||||
static QString getStrFromTI(EnTimeInterval enTI)
|
||||
{
|
||||
switch (enTI)
|
||||
{
|
||||
case TI_DAY:
|
||||
return "日";
|
||||
case TI_WEEK:
|
||||
return "周";
|
||||
case TI_MONTH:
|
||||
return "月";
|
||||
case TI_YEAR:
|
||||
return "年";
|
||||
}
|
||||
return "无时间";
|
||||
}
|
||||
|
||||
const int RETRY_TIME = 10;
|
||||
void dataWorker::doTest(int timeout, int base, int factor, QStringList listpoint, qint64 starttime, QString address)
|
||||
{
|
||||
|
||||
QList<iot_dbms::EnComputeMethod> listCM;
|
||||
listCM << iot_dbms::CM_NULL << iot_dbms::CM_MAX << iot_dbms::CM_MIN << iot_dbms::CM_LAST << iot_dbms::CM_MEAN;
|
||||
|
||||
QList<EnTimeInterval> listTI;
|
||||
listTI << TI_DAY << TI_WEEK<< TI_MONTH<< TI_YEAR;
|
||||
// listTI << TI_YEAR;
|
||||
|
||||
|
||||
|
||||
iot_dbms::CTsdbConn conn(address.toStdString().c_str());
|
||||
if(!conn.pingServer())
|
||||
{
|
||||
emit testResultReady(tr("无法连接数据库"),false);
|
||||
}
|
||||
|
||||
qint64 timeoutMs = timeout * 1000l;
|
||||
|
||||
|
||||
|
||||
// a lot of loop
|
||||
// loop 1 listpoint size
|
||||
for(size_t pointSize = base; pointSize < listpoint.size(); pointSize += factor){
|
||||
QList<EnTimeInterval> ::const_iterator itTI;
|
||||
// loop 2 time interval
|
||||
for (itTI = listTI.constBegin(); itTI != listTI.constEnd(); ++itTI) {
|
||||
qint64 inteval = 0,endtime = 0;
|
||||
getTimeInteval(*itTI,starttime,inteval,endtime);
|
||||
// loop 3 computeMethod
|
||||
QList<iot_dbms::EnComputeMethod> ::const_iterator itCM;
|
||||
// loop 2 time interval
|
||||
for (itCM = listCM.constBegin(); itCM != listCM.constEnd(); ++itCM) {
|
||||
// add listpoint
|
||||
std::vector<iot_dbms::SMeasPointKey> vecMpKey;
|
||||
std::vector<std::vector<iot_dbms::SVarHisValue> *> *vecResult = new std::vector<std::vector<iot_dbms::SVarHisValue> *>();
|
||||
|
||||
// 构造随机测点集合
|
||||
QStringList testPoints;
|
||||
{
|
||||
std::vector<int> nums;
|
||||
for (int i = 0; i < listpoint.size(); i++) {
|
||||
nums.push_back(i);
|
||||
}
|
||||
|
||||
std::random_device rd;
|
||||
std::mt19937 g(rd());
|
||||
std::shuffle(nums.begin(), nums.end(), g);
|
||||
|
||||
std::vector<int> random_nums(nums.begin(), nums.begin() + pointSize);
|
||||
|
||||
for (int i : random_nums) {
|
||||
testPoints << listpoint.at(i);
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<boost::int64_t> vecTimeBegin,vecTimeEnd;
|
||||
for(int i = 0; i < pointSize; i++)
|
||||
{
|
||||
for(boost::int64_t queryTime = starttime;queryTime < endtime;queryTime += inteval )
|
||||
{
|
||||
iot_dbms::SMeasPointKey key;
|
||||
std::string tmp = testPoints[i].toStdString();
|
||||
char * tag = (char*)malloc(tmp.size() + 1);
|
||||
memset(tag, 0, tmp.size() + 1);
|
||||
memcpy(tag, tmp.c_str(), tmp.size());
|
||||
key.m_pszTagName = tag;
|
||||
key.m_enType = iot_dbms::MPT_AI;
|
||||
vecMpKey.push_back(key);
|
||||
|
||||
vecResult->push_back(new std::vector<iot_dbms::SVarHisValue>());
|
||||
vecTimeBegin.push_back(queryTime);
|
||||
vecTimeEnd.push_back(queryTime + inteval);
|
||||
}
|
||||
|
||||
if( *itCM == iot_dbms::CM_NULL) // TODO NULL 临时占位差值计算 后面替换
|
||||
{
|
||||
iot_dbms::SMeasPointKey key;
|
||||
std::string tmp = listpoint[i].toStdString();
|
||||
char * tag = (char*)malloc(tmp.size() + 1);
|
||||
memset(tag, 0, tmp.size() + 1);
|
||||
memcpy(tag, tmp.c_str(), tmp.size());
|
||||
key.m_pszTagName = tag;
|
||||
key.m_enType = iot_dbms::MPT_AI;
|
||||
vecMpKey.push_back(key);
|
||||
|
||||
vecResult->push_back(new std::vector<iot_dbms::SVarHisValue>());
|
||||
vecTimeBegin.push_back(endtime);
|
||||
vecTimeEnd.push_back(endtime + inteval);
|
||||
}
|
||||
}
|
||||
|
||||
// 开始查询
|
||||
QElapsedTimer timer;
|
||||
timer.start();
|
||||
|
||||
auto actualCM = *itCM;
|
||||
if( *itCM == iot_dbms::CM_NULL) // TODO NULL 临时占位差值计算 后面替换
|
||||
{
|
||||
actualCM = iot_dbms::CM_LAST;
|
||||
}
|
||||
|
||||
if(!iot_dbms::getHisValue(conn, timeoutMs, vecMpKey, &vecTimeBegin, &vecTimeEnd, NULL, NULL, actualCM, 0, iot_dbms::FM_NULL_METHOD, *vecResult))
|
||||
{
|
||||
QString testResult;
|
||||
testResult = QString("超时--%1点,%2[起%5,止%6,间隔:%7s,结果共:%8],%3,共%4ms")
|
||||
.arg(QString::number(pointSize))
|
||||
.arg(getStrFromTI(*itTI))
|
||||
.arg(getStrFromCM(*itCM))
|
||||
.arg(QString::number(timer.elapsed() ))
|
||||
.arg(QDateTime::fromMSecsSinceEpoch(starttime).toString("yyyyMMdd"))
|
||||
.arg(QDateTime::fromMSecsSinceEpoch(endtime).toString("yyyyMMdd"))
|
||||
.arg(inteval /1000)
|
||||
.arg(QString::number(vecResult->size()))
|
||||
;
|
||||
QStringList listResult;
|
||||
listResult << "超时";
|
||||
|
||||
listResult << QString::number(pointSize);
|
||||
listResult << getStrFromTI(*itTI);
|
||||
listResult << QDateTime::fromMSecsSinceEpoch(starttime).toString("yyyyMMdd");
|
||||
listResult << QDateTime::fromMSecsSinceEpoch(endtime).toString("yyyyMMdd");
|
||||
listResult << QString::number(inteval /1000);
|
||||
listResult << QString::number(vecResult->size());
|
||||
listResult << getStrFromCM(*itCM);
|
||||
listResult << QString::number(timer.elapsed()) ;
|
||||
|
||||
emit onAddTestRow(listResult);
|
||||
|
||||
// emit onTestStatus(testResult);
|
||||
emit testResultReady(tr("测试完毕"));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if( *itCM == iot_dbms::CM_NULL)
|
||||
{
|
||||
for(int i = 1; i < vecResult->at(0)->size() ; i ++)
|
||||
{
|
||||
auto result = boost::get<boost::float64_t>(vecResult->at(0)->at(i).m_varValue) - boost::get<boost::float64_t>(vecResult->at(0)->at(i - 1).m_varValue);
|
||||
}
|
||||
}
|
||||
|
||||
QString testResult;
|
||||
testResult = QString("完成:%1点,%2[起%5,止%6,间隔:%7s,结果共:%8],%3,共%4ms")
|
||||
.arg(QString::number(pointSize))
|
||||
.arg(getStrFromTI(*itTI))
|
||||
.arg(getStrFromCM(*itCM))
|
||||
.arg(QString::number(timer.elapsed()))
|
||||
.arg(QDateTime::fromMSecsSinceEpoch(starttime).toString("yyyyMMdd"))
|
||||
.arg(QDateTime::fromMSecsSinceEpoch(endtime).toString("yyyyMMdd"))
|
||||
.arg(inteval /1000)
|
||||
.arg(QString::number(vecResult->size()))
|
||||
;
|
||||
QStringList listResult;
|
||||
|
||||
|
||||
listResult << "完成";
|
||||
|
||||
listResult << QString::number(pointSize);
|
||||
listResult << getStrFromTI(*itTI);
|
||||
listResult << QDateTime::fromMSecsSinceEpoch(starttime).toString("yyyyMMdd");
|
||||
listResult << QDateTime::fromMSecsSinceEpoch(endtime).toString("yyyyMMdd");
|
||||
listResult << QString::number(inteval /1000);
|
||||
listResult << QString::number(vecResult->size());
|
||||
listResult << getStrFromCM(*itCM);
|
||||
listResult << QString::number(timer.elapsed()) ;
|
||||
|
||||
|
||||
emit onAddTestRow(listResult);
|
||||
|
||||
// emit onTestStatus(testResult);
|
||||
|
||||
foreach(iot_dbms::SMeasPointKey key, vecMpKey)
|
||||
{
|
||||
free((char*)key.m_pszTagName);
|
||||
}
|
||||
|
||||
std::vector<std::vector<iot_dbms::SVarHisValue> *>::iterator res = vecResult->begin();
|
||||
while(vecResult->end() != res)
|
||||
{
|
||||
delete (*res);
|
||||
++res;
|
||||
}
|
||||
vecResult->clear();
|
||||
delete vecResult;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
|
||||
emit testResultReady("success");
|
||||
|
||||
|
||||
}
|
||||
|
||||
void dataWorker::doWork(QStringList listPoint, QString address, QString pointType, quint64 interval, int deviatProb, double normalBase, double normalLength, quint64 starttime, quint64 endtime, int deviatType, bool isDeleteInterval, bool isDeleteAll, bool isMT)
|
||||
{
|
||||
// 删除
|
||||
if(isDeleteAll || isDeleteInterval)
|
||||
{
|
||||
if(!deletePoint(address,pointType,listPoint,starttime,endtime,isDeleteAll))
|
||||
{
|
||||
emit resultReady(tr("删除测点失败"),false);
|
||||
|
||||
return;
|
||||
}else{
|
||||
}
|
||||
}
|
||||
// 插入
|
||||
|
||||
// 生成QString
|
||||
bool result = false;
|
||||
if(isMT)
|
||||
{
|
||||
result = getGenSqlAndInsertMT(listPoint,pointType,address,interval,deviatProb,normalBase,normalLength,starttime,endtime,deviatType);
|
||||
}
|
||||
else
|
||||
{
|
||||
result = getGenSqlAndInsertST(listPoint,pointType,address,interval,deviatProb,normalBase,normalLength,starttime,endtime,deviatType);
|
||||
}
|
||||
|
||||
if(!result)
|
||||
{
|
||||
emit resultReady("插入失败",false);
|
||||
return;
|
||||
}
|
||||
else{
|
||||
emit resultReady("插入成功",true);
|
||||
}
|
||||
}
|
||||
|
||||
void dataWorker::doDel(QString address, QString pointType, QStringList listPoint, quint64 starttime, quint64 endtime, bool isDeleteAll)
|
||||
{
|
||||
if(!deletePoint(address,pointType,listPoint,starttime,endtime,isDeleteAll))
|
||||
{
|
||||
emit deleteResultReady(tr("删除测点失败"),false);
|
||||
|
||||
return;
|
||||
}
|
||||
emit deleteResultReady(tr("删除测点成功"),true);
|
||||
|
||||
}
|
||||
|
||||
void dataWorker::doInsertEvent(QStringList listFixedArgs, QStringList listPoints, QString content, quint64 starttime, quint64 endtime)
|
||||
{
|
||||
|
||||
|
||||
QFile file("outEvent.sql");
|
||||
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
|
||||
return;
|
||||
|
||||
QTextStream out(&file);
|
||||
//out << "The magic number is: " << 49 << "\n";
|
||||
|
||||
quint64 interval = listFixedArgs.at(8).toInt() * 1000;
|
||||
|
||||
QString sqltext;
|
||||
// 第一层测点循环
|
||||
for(int pointIdx = 0; pointIdx < listPoints.size(); pointIdx += 1){
|
||||
emit onStatus( QString("正在插入点%1(%2/%3)").arg( listPoints.at(pointIdx) ).arg(pointIdx + 1).arg(listPoints.size()) );
|
||||
|
||||
|
||||
QString tag_name = listPoints.at(pointIdx);
|
||||
QString key_id_tag = "digital." + tag_name + ".value";
|
||||
QString contentToFilled = content;
|
||||
contentToFilled = contentToFilled.replace("[tag_name]",tag_name);
|
||||
QString dev_group_tag = tag_name.split('.')[0] % QChar('.') % tag_name.split('.')[1].split('_')[0];
|
||||
|
||||
QString arg0 = listFixedArgs[0];
|
||||
QString arg1 = listFixedArgs[1];
|
||||
QString arg2 = listFixedArgs[2];
|
||||
QString arg3 = listFixedArgs[3];
|
||||
QString arg4 = listFixedArgs[4];
|
||||
QString arg5 = listFixedArgs[5];
|
||||
QString arg6 = listFixedArgs[6];
|
||||
QString arg7 = listFixedArgs[7];
|
||||
|
||||
// 第二层时间循环
|
||||
for(quint64 timestamp = starttime; timestamp < endtime; timestamp += interval )
|
||||
{
|
||||
std::string uuid;
|
||||
generateUuidBase64(uuid);
|
||||
//insert into HIS_EVENT (UUID_BASE64,ALM_TYPE,ALM_STATUS
|
||||
//,ALM_STYLE,TIME_STAMP,LOCATION_ID,CONTENT,PRIORITY,
|
||||
//SUB_SYSTEM,DEV_TYPE,REGION_ID,DEV_GROUP_TAG,KEY_ID_TAG,
|
||||
//CONFIRM_TIME,CONFIRM_USER_ID,CONFIRM_NODE_NAME,
|
||||
//WAVE_FILE,IA_UUID) values ('B0P7XbDw7mACiqFAnT36YU'
|
||||
//,3,201,0,1663027300645,1,'dev3 yx34 中断',2,4,7,1,'occ.dev3',
|
||||
//'digital.occ.dev3_ht100.yx34.value',0,0,'','','B0Pp6cIUMGw+bZBtbMy5JU');
|
||||
out << "insert into HIS_EVENT (UUID_BASE64,ALM_TYPE,ALM_STATUS"
|
||||
",ALM_STYLE,TIME_STAMP,LOCATION_ID,CONTENT,PRIORITY"
|
||||
",SUB_SYSTEM,DEV_TYPE,REGION_ID,DEV_GROUP_TAG"
|
||||
",KEY_ID_TAG,CONFIRM_TIME,CONFIRM_USER_ID"
|
||||
",CONFIRM_NODE_NAME,WAVE_FILE,IA_UUID) values ("
|
||||
% QChar('\'') % uuid.c_str() % QString("',")
|
||||
% arg0 % ","
|
||||
% arg1 % ","
|
||||
% arg2 % ","
|
||||
% QString::number( timestamp ) % ","
|
||||
% arg3 % ","
|
||||
% QChar('\'') % contentToFilled % QString("',")
|
||||
% arg4 % ","
|
||||
% arg5 % ","
|
||||
% arg6 % ","
|
||||
% arg7 % ","
|
||||
% QChar('\'') % dev_group_tag % QString("',")
|
||||
% QChar('\'') % key_id_tag % QString("',")
|
||||
% QStringLiteral("0,0,'','','');\n");
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
//out << "The magic number is: " << 49 << "\n";
|
||||
|
||||
// 两层循环,一层测点循环 一层时间循环
|
||||
|
||||
//qDebug() << uuid.c_str() << listFixedArgs << listPoints << content << starttime << endtime << interval;
|
||||
emit InsertEventResultReady("nice",true);
|
||||
|
||||
}
|
||||
|
||||
bool dataWorker::insertHisDataWithRetry(iot_dbms::CTsdbConn &conn, const QString &insertSqlTxt)
|
||||
{
|
||||
int retryTime = RETRY_TIME;
|
||||
while(retryTime > 0 )
|
||||
{
|
||||
if(retryTime <= RETRY_TIME -1)
|
||||
{
|
||||
QThread::msleep(500);
|
||||
}
|
||||
if(!conn.doInsert(insertSqlTxt.toStdString().c_str())){
|
||||
retryTime -= 1;
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if(retryTime <= 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool dataWorker::getGenSqlAndInsertMT(QStringList listpoint, QString pointType, QString address, quint64 interval, int deviatProb, double normalBase, double normalLength, quint64 starttime, quint64 endtime, int deviatType)
|
||||
{
|
||||
QElapsedTimer timer;
|
||||
timer.start();
|
||||
QList<STaskUnit> taskList;
|
||||
m_strTimestamp.clear();
|
||||
int totalCalc = ((endtime - starttime) / interval ) + 1;
|
||||
m_strTimestamp.reserve(totalCalc);
|
||||
for(quint64 timestamp = starttime; timestamp < endtime; timestamp += interval)
|
||||
{
|
||||
m_strTimestamp.append(QString::number(timestamp));
|
||||
}
|
||||
|
||||
for(int pointIdx = 0; pointIdx < listpoint.size(); pointIdx += 1){
|
||||
|
||||
STaskUnit task;
|
||||
task.pointtag = listpoint.at(pointIdx);
|
||||
task.pointtype = pointType;
|
||||
task.address = address;
|
||||
task.deviatProb = deviatProb;
|
||||
task.normalBase = normalBase;
|
||||
task.normalLength = normalLength;
|
||||
task.deviatType = deviatType;
|
||||
|
||||
taskList << task;
|
||||
}
|
||||
m_ft = QtConcurrent::mapped(taskList
|
||||
,std::bind(&dataWorker::getGenSqlAndInsertSingleTask,this,std::placeholders::_1));
|
||||
|
||||
while(true)
|
||||
{
|
||||
if( m_ft.isFinished())
|
||||
{
|
||||
break;
|
||||
}
|
||||
int progress = m_ft.progressValue();
|
||||
if(progress > 0)
|
||||
{
|
||||
emit onStatus( QString("已完成插入测点(%1/%2),平均耗时:%3 s")
|
||||
.arg( progress)
|
||||
.arg( listpoint.size() )
|
||||
.arg( (timer.elapsed() / 1000.0) / progress )
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
emit onStatus( QString("已完成插入测点(%1/%2)")
|
||||
.arg( progress)
|
||||
.arg( listpoint.size() )
|
||||
);
|
||||
}
|
||||
|
||||
QThread::msleep(500);
|
||||
}
|
||||
if( m_ft.resultCount() != taskList.size())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool dataWorker::getGenSqlAndInsertST(QStringList listpoint, QString pointType, QString address, quint64 interval, int deviatProb, double normalBase, double normalLength, quint64 starttime, quint64 endtime, int deviatType)
|
||||
{
|
||||
QElapsedTimer timer;
|
||||
timer.start();
|
||||
bool isDi = false;
|
||||
if( pointType == "di_sample_result" )
|
||||
{
|
||||
isDi = true;
|
||||
}
|
||||
|
||||
iot_dbms::CTsdbConn conn(address.toStdString().c_str());
|
||||
if(!conn.pingServer())
|
||||
{
|
||||
emit onErrMsg(tr("无法连接数据库"));
|
||||
qDebug() << "无法连接数据库";
|
||||
return false;
|
||||
}
|
||||
|
||||
QString insertSqlTxt;
|
||||
insertSqlTxt.reserve( 100000000 );
|
||||
|
||||
// 第一层测点循环
|
||||
for(int pointIdx = 0; pointIdx < listpoint.size(); pointIdx += 1){
|
||||
QString pointHeader = pointType % QStringLiteral(",tag_name=") % listpoint.at(pointIdx) % QStringLiteral(" status=2i,value=");
|
||||
// 第二层时间循环
|
||||
long long totalCalc = ((endtime - starttime) / interval ) + 1;
|
||||
int sqlCnt = 0;
|
||||
long totalCnt = 0;
|
||||
for(quint64 timestamp = starttime; timestamp < endtime; timestamp += interval)
|
||||
{
|
||||
if(isDi){
|
||||
insertSqlTxt.append( pointHeader %
|
||||
(boolGen(deviatProb) ? QStringLiteral("1i ") : QStringLiteral("0i ") )
|
||||
% QString::number(timestamp) % "\n" );
|
||||
}else{
|
||||
insertSqlTxt += pointHeader;
|
||||
insertSqlTxt += QString::number( doubleGenController(normalBase,normalLength,deviatProb,deviatType) );
|
||||
insertSqlTxt += QStringLiteral(" ");
|
||||
insertSqlTxt += QString::number(timestamp);
|
||||
insertSqlTxt += QStringLiteral("\n");
|
||||
}
|
||||
totalCnt += 1;
|
||||
if( ++sqlCnt >= 10000 || insertSqlTxt.size() >= 950000 )
|
||||
{
|
||||
sqlCnt = 0;
|
||||
if(!insertHisDataWithRetry(conn,insertSqlTxt))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
insertSqlTxt.clear();
|
||||
}
|
||||
// qDebug() << insertSqlTxt.size();
|
||||
}
|
||||
if(pointIdx > 0)
|
||||
{
|
||||
emit onStatus( QString("已完成插入测点(%1/%2),平均耗时:%3 s")
|
||||
.arg( pointIdx)
|
||||
.arg( listpoint.size() )
|
||||
.arg( (timer.elapsed() / 1000.0) / pointIdx )
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
emit onStatus( QString("已完成插入测点(%1/%2),耗时:%3 s")
|
||||
.arg( pointIdx)
|
||||
.arg( listpoint.size() )
|
||||
.arg( (timer.elapsed() / 1000.0) )
|
||||
);
|
||||
}
|
||||
}
|
||||
// 剩余sql语句插入
|
||||
if(!insertHisDataWithRetry(conn,insertSqlTxt))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool dataWorker::getGenSqlAndInsertSingleTask(dataWorker::STaskUnit task)
|
||||
{
|
||||
QString insertSqlTxt;
|
||||
insertSqlTxt.reserve( 400000 );
|
||||
|
||||
bool isDi = false;
|
||||
if( task.pointtype == "di_sample_result" )
|
||||
{
|
||||
isDi = true;
|
||||
}
|
||||
|
||||
iot_dbms::CTsdbConn conn(task.address.toStdString().c_str());
|
||||
|
||||
|
||||
QString pointHeader = task.pointtype % QStringLiteral(",tag_name=") % task.pointtag % QStringLiteral(" status=2i,value=");
|
||||
// 第二层时间循环
|
||||
int sqlCnt = 0,totalCnt = 0;
|
||||
|
||||
QVector<QString>::const_iterator it;
|
||||
for (it = m_strTimestamp.constBegin(); it != m_strTimestamp.constEnd(); ++it) {
|
||||
if(isDi){
|
||||
insertSqlTxt += pointHeader;
|
||||
insertSqlTxt += (boolGen(task.deviatProb) ? QStringLiteral("1i ") : QStringLiteral("0i ") );
|
||||
insertSqlTxt += *it;
|
||||
insertSqlTxt += "\n";
|
||||
}else{
|
||||
insertSqlTxt += pointHeader;
|
||||
insertSqlTxt += QString::number( doubleGenController(task.normalBase,task.normalLength,task.deviatProb,task.deviatType) );
|
||||
insertSqlTxt += QStringLiteral(" ");
|
||||
insertSqlTxt += *it;
|
||||
insertSqlTxt += QStringLiteral("\n");
|
||||
}
|
||||
totalCnt++;
|
||||
// sql语句大于10000句时
|
||||
if( ++sqlCnt >= 5000 || m_strTimestamp.size() == totalCnt)
|
||||
{
|
||||
sqlCnt = 0;
|
||||
if(!insertHisDataWithRetry(conn,insertSqlTxt))
|
||||
{
|
||||
m_ft.cancel();
|
||||
return false;
|
||||
}
|
||||
insertSqlTxt.clear();
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool dataWorker::deletePoint(QString address, QString pointType, QStringList listPoint, quint64 starttime, quint64 endtime, bool isDeleteAll)
|
||||
{
|
||||
using namespace iot_dbms;
|
||||
|
||||
CTsdbConn conn(address.toStdString().c_str());
|
||||
|
||||
if(!conn.pingServer())
|
||||
{
|
||||
emit onErrMsg(tr("无法连接数据库"));
|
||||
return false;
|
||||
}
|
||||
|
||||
// 获得删除语句
|
||||
qDebug()<< "start delete";
|
||||
{
|
||||
// 第一层测点循环
|
||||
for(int pointIdx = 0; pointIdx < listPoint.size(); pointIdx += 1){
|
||||
emit onStatus( QString("正在删除点%1(%2/%3)").arg(listPoint.at(pointIdx)).arg(pointIdx + 1).arg(listPoint.size()) );
|
||||
|
||||
QString singlePoint;
|
||||
singlePoint += "delete from " + pointType;
|
||||
singlePoint += " where tag_name='" + listPoint.at(pointIdx);
|
||||
if( !isDeleteAll ) {
|
||||
singlePoint += "' and time >= " + QString::number(starttime);
|
||||
singlePoint += "ms and time < " + QString::number(endtime) + "ms;";
|
||||
}else{
|
||||
singlePoint += "';";
|
||||
}
|
||||
qDebug() << singlePoint;
|
||||
//emit onStatus( QString("正在执行删除语句到数据库") );
|
||||
int retryTime = RETRY_TIME;
|
||||
while(retryTime > 0 )
|
||||
{
|
||||
if(retryTime <= RETRY_TIME - 1)
|
||||
{
|
||||
QThread::msleep(500);
|
||||
}
|
||||
std::string result;
|
||||
if(!conn.doQuery(singlePoint.toStdString().c_str(),&result)){
|
||||
retryTime -= 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if( result.find("error") != std::string::npos){ // 找到eror则错误
|
||||
retryTime -= 1;
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if(retryTime <= 0)
|
||||
{
|
||||
onErrMsg( QString("无法删除测点%1").arg(listPoint.at(pointIdx)) );
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
95
platform/src/example/tsdbDataSim/dataWorker.h
Normal file
95
platform/src/example/tsdbDataSim/dataWorker.h
Normal file
@ -0,0 +1,95 @@
|
||||
#ifndef DATAWORKER_H
|
||||
#define DATAWORKER_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QFuture>
|
||||
|
||||
#include <tsdb_api/CTsdbConn.h>
|
||||
|
||||
class dataWorker : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
typedef struct taskUnit
|
||||
{
|
||||
QString pointtag;
|
||||
QString pointtype;
|
||||
QString address;
|
||||
int deviatProb;
|
||||
double normalBase;
|
||||
double normalLength;
|
||||
int deviatType;
|
||||
} STaskUnit;
|
||||
public slots:
|
||||
|
||||
void doTest(
|
||||
int timeout,
|
||||
int base,
|
||||
int factor,
|
||||
QStringList listpoint,
|
||||
qint64 starttime,
|
||||
QString address);
|
||||
void doWork(
|
||||
QStringList listPoint,
|
||||
QString address,
|
||||
QString pointType,
|
||||
quint64 interval,
|
||||
int deviatProb,
|
||||
double normalBase,
|
||||
double normalLength,
|
||||
quint64 starttime,
|
||||
quint64 endtime,
|
||||
int deviatType,
|
||||
bool isDeleteInterval,
|
||||
bool isDeleteAll,
|
||||
bool isMT);
|
||||
void doDel(QString address,QString pointType,QStringList listPoint,quint64 starttime,quint64 endtime,bool isDeleteAll);
|
||||
void doInsertEvent(QStringList listFixedArgs,
|
||||
QStringList listPoints,
|
||||
QString content,
|
||||
quint64 starttime,quint64 endtime);
|
||||
bool insertHisDataWithRetry(iot_dbms::CTsdbConn& conn, const QString &insertSqlTxt);
|
||||
|
||||
signals:
|
||||
void resultReady(const QString &msg,bool result =true);
|
||||
void testResultReady(const QString &msg,bool result =true);
|
||||
void deleteResultReady(const QString &msg,bool result =true);
|
||||
void InsertEventResultReady(const QString &msg,bool result =true);
|
||||
|
||||
|
||||
void onErrMsg(const QString &msg);
|
||||
void onStatus(const QString &msg);
|
||||
void onTestStatus(const QString &msg);
|
||||
void onAddTestRow(const QStringList &newRow);
|
||||
|
||||
private:
|
||||
bool getGenSqlAndInsertMT(QStringList listpoint,
|
||||
QString pointType,
|
||||
QString address,
|
||||
quint64 interval,
|
||||
int deviatProb,
|
||||
double normalBase,
|
||||
double normalLength,
|
||||
quint64 starttime,
|
||||
quint64 endtime,
|
||||
int deviatType);
|
||||
bool getGenSqlAndInsertST(QStringList listpoint,
|
||||
QString pointType,
|
||||
QString address,
|
||||
quint64 interval,
|
||||
int deviatProb,
|
||||
double normalBase,
|
||||
double normalLength,
|
||||
quint64 starttime,
|
||||
quint64 endtime,
|
||||
int deviatType);
|
||||
bool getGenSqlAndInsertSingleTask(STaskUnit task);
|
||||
bool deletePoint(QString address,QString pointType,QStringList listPoint,quint64 starttime,quint64 endtime,bool isDeleteAll);
|
||||
|
||||
QFuture<bool> m_ft;
|
||||
QVector<QString> m_strTimestamp;
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif // DATAWORKER_H
|
||||
BIN
platform/src/example/tsdbDataSim/download.ico
Normal file
BIN
platform/src/example/tsdbDataSim/download.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.2 KiB |
BIN
platform/src/example/tsdbDataSim/download.png
Normal file
BIN
platform/src/example/tsdbDataSim/download.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 8.1 KiB |
18
platform/src/example/tsdbDataSim/main.cpp
Normal file
18
platform/src/example/tsdbDataSim/main.cpp
Normal file
@ -0,0 +1,18 @@
|
||||
#include "MainWindow.h"
|
||||
#include <QApplication>
|
||||
#include "tsdb_api/TsdbApi.h"
|
||||
#include "pub_logger_api/logger.h"
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
using namespace iot_dbms;
|
||||
initTsdbApi();
|
||||
iot_public::StartLogSystem("TEST","tsdbDataSim");
|
||||
QApplication a(argc, argv);
|
||||
MainWindow w;
|
||||
w.show();
|
||||
|
||||
int result = a.exec();
|
||||
releaseTsdbApi();
|
||||
return result;
|
||||
}
|
||||
56
platform/src/example/tsdbDataSim/tsdbDataSim.pro
Normal file
56
platform/src/example/tsdbDataSim/tsdbDataSim.pro
Normal file
@ -0,0 +1,56 @@
|
||||
#-------------------------------------------------
|
||||
#
|
||||
# Project created by QtCreator 2021-04-07T16:28:26
|
||||
#
|
||||
#-------------------------------------------------
|
||||
|
||||
QT += core gui concurrent
|
||||
|
||||
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
||||
|
||||
TARGET = tsdbDataSim
|
||||
TEMPLATE = app
|
||||
|
||||
# The following define makes your compiler emit warnings if you use
|
||||
# any feature of Qt which has been marked as deprecated (the exact warnings
|
||||
# depend on your compiler). Please consult the documentation of the
|
||||
# deprecated API in order to know how to port your code away from it.
|
||||
DEFINES += QT_DEPRECATED_WARNINGS
|
||||
|
||||
# You can also make your code fail to compile if you use deprecated APIs.
|
||||
# In order to do so, uncomment the following line.
|
||||
# You can also select to disable deprecated APIs only up to a certain version of Qt.
|
||||
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
|
||||
|
||||
|
||||
SOURCES += \
|
||||
main.cpp \
|
||||
MainWindow.cpp \
|
||||
dataWorker.cpp
|
||||
|
||||
HEADERS += \
|
||||
MainWindow.h \
|
||||
RandUtil.h \
|
||||
dataWorker.h
|
||||
|
||||
FORMS += \
|
||||
MainWindow.ui
|
||||
|
||||
|
||||
LIBS += -ltsdb_api -ldb_base_api -ldb_his_query_api -lboost_system -llog4cplus \
|
||||
-lpub_logger_api
|
||||
|
||||
win32:RC_ICONS += download.ico
|
||||
|
||||
win32{
|
||||
LIBS += -lbcrypt
|
||||
}
|
||||
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
COMMON_PRI=$$PWD/../../common.pri
|
||||
exists($$COMMON_PRI) {
|
||||
include($$COMMON_PRI)
|
||||
}else {
|
||||
error("FATAL error: can not find common.pri")
|
||||
}
|
||||
254
platform/src/example/tsdbDataSimForCloudPlatform/MainWindow.cpp
Normal file
254
platform/src/example/tsdbDataSimForCloudPlatform/MainWindow.cpp
Normal file
@ -0,0 +1,254 @@
|
||||
#include "MainWindow.h"
|
||||
#include "ui_MainWindow.h"
|
||||
#include <QDebug>
|
||||
#include <QMessageBox>
|
||||
#include <tsdb_api/CTsdbConn.h>
|
||||
#include <tsdb_api/TsdbApi.h>
|
||||
#include "dataWorker.h"
|
||||
using namespace iot_dbms;
|
||||
MainWindow::MainWindow(QWidget *parent) :
|
||||
QMainWindow(parent),
|
||||
ui(new Ui::MainWindow)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
dataWorker *worker = new dataWorker;
|
||||
worker->moveToThread(&workerThread);
|
||||
connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);
|
||||
|
||||
connect(this, &MainWindow::operate, worker, &dataWorker::doWork);
|
||||
connect(worker, &dataWorker::resultReady, this, &MainWindow::handleResults);
|
||||
|
||||
connect(this, &MainWindow::insertEvent, worker, &dataWorker::doInsertEvent);
|
||||
connect(worker, &dataWorker::InsertEventResultReady, this, &MainWindow::handleEventInsertResults);
|
||||
|
||||
|
||||
connect(this, &MainWindow::deleteWork, worker, &dataWorker::doDel);
|
||||
connect(worker, &dataWorker::deleteResultReady, this, &MainWindow::handleDeleteResults);
|
||||
|
||||
connect(worker, &dataWorker::onErrMsg, this, &MainWindow::onErrMsg);
|
||||
connect(worker, &dataWorker::onStatus, this, &MainWindow::onStatus);
|
||||
|
||||
|
||||
workerThread.start();
|
||||
ui->label_status->setHidden(true);
|
||||
|
||||
}
|
||||
|
||||
MainWindow::~MainWindow()
|
||||
{
|
||||
workerThread.quit();
|
||||
workerThread.wait();
|
||||
|
||||
delete ui;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
QString MainWindow::getPointType()
|
||||
{
|
||||
if( ui->comboBox_type->currentText() == tr("模拟量")){
|
||||
return QString("ANALOG");
|
||||
}else if( ui->comboBox_type->currentText() == tr("累积量")){
|
||||
return QString("ACCRUE");
|
||||
}else
|
||||
return "";
|
||||
}
|
||||
|
||||
int MainWindow::getDeviatType()
|
||||
{
|
||||
if (ui->comboBox_deviatType->currentText() == tr("左边")){
|
||||
return -1;
|
||||
}else if (ui->comboBox_deviatType->currentText() == tr("两边")){
|
||||
return 0;
|
||||
}else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void MainWindow::on_pushButton_insert_clicked()
|
||||
{
|
||||
if(QMessageBox::question(this,"提醒","是否插入") != QMessageBox::Yes)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
QString address = ui->lineEdit_addr->text();
|
||||
QStringList listPoint = ui->plainTextEdit_point->toPlainText().simplified().split(',');
|
||||
listPoint.removeAll("");
|
||||
for(int i = 0; i < listPoint.size(); i++)
|
||||
{
|
||||
listPoint[i] = listPoint[i].trimmed();
|
||||
}
|
||||
QString pointType = getPointType();
|
||||
quint64 interval = ui->spinBox_interval->value() * 1000; //ms
|
||||
int deviatProb = ui->spinBox_deviatProb->value();
|
||||
double normalBase = ui->doubleSpinBox_base->value();
|
||||
double normalLength = ui->doubleSpinBox_length->value();
|
||||
quint64 starttime = QDateTime(ui->calendarWidget_startDate->selectedDate(),ui->timeEdit_start->time()).toMSecsSinceEpoch();
|
||||
quint64 endtime = QDateTime(ui->calendarWidget_endDate->selectedDate(),ui->timeEdit_end->time()).toMSecsSinceEpoch(); // 结束日期加一天
|
||||
int deviatType = getDeviatType();
|
||||
|
||||
bool isDeleteInterval = ui->checkBox_delete->isChecked();
|
||||
bool isDeleteAll = ui->checkBox_delAll->isChecked();
|
||||
|
||||
emit operate(listPoint,address,pointType,interval,deviatProb,normalBase,normalLength,starttime,endtime,deviatType,isDeleteInterval,isDeleteAll);
|
||||
ui->pushButton_insert->setEnabled(false);
|
||||
ui->pushButton_delete->setEnabled(false);
|
||||
ui->label_status->setHidden(false);
|
||||
}
|
||||
|
||||
void MainWindow::onErrMsg(const QString &msg)
|
||||
{
|
||||
QMessageBox::critical(this,"提醒",msg);
|
||||
}
|
||||
|
||||
void MainWindow::onStatus(const QString &msg)
|
||||
{
|
||||
ui->label_status->setText(msg);
|
||||
}
|
||||
|
||||
void MainWindow::on_comboBox_type_currentTextChanged(const QString &arg1)
|
||||
{
|
||||
if("数字量" == arg1)
|
||||
{
|
||||
ui->groupBox->setHidden(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
ui->groupBox->setHidden(false);
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::handleResults(const QString &msg, bool result) {
|
||||
ui->label_status->setHidden(true);
|
||||
|
||||
if(result)
|
||||
{
|
||||
QMessageBox::information(this,"提醒","插入成功");
|
||||
}
|
||||
else
|
||||
{
|
||||
onErrMsg(QString("插入失败:") + msg);
|
||||
}
|
||||
ui->pushButton_insert->setEnabled(true);
|
||||
ui->pushButton_delete->setEnabled(true);
|
||||
|
||||
}
|
||||
|
||||
void MainWindow::handleDeleteResults(const QString &msg, bool result)
|
||||
{
|
||||
ui->label_status->setHidden(true);
|
||||
|
||||
if(result)
|
||||
{
|
||||
QMessageBox::information(this,"提醒","删除成功");
|
||||
}
|
||||
else
|
||||
{
|
||||
onErrMsg(QString("删除失败:") + msg);
|
||||
}
|
||||
ui->pushButton_insert->setEnabled(true);
|
||||
ui->pushButton_delete->setEnabled(true);
|
||||
}
|
||||
|
||||
void MainWindow::handleEventInsertResults(const QString &msg, bool result)
|
||||
{
|
||||
if(result)
|
||||
{
|
||||
QMessageBox::information(this,"提醒","生成数据库文件已放至同目录outEvent.sql");
|
||||
}
|
||||
else
|
||||
{
|
||||
onErrMsg(QString("插入失败:") + msg);
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::on_pushButton_delete_clicked()
|
||||
{
|
||||
if(QMessageBox::question(this,"提醒","是否删除") != QMessageBox::Yes)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
QString address = ui->lineEdit_addr->text();
|
||||
QStringList listPoint = ui->plainTextEdit_point->toPlainText().simplified().split(',');
|
||||
listPoint.removeAll("");
|
||||
for(int i = 0; i < listPoint.size(); i++)
|
||||
{
|
||||
listPoint[i] = listPoint[i].trimmed();
|
||||
}
|
||||
QString pointType = getPointType();
|
||||
|
||||
quint64 starttime = QDateTime(ui->calendarWidget_startDate->selectedDate(),ui->timeEdit_start->time()).toMSecsSinceEpoch();
|
||||
quint64 endtime = QDateTime(ui->calendarWidget_endDate->selectedDate(),ui->timeEdit_end->time()).toMSecsSinceEpoch(); // 结束日期加一天
|
||||
bool isDeleteAll = ui->checkBox_delAll->isChecked();
|
||||
|
||||
emit deleteWork(address,pointType,listPoint,starttime,endtime,isDeleteAll);
|
||||
|
||||
ui->pushButton_insert->setEnabled(false);
|
||||
ui->pushButton_delete->setEnabled(false);
|
||||
ui->label_status->setHidden(false);
|
||||
|
||||
}
|
||||
|
||||
void MainWindow::on_pushButton_insert_event_clicked()
|
||||
{
|
||||
if(QMessageBox::question(this,"提醒","是否插入历史数据") != QMessageBox::Yes)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
QStringList listPoint = ui->plainTextEdit_point_event->toPlainText().simplified().split(',');
|
||||
listPoint.removeAll("");
|
||||
for(int i = 0; i < listPoint.size(); i++)
|
||||
{
|
||||
listPoint[i] = listPoint[i].trimmed();
|
||||
}
|
||||
|
||||
quint64 starttime = QDateTime(ui->calendarWidget_startDate->selectedDate(),ui->timeEdit_start->time()).toMSecsSinceEpoch();
|
||||
quint64 endtime = QDateTime(ui->calendarWidget_endDate->selectedDate(),ui->timeEdit_end->time()).toMSecsSinceEpoch(); // 结束日期加一天
|
||||
|
||||
emit insertEvent(
|
||||
QStringList()
|
||||
<< QString::number( ui->spinBox_alm_type->value() ) // 0
|
||||
<< QString::number( ui->spinBox_alm_status->value() ) // 1
|
||||
<< QString::number( ui->spinBox_alm_style->value() ) // 2
|
||||
<< QString::number( ui->spinBox_location_id->value() ) // 3
|
||||
<< QString::number( ui->spinBox_priority->value() ) // 4
|
||||
<< QString::number( ui->spinBox_sub_system->value() ) // 5
|
||||
<< QString::number( ui->spinBox_dev_type->value() ) //6
|
||||
<< QString::number( ui->spinBox_region_id->value() ) // 7
|
||||
<< QString::number( ui->spinBox_interval_event->value() ) // 8
|
||||
|
||||
,
|
||||
listPoint,ui->lineEdit_content->text(),starttime,endtime);
|
||||
|
||||
// QString address = ui->lineEdit_addr->text();
|
||||
// QStringList listPoint = ui->plainTextEdit_point->toPlainText().simplified().split(',');
|
||||
// listPoint.removeAll("");
|
||||
// for(int i = 0; i < listPoint.size(); i++)
|
||||
// {
|
||||
// listPoint[i] = listPoint[i].trimmed();
|
||||
// }
|
||||
// QString pointType = getPointType();
|
||||
|
||||
// quint64 starttime = QDateTime(ui->calendarWidget_startDate->selectedDate(),ui->timeEdit_start->time()).toMSecsSinceEpoch();
|
||||
// quint64 endtime = QDateTime(ui->calendarWidget_endDate->selectedDate(),ui->timeEdit_end->time()).toMSecsSinceEpoch(); // 结束日期加一天
|
||||
// bool isDeleteAll = ui->checkBox_delAll->isChecked();
|
||||
|
||||
// emit deleteWork(address,pointType,listPoint,starttime,endtime,isDeleteAll);
|
||||
|
||||
// ui->pushButton_insert->setEnabled(false);
|
||||
// ui->pushButton_delete->setEnabled(false);
|
||||
// ui->label_status->setHidden(false);
|
||||
|
||||
}
|
||||
|
||||
void MainWindow::on_pushButton_delete_event_clicked()
|
||||
{
|
||||
onErrMsg(tr("该功能未实现"));
|
||||
}
|
||||
@ -0,0 +1,71 @@
|
||||
#ifndef MAINWINDOW_H
|
||||
#define MAINWINDOW_H
|
||||
|
||||
#include <QMainWindow>
|
||||
#include <QThread>
|
||||
|
||||
namespace Ui
|
||||
{
|
||||
class MainWindow;
|
||||
}
|
||||
|
||||
class MainWindow : public QMainWindow
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit MainWindow(QWidget *parent = 0);
|
||||
~MainWindow();
|
||||
|
||||
|
||||
private slots:
|
||||
|
||||
QString getPointType();
|
||||
int getDeviatType();
|
||||
void on_pushButton_insert_clicked();
|
||||
|
||||
void on_comboBox_type_currentTextChanged(const QString &arg1);
|
||||
|
||||
void on_pushButton_delete_clicked();
|
||||
|
||||
void on_pushButton_insert_event_clicked();
|
||||
|
||||
void on_pushButton_delete_event_clicked();
|
||||
|
||||
public slots:
|
||||
void handleResults(const QString &msg,bool result =true);
|
||||
void handleDeleteResults(const QString &msg,bool result =true);
|
||||
void handleEventInsertResults(const QString &msg,bool result =true);
|
||||
|
||||
|
||||
void onErrMsg(const QString &msg);
|
||||
void onStatus(const QString &msg);
|
||||
|
||||
signals:
|
||||
void operate(
|
||||
QStringList listpoint,
|
||||
QString address,
|
||||
QString pointType,
|
||||
quint64 interval,
|
||||
int deviatProb,
|
||||
double normalBase,
|
||||
double normalLength,
|
||||
quint64 starttime,
|
||||
quint64 endtime,
|
||||
int deviatType,
|
||||
bool isDeleteInterval,
|
||||
bool isDeleteAll);
|
||||
|
||||
void deleteWork(QString address,QString pointType,QStringList listPoint,quint64 starttime,quint64 endtime,bool isDeleteAll);
|
||||
|
||||
void insertEvent(QStringList listFixedArgs,
|
||||
QStringList listPoints,
|
||||
QString content,quint64 starttime,quint64 endtime
|
||||
);
|
||||
|
||||
private:
|
||||
Ui::MainWindow *ui;
|
||||
QThread workerThread;
|
||||
};
|
||||
|
||||
#endif // MAINWINDOW_H
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user