public inbox for [email protected]
help / color / mirror / Atom feedFrom: Aditya Toshniwal <[email protected]>
To: pgadmin-hackers <[email protected]>
Subject: [pgAdmin][RM7238] ERD: Remove foreign references when table node is removed
Date: Thu, 17 Mar 2022 15:22:40 +0530
Message-ID: <CAM9w-_=4sxgfdS9vPjDMWBoi85xkg1LESCTJyBNCxFFawEZgAg@mail.gmail.com> (raw)
Hi Hackers,
Attached patch fixes issue where foreign key is not removed even if the
referred table is removed in ERD. I have also added a check to not allow
duplicate table names.
Please review.
--
Thanks,
Aditya Toshniwal
pgAdmin Hacker | Software Architect | *edbpostgres.com*
<http://edbpostgres.com;
"Don't Complain about Heat, Plant a TREE"
Attachments:
[application/octet-stream] RM7238.patch (4.4K, 3-RM7238.patch)
download | inline diff:
diff --git a/web/pgadmin/tools/erd/__init__.py b/web/pgadmin/tools/erd/__init__.py
index b951ecb53..260b5a70e 100644
--- a/web/pgadmin/tools/erd/__init__.py
+++ b/web/pgadmin/tools/erd/__init__.py
@@ -547,8 +547,10 @@ def translate_foreign_keys(tab_fks, tab_data, all_nodes):
for tab_fk in tab_fks:
if 'columns' not in tab_fk:
continue
- print(tab_data)
- remote_table = all_nodes[tab_fk['columns'][0]['references']]
+ try:
+ remote_table = all_nodes[tab_fk['columns'][0]['references']]
+ except KeyError:
+ continue
tab_fk['schema'] = tab_data['schema']
tab_fk['table'] = tab_data['name']
tab_fk['remote_schema'] = remote_table['schema']
diff --git a/web/pgadmin/tools/erd/static/js/erd_tool/ERDCore.js b/web/pgadmin/tools/erd/static/js/erd_tool/ERDCore.js
index e3de3670a..0265668a9 100644
--- a/web/pgadmin/tools/erd/static/js/erd_tool/ERDCore.js
+++ b/web/pgadmin/tools/erd/static/js/erd_tool/ERDCore.js
@@ -210,6 +210,26 @@ export default class ERDCore {
return newNode;
}
+ removeNode(node) {
+ let self = this;
+ node.setSelected(false);
+ Object.values(node.getPorts()).forEach((port)=>{
+ Object.values(port.getLinks()).forEach((link)=>{
+ self.removeOneToManyLink(link);
+ });
+ });
+ node.remove();
+ }
+
+ anyDuplicateNodeName(newNodeData, oldNodeData) {
+ if(newNodeData.name == oldNodeData?.name && newNodeData.schema == oldNodeData?.schema) {
+ return false;
+ }
+ return _.filter(this.getNodesData(), (n)=>{
+ return n.name==newNodeData.name && n.schema==newNodeData.schema;
+ }).length > 0;
+ }
+
addLink(data, type) {
let tableNodesDict = this.getModel().getNodesDict();
let sourceNode = tableNodesDict[data.referenced_table_uid];
diff --git a/web/pgadmin/tools/erd/static/js/erd_tool/dialogs/DialogWrapper.js b/web/pgadmin/tools/erd/static/js/erd_tool/dialogs/DialogWrapper.js
index 4fe960f45..c46bde715 100644
--- a/web/pgadmin/tools/erd/static/js/erd_tool/dialogs/DialogWrapper.js
+++ b/web/pgadmin/tools/erd/static/js/erd_tool/dialogs/DialogWrapper.js
@@ -69,11 +69,15 @@ export default class DialogWrapper {
};
}
- onSaveClick(isNew, data) {
- return new Promise((resolve)=>{
- this.okCallback(data);
- this.close();
- resolve();
+ onSaveClick(_isNew, data) {
+ return new Promise((resolve, reject)=>{
+ let errorMsg = this.okCallback(data);
+ if(errorMsg) {
+ reject(errorMsg);
+ } else {
+ this.close();
+ resolve();
+ }
});
}
diff --git a/web/pgadmin/tools/erd/static/js/erd_tool/ui_components/BodyWidget.jsx b/web/pgadmin/tools/erd/static/js/erd_tool/ui_components/BodyWidget.jsx
index afd3689b4..2b598d808 100644
--- a/web/pgadmin/tools/erd/static/js/erd_tool/ui_components/BodyWidget.jsx
+++ b/web/pgadmin/tools/erd/static/js/erd_tool/ui_components/BodyWidget.jsx
@@ -347,14 +347,20 @@ export default class BodyWidget extends React.Component {
let dialog = this.getDialog('table_dialog');
if(node) {
let [schema, table] = node.getSchemaTableName();
- dialog(gettext('Table: %s (%s)', _.escape(table),_.escape(schema)), node.getData(), false, (newData)=>{
- let oldData = node.getData();
+ let oldData = node.getData();
+ dialog(gettext('Table: %s (%s)', _.escape(table),_.escape(schema)), oldData, false, (newData)=>{
+ if(this.diagram.anyDuplicateNodeName(newData, oldData)) {
+ return gettext('Table name already exists');
+ }
node.setData(newData);
this.diagram.syncTableLinks(node, oldData);
this.diagram.repaint();
});
} else {
dialog(gettext('New table'), {}, true, (newData)=>{
+ if(this.diagram.anyDuplicateNodeName(newData)) {
+ return gettext('Table name already exists');
+ }
let newNode = this.diagram.addNode(newData);
this.diagram.syncTableLinks(newNode);
newNode.setSelected(true);
@@ -424,8 +430,7 @@ export default class BodyWidget extends React.Component {
+ '<br />' + gettext('Are you sure you want to delete ?'),
() => {
this.diagram.getSelectedNodes().forEach((node)=>{
- node.setSelected(false);
- node.remove();
+ this.diagram.removeNode(node);
});
this.diagram.getSelectedLinks().forEach((link)=>{
this.diagram.removeOneToManyLink(link);
view thread (2+ messages) latest in thread
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: [email protected]
Cc: [email protected]
Subject: Re: [pgAdmin][RM7238] ERD: Remove foreign references when table node is removed
In-Reply-To: <CAM9w-_=4sxgfdS9vPjDMWBoi85xkg1LESCTJyBNCxFFawEZgAg@mail.gmail.com>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox