Mercurial > p > roundup > code
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 |
