mirror of
https://github.com/pgadmin-org/pgadmin4.git
synced 2025-02-25 18:55:31 -06:00
Fixed the issue of renaming the database by another user. Fixes #4203
This commit is contained in:
committed by
Akshay Joshi
parent
a487a51135
commit
658a2de619
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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(){
|
||||
|
||||
@@ -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"},
|
||||
|
||||
Reference in New Issue
Block a user