Hi Khushboo, As we discussed, the database disconnection error message is ignored as it is getting displayed as expected. Variable name , info_already_connected, is changed to already_connected. Run all the test cases except the feature test. Number of test case failures before and after the patch remain the same.
Thanks, Sathish V On Mon, May 4, 2020 at 12:04 AM Khushboo Vashi < khushboo.va...@enterprisedb.com> wrote: > Hi Satish, > > On Thu, Apr 30, 2020 at 8:29 PM Satish V <satis...@enterprisedb.com> > wrote: > >> Hi Khushboo, >> >> In the attached patch, >> Fixed pep8 and made use of 'gettext' inside "database.js" file... >> Regarding *res.info <http://res.info>='Database already connected', **we >> are appending the database name and server name in front of 'res.info >> <http://res.info>' string in the very next line. So using this 'Database >> already connected' text directly inside alertify will stop it from showing >> the info pertaining to the server and database. -* no changes are done >> about res.info. >> >> The database disconnection error comes without a database name. To > reproduce this issue, perform the steps in this RM and then try to > disconnect the database. > Also, please give the proper variable name as we discussed. > > Thanks, > Khushboo > > Thanks > >> Sathish >> >> On Thu, Apr 30, 2020 at 7:40 AM Khushboo Vashi < >> khushboo.va...@enterprisedb.com> wrote: >> >>> Hi Satish, >>> >>> Some minor comments: >>> >>> - Fix PEP8 issues. >>> - Use gettext in database.js file for the info message. >>> - No need to assign text value in res object (res.info = 'Database >>> already connected.'), use this text directly in Alertify.info. >>> >>> Thanks, >>> Khushboo >>> >>> >>> >>> >>> >>> On Thu, Apr 30, 2020 at 1:59 PM Satish V <satis...@enterprisedb.com> >>> wrote: >>> >>>> Hi, >>>> >>>> I made the changes to the code such that conn.connect() will happen >>>> only when there is no prior connection exist. In short, connection via >>>> context menu will not trigger this conn.connect(). >>>> In the client side code, instead of error alert, info alert is used to >>>> inform the user. >>>> >>>> Kindly review the patch and suggest the changes if required. >>>> >>>> Thanks, >>>> Sathish V >>>> >>>> On Thu, Apr 30, 2020 at 2:43 AM Khushboo Vashi < >>>> khushboo.va...@enterprisedb.com> wrote: >>>> >>>>> >>>>> >>>>> On Thu, Apr 30, 2020 at 12:04 PM Aditya Toshniwal < >>>>> aditya.toshni...@enterprisedb.com> wrote: >>>>> >>>>>> Hi, >>>>>> >>>>>> On Thu, Apr 30, 2020 at 11:55 AM Khushboo Vashi < >>>>>> khushboo.va...@enterprisedb.com> wrote: >>>>>> >>>>>>> >>>>>>> >>>>>>> On Thu, Apr 30, 2020 at 10:55 AM Aditya Toshniwal < >>>>>>> aditya.toshni...@enterprisedb.com> wrote: >>>>>>> >>>>>>>> Hi, >>>>>>>> >>>>>>>> On Thu, Apr 30, 2020 at 10:48 AM Khushboo Vashi < >>>>>>>> khushboo.va...@enterprisedb.com> wrote: >>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> On Thu, Apr 30, 2020 at 10:14 AM Aditya Toshniwal < >>>>>>>>> aditya.toshni...@enterprisedb.com> wrote: >>>>>>>>> >>>>>>>>>> Hi, >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> On Thu, Apr 30, 2020 at 9:41 AM Satish V < >>>>>>>>>> satis...@enterprisedb.com> wrote: >>>>>>>>>> >>>>>>>>>>> Hi Kushboo, >>>>>>>>>>> >>>>>>>>>>> Thanks for the update. I will check the same and make >>>>>>>>>>> appropriate changes. >>>>>>>>>>> >>>>>>>>>>> Thanks, >>>>>>>>>>> Sathish >>>>>>>>>>> >>>>>>>>>>> On Thu, Apr 30, 2020 at 9:20 AM Khushboo Vashi < >>>>>>>>>>> khushboo.va...@enterprisedb.com> wrote: >>>>>>>>>>> >>>>>>>>>>>> Hi Satish, >>>>>>>>>>>> >>>>>>>>>>>> As per the RM, the fix is supposed to be at the front-end but >>>>>>>>>>>> it seems difficult at the moment as on the selection of the >>>>>>>>>>>> database, we >>>>>>>>>>>> connect it and at the same time the context menu is being called. >>>>>>>>>>>> As you have tried to fix at the backend, some of the review >>>>>>>>>>>> comments are below. >>>>>>>>>>>> >>>>>>>>>>>> 1. If the database is already connected, no need to call >>>>>>>>>>>> conn.connect again. >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> info_already_connected = conn.connected() >>>>>>>>>>>> >>>>>>>>>>>> status, errmsg = conn.connect() >>>>>>>>>>>> >>>>>>>>>>>> I've noticed conn.connected() is misleading sometimes. Let's >>>>>>>>>> say if the PG server is stopped and no query is fired from pgadmin >>>>>>>>>> after >>>>>>>>>> that, then conn.connected() will still give True. It is updated >>>>>>>>>> only when a query is fired to the PG server. I would suggest let it >>>>>>>>>> connect >>>>>>>>>> again as there is no harm and this function is very important. We >>>>>>>>>> don't >>>>>>>>>> want to mess it up for the sake of a message. >>>>>>>>>> >>>>>>>>> It's true that conn.connected() is misleading but we already get >>>>>>>>> the connection before checking conn.connected() with conn = >>>>>>>>> manager.connection(did=did, auto_reconnect=True). >>>>>>>>> So, if the database server is stopped, it will throw the error. >>>>>>>>> >>>>>>>> I just checked the manager.connection function, and it is not >>>>>>>> connecting or checking. It will just give the connection object stored >>>>>>>> in >>>>>>>> the memory. >>>>>>>> >>>>>>> :). >>>>>>> >>>>>>> >>>>>>> databases/__init__.py : def connect() >>>>>>> >>>>>>> >>>>>>> manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(sid) >>>>>>> >>>>>>> conn = manager.connection(did=did, auto_reconnect=True) >>>>>>> >>>>>>> >>>>>>> >>>>>>> Above 2 lines will handle which I just just mentioned above. >>>>>>> >>>>>> I didn't find any code which will call the connect, apart >>>>>> from auto_reconnect being used when we execute some query. Nevertheless, >>>>>> I >>>>>> still believe we should not remove the connect call for the sake of a >>>>>> message, for which I think the user won't even bother. >>>>>> >>>>>>> >>>>>>> >>>>>> To understand the code properly, comment out the line conn.connect() >>>>> from the def connect(), restart the pgadmin server and try to connect the >>>>> database from the client side. >>>>> So, you get to know that there is no harm in my suggestion. >>>>> >>>>>> 2. If you want to raise an error at the client side, use the appropriate >>>>>> function or status (check file ajax.py) at the server side and send the >>>>>> appropriate response. >>>>>>>>>>>> >>>>>>>>>>>> Below code needs to be changed. >>>>>>>>>>>> >>>>>>>>>>>> if(res.data.info_already_connected){ >>>>>>>>>>>> >>>>>>>>>>>> Alertify.error(res.info); >>>>>>>>>>>> >>>>>>>>>>>> } else { >>>>>>>>>>>> >>>>>>>>>>>> Alertify.success(res.info); >>>>>>>>>>>> >>>>>>>>>>>> } >>>>>>>>>>>> >>>>>>>>>>>> The problem is test cases. Almost all the test cases have >>>>>>>>>> checked for response "Database connected.". If the function is >>>>>>>>>> changed at >>>>>>>>>> the server side then all the test cases (around 85+) would have to be >>>>>>>>>> changed to handle this. >>>>>>>>>> >>>>>>>>> It's a valid point, so I would suggest to show the warning/info at >>>>>>>>> the client side, no need to show the error message. >>>>>>>>> >>>>>>>> Yes, info is a good option. >>>>>>>> >>>>>>>>> Thanks, >>>>>>>>>>>> >>>>>>>>>>>> Khushboo >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> On Wed, Apr 29, 2020 at 8:20 PM Satish V < >>>>>>>>>>>> satis...@enterprisedb.com> wrote: >>>>>>>>>>>> >>>>>>>>>>>>> Hi Hackers, >>>>>>>>>>>>> >>>>>>>>>>>>> In the patch attached, we are gracefully informing the end >>>>>>>>>>>>> user, using an alert message, that the database is already >>>>>>>>>>>>> connected when >>>>>>>>>>>>> they click "Connect Database..." after right clicking on a >>>>>>>>>>>>> disconnected >>>>>>>>>>>>> database. >>>>>>>>>>>>> >>>>>>>>>>>>> As this problem deals with racing conditions, it is highly >>>>>>>>>>>>> complex to show the "Disconnect database" option in the menu upon >>>>>>>>>>>>> right >>>>>>>>>>>>> click. So we are alerting the end user with the information of >>>>>>>>>>>>> "Database >>>>>>>>>>>>> already connected". >>>>>>>>>>>>> >>>>>>>>>>>>> Thanks, >>>>>>>>>>>>> Sathish V >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> Thanks and Regards, >>>>>>>>>> Aditya Toshniwal >>>>>>>>>> pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | >>>>>>>>>> Pune >>>>>>>>>> "Don't Complain about Heat, Plant a TREE" >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> Thanks and Regards, >>>>>>>> Aditya Toshniwal >>>>>>>> pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune >>>>>>>> "Don't Complain about Heat, Plant a TREE" >>>>>>>> >>>>>>> >>>>>> >>>>>> -- >>>>>> Thanks and Regards, >>>>>> Aditya Toshniwal >>>>>> pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune >>>>>> "Don't Complain about Heat, Plant a TREE" >>>>>> >>>>>
diff --git a/web/pgadmin/browser/server_groups/servers/databases/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/__init__.py index 9216f21..9e09419 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/__init__.py @@ -456,30 +456,33 @@ class DatabaseView(PGChildNodeView): from pgadmin.utils.driver import get_driver manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(sid) conn = manager.connection(did=did, auto_reconnect=True) - status, errmsg = conn.connect() - - if not status: - current_app.logger.error( - "Could not connected to database(#{0}).\nError: {1}".format( - did, errmsg + already_connected = conn.connected() + if not already_connected: + status, errmsg = conn.connect() + if not status: + current_app.logger.error( + "Could not connected to database(#{0}).\nError: {1}" + .format( + did, errmsg + ) ) - ) - - return internal_server_error(errmsg) - else: - current_app.logger.info('Connection Established for Database Id: \ - %s' % (did)) - - return make_json_response( - success=1, - info=_("Database connected."), - data={ - 'icon': 'pg-icon-database', - 'connected': True, - 'info_prefix': '{0}/{1}'. - format(Server.query.filter_by(id=sid)[0].name, conn.db) - } - ) + return internal_server_error(errmsg) + else: + current_app.logger.info( + 'Connection Established for Database Id: \ + %s' % (did) + ) + return make_json_response( + success=1, + info=_("Database connected."), + data={ + 'icon': 'pg-icon-database', + 'already_connected': already_connected, + 'connected': True, + 'info_prefix': '{0}/{1}'. + format(Server.query.filter_by(id=sid)[0].name, conn.db) + } + ) def disconnect(self, gid, sid, did): """Disconnect the database.""" diff --git a/web/pgadmin/browser/server_groups/servers/databases/static/js/database.js b/web/pgadmin/browser/server_groups/servers/databases/static/js/database.js index f458d69..af2de4a 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/static/js/database.js +++ b/web/pgadmin/browser/server_groups/servers/databases/static/js/database.js @@ -520,7 +520,6 @@ define('pgadmin.node.database', [ tree.deselect(item); tree.setInode(item); } - if (res && res.data) { if(typeof res.data.connected == 'boolean') { data.connected = res.data.connected; @@ -530,11 +529,17 @@ define('pgadmin.node.database', [ data.icon = res.data.icon; tree.addIcon(item, {icon: data.icon}); } + if(res.data.already_connected) { + res.info = gettext('Database already connected.'); + } if(res.data.info_prefix) { res.info = `${_.escape(res.data.info_prefix)} - ${res.info}`; } - - Alertify.success(res.info); + if(res.data.already_connected) { + Alertify.info(res.info); + } else { + Alertify.success(res.info); + } obj.trigger('connected', obj, item, data); pgBrowser.Events.trigger( 'pgadmin:database:connected', item, data