2025-02-06 16:36:50 +08:00
|
|
|
#include "dataBase.h"
|
2025-03-21 12:53:45 +08:00
|
|
|
#include "logger.h"
|
2025-02-06 16:36:50 +08:00
|
|
|
#include <QDebug>
|
|
|
|
|
#include <QFile>
|
|
|
|
|
#include <QXmlStreamReader>
|
|
|
|
|
#include <QMessageBox>
|
|
|
|
|
#include <QSqlQuery>
|
|
|
|
|
#include <QJsonObject>
|
|
|
|
|
#include <QSqlError>
|
|
|
|
|
#include <QSqlDriver>
|
|
|
|
|
#include <QJsonDocument>
|
|
|
|
|
|
2025-03-21 12:53:45 +08:00
|
|
|
DataBase* DataBase::dbInstance = nullptr;
|
2025-02-06 16:36:50 +08:00
|
|
|
int DataBase::_id = 0;
|
|
|
|
|
|
|
|
|
|
DataBase::DataBase()
|
|
|
|
|
{
|
|
|
|
|
m_sFileName = QString("setting.xml");
|
|
|
|
|
initial();
|
2025-03-04 09:44:03 +08:00
|
|
|
//createProjectDB();
|
|
|
|
|
//initialProjectDB();
|
|
|
|
|
createProjectManager();
|
2025-02-06 16:36:50 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DataBase::~DataBase()
|
|
|
|
|
{
|
|
|
|
|
QString connectionName = QSqlDatabase::database().connectionName();
|
|
|
|
|
QSqlDatabase::removeDatabase(connectionName);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DataBase::initial()
|
|
|
|
|
{
|
|
|
|
|
readXML();
|
2025-03-04 09:44:03 +08:00
|
|
|
if (QSqlDatabase::contains(_DataBaseName))
|
|
|
|
|
db = QSqlDatabase::database(_DataBaseName);
|
2025-02-06 16:36:50 +08:00
|
|
|
else
|
2025-03-04 09:44:03 +08:00
|
|
|
db = QSqlDatabase::addDatabase(_DataBaseType,_DataBaseName);
|
|
|
|
|
|
2025-02-06 16:36:50 +08:00
|
|
|
db.setDatabaseName(_DataBaseName);
|
|
|
|
|
db.setHostName(_HostName);
|
|
|
|
|
db.setPort(_Port);
|
|
|
|
|
// 需要改成自己的用户名和密码
|
|
|
|
|
db.setUserName(_UserName);
|
|
|
|
|
db.setPassword(_PassWord);
|
|
|
|
|
|
|
|
|
|
if (db.open()) {
|
2025-03-04 09:44:03 +08:00
|
|
|
qDebug()<<"baseDB success";
|
2025-02-06 16:36:50 +08:00
|
|
|
} else {
|
2025-03-21 12:53:45 +08:00
|
|
|
LOG_ERROR("DB", QString("Database not open"));
|
2025-02-06 16:36:50 +08:00
|
|
|
}
|
2025-03-07 19:24:19 +08:00
|
|
|
//元模
|
2025-03-21 12:53:45 +08:00
|
|
|
|
|
|
|
|
getAttributeGroup(); //获取属性组信息
|
|
|
|
|
getDataType(); //获取数据类型信息
|
|
|
|
|
getModelType(); //获取模型类型
|
|
|
|
|
getModelGroup(); //获取模型组
|
|
|
|
|
getAttribute(); //获取属性
|
2025-03-07 19:24:19 +08:00
|
|
|
getModelAttribute();
|
2025-03-21 12:53:45 +08:00
|
|
|
getModelConnectivity(); //获取连接性
|
2025-02-06 16:36:50 +08:00
|
|
|
}
|
|
|
|
|
|
2025-03-21 12:53:45 +08:00
|
|
|
DataBase* DataBase::GetInstance()
|
2025-03-04 09:44:03 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
if(dbInstance == nullptr)
|
|
|
|
|
{
|
|
|
|
|
dbInstance = new DataBase();
|
2025-03-04 09:44:03 +08:00
|
|
|
}
|
2025-03-21 12:53:45 +08:00
|
|
|
return dbInstance;
|
2025-03-04 09:44:03 +08:00
|
|
|
}
|
|
|
|
|
|
2025-03-21 12:53:45 +08:00
|
|
|
QSqlQuery DataBase::executeSQL(const QString& strSQL,bool createOrDrop,const QVariantList& params, bool useTranscation)
|
2025-03-04 09:44:03 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
//事务
|
|
|
|
|
bool transactionStarted = false;
|
|
|
|
|
if(useTranscation)
|
|
|
|
|
{
|
|
|
|
|
if(!db.transaction())
|
|
|
|
|
{
|
|
|
|
|
LOG_ERROR("DB", QString("Start transaction failed. error: %1").arg(db.lastError().databaseText()));
|
|
|
|
|
throw std::runtime_error(db.lastError().text().toStdString());
|
|
|
|
|
}
|
|
|
|
|
transactionStarted = true;
|
2025-03-04 09:44:03 +08:00
|
|
|
}
|
|
|
|
|
|
2025-03-21 12:53:45 +08:00
|
|
|
QSqlQuery sqlQuery(db);
|
|
|
|
|
try
|
2025-02-06 16:36:50 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
if(createOrDrop) //创建或删除直接执行sql
|
2025-02-06 16:36:50 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
if (!sqlQuery.exec(strSQL))
|
2025-02-06 16:36:50 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
LOG_ERROR("SQL", QString("SQL '%1' execute error: %2").arg(strSQL, sqlQuery.lastError().databaseText()));
|
|
|
|
|
throw std::runtime_error(db.lastError().text().toStdString());
|
2025-02-06 16:36:50 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
if(!sqlQuery.prepare(strSQL))
|
2025-02-06 16:36:50 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
LOG_ERROR("SQL", QString("SQL '%1' prepare fialed. error: %2").arg(strSQL, sqlQuery.lastError().databaseText()));
|
|
|
|
|
throw std::runtime_error(db.lastError().text().toStdString());
|
2025-02-06 16:36:50 +08:00
|
|
|
}
|
2025-03-21 12:53:45 +08:00
|
|
|
//绑定参数
|
2025-02-06 16:36:50 +08:00
|
|
|
|
2025-03-21 12:53:45 +08:00
|
|
|
for(int i = 0;i < params.size();++i)
|
2025-02-06 16:36:50 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
sqlQuery.bindValue(i, params[i]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!sqlQuery.exec())
|
|
|
|
|
{
|
|
|
|
|
LOG_ERROR("SQL", QString("SQL '%1' execute error: %2").arg(strSQL, sqlQuery.lastError().databaseText()));
|
|
|
|
|
throw std::runtime_error(db.lastError().text().toStdString());
|
2025-02-06 16:36:50 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-21 12:53:45 +08:00
|
|
|
// 提交事务(如果已开启)
|
|
|
|
|
if(transactionStarted && !db.commit())
|
|
|
|
|
{
|
|
|
|
|
throw std::runtime_error(db.lastError().text().toStdString());
|
|
|
|
|
LOG_ERROR("DB", QString("Commit transaction failed. connectionName: %1").arg(db.lastError().databaseText()));
|
2025-02-06 16:36:50 +08:00
|
|
|
}
|
2025-03-21 12:53:45 +08:00
|
|
|
}
|
|
|
|
|
catch (const std::runtime_error& e)
|
|
|
|
|
{
|
|
|
|
|
// 错误处理:回滚事务(如果已开启)
|
|
|
|
|
if(transactionStarted)
|
2025-02-06 16:36:50 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
if(!db.rollback()) // 回滚失败时记录警告
|
2025-02-06 16:36:50 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
LOG_ERROR("DB", QString("Rollback failed. connectionName: %1").arg(db.lastError().databaseText()));
|
2025-02-06 16:36:50 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-21 12:53:45 +08:00
|
|
|
throw; // 重新抛出异常
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return sqlQuery;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//多条批量SQL语句执行接口
|
|
|
|
|
QSqlQuery DataBase::executeBatchSQL(const QStringList& sqlStatements, bool createOrDrop,const QList<QVariantList>& paramsList, bool useTranscation)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
//参数数量校验
|
|
|
|
|
if(!paramsList.isEmpty() && sqlStatements.size() != paramsList.size())
|
|
|
|
|
{
|
|
|
|
|
LOG_ERROR("SQL", QString("SQL statement does not match the number of parameters"));
|
|
|
|
|
throw std::runtime_error(QSqlError("SQL statement does not match the number of parameters").text().toStdString());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//事务
|
|
|
|
|
bool transactionStarted = false;
|
|
|
|
|
if(useTranscation)
|
|
|
|
|
{
|
|
|
|
|
if(!db.transaction())
|
|
|
|
|
{
|
|
|
|
|
LOG_ERROR("DB", QString("Start transaction failed."));
|
|
|
|
|
throw std::runtime_error(db.lastError().text().toStdString());
|
2025-02-06 16:36:50 +08:00
|
|
|
}
|
2025-03-21 12:53:45 +08:00
|
|
|
transactionStarted = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QSqlQuery lastQuery(db);
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
for(int i = 0; i < sqlStatements.size(); i++)
|
2025-02-06 16:36:50 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
const QString& strSQL = sqlStatements.at(i);
|
|
|
|
|
const QVariantList& params = paramsList.isEmpty() ? QVariantList() : paramsList.at(i);
|
|
|
|
|
|
|
|
|
|
QSqlQuery sqlQuery(db);
|
|
|
|
|
if(createOrDrop)
|
2025-02-06 16:36:50 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
if (!sqlQuery.exec(strSQL))
|
|
|
|
|
{
|
|
|
|
|
LOG_ERROR("SQL", QString("SQL '%1' execute error: %2").arg(strSQL, sqlQuery.lastError().databaseText()));
|
|
|
|
|
throw std::runtime_error(db.lastError().text().toStdString());
|
|
|
|
|
}
|
2025-02-06 16:36:50 +08:00
|
|
|
}
|
2025-03-21 12:53:45 +08:00
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if(!sqlQuery.prepare(strSQL))
|
|
|
|
|
{
|
|
|
|
|
LOG_ERROR("SQL", QString("SQL '%1' prepare fialed. error: %2").arg(strSQL, sqlQuery.lastError().databaseText()));
|
|
|
|
|
throw std::runtime_error(db.lastError().text().toStdString());
|
|
|
|
|
}
|
|
|
|
|
//绑定参数
|
|
|
|
|
for(int i = 0;i < params.size();++i)
|
|
|
|
|
{
|
|
|
|
|
sqlQuery.bindValue(i, params[i]);
|
|
|
|
|
}
|
2025-02-06 16:36:50 +08:00
|
|
|
|
2025-03-21 12:53:45 +08:00
|
|
|
if (!sqlQuery.exec())
|
|
|
|
|
{
|
|
|
|
|
LOG_ERROR("SQL", QString("SQL '%1' execute error: %2").arg(strSQL, sqlQuery.lastError().databaseText()));
|
|
|
|
|
throw std::runtime_error(db.lastError().text().toStdString());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
lastQuery = std::move(sqlQuery);
|
|
|
|
|
// 提交事务(如果已开启)
|
|
|
|
|
if(transactionStarted && !db.commit())
|
|
|
|
|
{
|
|
|
|
|
throw std::runtime_error(db.lastError().text().toStdString());
|
|
|
|
|
LOG_ERROR("DB", QString("Commit transaction failed."));
|
|
|
|
|
}
|
2025-02-06 16:36:50 +08:00
|
|
|
}
|
2025-03-21 12:53:45 +08:00
|
|
|
}
|
|
|
|
|
catch (const std::runtime_error& e)
|
|
|
|
|
{
|
|
|
|
|
// 错误处理:回滚事务(如果已开启)
|
|
|
|
|
if(transactionStarted)
|
2025-02-06 16:36:50 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
if(!db.rollback()) // 回滚失败时记录警告
|
2025-02-06 16:36:50 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
LOG_ERROR("DB", QString("Rollback failed. error: %1").arg( db.lastError().databaseText()));
|
2025-02-06 16:36:50 +08:00
|
|
|
}
|
|
|
|
|
}
|
2025-03-21 12:53:45 +08:00
|
|
|
|
|
|
|
|
throw; // 重新抛出异常
|
2025-02-06 16:36:50 +08:00
|
|
|
}
|
2025-03-21 12:53:45 +08:00
|
|
|
|
|
|
|
|
return lastQuery;
|
2025-02-06 16:36:50 +08:00
|
|
|
}
|
|
|
|
|
|
2025-03-21 12:53:45 +08:00
|
|
|
|
2025-02-06 16:36:50 +08:00
|
|
|
bool DataBase::insertComponent(QUuid uuid,QString nspath,QString tag,QString name,QString description,QString grid,QString zone,QString station,int type,bool inService,int state,QJsonObject connected_bus,QJsonObject label,QJsonObject context,int page_id,int op)
|
|
|
|
|
{
|
|
|
|
|
if(db.open())
|
|
|
|
|
{
|
|
|
|
|
QSqlQuery qry(db);
|
|
|
|
|
|
|
|
|
|
/*QJsonDocument busDoc(connected_bus);
|
|
|
|
|
QString strBus = busDoc.toJson(QJsonDocument::Compact);
|
|
|
|
|
|
|
|
|
|
QJsonDocument labelDoc(label);
|
|
|
|
|
QString strLabel = labelDoc.toJson(QJsonDocument::Compact);*/
|
|
|
|
|
|
|
|
|
|
QJsonDocument contextDoc(context);
|
|
|
|
|
QString strCon = contextDoc.toJson(QJsonDocument::Compact);
|
|
|
|
|
|
|
|
|
|
/*qry.prepare("INSERT INTO component(global_uuid, nspath, tag, name, description, grid, zone, station, type, in_service, state, connected_bus, label, context, page_id, op, ts) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
|
|
|
|
qry.bindValue(0,uuid);
|
|
|
|
|
qry.bindValue(1,nspath);
|
|
|
|
|
qry.bindValue(2,tag);
|
|
|
|
|
qry.bindValue(3,name);
|
|
|
|
|
qry.bindValue(4,description);
|
|
|
|
|
qry.bindValue(5,grid);
|
|
|
|
|
qry.bindValue(6,zone);
|
|
|
|
|
qry.bindValue(7,station);
|
|
|
|
|
qry.bindValue(8,type);
|
|
|
|
|
qry.bindValue(9,inService);
|
|
|
|
|
qry.bindValue(10,state);
|
|
|
|
|
qry.bindValue(11,strBus);
|
|
|
|
|
qry.bindValue(12,strLabel);
|
|
|
|
|
qry.bindValue(13,strCon);
|
|
|
|
|
qry.bindValue(14,page_id);
|
|
|
|
|
qry.bindValue(15,op);
|
|
|
|
|
qry.bindValue(16,QDateTime::currentDateTime());*/
|
|
|
|
|
qry.prepare("INSERT INTO component(global_uuid, tag, name, grid, zone, station, type, context, page_id, op, ts) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
|
|
|
|
qry.bindValue(0,uuid);
|
|
|
|
|
qry.bindValue(1,tag);
|
|
|
|
|
qry.bindValue(2,name);
|
|
|
|
|
qry.bindValue(3,grid);
|
|
|
|
|
qry.bindValue(4,zone);
|
|
|
|
|
qry.bindValue(5,station);
|
|
|
|
|
qry.bindValue(6,type);
|
|
|
|
|
qry.bindValue(7,strCon);
|
|
|
|
|
qry.bindValue(8,page_id);
|
|
|
|
|
qry.bindValue(9,op);
|
|
|
|
|
qry.bindValue(10,QDateTime::currentDateTime());
|
|
|
|
|
bool res = qry.exec();
|
|
|
|
|
QString str = qry.lastQuery();
|
|
|
|
|
const QVariantList list = qry.boundValues();
|
|
|
|
|
for (qsizetype i = 0; i < list.size(); ++i)
|
|
|
|
|
qDebug() << i << ":" << list.at(i).toString();
|
|
|
|
|
if(!res)
|
|
|
|
|
{
|
|
|
|
|
qDebug()<<str<<"\n"<<qry.lastError().text();
|
|
|
|
|
}
|
|
|
|
|
qry.clear();
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool DataBase::updateComponent(QUuid uuid,QString tag,QString name,QJsonObject context)
|
|
|
|
|
{
|
|
|
|
|
if(db.open())
|
|
|
|
|
{
|
|
|
|
|
QSqlQuery qry(db);
|
|
|
|
|
|
|
|
|
|
QJsonDocument contextDoc(context);
|
|
|
|
|
QString strCon = contextDoc.toJson(QJsonDocument::Compact);
|
|
|
|
|
|
|
|
|
|
qry.prepare("UPDATE component SET tag=?, name=?, context=?, ts=? WHERE global_uuid=?");
|
|
|
|
|
qry.bindValue(0,tag);
|
|
|
|
|
qry.bindValue(1,name);
|
|
|
|
|
qry.bindValue(2,strCon);
|
|
|
|
|
qry.bindValue(3,QDateTime::currentDateTime());
|
|
|
|
|
qry.bindValue(4,uuid);
|
|
|
|
|
bool res = qry.exec();
|
|
|
|
|
QString str = qry.lastQuery();
|
|
|
|
|
const QVariantList list = qry.boundValues();
|
|
|
|
|
for (qsizetype i = 0; i < list.size(); ++i)
|
|
|
|
|
qDebug() << i << ":" << list.at(i).toString();
|
|
|
|
|
if(!res)
|
|
|
|
|
{
|
|
|
|
|
qDebug()<<str<<"\n"<<qry.lastError().text();
|
|
|
|
|
}
|
|
|
|
|
qry.clear();
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool DataBase::insertPage(QString tag,QString name,int status,QJsonObject label,QJsonObject context,QString description,int op)
|
|
|
|
|
{
|
|
|
|
|
if(db.open())
|
|
|
|
|
{
|
|
|
|
|
QSqlQuery qry(db);
|
|
|
|
|
|
|
|
|
|
QJsonDocument labelDoc(label);
|
|
|
|
|
QString strLabel = labelDoc.toJson(QJsonDocument::Compact);
|
|
|
|
|
|
|
|
|
|
QJsonDocument contextDoc(context);
|
|
|
|
|
QString strCon = contextDoc.toJson(QJsonDocument::Compact);
|
|
|
|
|
|
|
|
|
|
qry.prepare("INSERT INTO page(tag, name, status, label, context, description, op, ts) VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
|
|
|
|
|
qry.bindValue(0,tag);
|
|
|
|
|
qry.bindValue(1,name);
|
|
|
|
|
qry.bindValue(2,status);
|
|
|
|
|
qry.bindValue(3,strLabel);
|
|
|
|
|
qry.bindValue(4,strCon);
|
|
|
|
|
qry.bindValue(5,description);
|
|
|
|
|
qry.bindValue(6,op);
|
|
|
|
|
qry.bindValue(7,QDateTime::currentDateTime());
|
|
|
|
|
bool res = qry.exec();
|
|
|
|
|
QString str = qry.lastQuery();
|
|
|
|
|
if(!res)
|
|
|
|
|
{
|
|
|
|
|
qDebug()<<str<<"\n"<<qry.lastError().text();
|
|
|
|
|
}
|
|
|
|
|
qry.clear();
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool DataBase::insertStation(int zoneId,QString name,QString description,bool isLocal,int op)
|
|
|
|
|
{
|
|
|
|
|
if(db.open())
|
|
|
|
|
{
|
|
|
|
|
QSqlQuery qry(db);
|
|
|
|
|
|
|
|
|
|
qry.prepare("INSERT INTO station(zone_id, name, description, is_local, op, ts) VALUES (?, ?, ?, ?, ?, ?)");
|
|
|
|
|
qry.bindValue(0,zoneId);
|
|
|
|
|
qry.bindValue(1,name);
|
|
|
|
|
qry.bindValue(2,description);
|
|
|
|
|
qry.bindValue(3,isLocal);
|
|
|
|
|
qry.bindValue(4,op);
|
|
|
|
|
qry.bindValue(5,QDateTime::currentDateTime());
|
|
|
|
|
|
|
|
|
|
bool res = qry.exec();
|
|
|
|
|
QString str = qry.lastQuery();
|
|
|
|
|
if(!res)
|
|
|
|
|
{
|
|
|
|
|
qDebug()<<str<<"\n"<<qry.lastError().text();
|
|
|
|
|
}
|
|
|
|
|
qry.clear();
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool DataBase::insertGrid(QString name,QString description,int op)
|
|
|
|
|
{
|
|
|
|
|
if(db.open())
|
|
|
|
|
{
|
|
|
|
|
QSqlQuery qry(db);
|
|
|
|
|
qry.prepare("INSERT INTO grid(name, description, op, ts) VALUES (?, ?, ?, ?);");
|
|
|
|
|
qry.bindValue(0,name);
|
|
|
|
|
qry.bindValue(1,description);
|
|
|
|
|
qry.bindValue(2,op);
|
|
|
|
|
qry.bindValue(3,QDateTime::currentDateTime());
|
|
|
|
|
bool res = qry.exec();
|
|
|
|
|
QString str = qry.lastQuery();
|
|
|
|
|
if(!res)
|
|
|
|
|
{
|
|
|
|
|
qDebug()<<str<<"\n"<<qry.lastError().text();
|
|
|
|
|
}
|
|
|
|
|
qry.clear();
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool DataBase::insertZone(int grid_id,QString name,QString description,int op)
|
|
|
|
|
{
|
|
|
|
|
if(db.open())
|
|
|
|
|
{
|
|
|
|
|
QSqlQuery qry(db);
|
|
|
|
|
qry.prepare("INSERT INTO zone(grid_id, name, description, op, ts) VALUES (?, ?, ?, ?, ?)");
|
|
|
|
|
qry.bindValue(0,grid_id);
|
|
|
|
|
qry.bindValue(1,name);
|
|
|
|
|
qry.bindValue(2,description);
|
|
|
|
|
qry.bindValue(3,op);
|
|
|
|
|
qry.bindValue(4,QDateTime::currentDateTime());
|
|
|
|
|
bool res = qry.exec();
|
|
|
|
|
QString str = qry.lastQuery();
|
|
|
|
|
if(!res)
|
|
|
|
|
{
|
|
|
|
|
qDebug()<<str<<"\n"<<qry.lastError().text();
|
|
|
|
|
}
|
|
|
|
|
qry.clear();
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool DataBase::insertTopologic(int page_id,QUuid uuid_from,QUuid uuid_to,int flag,QString description,int op)
|
|
|
|
|
{
|
|
|
|
|
if(db.open())
|
|
|
|
|
{
|
|
|
|
|
QSqlQuery qry(db);
|
|
|
|
|
qry.prepare("INSERT INTO topologic(page_id, uuid_from, uuid_to, flag, description, op, ts) VALUES (?, ?, ?, ?, ?, ?, ?);");
|
|
|
|
|
qry.bindValue(0,page_id);
|
|
|
|
|
qry.bindValue(1,uuid_from);
|
|
|
|
|
qry.bindValue(2,uuid_to);
|
|
|
|
|
qry.bindValue(3,flag);
|
|
|
|
|
qry.bindValue(4,description);
|
|
|
|
|
qry.bindValue(5,op);
|
|
|
|
|
qry.bindValue(6,QDateTime::currentDateTime());
|
|
|
|
|
bool res = qry.exec();
|
|
|
|
|
QString str = qry.lastQuery();
|
|
|
|
|
if(!res)
|
|
|
|
|
{
|
|
|
|
|
qDebug()<<str<<"\n"<<qry.lastError().text();
|
|
|
|
|
}
|
|
|
|
|
qry.clear();
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool DataBase::insertBus_stability(int componentId,double resistance,bool anchor_v,double uv_alarm,double ov_alarm,bool anchor_i,double ui_alarm,double oi_alarm,int op)
|
|
|
|
|
{
|
|
|
|
|
if(db.open())
|
|
|
|
|
{
|
|
|
|
|
QSqlQuery qry(db);
|
|
|
|
|
|
|
|
|
|
qry.prepare("INSERT INTO bus_stability(component_id, resistance, anchor_v, uv_alarm, ov_alarm, anchor_i, ui_alarm, oi_alarm, op, ts) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
|
|
|
|
qry.bindValue(0,componentId);
|
|
|
|
|
qry.bindValue(1,resistance);
|
|
|
|
|
qry.bindValue(2,anchor_v);
|
|
|
|
|
qry.bindValue(3,uv_alarm);
|
|
|
|
|
qry.bindValue(4,ov_alarm);
|
|
|
|
|
qry.bindValue(5,anchor_i);
|
|
|
|
|
qry.bindValue(6,ui_alarm);
|
|
|
|
|
qry.bindValue(7,oi_alarm);
|
|
|
|
|
qry.bindValue(8,op);
|
|
|
|
|
qry.bindValue(9,QDateTime::currentDateTime());
|
|
|
|
|
bool res = qry.exec();
|
|
|
|
|
QString str = qry.lastQuery();
|
|
|
|
|
if(!res)
|
|
|
|
|
{
|
|
|
|
|
qDebug()<<str<<"\n"<<qry.lastError().text();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool DataBase::updateBus_stability(int componentId,double resistance,bool anchor_v,double uv_alarm,double ov_alarm,bool anchor_i,double ui_alarm,double oi_alarm,int op)
|
|
|
|
|
{
|
|
|
|
|
if(db.open())
|
|
|
|
|
{
|
|
|
|
|
QSqlQuery qry(db);
|
|
|
|
|
|
|
|
|
|
qry.prepare("UPDATE bus_stability SET resistance=?, anchor_v=?, uv_alarm=?, ov_alarm=?, anchor_i=?, ui_alarm=?, oi_alarm=?, op=?, ts=? WHERE component_id=?");
|
|
|
|
|
qry.bindValue(0,resistance);
|
|
|
|
|
qry.bindValue(1,anchor_v);
|
|
|
|
|
qry.bindValue(2,uv_alarm);
|
|
|
|
|
qry.bindValue(3,ov_alarm);
|
|
|
|
|
qry.bindValue(4,anchor_i);
|
|
|
|
|
qry.bindValue(5,ui_alarm);
|
|
|
|
|
qry.bindValue(6,oi_alarm);
|
|
|
|
|
qry.bindValue(7,op);
|
|
|
|
|
qry.bindValue(8,QDateTime::currentDateTime());
|
|
|
|
|
qry.bindValue(9,componentId);
|
|
|
|
|
bool res = qry.exec();
|
|
|
|
|
QString str = qry.lastQuery();
|
|
|
|
|
const QVariantList list = qry.boundValues();
|
|
|
|
|
for (qsizetype i = 0; i < list.size(); ++i)
|
|
|
|
|
qDebug() << i << ":" << list.at(i).toString();
|
|
|
|
|
if(!res)
|
|
|
|
|
{
|
|
|
|
|
qDebug()<<str<<"\n"<<qry.lastError().text();
|
|
|
|
|
}
|
|
|
|
|
qry.clear();
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
busStability DataBase::getBusStabilityById(int componentId)
|
|
|
|
|
{
|
|
|
|
|
busStability inf;
|
|
|
|
|
if(db.open())
|
|
|
|
|
{
|
|
|
|
|
QSqlQuery qry(db);
|
|
|
|
|
|
|
|
|
|
//qry.prepare("SELECT * FROM component WHERE global_uuid = ?");
|
|
|
|
|
qry.prepare("SELECT id, component_id, resistance, anchor_v, uv_alarm, ov_alarm, anchor_i, ui_alarm, oi_alarm, op FROM bus_stability WHERE component_id = ?");
|
|
|
|
|
qry.bindValue(0,componentId);
|
|
|
|
|
bool res = qry.exec();
|
|
|
|
|
QString str = qry.lastQuery();
|
|
|
|
|
if(!res)
|
|
|
|
|
{
|
|
|
|
|
qDebug()<<str<<"\n"<<qry.lastError().text();
|
|
|
|
|
qry.clear();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
while (qry.next())
|
|
|
|
|
{
|
|
|
|
|
int id = qry.value(0).toInt();
|
|
|
|
|
inf.componentId = qry.value(1).toInt();
|
|
|
|
|
inf.resistance = qry.value(2).toDouble();
|
|
|
|
|
inf.anchor_v = qry.value(3).toBool();
|
|
|
|
|
inf.uv_alarm = qry.value(4).toDouble();
|
|
|
|
|
inf.ov_alarm = qry.value(5).toDouble();
|
|
|
|
|
inf.anchor_i = qry.value(6).toBool();
|
|
|
|
|
inf.ui_alarm = qry.value(7).toDouble();
|
|
|
|
|
inf.oi_alarm = qry.value(8).toDouble();
|
|
|
|
|
qry.clear();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return inf;
|
|
|
|
|
}
|
|
|
|
|
/************************************************************/
|
|
|
|
|
componentInfo DataBase::getComponentInfoByUuid(QString uuid)
|
|
|
|
|
{
|
|
|
|
|
componentInfo inf;
|
|
|
|
|
if(db.open())
|
|
|
|
|
{
|
|
|
|
|
QSqlQuery qry(db);
|
|
|
|
|
|
|
|
|
|
//qry.prepare("SELECT * FROM component WHERE global_uuid = ?");
|
|
|
|
|
qry.prepare("SELECT id, global_uuid, tag, name, grid, zone, station, type, context, page_id, op FROM component WHERE global_uuid = ?");
|
|
|
|
|
qry.bindValue(0,uuid);
|
|
|
|
|
bool res = qry.exec();
|
|
|
|
|
QString str = qry.lastQuery();
|
|
|
|
|
if(!res)
|
|
|
|
|
{
|
|
|
|
|
qDebug()<<str<<"\n"<<qry.lastError().text();
|
|
|
|
|
qry.clear();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
while (qry.next())
|
|
|
|
|
{
|
|
|
|
|
inf.id = qry.value(0).toInt();
|
|
|
|
|
inf.uuid = QUuid(qry.value(1).toString());
|
|
|
|
|
inf.tag = qry.value(2).toString();
|
|
|
|
|
inf.name = qry.value(3).toString();
|
|
|
|
|
inf.grid = qry.value(4).toString();
|
|
|
|
|
inf.zone = qry.value(5).toString();
|
|
|
|
|
inf.station = qry.value(6).toString();
|
|
|
|
|
inf.type = qry.value(7).toInt();
|
|
|
|
|
QString str = qry.value(8).toString();
|
|
|
|
|
inf.context = QstringToJson(str);
|
|
|
|
|
inf.page_id = qry.value(9).toInt();
|
|
|
|
|
inf.op = qry.value(10).toInt();
|
|
|
|
|
qry.clear();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return inf;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QList<componentInfo> DataBase::getAllComponents()
|
|
|
|
|
{
|
|
|
|
|
QList<componentInfo> lst;
|
|
|
|
|
if(db.open())
|
|
|
|
|
{
|
|
|
|
|
QSqlQuery qry(db);
|
|
|
|
|
|
|
|
|
|
qry.prepare("SELECT id, global_uuid, tag, name, grid, zone, station, type, context, page_id, op FROM component");
|
|
|
|
|
bool res = qry.exec();
|
|
|
|
|
QString str = qry.lastQuery();
|
|
|
|
|
if(!res)
|
|
|
|
|
{
|
|
|
|
|
qDebug()<<str<<"\n"<<qry.lastError().text();
|
|
|
|
|
qry.clear();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
while (qry.next())
|
|
|
|
|
{
|
|
|
|
|
componentInfo inf;
|
|
|
|
|
inf.id = qry.value(0).toInt();
|
|
|
|
|
inf.uuid = QUuid(qry.value(1).toString());
|
|
|
|
|
inf.tag = qry.value(2).toString();
|
|
|
|
|
inf.name = qry.value(3).toString();
|
|
|
|
|
inf.grid = qry.value(4).toString();
|
|
|
|
|
inf.zone = qry.value(5).toString();
|
|
|
|
|
inf.station = qry.value(6).toString();
|
|
|
|
|
inf.type = qry.value(7).toInt();
|
|
|
|
|
QString str = qry.value(8).toString();
|
|
|
|
|
inf.context = QstringToJson(str);
|
|
|
|
|
inf.page_id = qry.value(9).toInt();
|
|
|
|
|
inf.op = qry.value(10).toInt();
|
|
|
|
|
lst.push_back(inf);
|
|
|
|
|
}
|
|
|
|
|
qry.clear();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return lst;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool DataBase::componentExist(QString uuid)
|
|
|
|
|
{
|
|
|
|
|
if(db.open())
|
|
|
|
|
{
|
|
|
|
|
QSqlQuery qry(db);
|
|
|
|
|
|
|
|
|
|
qry.prepare("SELECT id FROM component WHERE global_uuid = ?");
|
|
|
|
|
qry.bindValue(0,uuid);
|
|
|
|
|
bool res = qry.exec();
|
|
|
|
|
QString str = qry.lastQuery();
|
|
|
|
|
if(!res)
|
|
|
|
|
{
|
|
|
|
|
qDebug()<<str<<"\n"<<qry.lastError().text();
|
|
|
|
|
qry.clear();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if(qry.size() > 0)
|
|
|
|
|
return true;
|
|
|
|
|
else
|
|
|
|
|
return false;
|
|
|
|
|
qry.clear();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool DataBase::deleteComponent(QString uuid)
|
|
|
|
|
{
|
|
|
|
|
if(db.open())
|
|
|
|
|
{
|
|
|
|
|
QSqlQuery qry(db);
|
|
|
|
|
|
|
|
|
|
qry.prepare("DELETE FROM component WHERE global_uuid = ?");
|
|
|
|
|
qry.bindValue(0,uuid);
|
|
|
|
|
bool res = qry.exec();
|
|
|
|
|
QString str = qry.lastQuery();
|
|
|
|
|
if(!res)
|
|
|
|
|
{
|
|
|
|
|
qDebug()<<str<<"\n"<<qry.lastError().text();
|
|
|
|
|
}
|
|
|
|
|
qry.clear();
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
/************************************************************/
|
|
|
|
|
|
|
|
|
|
bool DataBase::updatePage(QString tag,QString name,QJsonObject context)
|
|
|
|
|
{
|
|
|
|
|
if(db.open())
|
|
|
|
|
{
|
|
|
|
|
QSqlQuery qry(db);
|
|
|
|
|
|
|
|
|
|
QJsonDocument contextDoc(context);
|
|
|
|
|
QString strCon = contextDoc.toJson(QJsonDocument::Compact);
|
|
|
|
|
|
|
|
|
|
qry.prepare("UPDATE page SET name=?, context=?, ts=? WHERE tag=?");
|
|
|
|
|
qry.bindValue(0,name);
|
|
|
|
|
qry.bindValue(1,strCon);
|
|
|
|
|
qry.bindValue(2,QDateTime::currentDateTime());
|
|
|
|
|
qry.bindValue(3,tag);
|
|
|
|
|
bool res = qry.exec();
|
|
|
|
|
QString str = qry.lastQuery();
|
|
|
|
|
const QVariantList list = qry.boundValues();
|
|
|
|
|
for (qsizetype i = 0; i < list.size(); ++i)
|
|
|
|
|
qDebug() << i << ":" << list.at(i).toString();
|
|
|
|
|
if(!res)
|
|
|
|
|
{
|
|
|
|
|
qDebug()<<str<<"\n"<<qry.lastError().text();
|
|
|
|
|
}
|
|
|
|
|
qry.clear();
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int DataBase::getPageIdByName(QString name)
|
|
|
|
|
{
|
|
|
|
|
if(db.open())
|
|
|
|
|
{
|
|
|
|
|
QSqlQuery qry(db);
|
|
|
|
|
|
|
|
|
|
qry.prepare("SELECT id FROM page WHERE tag = ?");
|
|
|
|
|
qry.bindValue(0,name);
|
|
|
|
|
bool res = qry.exec();
|
|
|
|
|
QString str = qry.lastQuery();
|
|
|
|
|
if(!res)
|
|
|
|
|
{
|
|
|
|
|
qDebug()<<str<<"\n"<<qry.lastError().text();
|
|
|
|
|
qry.clear();
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
while (qry.next())
|
|
|
|
|
{
|
|
|
|
|
int id = qry.value(0).toInt();
|
|
|
|
|
qry.clear();
|
|
|
|
|
return id;
|
|
|
|
|
}
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QJsonObject DataBase::getPageContextByName(QString name)
|
|
|
|
|
{
|
|
|
|
|
if(db.open())
|
|
|
|
|
{
|
|
|
|
|
QSqlQuery qry(db);
|
|
|
|
|
|
|
|
|
|
qry.prepare("SELECT context FROM page WHERE tag = ?");
|
|
|
|
|
qry.bindValue(0,name);
|
|
|
|
|
bool res = qry.exec();
|
|
|
|
|
QString str = qry.lastQuery();
|
|
|
|
|
if(!res)
|
|
|
|
|
{
|
|
|
|
|
qDebug()<<str<<"\n"<<qry.lastError().text();
|
|
|
|
|
qry.clear();
|
|
|
|
|
return QJsonObject();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
while (qry.next())
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
QString str = qry.value(0).toString();
|
|
|
|
|
QJsonObject obj = QstringToJson(str);
|
|
|
|
|
qry.clear();
|
|
|
|
|
return obj;
|
|
|
|
|
}
|
|
|
|
|
return QJsonObject();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
return QJsonObject();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QStringList DataBase::getAllPage()
|
|
|
|
|
{
|
|
|
|
|
if(db.open())
|
|
|
|
|
{
|
|
|
|
|
QSqlQuery qry(db);
|
|
|
|
|
qry.prepare("SELECT tag FROM page");
|
|
|
|
|
bool res = qry.exec();
|
|
|
|
|
if(!res)
|
|
|
|
|
{
|
|
|
|
|
qDebug()<<qry.lastError().text();
|
|
|
|
|
qry.clear();
|
|
|
|
|
return QStringList();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
QStringList lst;
|
|
|
|
|
while (qry.next())
|
|
|
|
|
{
|
|
|
|
|
QString name = qry.value(0).toString();
|
|
|
|
|
lst.append(name);
|
|
|
|
|
}
|
|
|
|
|
qry.clear();
|
|
|
|
|
return lst;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
return QStringList();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool DataBase::deleteComponentById(int id)
|
|
|
|
|
{
|
|
|
|
|
if(db.open())
|
|
|
|
|
{
|
|
|
|
|
QSqlQuery qry(db);
|
|
|
|
|
|
|
|
|
|
qry.prepare("DELETE FROM topologic WHERE com_from = ? or com_to = ?");
|
|
|
|
|
qry.bindValue(0,id);
|
|
|
|
|
qry.bindValue(1,id);
|
|
|
|
|
bool res = qry.exec();
|
|
|
|
|
QString str = qry.lastQuery();
|
|
|
|
|
if(!res)
|
|
|
|
|
{
|
|
|
|
|
qDebug()<<str<<"\n"<<qry.lastError().text();
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
qry.finish();
|
|
|
|
|
|
|
|
|
|
qry.prepare("DELETE FROM component WHERE id = ?");
|
|
|
|
|
qry.bindValue(0,id);
|
|
|
|
|
res = qry.exec();
|
|
|
|
|
str = qry.lastQuery();
|
|
|
|
|
if(!res)
|
|
|
|
|
{
|
|
|
|
|
qDebug()<<str<<"\n"<<qry.lastError().text();
|
|
|
|
|
}
|
|
|
|
|
qry.clear();
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DataBase::select()
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DataBase::parallelUpdate()
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DataBase::readXML()
|
|
|
|
|
{
|
|
|
|
|
if (m_sFileName.isEmpty())
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
QFile *pFile = new QFile(m_sFileName);
|
|
|
|
|
if (!pFile->open(QIODevice::ReadOnly | QFile::Text))
|
|
|
|
|
{
|
|
|
|
|
QMessageBox::information(NULL, QString("title"), QString::fromWCharArray(L"配置文件打开错误"));
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QXmlStreamReader* m_pReader = new QXmlStreamReader(pFile);
|
|
|
|
|
while (!m_pReader->atEnd() && !m_pReader->hasError())
|
|
|
|
|
{
|
|
|
|
|
m_pReader->lineNumber();
|
|
|
|
|
QXmlStreamReader::TokenType token = m_pReader->readNext();
|
|
|
|
|
if (token == QXmlStreamReader::StartDocument)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
//qDebug() << m_pReader->name();
|
|
|
|
|
if (m_pReader->isStartElement())
|
|
|
|
|
{
|
|
|
|
|
if(m_pReader->name() == QString("DataBase"))
|
|
|
|
|
{
|
|
|
|
|
QXmlStreamAttributes attributes = m_pReader->attributes();
|
|
|
|
|
QString tpe = attributes.value("Type").toString();
|
|
|
|
|
QString sName = attributes.value("Name").toString();
|
2025-03-04 09:44:03 +08:00
|
|
|
//QString sProDB = attributes.value("ProjectDB").toString();
|
2025-02-06 16:36:50 +08:00
|
|
|
if (tpe == QString("PostgreSQL"))
|
|
|
|
|
{
|
|
|
|
|
_DataBaseType = QString("QPSQL");
|
|
|
|
|
_DataBaseName = sName;
|
2025-03-04 09:44:03 +08:00
|
|
|
//_ProjectDB = sProDB;
|
2025-02-06 16:36:50 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if(m_pReader->name() == QString("HostName"))
|
|
|
|
|
{
|
|
|
|
|
_HostName = m_pReader->readElementText();
|
|
|
|
|
}
|
|
|
|
|
else if(m_pReader->name() == QString("Port"))
|
|
|
|
|
{
|
|
|
|
|
_Port = m_pReader->readElementText().toInt();
|
|
|
|
|
}
|
|
|
|
|
else if(m_pReader->name() == QString("UserName"))
|
|
|
|
|
{
|
|
|
|
|
_UserName = m_pReader->readElementText();
|
|
|
|
|
}
|
|
|
|
|
else if(m_pReader->name() == QString("Password"))
|
|
|
|
|
{
|
|
|
|
|
_PassWord = m_pReader->readElementText();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
m_pReader->readNext();
|
|
|
|
|
}
|
|
|
|
|
if (m_pReader->hasError())
|
|
|
|
|
{
|
|
|
|
|
qDebug() << m_pReader->errorString();
|
|
|
|
|
}
|
|
|
|
|
m_pReader->clear();
|
|
|
|
|
delete m_pReader;
|
|
|
|
|
m_pReader = NULL;
|
|
|
|
|
pFile->close();
|
|
|
|
|
delete pFile;
|
|
|
|
|
pFile = NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QJsonObject DataBase::QstringToJson(QString jsonString)
|
|
|
|
|
{
|
|
|
|
|
QJsonDocument jsonDocument = QJsonDocument::fromJson(jsonString.toUtf8().data());
|
|
|
|
|
if(jsonDocument.isNull())
|
|
|
|
|
{
|
|
|
|
|
qDebug()<< "String NULL"<< jsonString.toLocal8Bit().data();
|
|
|
|
|
}
|
|
|
|
|
QJsonObject jsonObject = jsonDocument.object();
|
|
|
|
|
return jsonObject;
|
|
|
|
|
}
|
2025-03-04 09:44:03 +08:00
|
|
|
//=================================元模=============================================//
|
|
|
|
|
bool DataBase::getAttributeGroup()
|
|
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
QString strSQL = "SELECT * FROM basic.attribute_group";
|
|
|
|
|
|
|
|
|
|
try
|
2025-03-04 09:44:03 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
QSqlQuery query = executeSQL(strSQL);
|
|
|
|
|
while (query.next())
|
2025-03-04 09:44:03 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
int id = query.value(0).toInt();
|
|
|
|
|
QString groupType = query.value(1).toString();
|
|
|
|
|
QString groupName = query.value(2).toString();
|
|
|
|
|
int isPublic = query.value(3).toInt();
|
|
|
|
|
QString remark = query.value(4).toString();
|
2025-03-04 09:44:03 +08:00
|
|
|
|
2025-03-21 12:53:45 +08:00
|
|
|
if(!_attributeGroup.contains(id))
|
|
|
|
|
{
|
|
|
|
|
attributeGroup ag;
|
|
|
|
|
ag.id = id;
|
|
|
|
|
ag.groupType = groupType;
|
|
|
|
|
ag.groupName = groupName;
|
|
|
|
|
ag.isPublic = isPublic;
|
|
|
|
|
ag.remark = remark;
|
|
|
|
|
_attributeGroup.insert(id,ag);
|
2025-03-04 09:44:03 +08:00
|
|
|
}
|
|
|
|
|
}
|
2025-03-21 12:53:45 +08:00
|
|
|
query.finish();
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
catch (const std::exception& e)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
2025-03-04 09:44:03 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool DataBase::getDataType()
|
|
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
QString strSQL = "SELECT * FROM basic.data_type";
|
|
|
|
|
|
|
|
|
|
try
|
2025-03-04 09:44:03 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
QSqlQuery query = executeSQL(strSQL);
|
|
|
|
|
while (query.next())
|
|
|
|
|
{
|
|
|
|
|
int id = query.value(0).toInt();
|
|
|
|
|
QString dt = query.value(1).toString();
|
|
|
|
|
QString dbt = query.value(2).toString();
|
|
|
|
|
|
|
|
|
|
if(!_dataType.contains(id))
|
|
|
|
|
{
|
|
|
|
|
dataType type;
|
|
|
|
|
type.id = id;
|
|
|
|
|
type.dataType = dt;
|
|
|
|
|
type.databaseType = dbt;
|
|
|
|
|
_dataType.insert(id,type);
|
|
|
|
|
}
|
2025-03-04 09:44:03 +08:00
|
|
|
}
|
2025-03-21 12:53:45 +08:00
|
|
|
query.finish();
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
catch (const std::exception& e)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool DataBase::getModelType()
|
|
|
|
|
{
|
|
|
|
|
QString strSQL = "SELECT * FROM basic.model_type";
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
QSqlQuery query = executeSQL(strSQL);
|
|
|
|
|
while (query.next())
|
2025-03-04 09:44:03 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
int id = query.value(0).toInt();
|
|
|
|
|
QString sModelType = query.value(1).toString(); //模型类型
|
|
|
|
|
QString sModelName = query.value(2).toString(); //模型名称
|
|
|
|
|
QString remark = query.value(3).toString(); //备注
|
|
|
|
|
|
|
|
|
|
if(!_modelType.contains(id))
|
2025-03-04 09:44:03 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
modelType mt;
|
|
|
|
|
mt.id = id;
|
|
|
|
|
mt.modelType = sModelType;
|
|
|
|
|
mt.modelName = sModelName;
|
|
|
|
|
mt.remark = remark;
|
2025-03-04 09:44:03 +08:00
|
|
|
|
2025-03-21 12:53:45 +08:00
|
|
|
_modelType.insert(id,mt);
|
2025-03-04 09:44:03 +08:00
|
|
|
}
|
|
|
|
|
}
|
2025-03-21 12:53:45 +08:00
|
|
|
query.finish();
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
catch (const std::exception& e)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
2025-03-04 09:44:03 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-21 12:53:45 +08:00
|
|
|
bool DataBase::getModelGroup()
|
2025-03-04 09:44:03 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
QString strSQL = "SELECT * FROM basic.model_group";
|
|
|
|
|
|
|
|
|
|
try
|
2025-03-04 09:44:03 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
QSqlQuery query = executeSQL(strSQL);
|
|
|
|
|
while (query.next())
|
2025-03-04 09:44:03 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
int id = query.value(0).toInt();
|
|
|
|
|
int modelTypeId = query.value(1).toInt();
|
|
|
|
|
int attrybuteGroupId = query.value(2).toInt();
|
|
|
|
|
|
|
|
|
|
if(!_modelGroup.contains(id))
|
2025-03-04 09:44:03 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
modelGroup mg;
|
|
|
|
|
mg.id = id;
|
|
|
|
|
mg.modelTypeId = modelTypeId;
|
|
|
|
|
mg.attributeGroupId = attrybuteGroupId;
|
|
|
|
|
|
|
|
|
|
_modelGroup.insert(id,mg);
|
2025-03-04 09:44:03 +08:00
|
|
|
}
|
|
|
|
|
}
|
2025-03-21 12:53:45 +08:00
|
|
|
query.finish();
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
catch (const std::exception& e)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
2025-03-04 09:44:03 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool DataBase::getModelAttribute()
|
|
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
QString strSQL = "SELECT * FROM basic.model_attribute";
|
|
|
|
|
|
|
|
|
|
try
|
2025-03-04 09:44:03 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
QSqlQuery query = executeSQL(strSQL);
|
|
|
|
|
while (query.next())
|
2025-03-04 09:44:03 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
int id = query.value(0).toInt();
|
|
|
|
|
qint64 mti = query.value(1).toLongLong();
|
|
|
|
|
qint64 agi = query.value(2).toLongLong();
|
|
|
|
|
qint64 ai = query.value(3).toLongLong();
|
|
|
|
|
|
|
|
|
|
if(!_modelAttribute.contains(id))
|
2025-03-04 09:44:03 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
modelAttribute ma;
|
|
|
|
|
ma.id = id;
|
|
|
|
|
ma.modelTypeId = mti;
|
|
|
|
|
ma.attributeGroupId = agi;
|
|
|
|
|
ma.attributeId = ai;
|
2025-03-04 09:44:03 +08:00
|
|
|
|
2025-03-21 12:53:45 +08:00
|
|
|
_modelAttribute.insert(id,ma);
|
2025-03-04 09:44:03 +08:00
|
|
|
}
|
|
|
|
|
}
|
2025-03-21 12:53:45 +08:00
|
|
|
query.finish();
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
catch (const std::exception& e)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
2025-03-04 09:44:03 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-21 12:53:45 +08:00
|
|
|
bool DataBase::getAttribute()
|
2025-03-04 09:44:03 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
QString strSQL = "SELECT * FROM basic.attribute";
|
|
|
|
|
|
|
|
|
|
try
|
2025-03-04 09:44:03 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
QSqlQuery query = executeSQL(strSQL);
|
|
|
|
|
while (query.next())
|
2025-03-04 09:44:03 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
int id = query.value(0).toInt();
|
|
|
|
|
QString att = query.value(1).toString(); //属性
|
|
|
|
|
QString attn = query.value(2).toString(); //属性名
|
|
|
|
|
qint64 dt = query.value(3).toLongLong(); //类型号
|
|
|
|
|
int len = query.value(4).toInt(); //类型长度
|
|
|
|
|
int scale = query.value(5).toInt(); //类型精度
|
|
|
|
|
int inn = query.value(6).toInt(); //非空
|
|
|
|
|
QString dv = query.value(7).toString(); //默认值
|
|
|
|
|
QString vr = query.value(8).toString(); //范围
|
|
|
|
|
|
|
|
|
|
if(!_attribute.contains(id))
|
2025-03-04 09:44:03 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
attribute attribute;
|
|
|
|
|
attribute.id = id;
|
|
|
|
|
attribute.attribute = att;
|
|
|
|
|
attribute.attributeName = attn;
|
|
|
|
|
attribute.dataTypeId = dt;
|
|
|
|
|
attribute.lengthPrecision = len;
|
|
|
|
|
attribute.scale = scale;
|
|
|
|
|
attribute.isNotNull = inn;
|
|
|
|
|
attribute.defaultValue = dv;
|
|
|
|
|
attribute.valueRange = vr;
|
|
|
|
|
|
|
|
|
|
_attribute.insert(id,attribute);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
query.finish();
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
catch (const std::exception& e)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-03-04 09:44:03 +08:00
|
|
|
|
2025-03-21 12:53:45 +08:00
|
|
|
bool DataBase::getModelConnectivity()
|
|
|
|
|
{
|
|
|
|
|
QString strSQL = "SELECT * FROM basic.model_connectivity";
|
2025-03-04 09:44:03 +08:00
|
|
|
|
2025-03-21 12:53:45 +08:00
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
QSqlQuery query = executeSQL(strSQL);
|
|
|
|
|
while (query.next())
|
|
|
|
|
{
|
|
|
|
|
int id = query.value(0).toInt();
|
|
|
|
|
QString fm = query.value(1).toString(); //from
|
|
|
|
|
QString tm = query.value(2).toString(); //to
|
|
|
|
|
int con = query.value(3).toInt(); //是否可联
|
|
|
|
|
|
|
|
|
|
if(!_modelConnectivity.contains(id))
|
|
|
|
|
{
|
|
|
|
|
modelConnectivity connect;
|
|
|
|
|
connect.id = id;
|
|
|
|
|
connect.fromModel = fm;
|
|
|
|
|
connect.toModel = tm;
|
|
|
|
|
connect.connectivity = con;
|
|
|
|
|
|
|
|
|
|
_modelConnectivity.insert(id,connect);
|
2025-03-04 09:44:03 +08:00
|
|
|
}
|
|
|
|
|
}
|
2025-03-21 12:53:45 +08:00
|
|
|
query.finish();
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
catch (const std::exception& e)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
2025-03-04 09:44:03 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//=================================工程模===========================================//
|
|
|
|
|
bool DataBase::createProjectManager()
|
|
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
QString strSQL = R"(
|
2025-03-04 09:44:03 +08:00
|
|
|
CREATE TABLE IF NOT EXISTS project_manager (
|
|
|
|
|
id SERIAL NOT NULL PRIMARY KEY,
|
|
|
|
|
name VARCHAR(64) NOT NULL,
|
|
|
|
|
tag VARCHAR(64) NOT NULL,
|
|
|
|
|
meta_model VARCHAR(64) NOT NULL,
|
|
|
|
|
group_name VARCHAR(64) NOT NULL,
|
|
|
|
|
link_type integer NOT NULL DEFAULT 0,
|
2025-03-07 19:24:19 +08:00
|
|
|
check_state JSONB NOT NULL DEFAULT '{}'::jsonb
|
2025-03-21 12:53:45 +08:00
|
|
|
);
|
2025-03-04 09:44:03 +08:00
|
|
|
)";
|
|
|
|
|
|
|
|
|
|
if(db.open())
|
|
|
|
|
{
|
|
|
|
|
QSqlQuery qry(db);
|
|
|
|
|
|
2025-03-21 12:53:45 +08:00
|
|
|
bool res = qry.exec(strSQL);
|
2025-03-04 09:44:03 +08:00
|
|
|
QString str = qry.lastQuery();
|
|
|
|
|
if(!res)
|
|
|
|
|
{
|
|
|
|
|
qDebug()<<str<<"\n"<<qry.lastError().text();
|
2025-03-21 12:53:45 +08:00
|
|
|
qry.clear();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if(qry.size() > 0)
|
|
|
|
|
return true;
|
|
|
|
|
else
|
|
|
|
|
return false;
|
|
|
|
|
qry.clear();
|
2025-03-04 09:44:03 +08:00
|
|
|
}
|
|
|
|
|
}
|
2025-03-21 12:53:45 +08:00
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
/*try
|
|
|
|
|
{
|
|
|
|
|
executeSQL(strSQL);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
catch (const std::exception& e)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}*/
|
2025-03-04 09:44:03 +08:00
|
|
|
}
|
|
|
|
|
|
2025-03-21 12:53:45 +08:00
|
|
|
bool DataBase::insertProjectManager(const QString& name,const QString& tag,const QString& metaModel,const QString& groupName,int linkType,QJsonObject checkState)
|
2025-03-04 09:44:03 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
QString strSQL = "INSERT INTO project_manager(name, tag, meta_model, group_name, link_type, check_state) VALUES (?, ?, ?, ?, ?, ?)";
|
|
|
|
|
QJsonDocument checkDoc(checkState);
|
|
|
|
|
QString strCheck = checkDoc.toJson(QJsonDocument::Compact);
|
|
|
|
|
|
|
|
|
|
QVariantList params;
|
|
|
|
|
params.append(name);
|
|
|
|
|
params.append(tag);
|
|
|
|
|
params.append(metaModel);
|
|
|
|
|
params.append(groupName);
|
|
|
|
|
params.append(linkType);
|
|
|
|
|
params.append(strCheck);
|
|
|
|
|
try
|
2025-03-14 17:18:25 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
executeSQL(strSQL,false,params);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
catch (const std::exception& e)
|
|
|
|
|
{
|
|
|
|
|
LOG_ERROR("DB", QString("Insert project_manager fail"));
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2025-03-14 17:18:25 +08:00
|
|
|
|
2025-03-21 12:53:45 +08:00
|
|
|
}
|
2025-03-14 17:18:25 +08:00
|
|
|
|
2025-03-21 12:53:45 +08:00
|
|
|
bool DataBase::updateCheckState(const QString& tableName,QJsonObject checkState)
|
|
|
|
|
{
|
|
|
|
|
QJsonDocument checkDoc(checkState);
|
|
|
|
|
QString strCheck = checkDoc.toJson(QJsonDocument::Compact);
|
|
|
|
|
|
|
|
|
|
QString strSQL = "UPDATE project_manager SET check_state = ? WHERE name = ?";
|
|
|
|
|
QVariantList params;
|
|
|
|
|
params.append(strCheck);
|
|
|
|
|
params.append(tableName);
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
executeSQL(strSQL,false,params);
|
2025-03-14 17:18:25 +08:00
|
|
|
return true;
|
|
|
|
|
}
|
2025-03-21 12:53:45 +08:00
|
|
|
catch (const std::exception& e)
|
|
|
|
|
{
|
|
|
|
|
LOG_ERROR("DB", QString("Update table %1 state %2 fail").arg(tableName,strCheck));
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2025-03-14 17:18:25 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QMap<QString,int> DataBase::getProjectFromManager(const QString& sMeta)
|
|
|
|
|
{
|
|
|
|
|
QMap<QString,int> map;
|
2025-03-21 12:53:45 +08:00
|
|
|
QString strSQL = "SELECT tag,link_type FROM project_manager WHERE meta_model = ?";
|
|
|
|
|
QVariantList params;
|
|
|
|
|
params.append(sMeta);
|
2025-03-07 19:24:19 +08:00
|
|
|
|
2025-03-21 12:53:45 +08:00
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
QSqlQuery query = executeSQL(strSQL,false,params);
|
|
|
|
|
while (query.next())
|
2025-03-07 19:24:19 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
QString tag = query.value(0).toString();
|
|
|
|
|
int nType = query.value(1).toInt();
|
|
|
|
|
if(!map.contains(tag))
|
2025-03-07 19:24:19 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
map.insert(tag,nType);
|
2025-03-07 19:24:19 +08:00
|
|
|
}
|
2025-03-21 12:53:45 +08:00
|
|
|
query.clear();
|
2025-03-07 19:24:19 +08:00
|
|
|
}
|
2025-03-21 12:53:45 +08:00
|
|
|
return map;
|
2025-03-07 19:24:19 +08:00
|
|
|
}
|
2025-03-21 12:53:45 +08:00
|
|
|
catch (const std::exception& e)
|
|
|
|
|
{
|
2025-03-14 17:18:25 +08:00
|
|
|
return map;
|
2025-03-21 12:53:45 +08:00
|
|
|
}
|
2025-03-04 09:44:03 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QMap<QString,QJsonObject> DataBase::getCheckStateFromManager(const QString& sProject)
|
|
|
|
|
{
|
|
|
|
|
QMap<QString,QJsonObject> map;
|
|
|
|
|
if(sProject == QString::fromWCharArray(L"新建"))
|
|
|
|
|
{
|
|
|
|
|
return map;
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-21 12:53:45 +08:00
|
|
|
QString strSQL = "SELECT group_name, check_state FROM project_manager WHERE tag = ?";
|
|
|
|
|
QVariantList params;
|
|
|
|
|
params.append(sProject);
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
QSqlQuery query = executeSQL(strSQL,false,params);
|
|
|
|
|
while (query.next())
|
2025-03-04 09:44:03 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
QString group = query.value(0).toString();
|
|
|
|
|
QString state = query.value(1).toString();
|
|
|
|
|
QJsonObject jsonObj = QstringToJson(state);
|
|
|
|
|
map.insert(group,jsonObj);
|
2025-03-04 09:44:03 +08:00
|
|
|
}
|
2025-03-21 12:53:45 +08:00
|
|
|
query.clear();
|
|
|
|
|
return map;
|
2025-03-04 09:44:03 +08:00
|
|
|
}
|
2025-03-21 12:53:45 +08:00
|
|
|
catch (const std::exception& e)
|
|
|
|
|
{
|
2025-03-04 09:44:03 +08:00
|
|
|
return map;
|
2025-03-21 12:53:45 +08:00
|
|
|
}
|
2025-03-04 09:44:03 +08:00
|
|
|
}
|
|
|
|
|
|
2025-03-14 17:18:25 +08:00
|
|
|
QMap<QString,QString> DataBase::getProjectTableName(const QString& sProject)
|
|
|
|
|
{
|
|
|
|
|
QMap<QString,QString> map;
|
2025-03-21 12:53:45 +08:00
|
|
|
QString strSQL = "SELECT group_name, name FROM project_manager WHERE tag = ?";
|
|
|
|
|
QVariantList params;
|
|
|
|
|
params.append(sProject);
|
2025-03-14 17:18:25 +08:00
|
|
|
|
2025-03-21 12:53:45 +08:00
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
QSqlQuery query = executeSQL(strSQL,false,params);
|
|
|
|
|
while (query.next())
|
2025-03-14 17:18:25 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
QString group = query.value(0).toString();
|
|
|
|
|
QString tableName = query.value(1).toString();
|
|
|
|
|
map.insert(group,tableName);
|
2025-03-14 17:18:25 +08:00
|
|
|
}
|
2025-03-21 12:53:45 +08:00
|
|
|
query.clear();
|
|
|
|
|
return map;
|
2025-03-14 17:18:25 +08:00
|
|
|
}
|
2025-03-21 12:53:45 +08:00
|
|
|
catch (const std::exception& e)
|
|
|
|
|
{
|
2025-03-14 17:18:25 +08:00
|
|
|
return map;
|
2025-03-21 12:53:45 +08:00
|
|
|
}
|
2025-03-14 17:18:25 +08:00
|
|
|
}
|
|
|
|
|
|
2025-03-21 12:53:45 +08:00
|
|
|
QMap<QString,int> DataBase::getAllProjectModel()
|
2025-03-04 09:44:03 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
QMap<QString,int> map; //工程模名,类型
|
|
|
|
|
QString strSQL = "SELECT tag, MAX(link_type) AS link_type FROM project_manager GROUP BY tag";
|
2025-03-04 09:44:03 +08:00
|
|
|
|
2025-03-21 12:53:45 +08:00
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
QSqlQuery query = executeSQL(strSQL);
|
|
|
|
|
while (query.next())
|
|
|
|
|
{
|
|
|
|
|
QString tableName = query.value(0).toString();
|
|
|
|
|
int linkType = query.value(1).toInt();
|
|
|
|
|
map.insert(tableName,linkType);
|
2025-03-04 09:44:03 +08:00
|
|
|
}
|
2025-03-21 12:53:45 +08:00
|
|
|
query.clear();
|
|
|
|
|
return map;
|
|
|
|
|
}
|
|
|
|
|
catch (const std::exception& e)
|
|
|
|
|
{
|
|
|
|
|
return map;
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-03-04 09:44:03 +08:00
|
|
|
|
2025-03-21 12:53:45 +08:00
|
|
|
QMap<QString,projectManager> DataBase::getProjectModelGroupInfo(const QString& sTable)
|
|
|
|
|
{
|
|
|
|
|
QMap<QString,projectManager> map;
|
|
|
|
|
QString strSQL = "SELECT * FROM project_manager WHERE tag = ?";
|
|
|
|
|
QVariantList params;
|
|
|
|
|
params.append(sTable);
|
2025-03-04 09:44:03 +08:00
|
|
|
|
2025-03-21 12:53:45 +08:00
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
QSqlQuery query = executeSQL(strSQL,false,params);
|
|
|
|
|
while (query.next())
|
|
|
|
|
{
|
|
|
|
|
projectManager info;
|
|
|
|
|
info.id = query.value(0).toInt();
|
|
|
|
|
info.name = query.value(1).toString();
|
|
|
|
|
info.tag = query.value(2).toString();
|
|
|
|
|
info.metaModel = query.value(3).toString();
|
|
|
|
|
info.groupName = query.value(4).toString();
|
|
|
|
|
info.linkType = query.value(5).toInt();
|
|
|
|
|
QString json = query.value(6).toString();
|
|
|
|
|
info.checkState = QstringToJson(json);
|
|
|
|
|
|
|
|
|
|
if(!map.contains(info.groupName))
|
|
|
|
|
map.insert(info.groupName,info);
|
|
|
|
|
}
|
|
|
|
|
query.clear();
|
|
|
|
|
return map;
|
|
|
|
|
}
|
|
|
|
|
catch (const std::exception& e)
|
|
|
|
|
{
|
|
|
|
|
return map;
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-03-04 09:44:03 +08:00
|
|
|
|
2025-03-21 12:53:45 +08:00
|
|
|
bool DataBase::createDynamicTable(const QString &tableName, const QStringList &fields)
|
|
|
|
|
{
|
|
|
|
|
QString strSQL = "CREATE TABLE IF NOT EXISTS " + tableName + " (";
|
|
|
|
|
for (const QString &field : fields) {
|
|
|
|
|
strSQL += field + ", ";
|
|
|
|
|
}
|
|
|
|
|
// Remove the last comma and space
|
|
|
|
|
strSQL.chop(2);
|
|
|
|
|
strSQL += ");";
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
executeSQL(strSQL,true);
|
|
|
|
|
LOG_INFO("DB", QString("Create table %1 success").arg(tableName));
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
catch (const std::exception& e)
|
|
|
|
|
{
|
|
|
|
|
LOG_ERROR("DB", QString("Create table %1 fail").arg(tableName));
|
|
|
|
|
return false;
|
2025-03-04 09:44:03 +08:00
|
|
|
}
|
|
|
|
|
}
|
2025-03-07 19:24:19 +08:00
|
|
|
|
|
|
|
|
bool DataBase::deleteProjectModel(const QString& sProject)
|
|
|
|
|
{
|
|
|
|
|
if(sProject == QString::fromWCharArray(L"新建"))
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-21 12:53:45 +08:00
|
|
|
QStringList lstTable;
|
|
|
|
|
QString strSQL = "SELECT name FROM project_manager WHERE tag = ?";
|
|
|
|
|
QVariantList params;
|
|
|
|
|
params.append(sProject);
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
QSqlQuery query = executeSQL(strSQL,false,params);
|
|
|
|
|
while (query.next())
|
2025-03-07 19:24:19 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
QString sName = query.value(0).toString(); //获取表名
|
|
|
|
|
lstTable.append(sName);
|
2025-03-07 19:24:19 +08:00
|
|
|
}
|
2025-03-21 12:53:45 +08:00
|
|
|
query.finish();
|
|
|
|
|
}
|
|
|
|
|
catch (const std::exception& e)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2025-03-07 19:24:19 +08:00
|
|
|
|
2025-03-21 12:53:45 +08:00
|
|
|
if(!db.transaction())
|
|
|
|
|
{
|
|
|
|
|
LOG_ERROR("DB", QString("Start transaction failed. error: %1.").arg( db.lastError().databaseText()));
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
QStringList sqlStatements;
|
|
|
|
|
for(auto &sTab:lstTable)
|
|
|
|
|
{
|
|
|
|
|
sqlStatements << QString("DROP TABLE IF EXISTS %1").arg(sTab);
|
|
|
|
|
}
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
executeBatchSQL(sqlStatements,true);
|
|
|
|
|
}
|
|
|
|
|
catch (const std::exception& e)
|
|
|
|
|
{
|
|
|
|
|
if(!db.rollback()) // 回滚失败时记录警告
|
2025-03-07 19:24:19 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
LOG_ERROR("DB", QString("Rollback failed. error: %1").arg(db.lastError().databaseText()));
|
2025-03-07 19:24:19 +08:00
|
|
|
}
|
2025-03-21 12:53:45 +08:00
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if(!db.commit()) // 提交
|
|
|
|
|
{
|
|
|
|
|
LOG_ERROR("DB", QString("Commit transaction failed. error: %1.").arg(db.lastError().databaseText()));
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2025-03-07 19:24:19 +08:00
|
|
|
|
2025-03-21 12:53:45 +08:00
|
|
|
strSQL = "DELETE FROM project_manager WHERE tag = ?";
|
|
|
|
|
params.clear();
|
|
|
|
|
params.append(sProject);
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
executeSQL(strSQL,false,params);
|
|
|
|
|
LOG_INFO("DB", QString("Delete row %1 success").arg(sProject));
|
2025-03-14 17:18:25 +08:00
|
|
|
return true;
|
|
|
|
|
}
|
2025-03-21 12:53:45 +08:00
|
|
|
catch (const std::exception& e)
|
|
|
|
|
{
|
|
|
|
|
LOG_ERROR("DB", QString("Delete row %1 failed").arg(sProject));
|
2025-03-14 17:18:25 +08:00
|
|
|
return false;
|
2025-03-21 12:53:45 +08:00
|
|
|
}
|
|
|
|
|
|
2025-03-14 17:18:25 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool DataBase::deleteTable(const QString& sName)
|
|
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
QString strSQL = QString("DROP TABLE IF EXISTS %1").arg(sName);
|
|
|
|
|
try
|
2025-03-14 17:18:25 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
executeSQL(strSQL,true);
|
|
|
|
|
LOG_INFO("DB", QString("Drop table %1 success").arg(sName));
|
2025-03-14 17:18:25 +08:00
|
|
|
return true;
|
|
|
|
|
}
|
2025-03-21 12:53:45 +08:00
|
|
|
catch (const std::exception& e)
|
|
|
|
|
{
|
|
|
|
|
LOG_ERROR("DB", QString("Drop table %1 failed").arg(sName));
|
2025-03-14 17:18:25 +08:00
|
|
|
return false;
|
2025-03-21 12:53:45 +08:00
|
|
|
}
|
2025-03-14 17:18:25 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool DataBase::deleteRecordFromManager(const QString& sProject,const QString& sGroup)
|
|
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
QString strSQL = "DELETE FROM project_manager WHERE tag = ? AND group_name = ?";
|
|
|
|
|
QVariantList params;
|
|
|
|
|
params.append(sProject);
|
|
|
|
|
params.append(sGroup);
|
|
|
|
|
|
|
|
|
|
try
|
2025-03-14 17:18:25 +08:00
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
executeSQL(strSQL,false,params);
|
|
|
|
|
LOG_INFO("DB", QString("Delete row %1 success").arg(sProject));
|
2025-03-14 17:18:25 +08:00
|
|
|
return true;
|
|
|
|
|
}
|
2025-03-21 12:53:45 +08:00
|
|
|
catch (const std::exception& e)
|
|
|
|
|
{
|
|
|
|
|
LOG_ERROR("DB", QString("Delete row %1 failed").arg(sProject));
|
2025-03-14 17:18:25 +08:00
|
|
|
return false;
|
2025-03-21 12:53:45 +08:00
|
|
|
}
|
2025-03-14 17:18:25 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool DataBase::modifyProjectTable(QString sTable,QMap<QString,QString> mOld,QMap<QString,QString> mNew)
|
|
|
|
|
{
|
2025-03-21 12:53:45 +08:00
|
|
|
QStringList sqlStatements;
|
|
|
|
|
for (auto &col : mOld.keys()) {
|
|
|
|
|
if (!mNew.contains(col)) {
|
|
|
|
|
sqlStatements << QString("ALTER TABLE %1 DROP COLUMN %2")
|
|
|
|
|
.arg(sTable, col);
|
2025-03-14 17:18:25 +08:00
|
|
|
}
|
2025-03-21 12:53:45 +08:00
|
|
|
}
|
|
|
|
|
// 添加/修改列
|
|
|
|
|
for (auto &col : mNew.keys()) {
|
|
|
|
|
const QString &newType = mNew[col];
|
2025-03-14 17:18:25 +08:00
|
|
|
|
2025-03-21 12:53:45 +08:00
|
|
|
// 新增列
|
|
|
|
|
if (!mOld.contains(col)) {
|
|
|
|
|
sqlStatements << QString("ALTER TABLE %1 ADD COLUMN %2 %3")
|
|
|
|
|
.arg(sTable, col, newType);
|
2025-03-14 17:18:25 +08:00
|
|
|
}
|
2025-03-21 12:53:45 +08:00
|
|
|
// 修改列类型
|
|
|
|
|
else if (mOld[col] != newType) {
|
|
|
|
|
sqlStatements << QString("ALTER TABLE %1 ALTER COLUMN %2 TYPE %3 USING %2::%3")
|
|
|
|
|
.arg(sTable, col, newType);
|
2025-03-14 17:18:25 +08:00
|
|
|
}
|
2025-03-21 12:53:45 +08:00
|
|
|
}
|
2025-03-14 17:18:25 +08:00
|
|
|
|
2025-03-21 12:53:45 +08:00
|
|
|
if(!db.transaction())
|
|
|
|
|
{
|
|
|
|
|
LOG_ERROR("DB", QString("Start transaction failed. error: %1.").arg( db.lastError().databaseText()));
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
executeBatchSQL(sqlStatements);
|
|
|
|
|
}
|
|
|
|
|
catch (const std::exception& e)
|
|
|
|
|
{
|
|
|
|
|
if(!db.rollback()) // 回滚失败时记录警告
|
|
|
|
|
{
|
|
|
|
|
LOG_ERROR("DB", QString("Rollback failed. error: %1").arg(db.lastError().databaseText()));
|
2025-03-14 17:18:25 +08:00
|
|
|
}
|
2025-03-21 12:53:45 +08:00
|
|
|
return false;
|
2025-03-07 19:24:19 +08:00
|
|
|
}
|
2025-03-21 12:53:45 +08:00
|
|
|
if(!db.commit()) // 提交
|
|
|
|
|
{
|
|
|
|
|
LOG_ERROR("DB", QString("Commit transaction failed. error: %1.").arg(db.lastError().databaseText()));
|
2025-03-07 19:24:19 +08:00
|
|
|
return false;
|
2025-03-21 12:53:45 +08:00
|
|
|
}
|
|
|
|
|
return true;
|
2025-03-07 19:24:19 +08:00
|
|
|
}
|