Improvise the PostgreSQL driver to fetch the status message.

At the moment, we will only allow to fetch status messages from the
asynchronous connection only, later - we may implement to fetch the
status message from the normal connection too.
This commit is contained in:
Neel Patel 2016-04-05 13:29:13 +05:30 committed by Ashesh Vashi
parent f7e4e8bea0
commit e585ddbdaf
2 changed files with 29 additions and 7 deletions

View File

@ -205,6 +205,10 @@ class BaseConnection(object):
def poll(self, formatted_exception_msg=True): def poll(self, formatted_exception_msg=True):
pass pass
@abstractmethod
def status_message(self):
pass
@abstractmethod @abstractmethod
def cancel_transaction(self, conn_id, did=None): def cancel_transaction(self, conn_id, did=None):
pass pass

View File

@ -95,6 +95,9 @@ class Connection(BaseConnection):
- This method is used to poll the data of query running on asynchronous - This method is used to poll the data of query running on asynchronous
connection. connection.
* status_message()
- Returns the status message returned by the last command executed on the server.
* cancel_transaction(conn_id, did=None) * cancel_transaction(conn_id, did=None)
- This method is used to cancel the transaction for the - This method is used to cancel the transaction for the
specified connection id and database id. specified connection id and database id.
@ -464,6 +467,7 @@ Attempt to reconnect it failed with the below error:
params: extra parameters to the function params: extra parameters to the function
formatted_exception_msg: if True then function return the formatted exception message formatted_exception_msg: if True then function return the formatted exception message
""" """
self.__async_cursor = None
status, cur = self.__cursor() status, cur = self.__cursor()
if not status: if not status:
@ -767,7 +771,7 @@ Failed to reset the connection of the server due to following error:
cur = self.__async_cursor cur = self.__async_cursor
if not cur: if not cur:
return False, gettext( return False, gettext(
"Cursor could not be found for the aysnc connection." "Cursor could not be found for the async connection."
), None ), None
current_app.logger.log( current_app.logger.log(
@ -784,19 +788,19 @@ Failed to reset the connection of the server due to following error:
return False, errmsg, None return False, errmsg, None
colinfo = None colinfo = None
result = None
if status == self.ASYNC_OK: if status == self.ASYNC_OK:
# if user has cancelled the transaction then changed the status # if user has cancelled the transaction then changed the status
if self.execution_aborted: if self.execution_aborted:
status = self.ASYNC_EXECUTION_ABORTED status = self.ASYNC_EXECUTION_ABORTED
self.execution_aborted = False self.execution_aborted = False
return status, None, colinfo return status, result, colinfo
# Fetch the column information # Fetch the column information
if cur.description is not None: if cur.description is not None:
colinfo = [desc for desc in cur.description] colinfo = [desc for desc in cur.description]
result = cur.statusmessage
if cur.rowcount > 0: if cur.rowcount > 0:
result = [] result = []
@ -809,12 +813,26 @@ Failed to reset the connection of the server due to following error:
for row in cur: for row in cur:
result.append(dict(row)) result.append(dict(row))
except psycopg2.ProgrammingError: except psycopg2.ProgrammingError:
result = cur.statusmessage result = None
self.__async_cursor = None return status, result, colinfo
return status, result, colinfo
return status, None, colinfo def status_message(self):
"""
This function will return the status message returned by the last command executed on the server.
"""
cur = self.__async_cursor
if not cur:
return gettext("Cursor could not be found for the async connection.")
current_app.logger.log(
25,
"Status message for (Query-id: {query_id})".format(
query_id=self.__async_query_id
)
)
return cur.statusmessage
def cancel_transaction(self, conn_id, did=None): def cancel_transaction(self, conn_id, did=None):
""" """