diff options
| author | Xavier Morel <xmo@openerp.com> | 2014-02-20 11:33:45 +0100 |
|---|---|---|
| committer | Xavier Morel <xmo@openerp.com> | 2014-02-20 11:33:45 +0100 |
| commit | bc86fdc614f6eb0b0db20437b9364af82665fee4 (patch) | |
| tree | 7a75afe63e70caf51d3f646d9aedf04c8e4184d5 /openerp/sql_db.py | |
| parent | d4e62ca71305988e8046fb58ddb3c44ca081972a (diff) | |
[IMP] Cursor.savepoint
time.time doesn't guarantee sub-second precision.
Use a uuid1 instead (lower anonymity but higher isolation than uuid4
especially in distributed systems, and we don't care about anonimity for
savepoint names from application servers).
Quote name so first character can be a digit.
bzr revid: xmo@openerp.com-20140220103345-xistzxy17r8j87hf
Diffstat (limited to 'openerp/sql_db.py')
| -rw-r--r-- | openerp/sql_db.py | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/openerp/sql_db.py b/openerp/sql_db.py index fb214fa068b..694ae02b3d9 100644 --- a/openerp/sql_db.py +++ b/openerp/sql_db.py @@ -31,6 +31,7 @@ from contextlib import contextmanager from functools import wraps import logging import time +import uuid import psycopg2.extensions from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT, ISOLATION_LEVEL_READ_COMMITTED, ISOLATION_LEVEL_REPEATABLE_READ from psycopg2.pool import PoolError @@ -350,13 +351,13 @@ class Cursor(object): @check def savepoint(self): """context manager entering in a new savepoint""" - name = hex(int(time.time() * 1000))[1:] - self.execute("SAVEPOINT %s" % (name,)) + name = uuid.uuid1().hex + self.execute('SAVEPOINT "%s"' % name) try: yield - self.execute('RELEASE SAVEPOINT %s' % (name,)) - except Exception: - self.execute('ROLLBACK TO SAVEPOINT %s' % (name,)) + self.execute('RELEASE SAVEPOINT "%s"' % name) + except: + self.execute('ROLLBACK TO SAVEPOINT "%s"' % name) raise @check |
