Fixed the issue of renaming the database by another user. Fixes #4203

This commit is contained in:
Rahul Shirsat
2021-05-31 12:41:09 +05:30
committed by Akshay Joshi
parent a487a51135
commit 658a2de619
16 changed files with 645 additions and 478 deletions

View File

@@ -21,6 +21,7 @@ from pgadmin.utils.constants import MIMETYPE_APP_JS
from pgadmin.utils.driver import get_driver
from ... import socketio as sio
from pgadmin.utils import get_complete_file_path
from pgadmin.utils.ajax import internal_server_error
session_input = dict()
@@ -28,6 +29,7 @@ session_input_cursor = dict()
session_last_cmd = dict()
pdata = dict()
cdata = dict()
_NODES_SQL = 'nodes.sql'
class PSQLModule(PgAdminModule):
@@ -95,6 +97,8 @@ def panel(trans_id):
# Set TERM env for xterm.
os.environ['TERM'] = 'xterm'
o_db_name = _get_database(params['sid'], params['did'])
return render_template('editor_template.html',
sid=params['sid'],
db=underscore_unescape(params['db']) if params[
@@ -102,7 +106,8 @@ def panel(trans_id):
server_type=params['server_type'],
is_enable=config.ENABLE_PSQL,
title=underscore_unescape(params['title']),
theme=params['theme']
theme=params['theme'],
o_db_name=o_db_name
)
@@ -684,3 +689,53 @@ def disconnect_socket():
os.close(app.config['sessions'][request.sid])
os.close(cdata[request.sid])
del app.config['sessions'][request.sid]
def _get_database(sid, did):
"""
This method is used to get database based on sid, did.
"""
try:
from pgadmin.utils.driver import get_driver
manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(int(sid))
conn = manager.connection()
db_name = None
if conn.connected():
is_connected = True
else:
is_connected = False
if is_connected:
if conn.manager and conn.manager.db_info \
and conn.manager.db_info[int(did)] is not None:
db_name = conn.manager.db_info[int(did)]['datname']
return db_name
elif sid:
template_path = 'databases/sql/#{0}#'.format(manager.version)
last_system_oid = 0
server_node_res = manager
db_disp_res = None
params = None
if server_node_res and server_node_res.db_res:
db_disp_res = ", ".join(
['%s'] * len(server_node_res.db_res.split(','))
)
params = tuple(server_node_res.db_res.split(','))
sql = render_template(
"/".join([template_path, _NODES_SQL]),
last_system_oid=last_system_oid,
db_restrictions=db_disp_res,
did=did
)
status, databases = conn.execute_dict(sql, params)
database = databases['rows'][0]
if database is not None:
db_name = database['name']
return db_name
else:
return db_name
except Exception:
return None

View File

@@ -16,9 +16,10 @@ import {enable} from 'pgadmin.browser.toolbar';
import clipboard from 'sources/selection/clipboard';
import 'wcdocker';
import {getRandomInt} from 'sources/utils';
import pgWindow from 'sources/window';
import {getTreeNodeHierarchyFromIdentifier} from 'sources/tree/pgadmin_tree_node';
import {generateTitle} from 'tools/datagrid/static/js/datagrid_panel_title';
import {generateTitle, refresh_db_node} from 'tools/datagrid/static/js/datagrid_panel_title';
export function setPanelTitle(psqlToolPanel, panelTitle) {
@@ -285,6 +286,7 @@ export function initialize(gettext, url_for, $, _, pgAdmin, csrfToken, Browser)
openUrl += `?sgid=${parentData.server_group._id}`
+`&sid=${parentData.server._id}`
+`&did=${parentData.database._id}`
+`&server_type=${parentData.server.server_type}`
+ `&theme=${theme}`;
@@ -417,7 +419,19 @@ export function initialize(gettext, url_for, $, _, pgAdmin, csrfToken, Browser)
term.onKey(function (ev) {
socket.emit('socket_input', {'input': ev.key, 'key_name': ev.domEvent.code});
});
}
},
check_db_name_change: function(db_name, o_db_name) {
if (db_name != o_db_name) {
var selected_item = pgWindow.pgAdmin.Browser.treeMenu.selected(),
tree_data = pgWindow.pgAdmin.Browser.treeMenu.translateTreeNodeIdFromACITree(selected_item),
database_data = pgWindow.pgAdmin.Browser.treeMenu.findNode(tree_data.slice(0,4)),
dbNode = database_data.domNode;
var message = `Current database has been moved or renamed to ${o_db_name}. Click on the OK button to refresh the database name, and reopen the psql again.`;
refresh_db_node(message, dbNode);
}
},
};
return pgBrowser.psql;

View File

@@ -34,6 +34,7 @@ require(
const socket = self.pgAdmin.Browser.psql.psql_socket();
self.pgAdmin.Browser.psql.psql_socket_io(socket, '{{is_enable}}', '{{sid}}', '{{db}}', '{{server_type}}', fitAddon, term);
self.pgAdmin.Browser.psql.psql_terminal_io(term, socket);
self.pgAdmin.Browser.psql.check_db_name_change('{{db}}', '{{o_db_name}}');
<!-- Resize the terminal -->
function fitToscreen(){

View File

@@ -17,10 +17,10 @@ class PSQLPanel(BaseTestGenerator):
def runTest(self):
trans_id = random.randint(1, 9999999)
url = '/psql/panel/{trans_id}?sgid={sgid}&sid={sid}&server_type=pg' \
'&db={db_name}&theme={theme}'.\
url = '/psql/panel/{trans_id}?sgid={sgid}&sid={sid}&did={did}' \
'&server_type=pg&db={db_name}&theme={theme}'.\
format(trans_id=trans_id, sgid=self.sgid, sid=self.sid,
db_name=self.db_name, theme=self.theme)
did=self.did, db_name=self.db_name, theme=self.theme)
response = self.tester.post(
url, data={"title": "panel_title"},