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.
Thanks
Sathish
On Thu, Apr 30, 2020 at 7:40 AM Khushboo Vashi <
[email protected]> 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 <[email protected]>
> 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 <
>> [email protected]> wrote:
>>
>>>
>>>
>>> On Thu, Apr 30, 2020 at 12:04 PM Aditya Toshniwal <
>>> [email protected]> wrote:
>>>
>>>> Hi,
>>>>
>>>> On Thu, Apr 30, 2020 at 11:55 AM Khushboo Vashi <
>>>> [email protected]> wrote:
>>>>
>>>>>
>>>>>
>>>>> On Thu, Apr 30, 2020 at 10:55 AM Aditya Toshniwal <
>>>>> [email protected]> wrote:
>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> On Thu, Apr 30, 2020 at 10:48 AM Khushboo Vashi <
>>>>>> [email protected]> wrote:
>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On Thu, Apr 30, 2020 at 10:14 AM Aditya Toshniwal <
>>>>>>> [email protected]> wrote:
>>>>>>>
>>>>>>>> Hi,
>>>>>>>>
>>>>>>>>
>>>>>>>> On Thu, Apr 30, 2020 at 9:41 AM Satish V <[email protected]>
>>>>>>>> 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 <
>>>>>>>>> [email protected]> 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 <
>>>>>>>>>> [email protected]> 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..c8dba00 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
+ info_already_connected = conn.connected()
+ if not info_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',
+ 'info_already_connected': info_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..1dd25f2 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.info_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.info_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