From eafdf1812d3ef545400bf9f6acd6842de807a33a Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Mon, 26 Aug 2019 13:37:25 +0000 Subject: [PATCH] [FIX] sql_db: environment retrieval in cursor --- odoo/sql_db.py | 49 +++++++++++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/odoo/sql_db.py b/odoo/sql_db.py index ed5cf07884d..5cedf34b428 100644 --- a/odoo/sql_db.py +++ b/odoo/sql_db.py @@ -22,8 +22,6 @@ from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT, ISOLATION_LEVEL_READ from psycopg2.pool import PoolError from werkzeug import urls -from odoo.api import Environment - psycopg2.extensions.register_type(psycopg2.extensions.UNICODE) _logger = logging.getLogger(__name__) @@ -59,6 +57,25 @@ from datetime import timedelta import threading from inspect import currentframe + +SENTINEL = object() + + +def get_env(frame, back=0): + """ Retrieve an environment from the given stack frame. """ + for i in range(back): + frame = frame.f_back + while frame: + env = frame.f_locals.get('env', SENTINEL) + if env is not SENTINEL: + return env + env = getattr(frame.f_locals.get('self'), 'env', SENTINEL) + if env is not SENTINEL: + return env + frame = frame.f_back + return None + + import re re_from = re.compile('.* from "?([a-zA-Z_0-9]+)"? .*$') re_into = re.compile('.* into "?([a-zA-Z_0-9]+)"? .*$') @@ -369,10 +386,9 @@ class Cursor(object): def commit(self): """ Perform an SQL `COMMIT` """ - for env in Environment.envs: - if env.cr is self: - env['base'].flush() - break + env = get_env(currentframe(), 2) + if env is not None: + env['base'].flush() result = self._cnx.commit() for func in self._pop_event_handlers()['commit']: func() @@ -382,10 +398,9 @@ class Cursor(object): def rollback(self): """ Perform an SQL `ROLLBACK` """ - for env in Environment.envs: - if env.cr is self: - env.clear() - break + env = get_env(currentframe(), 2) + if env is not None: + env.clear() result = self._cnx.rollback() for func in self._pop_event_handlers()['rollback']: func() @@ -473,17 +488,15 @@ class TestCursor(object): _logger.debug("TestCursor.autocommit(%r) does nothing", on) def commit(self): - for env in Environment.envs: - if env.cr is self: - env['base'].flush() - break + env = get_env(currentframe(), 1) + if env is not None: + env['base'].flush() self._cursor.execute('SAVEPOINT "%s"' % self._savepoint) def rollback(self): - for env in Environment.envs: - if env.cr is self: - env.clear() - break + env = get_env(currentframe(), 1) + if env is not None: + env.clear() self._cursor.execute('ROLLBACK TO SAVEPOINT "%s"' % self._savepoint) def __enter__(self):