Skip to content

Commit 6f92ad9

Browse files
committed
Rollback in case of errors only
1 parent 025ac22 commit 6f92ad9

1 file changed

Lines changed: 35 additions & 32 deletions

File tree

src/DatabaseLibrary/query.py

Lines changed: 35 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
from robot.api import logger
2222

23+
from .connection_manager import Connection
2324
from .params_decorator import renamed_args
2425

2526

@@ -87,9 +88,8 @@ def query(
8788
if return_dict:
8889
return [dict(zip(col_names, row)) for row in all_rows]
8990
return all_rows
90-
finally:
91-
if cur and not no_transaction:
92-
db_connection.client.rollback()
91+
except Exception as e:
92+
self._rollback_and_raise(db_connection, no_transaction, e)
9393

9494
@renamed_args(mapping={"selectStatement": "select_statement", "sansTran": "no_transaction"})
9595
def row_count(
@@ -140,9 +140,8 @@ def row_count(
140140
logger.info(f"Retrieved {current_row_count} rows")
141141
self._log_query_results(col_names, data)
142142
return current_row_count
143-
finally:
144-
if cur and not no_transaction:
145-
db_connection.client.rollback()
143+
except Exception as e:
144+
self._rollback_and_raise(db_connection, no_transaction, e)
146145

147146
@renamed_args(mapping={"selectStatement": "select_statement", "sansTran": "no_transaction"})
148147
def description(
@@ -189,9 +188,8 @@ def description(
189188
for row in range(0, len(description)):
190189
description[row] = (description[row][0].encode("utf-8"),) + description[row][1:]
191190
return description
192-
finally:
193-
if cur and not no_transaction:
194-
db_connection.client.rollback()
191+
except Exception as e:
192+
self._rollback_and_raise(db_connection, no_transaction, e)
195193

196194
@renamed_args(mapping={"tableName": "table_name", "sansTran": "no_transaction"})
197195
def delete_all_rows_from_table(
@@ -229,15 +227,11 @@ def delete_all_rows_from_table(
229227
try:
230228
cur = db_connection.client.cursor()
231229
result = self._execute_sql(cur, query)
230+
self._commit_if_needed(db_connection, no_transaction)
232231
if result is not None:
233-
if not no_transaction:
234-
db_connection.client.commit()
235232
return result
236-
if not no_transaction:
237-
db_connection.client.commit()
238-
finally:
239-
if cur and not no_transaction:
240-
db_connection.client.rollback()
233+
except Exception as e:
234+
self._rollback_and_raise(db_connection, no_transaction, e)
241235

242236
@renamed_args(mapping={"sqlScriptFileName": "script_path", "sansTran": "no_transaction"})
243237
def execute_sql_script(
@@ -348,11 +342,9 @@ def execute_sql_script(
348342
line_ends_with_proc_end = re.compile(r"(\s|;)" + proc_end_pattern.pattern + "$")
349343
omit_semicolon = not line_ends_with_proc_end.search(statement.lower())
350344
self._execute_sql(cur, statement, omit_semicolon)
351-
if not no_transaction:
352-
db_connection.client.commit()
353-
finally:
354-
if cur and not no_transaction:
355-
db_connection.client.rollback()
345+
self._commit_if_needed(db_connection, no_transaction)
346+
except Exception as e:
347+
self._rollback_and_raise(db_connection, no_transaction, e)
356348

357349
@renamed_args(
358350
mapping={
@@ -410,11 +402,9 @@ def execute_sql_string(
410402
try:
411403
cur = db_connection.client.cursor()
412404
self._execute_sql(cur, sql_string, omit_trailing_semicolon=omit_trailing_semicolon, parameters=parameters)
413-
if not no_transaction:
414-
db_connection.client.commit()
415-
finally:
416-
if cur and not no_transaction:
417-
db_connection.client.rollback()
405+
self._commit_if_needed(db_connection, no_transaction)
406+
except Exception as e:
407+
self._rollback_and_raise(db_connection, no_transaction, e)
418408

419409
@renamed_args(mapping={"spName": "procedure_name", "spParams": "procedure_params", "sansTran": "no_transaction"})
420410
def call_stored_procedure(
@@ -717,13 +707,10 @@ def call_stored_procedure(
717707
else:
718708
result_sets_available = False
719709

720-
if not no_transaction:
721-
db_connection.client.commit()
722-
710+
self._commit_if_needed(db_connection, no_transaction)
723711
return param_values, result_sets
724-
finally:
725-
if cur and not no_transaction:
726-
db_connection.client.rollback()
712+
except Exception as e:
713+
self._rollback_and_raise(db_connection, no_transaction, e)
727714

728715
def set_logging_query_results(self, enabled: Optional[bool] = None, log_head: Optional[int] = None):
729716
"""
@@ -771,6 +758,22 @@ def _execute_sql(
771758
)
772759
return cur.execute(sql_statement, parameters)
773760

761+
def _commit_if_needed(self, db_connection: Connection, no_transaction):
762+
if no_transaction:
763+
logger.info(f"Perform no commit, because 'no_transaction' set to {no_transaction}")
764+
else:
765+
logger.info("Commit the transaction")
766+
db_connection.client.commit()
767+
768+
def _rollback_and_raise(self, db_connection: Connection, no_transaction, e):
769+
logger.info(f"Error occurred: {e}")
770+
if no_transaction:
771+
logger.info(f"Perform no rollback, because 'no_transaction' set to {no_transaction}")
772+
else:
773+
logger.info("Rollback the transaction")
774+
db_connection.client.rollback()
775+
raise e
776+
774777
def _log_query_results(self, col_names, result_rows, log_head: Optional[int] = None):
775778
"""
776779
Logs the `result_rows` of a query in RF log as a HTML table.

0 commit comments

Comments
 (0)