1119 lines
42 KiB
C++
1119 lines
42 KiB
C++
#include "db_compare.h"
|
||
#include "db_manager_api/db_opt.h"
|
||
#include <QApplication>
|
||
#include <QSqlRecord>
|
||
#include "db_manager_api/kbdwaitprgdlg.h"
|
||
#include <QPushButton>
|
||
#include "pub_widget/MessageBox.h"
|
||
#include "db_manager_common.h"
|
||
#include "db_sysinfo_api/CDbSysInfo.h"
|
||
|
||
db_compare::db_compare(QWidget *parent){
|
||
m_pDb_manager = parent;
|
||
m_stationIdOrg = -1;
|
||
m_subSystemIdOrg = -1;
|
||
m_stationIdDst = -1;
|
||
COMMONLOCATIONID = "LOCATION_ID";
|
||
COMMONCHANNO = "CHAN_NO";
|
||
COMMONRTUNO = "RTU_NO";
|
||
COMMONFESRTUNO = "FES_RTU_NO";
|
||
COMMONFESCHANNELPARA = "fes_channel_para";
|
||
COMMONFESRTUPARA = "fes_rtu_para";
|
||
COMMON61850KEY = "id";
|
||
COMMONSCLFCDA = "scl_fcda";
|
||
COMMONSCLDATASET = "scl_dataset";
|
||
COMMONDATASETID = "DatasetID";
|
||
}
|
||
|
||
//******************************************** 数据合并 ****************************************************
|
||
void db_compare::dataMerge(db_opt *pDbOpt_org, QString sDataBaseOrg, db_opt *pDbOpt_dst, QString sDataBaseDst, int subStationIdOrg, int subSystemIdOrg, int subStationIdDst )
|
||
{
|
||
m_pSrcDbOpt = pDbOpt_org;
|
||
m_pDstDbOpt = pDbOpt_dst;
|
||
m_sDatabaseOrg = sDataBaseOrg;
|
||
m_sDatabaseDst = sDataBaseDst;
|
||
m_stationIdOrg = subStationIdOrg;
|
||
m_subSystemIdOrg = subSystemIdOrg;
|
||
m_stationIdDst = subStationIdDst;
|
||
connect( m_pSrcDbOpt, SIGNAL(signalPercent(int)), this, SIGNAL(signalPercent(int) ) ,Qt::QueuedConnection);
|
||
connect( m_pDstDbOpt, SIGNAL(signalPercent(int)), this, SIGNAL(signalPercent(int) ) ,Qt::QueuedConnection);
|
||
tableMergeMap.clear();
|
||
m_sclDatasetMap.clear();
|
||
//pDbOpt_org->getTableName( sDataBaseOrg, m_listTable );
|
||
//通过xml过滤历史表
|
||
pDbOpt_org->filterTable( tableMergeMap );
|
||
|
||
m_maxChanNo = getMaxId(pDbOpt_dst,m_sDatabaseDst,COMMONFESCHANNELPARA,COMMONCHANNO);
|
||
m_maxRtuNo = getMaxId(pDbOpt_dst,m_sDatabaseDst,COMMONFESRTUPARA,COMMONRTUNO);
|
||
mergeFunc();
|
||
emit signalEnable();
|
||
}
|
||
|
||
void db_compare::mergeFunc()
|
||
{
|
||
m_pDstDbOpt->deleteAllTrigger_impl( m_sDatabaseDst, true);
|
||
int mergeTables = 0;
|
||
int nPercent = 0;
|
||
int tableCount = tableMergeMap.size();
|
||
emit signalPercent( nPercent );
|
||
QMap<QString ,QString >::iterator it = tableMergeMap.begin();
|
||
|
||
while (it != tableMergeMap.end())
|
||
{
|
||
mergeTables++;
|
||
//此处只处理基础应用不含sub 和 非基础专业含sub(其余的过滤),61850相关表当成基础表处理
|
||
QString strSubSystem = "SUB_SYSTEM" ;
|
||
QString tableName = it.key();
|
||
bool hasSubSystem = hasColumn(m_pSrcDbOpt, m_sDatabaseOrg, tableName, strSubSystem );
|
||
if(m_subSystemIdOrg == 1 && !hasSubSystem)
|
||
{
|
||
if(mergeTable( m_pSrcDbOpt, m_sDatabaseOrg, m_pDstDbOpt, m_sDatabaseDst, tableName, it.value() ) == -1)
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
else if(m_subSystemIdOrg != 1 && hasSubSystem)
|
||
{
|
||
if(mergeTable( m_pSrcDbOpt, m_sDatabaseOrg, m_pDstDbOpt, m_sDatabaseDst, tableName, it.value() ) == -1)
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
if( mergeTables * 100 / tableCount >= nPercent )
|
||
{
|
||
nPercent++;
|
||
emit signalPercent( nPercent );
|
||
}
|
||
it++;
|
||
}
|
||
m_pDstDbOpt->recoverAllTrigger_impl( m_sDatabaseDst );
|
||
}
|
||
|
||
//******************************************** 车站复用 ****************************************************
|
||
void db_compare::dataReuse(db_opt* pSrcDbOpt, QString sDataBaseOrg, db_opt* pDstDbOpt, QString sDataBaseDst,
|
||
QString sSrcSubStation, QString sDstSubStation, QStringList sSubSystemList )
|
||
{
|
||
m_pSrcDbOpt = pSrcDbOpt;
|
||
m_pDstDbOpt = pDstDbOpt;
|
||
m_sDatabaseOrg = sDataBaseOrg;
|
||
m_sDatabaseDst = sDataBaseDst;
|
||
m_sSubSystemList = sSubSystemList;
|
||
|
||
//获取车站ID等信息
|
||
//==============================================================================================================
|
||
m_nSrcStaId = getSubStationId(pSrcDbOpt, sDataBaseOrg, sSrcSubStation);
|
||
m_nDstStaId = getSubStationId(pDstDbOpt, sDataBaseDst, sDstSubStation);
|
||
m_sSrcStaTagName= getSerachStr(pSrcDbOpt, m_sDatabaseOrg, m_nSrcStaId , "tag_name");
|
||
m_sSrcStaDesc = getSerachStr(pSrcDbOpt, m_sDatabaseOrg, m_nSrcStaId , "description");
|
||
m_sDstStaTagName= getSerachStr(pDstDbOpt, m_sDatabaseDst, m_nDstStaId , "tag_name");
|
||
m_sDstStaDesc = getSerachStr(pDstDbOpt, m_sDatabaseDst, m_nDstStaId , "description");
|
||
|
||
if( m_sDstStaTagName.isEmpty() || m_sDstStaDesc.isEmpty() )
|
||
{
|
||
emit mergeRes(tr("目标车站信息为空,请检查数据库"), 1);
|
||
emit signalEnable();
|
||
return;
|
||
}
|
||
connect( m_pSrcDbOpt, SIGNAL(signalPercent(int)), this, SIGNAL(signalPercent(int) ) ,Qt::QueuedConnection);
|
||
connect( m_pDstDbOpt, SIGNAL(signalPercent(int)), this, SIGNAL(signalPercent(int) ) ,Qt::QueuedConnection);
|
||
m_listTable.clear();
|
||
|
||
pSrcDbOpt->getTableName( sDataBaseOrg, m_listTable ); //获取源库所有表
|
||
//pSrcDbOpt->filterTable( m_listTable );//通过xml过滤历史表
|
||
pSrcDbOpt->filterTable( tableMergeMap );//通过xml过滤skip的表
|
||
|
||
|
||
//转换专业id类型
|
||
//==============================================================================================================
|
||
QVector<int> subSystemIdVec;
|
||
for( int i = 0; i < sSubSystemList.count(); i++ )
|
||
{
|
||
int subSystemId = sSubSystemList[i].toInt();
|
||
subSystemIdVec.append(subSystemId);
|
||
}
|
||
m_vecSubSystemFlag.clear();
|
||
m_vecSubSystemFlag = getSubSystemFlagById( subSystemIdVec );
|
||
|
||
reuseFunc();
|
||
emit signalEnable();
|
||
}
|
||
|
||
void db_compare::reuseFunc()
|
||
{
|
||
m_pDstDbOpt->deleteAllTrigger_impl( m_sDatabaseDst, true);
|
||
|
||
int reuseTables = 0;
|
||
int nPercent = 0;
|
||
int tableCount = m_listTable.count();
|
||
emit signalPercent( nPercent );
|
||
for( int i = 0; i < m_listTable.count(); i++ )
|
||
{
|
||
reuseTables++;
|
||
QString curTableName = m_listTable[i];
|
||
|
||
// 该表用来同步,并不需要
|
||
if(curTableName =="dbop_list")
|
||
{
|
||
continue;
|
||
}
|
||
QStringList keyList = getMainKeys( m_pSrcDbOpt, m_sDatabaseOrg, curTableName );//主键
|
||
QStringList uniqueList = getUniques( m_pSrcDbOpt, m_sDatabaseOrg, curTableName );//UNIQUE
|
||
|
||
//获取表信息
|
||
//==============================================================================================================
|
||
STableModeInfo stTableModelInfo ;
|
||
if(is61850Table( m_pSrcDbOpt, m_sDatabaseOrg, curTableName, COMMON61850KEY))
|
||
{
|
||
//< 61850 表当成基础表处理,直接拷贝
|
||
stTableModelInfo.nSubsystemFlag = 1;
|
||
}
|
||
// 目标中找不到的表直接忽略
|
||
else if(false == CDbSysInfo::getTableModeByTableName(curTableName.toStdString(),stTableModelInfo) )
|
||
{
|
||
emit mergeRes(tr("数据库表[%1]复用忽略.").arg(curTableName), 0);
|
||
continue;
|
||
} else if( tableMergeMap[curTableName] == "skip" )
|
||
{
|
||
continue;
|
||
}
|
||
|
||
//如果符合专业,则处理,首先看这个表是否需要复制
|
||
//==============================================================================================================
|
||
if((m_nSubSystemFlag & (stTableModelInfo.nSubsystemFlag)) >0 ) //该表存在复制专业数据
|
||
{
|
||
bool bRet = checkTable( curTableName );
|
||
if(!bRet)
|
||
{
|
||
continue;
|
||
}
|
||
bool bSelectByLocation = stTableModelInfo.bSelectByLocation ;
|
||
bool bSelectBySubsystem = stTableModelInfo.bSelectBySubsystem ;
|
||
|
||
QString sSqlSelect = "select * from " + m_sDatabaseOrg + "." + curTableName;
|
||
if(bSelectByLocation)//区分车站
|
||
{
|
||
sSqlSelect += QString(" where location_id = ") + QString::number(m_nSrcStaId);
|
||
}
|
||
|
||
//区分专业
|
||
if(bSelectBySubsystem)
|
||
{
|
||
QString sSubSystems = getSubSystemSQLStr(m_sSubSystemList, bSelectByLocation);
|
||
sSqlSelect += sSubSystems;
|
||
}
|
||
|
||
//emit mergeRes(sSqlSelect);
|
||
QSqlQuery objSqlQuery;
|
||
QString sSelectError = "";
|
||
if ( m_pSrcDbOpt->executeSql( sSqlSelect, objSqlQuery, sSelectError ) == false )
|
||
{
|
||
emit mergeRes(tr("从源数据库查询记录查询失败:%1").arg(sSelectError), 1);
|
||
emit mergeRes(tr("表 :%1, 复用失败!").arg(curTableName), 1);
|
||
continue;
|
||
}
|
||
if(objSqlQuery.size() <=0 ){
|
||
continue ;//没有记录,返回
|
||
}
|
||
|
||
bool bReuseRet = true;
|
||
//qDebug() << "表" << curTableName << "*****************记录数:" << objSqlQuery.size();
|
||
while( objSqlQuery.next() )
|
||
{
|
||
QSqlRecord objSqlRecord = objSqlQuery.record();
|
||
changeRecord( objSqlRecord, curTableName, m_nDstStaId, bSelectByLocation );//修改信息
|
||
if(keyList.size() > 0 || uniqueList.size() > 0)//判断主键冲突
|
||
{
|
||
bool keysConflict = ifKeysConflict(m_pDstDbOpt, m_sDatabaseDst, curTableName, keyList, uniqueList, objSqlRecord);
|
||
if(keysConflict)//删除冲突的记录
|
||
{
|
||
deleteConflictRecord(m_pDstDbOpt, m_sDatabaseDst, curTableName, keyList, uniqueList, objSqlRecord);
|
||
}
|
||
}
|
||
bReuseRet = insertRecord(m_pDstDbOpt, m_sDatabaseDst, curTableName, objSqlRecord);//插入记录
|
||
}
|
||
objSqlQuery.clear();
|
||
if(bReuseRet)
|
||
{
|
||
emit mergeRes(tr("表:%1, 复用成功!").arg(curTableName), 0);
|
||
}
|
||
else
|
||
{
|
||
emit mergeRes(tr("表:%1, 复用失败!").arg(curTableName), 1);
|
||
continue;
|
||
}
|
||
}
|
||
if( reuseTables * 100 / tableCount >= nPercent )
|
||
{
|
||
nPercent++;
|
||
emit signalPercent( nPercent );
|
||
}
|
||
}
|
||
//恢复所有触发器
|
||
m_pDstDbOpt->recoverAllTrigger_impl( m_sDatabaseDst );
|
||
}
|
||
|
||
bool db_compare::checkTable( QString& sTableName )
|
||
{
|
||
//判断表是否存在
|
||
if(!ifExistTable(m_pDstDbOpt, m_sDatabaseDst, sTableName ) )
|
||
{
|
||
emit mergeRes(tr("目标数据库中不存在表:%1").arg(sTableName), 1);
|
||
return false;
|
||
}
|
||
//判断源表与目标表字段是否一致
|
||
int columnNum_org = getColumnNum(m_pSrcDbOpt, m_sDatabaseOrg, sTableName);
|
||
int columnNum_dst = getColumnNum(m_pDstDbOpt, m_sDatabaseDst, sTableName);
|
||
if(columnNum_org != columnNum_dst)
|
||
{
|
||
emit mergeRes(tr("源数据库与目标数据库的表:%1字段结构不一致!").arg(sTableName), 1);
|
||
return false;
|
||
}
|
||
//判断源表与目标表主键是否一致
|
||
QStringList keys_org = getMainKeys(m_pSrcDbOpt, m_sDatabaseOrg, sTableName);
|
||
QStringList keys_dst = getMainKeys(m_pDstDbOpt, m_sDatabaseDst, sTableName);
|
||
int key_num_org = keys_org.size();
|
||
int key_num_dst = keys_dst.size();
|
||
if(key_num_org != key_num_dst)
|
||
{
|
||
emit mergeRes(tr("源数据库与目标数据库的表:%1主键数量不一致!").arg(sTableName), 1);
|
||
return false;
|
||
}
|
||
else
|
||
{
|
||
bool keysColums = false;
|
||
for(int j = 0; j < key_num_dst; j++)
|
||
{
|
||
if(QString::compare(keys_org[j], keys_dst[j]) != 0)
|
||
{
|
||
keysColums = true;
|
||
break;
|
||
}
|
||
}
|
||
if(keysColums)
|
||
{
|
||
emit mergeRes(tr("源数据库与目标数据库的表:%1主键字段不一致!").arg(sTableName), 1);
|
||
return false;
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
|
||
bool db_compare::hasColumn(db_opt *pDb_opt, QString &sDatabaseName, QString &sTableName, QString &sColumn)
|
||
{
|
||
QString sql = QString("DESCRIBE %1.%2 %3;").arg(sDatabaseName).arg(sTableName).arg(sColumn);
|
||
QSqlQuery result;
|
||
QString error;
|
||
if ( pDb_opt->executeSql( sql, result, error ) == false )
|
||
{
|
||
emit mergeRes(tr("判断表是否存在字段失败 %1").arg(error), 1);
|
||
qDebug() << "判断表是否存在字段失败: sql == " << sql;
|
||
return false;
|
||
}
|
||
|
||
if(result.size() == 0)
|
||
return false;
|
||
|
||
return true;
|
||
}
|
||
|
||
bool db_compare::is61850Table(db_opt *pDb_opt, QString &sDatabaseName, QString &sTableName, QString columnName)
|
||
{
|
||
if(sTableName.startsWith("cfg_", Qt::CaseInsensitive))
|
||
{
|
||
return true;
|
||
}
|
||
if(sTableName.startsWith("scl_", Qt::CaseInsensitive))
|
||
{
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
//******************************************** 合并数据库表主函数 *****************************************************
|
||
int db_compare::mergeTable(db_opt* pSrcDbOpt, QString dataBaseOrg, db_opt* pDstDbOpt, QString dataBaseDst, QString sTableName, QString mergeWay )
|
||
{
|
||
//判断如果为clear 则先删除此表所有数据,然后进行其他操作
|
||
if(mergeWay.compare("clear") == 0)
|
||
{
|
||
clearAllDataByTableName(pDstDbOpt,dataBaseDst,sTableName);
|
||
}
|
||
//主键
|
||
QStringList keyList = getMainKeys( pSrcDbOpt, dataBaseOrg, sTableName );
|
||
//UNIQUE
|
||
QStringList uniqueList = getUniques( pSrcDbOpt, dataBaseOrg, sTableName );
|
||
QString sSqlSelect;
|
||
m_hasLocationId = hasColumn(m_pSrcDbOpt, dataBaseOrg, sTableName, COMMONLOCATIONID);
|
||
m_hasChanNo = hasColumn(m_pSrcDbOpt, dataBaseOrg, sTableName, COMMONCHANNO);
|
||
m_hasRtuNo = hasColumn(m_pSrcDbOpt, dataBaseOrg, sTableName, COMMONRTUNO);
|
||
m_hasFesRtuNo = hasColumn(m_pSrcDbOpt, dataBaseOrg, sTableName, COMMONFESRTUNO);
|
||
m_is61850Table = is61850Table(m_pSrcDbOpt, dataBaseOrg, sTableName, COMMON61850KEY);
|
||
|
||
if ( keyList.size() <= 0 ) //数据表没有主键
|
||
{
|
||
sSqlSelect = "select * from " + dataBaseOrg + "." + sTableName;
|
||
QSqlQuery objSqlQuery;
|
||
QString sSelectError = "";
|
||
if ( pSrcDbOpt->executeSql( sSqlSelect, objSqlQuery, sSelectError ) == false )
|
||
{
|
||
emit mergeRes(tr("判断表是否没有主键查询失败:%1").arg(sSelectError), 1);
|
||
return -1;
|
||
}
|
||
int size_Org = objSqlQuery.size();
|
||
for(int i = 0; i < size_Org; i++)
|
||
{
|
||
objSqlQuery.seek(i);
|
||
QSqlRecord objSqlRecord = objSqlQuery.record();
|
||
if(!insertRecord(pDstDbOpt, dataBaseDst, sTableName, objSqlRecord))
|
||
{
|
||
return -1;
|
||
}
|
||
}
|
||
objSqlQuery.clear();
|
||
}
|
||
else
|
||
{
|
||
//以第一个主键作为排序字符串
|
||
QString orderStr = keyList.at(0);
|
||
getSelectSqlString( dataBaseOrg, sTableName , orderStr, sSqlSelect );
|
||
//查找源数据库
|
||
QSqlQuery objSqlQuery;
|
||
QString sSelectError = "";
|
||
if ( pSrcDbOpt->executeSql( sSqlSelect, objSqlQuery, sSelectError ) == false )
|
||
{
|
||
qDebug() << "src db select error ============================ sql == " << sSqlSelect;
|
||
emit mergeRes(tr("查找源数据库失败%1").arg(sSelectError), 1);
|
||
return -1;
|
||
}
|
||
m_max61850Id = 0;
|
||
if(m_is61850Table && ifExistColumn(m_pSrcDbOpt,dataBaseOrg,sTableName,COMMON61850KEY))
|
||
{
|
||
m_max61850Id = getMaxId(pDstDbOpt, dataBaseDst, sTableName, COMMON61850KEY);
|
||
}
|
||
|
||
while( objSqlQuery.next() )
|
||
{
|
||
QSqlRecord objSqlRecord = objSqlQuery.record();
|
||
dealData(objSqlRecord,sTableName);
|
||
//判断目标数据库中是否有主键冲突的记录
|
||
if( keyList.size() > 0 || uniqueList.size() > 0 )
|
||
{
|
||
if(ifKeysConflict(pDstDbOpt, dataBaseDst, sTableName, keyList, uniqueList, objSqlRecord))
|
||
{
|
||
//此处不再弹窗请求如何合并,所有的合并全部根据配置文件去决定
|
||
emit mergeRes(m_keysConflict,0);
|
||
if(mergeWay.compare("skip") == 0)
|
||
{
|
||
continue;
|
||
}
|
||
else if(mergeWay.compare("fill") == 0)
|
||
{
|
||
deleteConflictRecord(pDstDbOpt, dataBaseDst, sTableName, keyList, uniqueList, objSqlRecord);
|
||
}
|
||
else if(mergeWay.compare("clear") == 0)
|
||
{
|
||
emit mergeRes(tr("合并出错,%1").arg(m_keysConflict),1);
|
||
return -1;
|
||
}
|
||
else
|
||
{
|
||
emit mergeRes(tr("配置出错,跳过,%1").arg(m_keysConflict),1);
|
||
return -1;
|
||
}
|
||
}
|
||
}
|
||
if(!insertRecord(pDstDbOpt, dataBaseDst, sTableName, objSqlRecord))
|
||
{
|
||
return -1;
|
||
}
|
||
}
|
||
objSqlQuery.clear();
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
void db_compare::clearAllDataByTableName(db_opt *pDstDbOpt, QString dataBaseDst, const QString &tableName)
|
||
{
|
||
QString sqlDel = "delete from " + dataBaseDst + "." +tableName;
|
||
QString error ;
|
||
if( pDstDbOpt->executeSql(sqlDel, error ) == false )
|
||
{
|
||
emit mergeRes(tr("删除表:%1数据失败").arg(tableName) + error, 1);
|
||
emit mergeRes(tr("SQL语句为:%1").arg(sqlDel), 1);
|
||
qDebug() << sqlDel;
|
||
// emit mergeRes(sSql_Insert, 0);
|
||
}
|
||
}
|
||
|
||
void db_compare::dealData(QSqlRecord &objSqlRecord, const QString &sTableName)
|
||
{
|
||
if(m_hasLocationId)
|
||
{
|
||
objSqlRecord.setValue(COMMONLOCATIONID,m_stationIdDst);
|
||
}
|
||
if(m_hasChanNo)
|
||
{
|
||
//由于通道号默认从0开始,所以此处需要+1
|
||
int searchChanno = objSqlRecord.value(COMMONCHANNO).toInt();
|
||
searchChanno += m_maxChanNo;
|
||
searchChanno += 1;
|
||
objSqlRecord.setValue(COMMONCHANNO,searchChanno);
|
||
}
|
||
if(m_hasRtuNo)
|
||
{
|
||
//由于RTU号默认从0开始,所以此处需要+1
|
||
int searchRtuno = objSqlRecord.value(COMMONRTUNO).toInt();
|
||
searchRtuno += m_maxRtuNo;
|
||
searchRtuno += 1;
|
||
objSqlRecord.setValue(COMMONRTUNO,searchRtuno);
|
||
}
|
||
if(m_hasFesRtuNo)
|
||
{
|
||
//由于RTU号默认从0开始,所以此处需要+1
|
||
int searchRtuno = objSqlRecord.value(COMMONFESRTUNO).toInt();
|
||
searchRtuno += m_maxRtuNo;
|
||
searchRtuno += 1;
|
||
objSqlRecord.setValue(COMMONFESRTUNO,searchRtuno);
|
||
}
|
||
if(m_is61850Table)
|
||
{
|
||
//< cfg_dev_type_map无id
|
||
if(m_max61850Id > 0)
|
||
{
|
||
int searchId = objSqlRecord.value(COMMON61850KEY).toInt();
|
||
int newId = searchId + m_max61850Id;
|
||
objSqlRecord.setValue(COMMON61850KEY,newId);
|
||
if(sTableName == COMMONSCLDATASET)
|
||
{
|
||
m_sclDatasetMap.insert(searchId,newId);
|
||
}
|
||
}
|
||
if(sTableName == COMMONSCLFCDA)
|
||
{
|
||
int datasetId = objSqlRecord.value(COMMONDATASETID).toInt();
|
||
QMap<int,int>::iterator iter = m_sclDatasetMap.find(datasetId);
|
||
if(iter != m_sclDatasetMap.end())
|
||
{
|
||
objSqlRecord.setValue(COMMONDATASETID,iter.value());
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
void db_compare::getSelectSqlString( QString& sDatabaseName, QString& sTableName, QString& orderStr, QString& sSql )
|
||
{
|
||
QString strLocatonId = "LOCATION_ID";
|
||
QString strSubSystem = "SUB_SYSTEM" ;
|
||
bool hasStation = hasColumn(m_pSrcDbOpt, sDatabaseName, sTableName, strLocatonId);
|
||
bool hasSubSystem = hasColumn(m_pSrcDbOpt, sDatabaseName, sTableName, strSubSystem );
|
||
|
||
if(hasStation && hasSubSystem)
|
||
{
|
||
sSql = "select * from " + sDatabaseName + "." + sTableName + " where location_id = " + QString::number(m_stationIdOrg) + " and sub_system = " + QString::number(m_subSystemIdOrg) \
|
||
+ " order by convert(" + orderStr + " using gbk) asc";
|
||
}else if(hasStation && !hasSubSystem)
|
||
{
|
||
sSql = "select * from " + sDatabaseName + "." + sTableName + " where location_id = " + QString::number(m_stationIdOrg) \
|
||
+ " order by convert(" + orderStr + " using gbk) asc";
|
||
}else if(!hasStation && hasSubSystem)
|
||
{
|
||
sSql = "select * from " + sDatabaseName + "." + sTableName + " where sub_system = " + QString::number(m_subSystemIdOrg) \
|
||
+ " order by convert(" + orderStr + " using gbk) asc";
|
||
}else if(!hasStation && !hasSubSystem)
|
||
{
|
||
sSql = "select * from " + sDatabaseName + "." + sTableName \
|
||
+ " order by convert(" + orderStr + " using gbk) asc";
|
||
}
|
||
}
|
||
|
||
//******************************************** 插入记录函数 ***********************************************************
|
||
bool db_compare::insertRecord(db_opt* pDb_option, QString dataBase, QString table_name, QSqlRecord& record)
|
||
{
|
||
//获取表的所有字段名,并添加对应的值
|
||
QString sSql_allColumnName = "show columns from " + dataBase + "." + table_name;
|
||
QSqlQuery query_allColumnName;
|
||
QString sError_allColumnName = "";
|
||
QString sSql_allColnameWithValue = "";
|
||
//emit mergeRes(sSql_allColumnName);
|
||
|
||
if( pDb_option->executeSql(sSql_allColumnName, query_allColumnName, sError_allColumnName) == false )
|
||
{
|
||
emit mergeRes( tr("获取表的所有字段名失败:%1").arg(sError_allColumnName), 1 );
|
||
return false;
|
||
}
|
||
while(query_allColumnName.next())
|
||
{
|
||
QString columnName = query_allColumnName.value(0).toString();
|
||
//转换数据类型
|
||
QVariant vType = record.field(columnName).type();
|
||
if(QString( vType.typeName() ) == "int")
|
||
{
|
||
sSql_allColnameWithValue += columnName + " = \'" + QString::number(record.value(columnName).toInt()) + "\',";
|
||
}
|
||
else if(QString( vType.typeName() ) == "uint")
|
||
{
|
||
sSql_allColnameWithValue += columnName + " = \'" + QString::number(record.value(columnName).toUInt()) + "\',";
|
||
}
|
||
else if(QString( vType.typeName() ) == "qlonglong")
|
||
{
|
||
sSql_allColnameWithValue += columnName + " = \'" + QString::number(record.value(columnName).toLongLong()) + "\',";
|
||
}
|
||
else if(QString( vType.typeName() ) == "qulonglong")
|
||
{
|
||
sSql_allColnameWithValue += columnName + " = \'" + QString::number(record.value(columnName).toULongLong()) + "\',";
|
||
}
|
||
else if(QString( vType.typeName() ) == "QString" || QString( vType.typeName() ) == "char")
|
||
{
|
||
if( columnName.compare("LB_DIR", Qt::CaseInsensitive) == 0
|
||
&& record.value( columnName ).toString().endsWith("\\") )
|
||
sSql_allColnameWithValue += columnName + " = \'" + record.value(columnName).toString().replace( "'", "\\'" ) + "\\',";
|
||
else
|
||
sSql_allColnameWithValue += columnName + " = \'" + record.value(columnName).toString().replace( "'", "\\'" ) + "\',";
|
||
}
|
||
else if(QString( vType.typeName() ) == "QDateTime")
|
||
{
|
||
sSql_allColnameWithValue += columnName + " = \'" + record.value(columnName).toDateTime().toString("yyyy-MM-dd hh:mm:ss") + "\',";
|
||
}
|
||
else if(QString( vType.typeName() ) == "double")
|
||
{
|
||
sSql_allColnameWithValue += columnName + " = \'" + record.value(columnName).toString() + "\',";
|
||
}
|
||
else
|
||
{
|
||
sSql_allColnameWithValue += columnName + " = \'" + record.value(columnName).toString() + "\',";
|
||
}
|
||
}
|
||
//去掉末尾的最后一个逗号
|
||
sSql_allColnameWithValue.chop(1);
|
||
//emit mergeRes(sSql_allColnameWithValue);
|
||
//插入记录
|
||
QString sSql_Insert = "insert into " + dataBase + "." + table_name + " set " + sSql_allColnameWithValue;
|
||
//emit mergeRes(sSql_Insert);
|
||
QSqlQuery query_Insert;
|
||
QString sError_Insert = "";
|
||
if( pDb_option->executeSql(sSql_Insert, query_Insert, sError_Insert ) == false )
|
||
{
|
||
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;
|
||
}
|
||
query_allColumnName.clear();
|
||
query_Insert.clear();
|
||
return true;
|
||
}
|
||
//******************************************** 获取最大的id号函数 ******************************************************
|
||
int db_compare::getMaxId(db_opt* pDb_option, QString dataBase, QString table_name, QString columnName)
|
||
{
|
||
int ret;
|
||
QString sSql_maxId = "select max(" + columnName + ") from " + dataBase + "." + table_name;
|
||
QSqlQuery query_maxId;
|
||
QString sError_maxId = "";
|
||
if( pDb_option->executeSql(sSql_maxId, query_maxId, sError_maxId ) == false )
|
||
{
|
||
// slotShowMsg( sError_maxId, 1 );
|
||
return -1;
|
||
}
|
||
while(query_maxId.next())
|
||
{
|
||
QString max_Id = query_maxId.value(0).toString();
|
||
ret = max_Id.toInt();
|
||
}
|
||
query_maxId.clear();
|
||
return ret;
|
||
}
|
||
//******************************************** 获取车站ID函数 *********************************************************
|
||
int db_compare::getSubStationId(db_opt* pDb_option, QString dataBase, QString SubStation)
|
||
{
|
||
int ret = -1;
|
||
SubStation = SubStation.section('(', 0, 0); //截取左括号前的子串
|
||
QString sSql_SubStationId = "select location_id from " + dataBase + ".sys_model_location_info where tag_name = \'" + SubStation + "\'";
|
||
QSqlQuery query_SubStationId;
|
||
QString sError_SubStationId = "";
|
||
if( pDb_option->executeSql(sSql_SubStationId, query_SubStationId, sError_SubStationId) == false )
|
||
{
|
||
emit mergeRes(sError_SubStationId, 1);
|
||
return ret;
|
||
}
|
||
while(query_SubStationId.next()){
|
||
QString SubStationId = query_SubStationId.value(0).toString();
|
||
ret = SubStationId.toInt();
|
||
}
|
||
query_SubStationId.clear();
|
||
return ret;
|
||
}
|
||
//******************************************** 获取专业ID函数 *********************************************************
|
||
int db_compare::getSubSystemId(db_opt* pDb_option, QString dataBase, QString SubSystem)
|
||
{
|
||
int ret = -1;
|
||
SubSystem = SubSystem.section('(', 0, 0); //截取左括号前的子串
|
||
QString sSql_SubSystemId = "select sub_system_id from " + dataBase + ".sys_model_sub_system_info where tag_name = \'" + SubSystem + "\'";
|
||
QSqlQuery query_SubSystemId;
|
||
QString sError_SubSystemId = "";
|
||
if( pDb_option->executeSql(sSql_SubSystemId, query_SubSystemId, sError_SubSystemId) == false )
|
||
{
|
||
emit mergeRes(sError_SubSystemId, 1);
|
||
return ret;
|
||
}
|
||
while(query_SubSystemId.next()){
|
||
QString SubSystemId = query_SubSystemId.value(0).toString();
|
||
ret = SubSystemId.toInt();
|
||
}
|
||
query_SubSystemId.clear();
|
||
return ret;
|
||
}
|
||
|
||
int db_compare::getSubSystemFlagById( int id )
|
||
{
|
||
int ret = 1;
|
||
for(int i = 0; i < id - 1; i++ )
|
||
{
|
||
ret *= 2;
|
||
}
|
||
return ret;
|
||
}
|
||
|
||
QVector<int> db_compare::getSubSystemFlagById( QVector<int> idVec )
|
||
{
|
||
QVector<int> ret;
|
||
QVector<int>::iterator itr;
|
||
m_nSubSystemFlag = 0 ;
|
||
for( itr = idVec.begin(); itr != idVec.end(); itr++ )
|
||
{
|
||
int flag = getSubSystemFlagById( *itr );
|
||
ret.append( flag );
|
||
m_nSubSystemFlag += flag;
|
||
}
|
||
return ret;
|
||
}
|
||
|
||
//******************************************** 对比主键函数 ***********************************************************
|
||
bool db_compare::compKey(QStringList Org, QStringList Dst, int n)
|
||
{
|
||
bool ret = true;
|
||
for(int i = 0; i < n; i++)
|
||
{
|
||
bool tmp;
|
||
if(QString::compare( Org.at(i), Dst.at(i) ) == 0)
|
||
{
|
||
tmp = true;
|
||
}else
|
||
{
|
||
ret = false;
|
||
break;
|
||
}
|
||
ret = ret & tmp;
|
||
}
|
||
return ret;
|
||
}
|
||
//*********************************************修改记录函数************************************************************
|
||
void db_compare::changeRecord( QSqlRecord& record, QString& sTableName, int StaId_dst, bool distinguishStation)
|
||
{
|
||
for( int i = 0; i < record.count(); i++ )
|
||
{
|
||
if(distinguishStation)
|
||
{
|
||
record.setValue("LOCATION_ID", QString::number(StaId_dst));
|
||
}
|
||
|
||
// if(QString::compare(sTableName, "sys_model_location_info") == 0)
|
||
// {
|
||
// record.setValue("DOMAIN_ID", domain_id);
|
||
// record.setValue("LOCATION_NO", location_no);
|
||
// }
|
||
|
||
if( record.fieldName(i).contains("tag", Qt::CaseInsensitive ) || record.fieldName(i).contains("desc", Qt::CaseInsensitive ) || record.fieldName(i).contains("device", Qt::CaseInsensitive ) || record.fieldName(i).contains("name", Qt::CaseInsensitive ) ||
|
||
record.fieldName(i).compare("LINKAGE_STRING", Qt::CaseInsensitive ) == 0 || record.fieldName(i).compare("OPT_HANDOVER_GROUP", Qt::CaseInsensitive ) == 0 || (sTableName.compare("trigger_condition_define", Qt::CaseInsensitive ) == 0 && record.fieldName(i).contains("PARAM", Qt::CaseInsensitive) ) )
|
||
{
|
||
if( record.value( i ).toString().contains(m_sSrcStaTagName, Qt::CaseInsensitive) )
|
||
{
|
||
QString sRecordValue = record.value( i ).toString();
|
||
sRecordValue.replace(m_sSrcStaTagName, m_sDstStaTagName );
|
||
record.setValue( record.fieldName(i), sRecordValue );
|
||
}
|
||
if( record.value( i ).toString().contains(m_sSrcStaDesc, Qt::CaseInsensitive) )
|
||
{
|
||
QString sRecordValue = record.value( i ).toString();
|
||
sRecordValue.replace(m_sSrcStaDesc, m_sDstStaDesc );
|
||
record.setValue( ( record.fieldName(i) ), sRecordValue );
|
||
}
|
||
}
|
||
}
|
||
}
|
||
//************************从sys_model_location_info表中获取TAG_NAME/DESCRIPTION****************************************
|
||
QString db_compare::getSerachStr(db_opt* pDb_opt, QString sDataBase, int StaId , QString searchStr)
|
||
{
|
||
QString ret;
|
||
QString sSql = "select " + searchStr + " from " + sDataBase + ".sys_model_location_info where location_id = \'" + QString::number(StaId) + "\'";
|
||
QSqlQuery query;
|
||
QString sError = "";
|
||
if( pDb_opt->executeSql(sSql, query, sError) == false )
|
||
{
|
||
emit mergeRes(sError, 1);
|
||
// return;
|
||
}
|
||
while(query.next()){
|
||
ret = query.value(0).toString();
|
||
|
||
}
|
||
query.clear();
|
||
return ret;
|
||
}
|
||
|
||
//***************************************判断某个表中是否存在某个字段*****************************************************
|
||
bool db_compare::ifExistColumn(db_opt* pDb_opt, QString sDataBase, QString tableName, QString columnName)
|
||
{
|
||
bool ret = false;
|
||
QString sSql = "show columns from " + sDataBase + "." + tableName;
|
||
//emit mergeRes(sSql);
|
||
QSqlQuery query;
|
||
QString sError;
|
||
if( pDb_opt->executeSql(sSql, query, sError) == false )
|
||
{
|
||
emit mergeRes(tr("判断%1字段是否存在:%2").arg(columnName).arg(sError), 1);
|
||
return ret;
|
||
}
|
||
while(query.next())
|
||
{
|
||
QString tmpStr = query.value(0).toString();
|
||
if(QString::compare(tmpStr, columnName) == 0)
|
||
{
|
||
ret = true;
|
||
return ret;
|
||
}
|
||
}
|
||
return ret;
|
||
}
|
||
//******************************************获取专业部分SQL字符串*******************************************************
|
||
QString db_compare::getSubSystemSQLStr(QStringList sSubSystem, bool existStation)
|
||
{
|
||
QString sub_systems;
|
||
if(sSubSystem.size() == 0)
|
||
{
|
||
sub_systems = "";
|
||
}
|
||
else
|
||
{
|
||
if(existStation)
|
||
{
|
||
if(sSubSystem.size() == 1)
|
||
{
|
||
sub_systems = " and ";
|
||
sub_systems += "sub_system = " + sSubSystem.at(0);
|
||
}
|
||
else
|
||
{
|
||
sub_systems = " and (";
|
||
for(int i = 0; i < sSubSystem.size(); i++)
|
||
{
|
||
if(i == 0)
|
||
{
|
||
sub_systems += "sub_system = " + sSubSystem.at(i);
|
||
}
|
||
else if(i == sSubSystem.size() - 1)
|
||
{
|
||
sub_systems += " or sub_system = " + sSubSystem.at(i) + ")";
|
||
}
|
||
else
|
||
{
|
||
sub_systems += " or sub_system = " + sSubSystem.at(i);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
sub_systems = " where ";
|
||
for(int i = 0; i < sSubSystem.size(); i++)
|
||
{
|
||
if(i == 0)
|
||
{
|
||
sub_systems += "sub_system = " + sSubSystem.at(i);
|
||
}
|
||
else
|
||
{
|
||
sub_systems += " or sub_system = " + sSubSystem.at(i);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return sub_systems;
|
||
}
|
||
//**************************************判断记录在目标数据库中是否主键冲突*************************************************
|
||
bool db_compare::ifKeysConflict(db_opt* pDb_opt, QString sDataBase, QString sTableName, QStringList keys, QStringList uniques, QSqlRecord& record)
|
||
{
|
||
bool ret = false;
|
||
//判断UNIQUE记录冲突
|
||
if( uniques.size() > 0 )
|
||
{
|
||
QString condition_u;
|
||
for(int i = 0; i < uniques.size(); i++)
|
||
{
|
||
if(i == 0)
|
||
{
|
||
condition_u += uniques.at(i) + " = \'" + record.value(uniques.at(i)).toString() + "\'";
|
||
}
|
||
else
|
||
{
|
||
condition_u += " or " + uniques.at(i) + " = \'" + record.value(uniques.at(i)).toString() + "\'";
|
||
}
|
||
}
|
||
QString sSql_u = "select * from " + sDataBase + "." + sTableName + " where " + condition_u;
|
||
QSqlQuery query_u;
|
||
QString sError_u = "";
|
||
if( pDb_opt->executeSql(sSql_u, query_u, sError_u) == false )
|
||
{
|
||
emit mergeRes(tr("判断UNIQUE记录冲突查询失败:%1").arg(sError_u), 1);
|
||
return false;
|
||
}
|
||
if(query_u.size() > 0)
|
||
{
|
||
ret = true;
|
||
m_keysConflict =QString("表[%1],条件[%2],unique冲突!").arg(sTableName.toStdString().c_str()).arg(condition_u.toStdString().c_str());
|
||
LOGERROR("表[%s],条件[%s],unique冲突!",sTableName.toStdString().c_str(),condition_u.toStdString().c_str());
|
||
//qDebug() << "表" << sTableName << "unique冲突";
|
||
return ret;
|
||
}
|
||
query_u.clear();
|
||
}
|
||
//***********************************************************************************************************
|
||
//判断主键冲突
|
||
QString condition_k;
|
||
for(int i = 0; i < keys.size(); i++)
|
||
{
|
||
if(i == 0)
|
||
{
|
||
condition_k += keys.at(i) + " = \'" + record.value(keys.at(i)).toString() + "\'";
|
||
}
|
||
else
|
||
{
|
||
condition_k += " and " + keys.at(i) + " = \'" + record.value(keys.at(i)).toString() + "\'";
|
||
}
|
||
}
|
||
QString sSql_k = "select * from " + sDataBase + "." + sTableName + " where " + condition_k;
|
||
QSqlQuery query_k;
|
||
QString sError_k = "";
|
||
if( pDb_opt->executeSql(sSql_k, query_k, sError_k) == false )
|
||
{
|
||
emit mergeRes(tr("判断主键冲突查询失败:%1").arg(sError_k), 1);
|
||
}
|
||
if(query_k.size() > 0)
|
||
{
|
||
ret = true;
|
||
m_keysConflict =QString("表[%1],条件[%2],主键冲突!").arg(sTableName.toStdString().c_str()).arg(condition_k.toStdString().c_str());
|
||
LOGERROR("表[%s],条件[%s],主键冲突!",sTableName.toStdString().c_str(),condition_k.toStdString().c_str());
|
||
return ret;
|
||
}
|
||
query_k.clear();
|
||
return ret;
|
||
}
|
||
//**********************************************删除冲突的记录**********************************************************
|
||
void db_compare::deleteConflictRecord(db_opt* pDb_opt, QString sDataBase, QString sTableName, QStringList keys, QStringList uniques, QSqlRecord& record)
|
||
{
|
||
//删除UNIQUE唯一的记录
|
||
if(uniques.size() > 0)
|
||
{
|
||
QString condition_u;
|
||
for(int i = 0; i < uniques.size(); i++)
|
||
{
|
||
if(i == 0)
|
||
{
|
||
condition_u += uniques.at(i) + " = \'" + record.value(uniques.at(i)).toString() + "\'";
|
||
}
|
||
else
|
||
{
|
||
condition_u += " or " + uniques.at(i) + " = \'" + record.value(uniques.at(i)).toString() + "\'";
|
||
}
|
||
}
|
||
QString sSql_u = "delete from " + sDataBase + "." + sTableName + " where " + condition_u;
|
||
//emit mergeRes(sSql_u);
|
||
QSqlQuery query_u;
|
||
QString sError_u = "";
|
||
if( pDb_opt->executeSql(sSql_u, query_u, sError_u) == false )
|
||
{
|
||
emit mergeRes(tr("删除UNIQUE冲突记录失败:%1").arg(sError_u), 1);
|
||
}
|
||
query_u.clear();
|
||
}
|
||
//********************************************************************************************************
|
||
//删除主键冲突的
|
||
QString condition_k;
|
||
for(int i = 0; i < keys.size(); i++)
|
||
{
|
||
if(i == 0)
|
||
{
|
||
condition_k += keys.at(i) + " = \'" + record.value(keys.at(i)).toString() + "\'";
|
||
}
|
||
else
|
||
{
|
||
condition_k += " and " + keys.at(i) + " = \'" + record.value(keys.at(i)).toString() + "\'";
|
||
}
|
||
}
|
||
QString sSql_k = "delete from " + sDataBase + "." + sTableName + " where " + condition_k;
|
||
QSqlQuery query_k;
|
||
QString sError_k = "";
|
||
if( pDb_opt->executeSql(sSql_k, query_k, sError_k) == false )
|
||
{
|
||
emit mergeRes(tr("删除主键冲突记录失败:%1").arg(sError_k), 1);
|
||
}
|
||
query_k.clear();
|
||
}
|
||
//*********************************************获取表字段的数量*********************************************************
|
||
int db_compare::getColumnNum(db_opt* pDb_opt, QString sDataBase, QString sTableName)
|
||
{
|
||
int ret;
|
||
QString sSql = "select count(*) from information_schema.COLUMNS where TABLE_SCHEMA = \'" + sDataBase + "\' and table_name = \'" + sTableName + "\'";
|
||
QSqlQuery query;
|
||
QString sError;
|
||
if( pDb_opt->executeSql(sSql, query, sError) == false )
|
||
{
|
||
emit mergeRes(tr("查询字段数量失败:%1").arg(sError), 1);
|
||
}
|
||
while(query.next())
|
||
{
|
||
ret = query.value(0).toInt();
|
||
}
|
||
query.clear();
|
||
return ret;
|
||
}
|
||
//***********************************************获取表的主键***********************************************************
|
||
QStringList db_compare::getMainKeys(db_opt* pDb_opt, QString sDataBase, QString sTableName)
|
||
{
|
||
QStringList ret;
|
||
QString sSql = "select column_name from information_schema.KEY_COLUMN_USAGE WHERE TABLE_NAME = \'" + sTableName + "\' and TABLE_SCHEMA = \'" + sDataBase + "\' and CONSTRAINT_NAME = 'primary'";
|
||
//emit mergeRes(sSql_getKeys);
|
||
qDebug()<<sSql;
|
||
QSqlQuery query;
|
||
QString sError = "";
|
||
if( pDb_opt->executeSql(sSql, query, sError) == false )
|
||
{
|
||
emit mergeRes(tr("获取主键查询失败:%1").arg(sError), 1);
|
||
}
|
||
|
||
while(query.next())
|
||
{
|
||
ret.append(query.value(0).toString());
|
||
}
|
||
query.clear();
|
||
return ret;
|
||
}
|
||
//*************************获取表属性为UNIQUE的字段**************************************
|
||
QStringList db_compare::getUniques(db_opt* pDb_opt, QString sDataBaseName, QString sTableName)
|
||
{
|
||
// show index from database.table where key_name =
|
||
// (select distinct CONSTRAINT_NAME from information_schema.TABLE_CONSTRAINTS
|
||
// where table_name = 'table' and CONSTRAINT_SCHEMA = 'database' and constraint_type = 'UNIQUE');
|
||
QStringList ret;
|
||
QString sSql = "show index from " + sDataBaseName + "." + sTableName + " where key_name = (select distinct CONSTRAINT_NAME from information_schema.TABLE_CONSTRAINTS where table_name = \'" \
|
||
+ sTableName + "\' and constraint_schema = \'" + sDataBaseName + "\' and constraint_type = \'UNIQUE\');";
|
||
qDebug() << "get uniques sql = " << sSql;
|
||
QSqlQuery query;
|
||
QString sError = "";
|
||
if( pDb_opt->executeSql(sSql, query, sError) == false )
|
||
{
|
||
emit mergeRes(tr("查询UNIQUE字段失败:%1").arg(sError), 1);
|
||
}
|
||
|
||
while(query.next())
|
||
{
|
||
ret.append( query.value("Column_name").toString() );
|
||
}
|
||
query.clear();
|
||
return ret;
|
||
}
|
||
|
||
//*******************************************判断数据库中是否存在表*******************************************************
|
||
bool db_compare::ifExistTable(db_opt* pDb_opt, QString sDataBase, QString sTableName)
|
||
{
|
||
bool ret = false;
|
||
QString sSql = "show tables from " + sDataBase;
|
||
|
||
QSqlQuery query;
|
||
QString sError = "";
|
||
if( pDb_opt->executeSql(sSql, query, sError) == false )
|
||
{
|
||
emit mergeRes(tr("获取主键查询失败:%1").arg(sError), 1);
|
||
}
|
||
while(query.next())
|
||
{
|
||
if(QString::compare(query.value(0).toString(), sTableName) == 0)
|
||
{
|
||
ret = true;
|
||
}
|
||
}
|
||
query.clear();
|
||
return ret;
|
||
}
|
||
|
||
bool db_compare::ifSubSystemSame( db_opt* pDb_opt, QString& sDatabaseName, QString& sTableName, int subSystemFlag )
|
||
{
|
||
QString sSql = "select SUBSYSTEM_FLAG from " + sDatabaseName + ".rt_table_mode where NAME = \'" + sTableName + "\';";
|
||
QSqlQuery query;
|
||
QString sError = "";
|
||
if( pDb_opt->executeSql(sSql, query, sError) == false )
|
||
{
|
||
emit mergeRes(tr("查询专业是否匹配出错,%1").arg(sError), 1);
|
||
return false;
|
||
}
|
||
while(query.next())
|
||
{
|
||
if(query.value(0).toInt() == subSystemFlag)
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
bool db_compare::ifSubSystemSame( db_opt* pDb_opt, QString& sDatabaseName, QString& sTableName, QVector<int> subSystemFlagVec )
|
||
{
|
||
QString sSql = "select SUBSYSTEM_FLAG from " + sDatabaseName + ".rt_table_mode where NAME = \'" + sTableName + "\';";
|
||
QSqlQuery query;
|
||
QString sError = "";
|
||
if( pDb_opt->executeSql(sSql, query, sError) == false )
|
||
{
|
||
emit mergeRes(tr("查询专业是否匹配出错,%1").arg(sError), 1);
|
||
return false;
|
||
}
|
||
while(query.next())
|
||
{
|
||
if( subSystemFlagVec.contains( query.value(0).toInt() ) )
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
bool db_compare::ifDistinguishStation( db_opt* pDb_opt, QString& sDatabaseName, QString& sTableName )
|
||
{
|
||
QString sSql = "select SELECT_BY_LOCATION from " + sDatabaseName + ".rt_table_mode where NAME = \'" + sTableName + "\';";
|
||
QSqlQuery query;
|
||
QString sError = "";
|
||
if( pDb_opt->executeSql(sSql, query, sError) == false )
|
||
{
|
||
emit mergeRes(tr("查询专业是否匹配出错,%1").arg(sError), 1);
|
||
return false;
|
||
}
|
||
while(query.next())
|
||
{
|
||
if(query.value(0).toInt() == 1)
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
bool db_compare::ifDistinguishSubSystem( db_opt* pDb_opt, QString& sDatabaseName, QString& sTableName )
|
||
{
|
||
QString sSql = "select SELECT_BY_SUBSYSTEM from " + sDatabaseName + ".rt_table_mode where NAME = \'" + sTableName + "\';";
|
||
QSqlQuery query;
|
||
QString sError = "";
|
||
if( pDb_opt->executeSql(sSql, query, sError) == false )
|
||
{
|
||
emit mergeRes(tr("查询专业是否匹配出错,%1").arg(sError), 1);
|
||
return false;
|
||
}
|
||
while(query.next())
|
||
{
|
||
if(query.value(0).toInt() == 1)
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|