From bc86fdc614f6eb0b0db20437b9364af82665fee4 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 20 Feb 2014 11:33:45 +0100 Subject: [PATCH] [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 --- openerp/sql_db.py | 11 ++++++----- 1 file 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