public inbox for [email protected]
help / color / mirror / Atom feedFrom: Murtuza Zabuawala <[email protected]>
To: pgadmin-hackers <[email protected]>
Subject: PATCH: To fix the issue where message panel was showing incomplete info (pgAdmin4)
Date: Tue, 9 Aug 2016 12:37:54 +0530
Message-ID: <CAKKotZTJY1zV+Edi_oJ3611WJVq4Qi4RXi00Ddzkp6iWJardMA@mail.gmail.com> (raw)
List-Unsubscribe: <mailto:[email protected]?body=unsub%20pgadmin-hackers>
Hi,
PFA patch to fix the issue where message panel was showing incomplete info.
We may still miss some messages from Psycopg2 driver due to limited size of
notices queue.
(RM#1523)
Regards,
Murtuza
--
Sent via pgadmin-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers
Attachments:
[text/x-patch] RM_1523.patch (9.8K, 3-RM_1523.patch)
download | inline diff:
diff --git a/web/pgadmin/tools/sqleditor/__init__.py b/web/pgadmin/tools/sqleditor/__init__.py
index bb5c26b..2389217 100644
--- a/web/pgadmin/tools/sqleditor/__init__.py
+++ b/web/pgadmin/tools/sqleditor/__init__.py
@@ -406,8 +406,10 @@ def poll(trans_id):
trans_id: unique transaction id
"""
col_info = None
+ result = None
primary_keys = None
rows_affected = 0
+ additional_result = []
# Check the transaction and connection status
status, error_msg, conn, trans_obj, session_obj = check_transaction_status(trans_id)
@@ -450,20 +452,25 @@ def poll(trans_id):
# restore it and update the session variable.
session_obj['columns_info'] = columns
update_session_grid_transaction(trans_id, session_obj)
- else:
- if result is None:
- result = conn.status_message()
- additional_result = conn.messages()
- """
- Procedure/Function output may comes in the form of Notices from the
- database server, so we need to append those outputs with the
- original result.
- """
- if isinstance(additional_result, list) \
- and len(additional_result) > 0:
- result = "{0} {1}".format(additional_result[-1], result)
-
- rows_affected = conn.rows_affected()
+
+ """
+ Procedure/Function output may comes in the form of Notices from the
+ database server, so we need to append those outputs with the
+ original result.
+ """
+ if status == 'Success' and result is None:
+ result = conn.status_message()
+ messages = conn.messages()
+ if messages:
+ additional_result = ''.join(messages)
+ else:
+ additional_result = ''
+ if result != 'SELECT 1' and result is not None:
+ result = additional_result + result
+ else:
+ result = additional_result
+
+ rows_affected = conn.rows_affected()
return make_json_response(
data={
diff --git a/web/pgadmin/tools/sqleditor/templates/sqleditor/js/sqleditor.js b/web/pgadmin/tools/sqleditor/templates/sqleditor/js/sqleditor.js
index 2be2b49..ce421e5 100644
--- a/web/pgadmin/tools/sqleditor/templates/sqleditor/js/sqleditor.js
+++ b/web/pgadmin/tools/sqleditor/templates/sqleditor/js/sqleditor.js
@@ -1282,7 +1282,9 @@ define(
else {
// Show message in message and history tab in case of query tool
self.total_time = self.get_query_run_time(self.query_start_time, self.query_end_time);
- self.update_msg_history(true, res.data.result);
+ self.update_msg_history(true, res.data.result, false);
+ var msg = S('{{ _('Total query runtime: %s.') }}').sprintf(self.total_time).value();
+ alertify.success(msg, self.info_notifier_timeout);
}
// Enable/Disable query tool button only if is_query_tool is true.
@@ -1292,6 +1294,9 @@ define(
}
}
else if (res.data.status === 'Busy') {
+ if (res.data.result) {
+ self.update_msg_history(true, res.data.result, false);
+ }
// If status is Busy then poll the result by recursive call to the poll function
self._poll();
}
@@ -1302,10 +1307,10 @@ define(
self.disable_tool_buttons(false);
$("#btn-cancel-query").prop('disabled', true);
}
- self.update_msg_history(false, res.data.result);
+ self.update_msg_history(false, res.data.result, true);
}
else if (res.data.status === 'Cancel') {
- self.update_msg_history(false, "Execution Cancelled!")
+ self.update_msg_history(false, "Execution Cancelled!", true)
}
},
error: function(e) {
@@ -1681,29 +1686,33 @@ define(
clear_grid = true;
self.trigger('pgadmin-sqleditor:loading-icon:hide');
- $("#btn-flash").prop('disabled', false);
- $('.sql-editor-message').text(msg);
+ $("#btn-flash").prop('disabled', false);
self.gridView.messages_panel.focus();
- if (self.is_query_tool && clear_grid) {
- // Delete grid and paginator
- if (self.gridView.grid) {
- self.gridView.grid.remove();
+ if (self.is_query_tool) {
+ if (clear_grid) {
+ // Delete grid and paginator
+ if (self.gridView.grid) {
+ self.gridView.grid.remove();
+ }
+ // Misc cleaning
self.columns = undefined;
self.collection = undefined;
- }
- if (self.gridView.paginator)
- self.gridView.paginator.remove();
+ if (self.gridView.paginator)
+ self.gridView.paginator.remove();
+ $('.sql-editor-message').text(msg);
+ } else {
+ $('.sql-editor-message').append(msg);
+ }
}
- self.gridView.history_collection.add(
- {'status' : status, 'start_time': self.query_start_time.toString(),
- 'query': self.query, 'row_affected': self.rows_affected,
- 'total_time': self.total_time, 'message':msg
+ self.gridView.history_collection.add({
+ 'status' : status, 'start_time': self.query_start_time.toString(),
+ 'query': self.query, 'row_affected': self.rows_affected,
+ 'total_time': self.total_time, 'message':msg
});
-
self.gridView.history_collection.sort();
},
@@ -2129,10 +2138,12 @@ define(
var self = this;
// Start execution of the query.
- if (self.is_query_tool)
+ if (self.is_query_tool) {
+ $('.sql-editor-message').html('');
self._execute();
- else
+ } else {
self._execute_data_query();
+ }
},
// This function will show the filter in the text area.
diff --git a/web/pgadmin/utils/driver/psycopg2/__init__.py b/web/pgadmin/utils/driver/psycopg2/__init__.py
index fbde603..bded931 100644
--- a/web/pgadmin/utils/driver/psycopg2/__init__.py
+++ b/web/pgadmin/utils/driver/psycopg2/__init__.py
@@ -178,6 +178,7 @@ class Connection(BaseConnection):
self.__backend_pid = None
self.execution_aborted = False
self.row_count = 0
+ self.__notices = None
super(Connection, self).__init__()
@@ -639,6 +640,7 @@ Attempt to reconnect it failed with the error:
)
try:
+ self.__notices = []
self.execution_aborted = False
cur.execute(query, params)
res = self._wait_timeout(cur.connection, ASYNC_WAIT_TIMEOUT)
@@ -904,31 +906,9 @@ Failed to reset the connection to the server due to following error:
if state == psycopg2.extensions.POLL_OK:
return self.ASYNC_OK
elif state == psycopg2.extensions.POLL_WRITE:
- # Wait for the given time and then check the return status
- # If three empty lists are returned then the time-out is reached.
- timeout_status = select.select([], [conn.fileno()], [], time)
- if timeout_status == ([], [], []):
- return self.ASYNC_WRITE_TIMEOUT
-
- # poll again to check the state if it is still POLL_WRITE
- # then return ASYNC_WRITE_TIMEOUT else return ASYNC_OK.
- state = conn.poll()
- if state == psycopg2.extensions.POLL_WRITE:
- return self.ASYNC_WRITE_TIMEOUT
- return self.ASYNC_OK
+ return self.ASYNC_WRITE_TIMEOUT
elif state == psycopg2.extensions.POLL_READ:
- # Wait for the given time and then check the return status
- # If three empty lists are returned then the time-out is reached.
- timeout_status = select.select([conn.fileno()], [], [], time)
- if timeout_status == ([], [], []):
- return self.ASYNC_READ_TIMEOUT
-
- # poll again to check the state if it is still POLL_READ
- # then return ASYNC_READ_TIMEOUT else return ASYNC_OK.
- state = conn.poll()
- if state == psycopg2.extensions.POLL_READ:
- return self.ASYNC_READ_TIMEOUT
- return self.ASYNC_OK
+ return self.ASYNC_READ_TIMEOUT
else:
raise psycopg2.OperationalError(
"poll() returned %s from _wait_timeout function" % state
@@ -965,6 +945,10 @@ Failed to reset the connection to the server due to following error:
errmsg = self._formatted_exception_msg(pe, formatted_exception_msg)
return False, errmsg, None
+ if self.conn.notices and self.__notices is not None:
+ while self.conn.notices:
+ self.__notices.append(self.conn.notices.pop(0)[:])
+
colinfo = None
result = None
self.row_count = 0
@@ -996,7 +980,6 @@ Failed to reset the connection to the server due to following error:
result.append(dict(row))
except psycopg2.ProgrammingError:
result = None
-
return status, result, colinfo
def status_message(self):
@@ -1094,7 +1077,7 @@ Failed to reset the connection to the server due to following error:
"""
Returns the list of the messages/notices send from the database server.
"""
- return self.conn.notices if self.conn else []
+ return self.__notices
def _formatted_exception_msg(self, exception_obj, formatted_msg):
"""
view thread (14+ messages) latest in thread
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: [email protected]
Cc: [email protected]
Subject: Re: PATCH: To fix the issue where message panel was showing incomplete info (pgAdmin4)
In-Reply-To: <CAKKotZTJY1zV+Edi_oJ3611WJVq4Qi4RXi00Ddzkp6iWJardMA@mail.gmail.com>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox