summaryrefslogtreecommitdiff
path: root/openerp/sql_db.py
diff options
context:
space:
mode:
authorXavier Morel <xmo@openerp.com>2014-02-20 11:33:45 +0100
committerXavier Morel <xmo@openerp.com>2014-02-20 11:33:45 +0100
commitbc86fdc614f6eb0b0db20437b9364af82665fee4 (patch)
tree7a75afe63e70caf51d3f646d9aedf04c8e4184d5 /openerp/sql_db.py
parentd4e62ca71305988e8046fb58ddb3c44ca081972a (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.py11
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