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
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): """
-- Sent via pgadmin-hackers mailing list (pgadmin-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgadmin-hackers