diff roundup/backends/back_postgresql.py @ 8305:a81a3cd067fa

Generate savepoint only if necessary Now some methods got an additional 'allow_abort' parameter. By default this is True. When False the postgres backend generates a savepoint. The methods are called with allow_abort=False from some of the cgi methods which can produce a traceback when called with data from the web-interface.
author Ralf Schlatterbeck <rsc@runtux.com>
date Sat, 01 Mar 2025 18:55:54 +0100
parents 45ec660eb7f7
children
line wrap: on
line diff
--- a/roundup/backends/back_postgresql.py	Sat Mar 01 13:08:09 2025 +0100
+++ b/roundup/backends/back_postgresql.py	Sat Mar 01 18:55:54 2025 +0100
@@ -560,14 +560,17 @@
             self.cursor.execute('DROP SEQUENCE _%s_ids' % cn)
             self.cursor.execute('CREATE SEQUENCE _%s_ids' % cn)
 
-    def getnode (self, classname, nodeid, fetch_multilinks=True):
+    def getnode(self, classname, nodeid, fetch_multilinks=True,
+                allow_abort=True):
         """ For use of savepoint see 'Class' below """
-        self.sql('savepoint sp')
+        if not allow_abort:
+            self.sql('savepoint sp')
         try:
             getnode = rdbms_common.Database.getnode
             return getnode(self, classname, nodeid, fetch_multilinks)
         except psycopg2.errors.DataError as err:
-            self.sql('rollback to savepoint sp')
+            if not allow_abort:
+                self.sql('rollback to savepoint sp')
             raise hyperdb.HyperdbValueError(str (err).split('\n')[0])
 
 
@@ -583,28 +586,26 @@
     """
 
     def filter(self, *args, **kw):
-        self.db.sql('savepoint sp')
         try:
             return rdbms_common.Class.filter(self, *args, **kw)
         except psycopg2.errors.DataError as err:
-            self.db.sql('rollback to savepoint sp')
             raise hyperdb.HyperdbValueError(str (err).split('\n')[0])
 
     def filter_iter(self, *args, **kw):
-        self.db.sql('savepoint sp')
         try:
             for v in rdbms_common.Class.filter_iter(self, *args, **kw):
                 yield v
         except psycopg2.errors.DataError as err:
-            self.db.sql('rollback to savepoint sp')
             raise hyperdb.HyperdbValueError(str (err).split('\n')[0])
 
-    def is_retired(self, nodeid):
-        self.db.sql('savepoint sp')
+    def is_retired(self, nodeid, allow_abort=True):
+        if not allow_abort:
+            self.db.sql('savepoint sp')
         try:
             return rdbms_common.Class.is_retired(self, nodeid)
         except psycopg2.errors.DataError as err:
-            self.db.sql('rollback to savepoint sp')
+            if not allow_abort:
+                self.db.sql('rollback to savepoint sp')
             raise hyperdb.HyperdbValueError (str (err).split('\n')[0])
 
 

Roundup Issue Tracker: http://roundup-tracker.org/