Drop all connections from the connection manager when a server is dropped to avoid issues if sqlite reuses an ID. Fixes #1720

This commit is contained in:
Harshal Dhumal 2016-09-22 12:57:52 +01:00 committed by Dave Page
parent 0ba414f0ab
commit f117685d77
2 changed files with 13 additions and 16 deletions

View File

@ -24,6 +24,7 @@ from pgadmin.utils.menu import MenuItem
import config
from config import PG_DEFAULT_DRIVER
from pgadmin.model import db, Server, ServerGroup, User
from pgadmin.utils.driver import get_driver
def has_any(data, keys):
@ -64,7 +65,6 @@ class ServerModule(sg.ServerGroupPluginModule):
servers = Server.query.filter_by(user_id=current_user.id,
servergroup_id=gid)
from pgadmin.utils.driver import get_driver
driver = get_driver(PG_DEFAULT_DRIVER)
for server in servers:
@ -156,7 +156,6 @@ class ServerModule(sg.ServerGroupPluginModule):
sub-modules at once.
"""
if first_registration:
from pgadmin.utils.driver import get_driver
driver = get_driver(PG_DEFAULT_DRIVER, app)
app.jinja_env.filters['qtLiteral'] = driver.qtLiteral
app.jinja_env.filters['qtIdent'] = driver.qtIdent
@ -224,7 +223,6 @@ class ServerNode(PGChildNodeView):
servers = Server.query.filter_by(user_id=current_user.id,
servergroup_id=gid)
from pgadmin.utils.driver import get_driver
driver = get_driver(PG_DEFAULT_DRIVER)
for server in servers:
@ -293,7 +291,6 @@ class ServerNode(PGChildNodeView):
)
)
from pgadmin.utils.driver import get_driver
manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(server.id)
conn = manager.connection()
connected = conn.connected()
@ -353,6 +350,7 @@ class ServerNode(PGChildNodeView):
else:
try:
for s in servers:
get_driver(PG_DEFAULT_DRIVER).delete_manager(s.id)
db.session.delete(s)
db.session.commit()
except Exception as e:
@ -405,7 +403,6 @@ class ServerNode(PGChildNodeView):
request.data, encoding='utf-8'
)
from pgadmin.utils.driver import get_driver
manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(sid)
conn = manager.connection()
connected = conn.connected()
@ -473,7 +470,6 @@ class ServerNode(PGChildNodeView):
).first()
res = []
from pgadmin.utils.driver import get_driver
driver = get_driver(PG_DEFAULT_DRIVER)
for server in servers:
@ -519,7 +515,6 @@ class ServerNode(PGChildNodeView):
id=server.servergroup_id
).first()
from pgadmin.utils.driver import get_driver
driver = get_driver(PG_DEFAULT_DRIVER)
manager = driver.connection_manager(sid)
@ -594,7 +589,6 @@ class ServerNode(PGChildNodeView):
user = None
if 'connect_now' in data and data['connect_now']:
from pgadmin.utils.driver import get_driver
manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(server.id)
manager.update(server)
conn = manager.connection()
@ -663,7 +657,6 @@ class ServerNode(PGChildNodeView):
return make_json_response(data='')
def statistics(self, gid, sid):
from pgadmin.utils.driver import get_driver
manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(sid)
conn = manager.connection()
@ -717,7 +710,6 @@ class ServerNode(PGChildNodeView):
def connect_status(self, gid, sid):
"""Check and return the connection status."""
from pgadmin.utils.driver import get_driver
manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(sid)
conn = manager.connection()
res = conn.connected()
@ -769,7 +761,6 @@ class ServerNode(PGChildNodeView):
save_password = False
# Connect the Server
from pgadmin.utils.driver import get_driver
manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(sid)
conn = manager.connection()
@ -902,7 +893,6 @@ class ServerNode(PGChildNodeView):
return bad_request(gettext("Server not found."))
# Release Connection
from pgadmin.utils.driver import get_driver
manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(sid)
status = manager.release()
@ -923,7 +913,6 @@ class ServerNode(PGChildNodeView):
"""Reload the server configuration"""
# Reload the server configurations
from pgadmin.utils.driver import get_driver
manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(sid)
conn = manager.connection()
@ -958,7 +947,6 @@ class ServerNode(PGChildNodeView):
try:
data = request.form
restore_point_name = data['value'] if data else None
from pgadmin.utils.driver import get_driver
manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(sid)
conn = manager.connection()
@ -1033,7 +1021,6 @@ class ServerNode(PGChildNodeView):
if user is None:
return unauthorized(gettext("Unauthorized request."))
from pgadmin.utils.driver import get_driver
manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(sid)
conn = manager.connection()
@ -1100,7 +1087,6 @@ class ServerNode(PGChildNodeView):
)
try:
from pgadmin.utils.driver import get_driver
manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(sid)
conn = manager.connection()

View File

@ -1721,6 +1721,17 @@ class Driver(BaseDriver):
"""
return self.connection_manager(sid).release(database, conn_id)
def delete_manager(self, sid):
"""
Delete manager for given server id.
"""
manager = self.connection_manager(sid)
if manager is not None:
manager.release()
if session['_id'] in self.managers and \
str(sid) in self.managers[session['_id']]:
del self.managers[session['_id']][str(sid)]
def gc(self):
"""
Release the connections for the sessions, which have not pinged the