comparison 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
comparison
equal deleted inserted replaced
8304:24549122f9b1 8305:a81a3cd067fa
558 # reset the sequences 558 # reset the sequences
559 for cn in self.classes: 559 for cn in self.classes:
560 self.cursor.execute('DROP SEQUENCE _%s_ids' % cn) 560 self.cursor.execute('DROP SEQUENCE _%s_ids' % cn)
561 self.cursor.execute('CREATE SEQUENCE _%s_ids' % cn) 561 self.cursor.execute('CREATE SEQUENCE _%s_ids' % cn)
562 562
563 def getnode (self, classname, nodeid, fetch_multilinks=True): 563 def getnode(self, classname, nodeid, fetch_multilinks=True,
564 allow_abort=True):
564 """ For use of savepoint see 'Class' below """ 565 """ For use of savepoint see 'Class' below """
565 self.sql('savepoint sp') 566 if not allow_abort:
567 self.sql('savepoint sp')
566 try: 568 try:
567 getnode = rdbms_common.Database.getnode 569 getnode = rdbms_common.Database.getnode
568 return getnode(self, classname, nodeid, fetch_multilinks) 570 return getnode(self, classname, nodeid, fetch_multilinks)
569 except psycopg2.errors.DataError as err: 571 except psycopg2.errors.DataError as err:
570 self.sql('rollback to savepoint sp') 572 if not allow_abort:
573 self.sql('rollback to savepoint sp')
571 raise hyperdb.HyperdbValueError(str (err).split('\n')[0]) 574 raise hyperdb.HyperdbValueError(str (err).split('\n')[0])
572 575
573 576
574 class PostgresqlClass: 577 class PostgresqlClass:
575 order_by_null_values = '(%s is not NULL)' 578 order_by_null_values = '(%s is not NULL)'
581 Note that we re-use the savepoint so that at most one savepoint 584 Note that we re-use the savepoint so that at most one savepoint
582 is used. 585 is used.
583 """ 586 """
584 587
585 def filter(self, *args, **kw): 588 def filter(self, *args, **kw):
586 self.db.sql('savepoint sp')
587 try: 589 try:
588 return rdbms_common.Class.filter(self, *args, **kw) 590 return rdbms_common.Class.filter(self, *args, **kw)
589 except psycopg2.errors.DataError as err: 591 except psycopg2.errors.DataError as err:
590 self.db.sql('rollback to savepoint sp')
591 raise hyperdb.HyperdbValueError(str (err).split('\n')[0]) 592 raise hyperdb.HyperdbValueError(str (err).split('\n')[0])
592 593
593 def filter_iter(self, *args, **kw): 594 def filter_iter(self, *args, **kw):
594 self.db.sql('savepoint sp')
595 try: 595 try:
596 for v in rdbms_common.Class.filter_iter(self, *args, **kw): 596 for v in rdbms_common.Class.filter_iter(self, *args, **kw):
597 yield v 597 yield v
598 except psycopg2.errors.DataError as err: 598 except psycopg2.errors.DataError as err:
599 self.db.sql('rollback to savepoint sp')
600 raise hyperdb.HyperdbValueError(str (err).split('\n')[0]) 599 raise hyperdb.HyperdbValueError(str (err).split('\n')[0])
601 600
602 def is_retired(self, nodeid): 601 def is_retired(self, nodeid, allow_abort=True):
603 self.db.sql('savepoint sp') 602 if not allow_abort:
603 self.db.sql('savepoint sp')
604 try: 604 try:
605 return rdbms_common.Class.is_retired(self, nodeid) 605 return rdbms_common.Class.is_retired(self, nodeid)
606 except psycopg2.errors.DataError as err: 606 except psycopg2.errors.DataError as err:
607 self.db.sql('rollback to savepoint sp') 607 if not allow_abort:
608 self.db.sql('rollback to savepoint sp')
608 raise hyperdb.HyperdbValueError (str (err).split('\n')[0]) 609 raise hyperdb.HyperdbValueError (str (err).split('\n')[0])
609 610
610 611
611 class IssueClass(PostgresqlClass, rdbms_common.IssueClass): 612 class IssueClass(PostgresqlClass, rdbms_common.IssueClass):
612 pass 613 pass

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