完成属性组的删除逻辑
This commit is contained in:
parent
246df65400
commit
bd49be8d6f
|
|
@ -23,6 +23,7 @@ public:
|
||||||
|
|
||||||
void setMainWindow(MainWindow*);
|
void setMainWindow(MainWindow*);
|
||||||
void addTab_attribute(const QString&, ModelAttributeGroup&);
|
void addTab_attribute(const QString&, ModelAttributeGroup&);
|
||||||
|
void closeTab_attribute(ModelAttributeGroup&);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void onTabCloseRequested(int);
|
void onTabCloseRequested(int);
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@ public:
|
||||||
QModelIndex getConnNodeIndex(const QString& name);
|
QModelIndex getConnNodeIndex(const QString& name);
|
||||||
void addDataModel(const QString& connection, Model& model);
|
void addDataModel(const QString& connection, Model& model);
|
||||||
void removeDataModel(DBStructureNode*);
|
void removeDataModel(DBStructureNode*);
|
||||||
|
void removeDataGroup(DBStructureNode*);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void errorOccurred(const QString& strConnectionName);
|
void errorOccurred(const QString& strConnectionName);
|
||||||
|
|
|
||||||
|
|
@ -36,10 +36,12 @@ private:
|
||||||
void disconnectToDB(const QString&);
|
void disconnectToDB(const QString&);
|
||||||
void removeNode(DBStructureNode*);
|
void removeNode(DBStructureNode*);
|
||||||
void openAttributeGroup(DBStructureNode*);
|
void openAttributeGroup(DBStructureNode*);
|
||||||
|
void closeAttributeGroup(DBStructureNode*);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void actionTrigger_addModel();
|
void actionTrigger_addModel();
|
||||||
void openAttributeInfo(const QString&, ModelAttributeGroup&);
|
void openAttributeInfo(const QString&, ModelAttributeGroup&);
|
||||||
|
void closeAttributeInfo(ModelAttributeGroup&);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void itemDoubleClick(const QModelIndex&);
|
void itemDoubleClick(const QModelIndex&);
|
||||||
|
|
|
||||||
|
|
@ -60,6 +60,7 @@ private slots:
|
||||||
void onSIG_connectionStatusChanged(const QString& strConnectionName, bool bConnected);
|
void onSIG_connectionStatusChanged(const QString& strConnectionName, bool bConnected);
|
||||||
void onSIG_addModel(Model&);
|
void onSIG_addModel(Model&);
|
||||||
void onSIG_openAttributeInfo(const QString&, ModelAttributeGroup&);
|
void onSIG_openAttributeInfo(const QString&, ModelAttributeGroup&);
|
||||||
|
void onSIG_closeAttributeInfo(ModelAttributeGroup&);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MAINWINDOW_H
|
#endif // MAINWINDOW_H
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,7 @@ public:
|
||||||
const QVector<AttributeGroup> getAttributeGroup(const QString&);
|
const QVector<AttributeGroup> getAttributeGroup(const QString&);
|
||||||
const QString getAttributeGroupName(const QString&, int);
|
const QString getAttributeGroupName(const QString&, int);
|
||||||
const AttributeGroup getAttributeGroupData(const QString&, int);
|
const AttributeGroup getAttributeGroupData(const QString&, int);
|
||||||
|
bool removeAttributeGroup(const QString&, int, int);
|
||||||
//模型相关
|
//模型相关
|
||||||
const QVector<Model> getModels(const QString&);
|
const QVector<Model> getModels(const QString&);
|
||||||
bool addModel(const QString&, Model&);
|
bool addModel(const QString&, Model&);
|
||||||
|
|
|
||||||
|
|
@ -80,6 +80,16 @@ void DatabaseBrowser::addTab_attribute(const QString& connection, ModelAttribute
|
||||||
ui->tabWidget->setCurrentIndex(index);
|
ui->tabWidget->setCurrentIndex(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DatabaseBrowser::closeTab_attribute(ModelAttributeGroup& attributeGroup)
|
||||||
|
{
|
||||||
|
QString tabText = attributeGroup.strModelName + "/" + attributeGroup.strGroupName;
|
||||||
|
int index = tabIndex(tabText);
|
||||||
|
if(index == -1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
onTabCloseRequested(index);
|
||||||
|
}
|
||||||
|
|
||||||
void DatabaseBrowser::onTabCloseRequested(int index)
|
void DatabaseBrowser::onTabCloseRequested(int index)
|
||||||
{
|
{
|
||||||
/*QObject* sender = QObject::sender();
|
/*QObject* sender = QObject::sender();
|
||||||
|
|
|
||||||
|
|
@ -212,6 +212,50 @@ void DBStructureModel::removeDataModel(DBStructureNode* modelNode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DBStructureModel::removeDataGroup(DBStructureNode* groupNode)
|
||||||
|
{
|
||||||
|
int groupID = groupNode->data(Qt::UserRole + NodeDataRole::ID).toInt();
|
||||||
|
//先从数据库中删除
|
||||||
|
DBStructureNode* modelNode = groupNode->parentNode();
|
||||||
|
if(!(modelNode && modelNode->type() == TableNode))
|
||||||
|
{
|
||||||
|
if(m_pMainWindow)
|
||||||
|
{
|
||||||
|
QString error = QString::fromWCharArray(L"删除失败,未找到所在链接节点信息");
|
||||||
|
m_pMainWindow->showMessageDialog(type_information, QString::fromWCharArray(L"失败"), error);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int modelID = modelNode->data(Qt::UserRole + NodeDataRole::ID).toInt();
|
||||||
|
DBStructureNode* connNode = modelNode->parentNode();
|
||||||
|
if(!(connNode && connNode->type() == ConnectionNode))
|
||||||
|
{
|
||||||
|
if(m_pMainWindow)
|
||||||
|
{
|
||||||
|
QString error = QString::fromWCharArray(L"删除失败,未找到所在链接节点信息");
|
||||||
|
m_pMainWindow->showMessageDialog(type_information, QString::fromWCharArray(L"失败"), error);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
bool result = SqlQueryExecutor::instance().removeAttributeGroup(connNode->name(), modelID, groupID);
|
||||||
|
if(!result)
|
||||||
|
{
|
||||||
|
if(m_pMainWindow)
|
||||||
|
{
|
||||||
|
QString error = QString::fromWCharArray(L"删除失败,详情可见日志文件");
|
||||||
|
m_pMainWindow->showMessageDialog(type_information, QString::fromWCharArray(L"失败"), error);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else //从列表中删除
|
||||||
|
{
|
||||||
|
QModelIndex connIndex = index(connNode->row(), 0, QModelIndex());
|
||||||
|
beginRemoveRows(index(modelNode->row(), 0, connIndex), groupNode->row(), groupNode->row());
|
||||||
|
modelNode->removeChild(groupNode);
|
||||||
|
endRemoveRows();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void DBStructureModel::refreshStructure_Connection(const QString& connection)
|
void DBStructureModel::refreshStructure_Connection(const QString& connection)
|
||||||
{
|
{
|
||||||
DBStructureNode* connNode = getConnectionNode(connection);
|
DBStructureNode* connNode = getConnectionNode(connection);
|
||||||
|
|
|
||||||
|
|
@ -115,7 +115,11 @@ void DBStructureView::removeNode(DBStructureNode* node)
|
||||||
model->removeDataModel(node);
|
model->removeDataModel(node);
|
||||||
}
|
}
|
||||||
else if(node->type() == GroupNode)
|
else if(node->type() == GroupNode)
|
||||||
{}
|
{
|
||||||
|
DBStructureModel* model = dynamic_cast<DBStructureModel*>(this->model());
|
||||||
|
if(model)
|
||||||
|
model->removeDataGroup(node);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DBStructureView::openAttributeGroup(DBStructureNode* node)
|
void DBStructureView::openAttributeGroup(DBStructureNode* node)
|
||||||
|
|
@ -132,6 +136,20 @@ void DBStructureView::openAttributeGroup(DBStructureNode* node)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DBStructureView::closeAttributeGroup(DBStructureNode* node)
|
||||||
|
{
|
||||||
|
DBStructureNode* parent = node->parentNode();
|
||||||
|
if(parent && parent->type() == TableNode)
|
||||||
|
{
|
||||||
|
int modelID = parent->data(Qt::UserRole + NodeDataRole::ID).toInt();
|
||||||
|
int groupID = node->data(Qt::UserRole + NodeDataRole::ID).toInt();
|
||||||
|
QString modelName = parent->name();
|
||||||
|
QString groupName = node->name();
|
||||||
|
ModelAttributeGroup attributeGroup(modelID, groupID, modelName, groupName);
|
||||||
|
emit closeAttributeInfo(attributeGroup);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void DBStructureView::disconnectCurConnection()
|
void DBStructureView::disconnectCurConnection()
|
||||||
{
|
{
|
||||||
if(!m_curConnection.isEmpty())
|
if(!m_curConnection.isEmpty())
|
||||||
|
|
@ -264,10 +282,10 @@ void DBStructureView::showContextMenu(const QPoint& pos)
|
||||||
});
|
});
|
||||||
menu.addSeparator();
|
menu.addSeparator();
|
||||||
menu.addAction(QString::fromWCharArray(L"刷新"), []{});
|
menu.addAction(QString::fromWCharArray(L"刷新"), []{});
|
||||||
menu.addAction(QString::fromWCharArray(L"打开"), []{});
|
//menu.addAction(QString::fromWCharArray(L"打开"), []{});
|
||||||
menu.addSeparator();
|
/*menu.addSeparator();
|
||||||
menu.addAction(QString::fromWCharArray(L"清空数据"), []{});
|
menu.addAction(QString::fromWCharArray(L"清空数据"), []{});
|
||||||
/*menu.addAction(QString::fromWCharArray(L"导入"), []{});
|
menu.addAction(QString::fromWCharArray(L"导入"), []{});
|
||||||
menu.addAction(QString::fromWCharArray(L"导出"), []{});*/
|
menu.addAction(QString::fromWCharArray(L"导出"), []{});*/
|
||||||
QPoint originPoint = this->mapToGlobal(QPoint(0,0));
|
QPoint originPoint = this->mapToGlobal(QPoint(0,0));
|
||||||
menu.exec(originPoint + pos);
|
menu.exec(originPoint + pos);
|
||||||
|
|
@ -275,13 +293,31 @@ void DBStructureView::showContextMenu(const QPoint& pos)
|
||||||
else if(node && node->type() == GroupNode)
|
else if(node && node->type() == GroupNode)
|
||||||
{
|
{
|
||||||
CustomMenu menu;
|
CustomMenu menu;
|
||||||
|
menu.addAction(QString::fromWCharArray(L"打开"), [this, node]{openAttributeGroup(node);});
|
||||||
menu.addAction(QString::fromWCharArray(L"删除"), [this, node]{
|
menu.addAction(QString::fromWCharArray(L"删除"), [this, node]{
|
||||||
|
bool isPublic = node->data(Qt::UserRole + NodeDataRole::Type).toBool();
|
||||||
|
if(isPublic)
|
||||||
|
{
|
||||||
|
if(m_pMainWindow)
|
||||||
|
{
|
||||||
|
m_pMainWindow->showMessageDialog(type_warning, QString::fromWCharArray(L"错误"),
|
||||||
|
QString::fromWCharArray(L"该属性组属于必备组别,不可删除"));
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(m_pMainWindow)
|
||||||
|
{
|
||||||
|
m_pMainWindow->showMessageDialog(type_question, QString::fromWCharArray(L"提示"),
|
||||||
|
QString::fromWCharArray(L"确认删除属性组 '%1' 吗").arg(node->name()));
|
||||||
|
if(g_msgDlgBtn == btn_No)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//关闭tab(若打开)
|
||||||
|
closeAttributeGroup(node);
|
||||||
|
//移除节点
|
||||||
removeNode(node);
|
removeNode(node);
|
||||||
});
|
});
|
||||||
menu.addSeparator();
|
menu.addSeparator();
|
||||||
menu.addAction(QString::fromWCharArray(L"刷新"), []{});
|
|
||||||
menu.addAction(QString::fromWCharArray(L"打开"), [this, node]{openAttributeGroup(node);});
|
|
||||||
menu.addSeparator();
|
|
||||||
menu.addAction(QString::fromWCharArray(L"清空数据"), []{});
|
menu.addAction(QString::fromWCharArray(L"清空数据"), []{});
|
||||||
QPoint originPoint = this->mapToGlobal(QPoint(0,0));
|
QPoint originPoint = this->mapToGlobal(QPoint(0,0));
|
||||||
menu.exec(originPoint + pos);
|
menu.exec(originPoint + pos);
|
||||||
|
|
|
||||||
|
|
@ -79,6 +79,7 @@ void MainWindow::initialize()
|
||||||
m_pDBStrutureView->setMainWindow(this);
|
m_pDBStrutureView->setMainWindow(this);
|
||||||
connect(m_pDBStrutureView, &DBStructureView::actionTrigger_addModel, this, &MainWindow::onActionTrigger_addModel);
|
connect(m_pDBStrutureView, &DBStructureView::actionTrigger_addModel, this, &MainWindow::onActionTrigger_addModel);
|
||||||
connect(m_pDBStrutureView, &DBStructureView::openAttributeInfo, this, &MainWindow::onSIG_openAttributeInfo);
|
connect(m_pDBStrutureView, &DBStructureView::openAttributeInfo, this, &MainWindow::onSIG_openAttributeInfo);
|
||||||
|
connect(m_pDBStrutureView, &DBStructureView::closeAttributeInfo, this, &MainWindow::onSIG_closeAttributeInfo);
|
||||||
ui->layoutDBStructure->addWidget(m_pDBStrutureView);
|
ui->layoutDBStructure->addWidget(m_pDBStrutureView);
|
||||||
m_pDBStrutureModel = new DBStructureModel(this);
|
m_pDBStrutureModel = new DBStructureModel(this);
|
||||||
m_pDBStrutureModel->setMainWindow(this);
|
m_pDBStrutureModel->setMainWindow(this);
|
||||||
|
|
@ -242,3 +243,9 @@ void MainWindow::onSIG_openAttributeInfo(const QString& connection, ModelAttribu
|
||||||
if(m_dbBrowser)
|
if(m_dbBrowser)
|
||||||
m_dbBrowser->addTab_attribute(connection, attributeGroup);
|
m_dbBrowser->addTab_attribute(connection, attributeGroup);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::onSIG_closeAttributeInfo(ModelAttributeGroup& attributeGroup)
|
||||||
|
{
|
||||||
|
if(m_dbBrowser)
|
||||||
|
m_dbBrowser->closeTab_attribute(attributeGroup);
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -134,12 +134,12 @@ QSqlQuery SqlQueryExecutor::executeBatchSQL(const QString& connectionName, const
|
||||||
throw DatabaseException(sqlQuery.lastError());
|
throw DatabaseException(sqlQuery.lastError());
|
||||||
}
|
}
|
||||||
lastQuery = std::move(sqlQuery);
|
lastQuery = std::move(sqlQuery);
|
||||||
// 提交事务(如果已开启)
|
}
|
||||||
if(transactionStarted && !db.commit())
|
// 提交事务(如果已开启)
|
||||||
{
|
if(transactionStarted && !db.commit())
|
||||||
throw DatabaseException(db.lastError());
|
{
|
||||||
LOG_ERROR("DB", QString("Commit transaction failed. connectionName: %1. error: %2").arg(connectionName, db.lastError().databaseText()));
|
throw DatabaseException(db.lastError());
|
||||||
}
|
LOG_ERROR("DB", QString("Commit transaction failed. connectionName: %1. error: %2").arg(connectionName, db.lastError().databaseText()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (const DatabaseException& e)
|
catch (const DatabaseException& e)
|
||||||
|
|
@ -344,6 +344,7 @@ bool SqlQueryExecutor::modelTypeExistsInDB(const QString& connectionName, const
|
||||||
|
|
||||||
bool SqlQueryExecutor::removeModel(const QString& connectionName, int modelID)
|
bool SqlQueryExecutor::removeModel(const QString& connectionName, int modelID)
|
||||||
{
|
{
|
||||||
|
//数据库中有级联删除,只需要从model_type中删除即可
|
||||||
QString strSQL = "DELETE FROM basic.model_type WHERE id = :id"/* + QString::number(modelID)*/;
|
QString strSQL = "DELETE FROM basic.model_type WHERE id = :id"/* + QString::number(modelID)*/;
|
||||||
QVariantHash params;
|
QVariantHash params;
|
||||||
params.insert(":id", modelID);
|
params.insert(":id", modelID);
|
||||||
|
|
@ -428,6 +429,34 @@ const AttributeGroup SqlQueryExecutor::getAttributeGroupData(const QString& conn
|
||||||
return group;
|
return group;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool SqlQueryExecutor::removeAttributeGroup(const QString& connectionName, int modelID, int groupID)
|
||||||
|
{
|
||||||
|
//从model_attribute和model_group两个map表中对相关记录进行删除(暂时不做属性本体的删除)
|
||||||
|
QStringList sqlStatements;
|
||||||
|
QList<QVariantHash> paramsList;
|
||||||
|
sqlStatements << "DELETE FROM basic.model_attribute WHERE model_type_id = :modelID AND attribute_group_id = :groupID";
|
||||||
|
QVariantHash params;
|
||||||
|
params.insert(":modelID", modelID);
|
||||||
|
params.insert(":groupID", groupID);
|
||||||
|
paramsList << params;
|
||||||
|
sqlStatements << "DELETE FROM basic.model_group WHERE model_type_id = :modelID AND attribute_group_id = :groupID";
|
||||||
|
params.clear();
|
||||||
|
params.insert(":modelID", modelID);
|
||||||
|
params.insert(":groupID", groupID);
|
||||||
|
paramsList << params;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
executeBatchSQL(connectionName, sqlStatements, paramsList, true);
|
||||||
|
}
|
||||||
|
catch (const DatabaseException& e)
|
||||||
|
{
|
||||||
|
LOG_ERROR("SQL", QString::fromWCharArray(L"删除属性组失败,model_type_id:%1,attribute_group_id:%2").arg(modelID, groupID));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
int SqlQueryExecutor::getAttributeCount(const QString& connectionName, int modelID, int groupID)
|
int SqlQueryExecutor::getAttributeCount(const QString& connectionName, int modelID, int groupID)
|
||||||
{
|
{
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue