From 0e1186dd3d50c797ac0676163e1e1a6a5598584c Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Wed, 20 Apr 2011 16:14:07 +0200 Subject: [REF] openerp.pooler/openerp.sql_db: cleaner dependencies: - openerp.pooler no longer provides get_db_only, which is a provided by sql_db - openerp.sql_db does not rely anymore on netsvc, which is goog as it was making a circular import. The downside is that db_close callers have to clean also the Agent themselves. bzr revid: vmt@openerp.com-20110420141407-au0oanwjc0t15vy5 --- openerp/sql_db.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'openerp/sql_db.py') diff --git a/openerp/sql_db.py b/openerp/sql_db.py index 8afd684d3f1..4b1d8aab794 100644 --- a/openerp/sql_db.py +++ b/openerp/sql_db.py @@ -54,7 +54,6 @@ psycopg2.extensions.register_type(psycopg2.extensions.new_type((700, 701, 1700,) import tools from tools.func import wraps, frame_codeinfo -from netsvc import Agent from datetime import datetime as mdt from datetime import timedelta import threading @@ -382,8 +381,8 @@ def db_connect(db_name): return Connection(_Pool, db_name) def close_db(db_name): + """ You might want to call openerp.netsvc.Agent.cancel(db_name) along this function.""" _Pool.close_all(dsn(db_name)) - Agent.cancel(db_name) tools.cache.clean_caches_for_db(db_name) ct = currentThread() if hasattr(ct, 'dbname'): -- cgit v1.2.3 From 7008aa3e0e757b8b1a0a38e3ac0515860986a5a6 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Thu, 21 Apr 2011 12:31:25 +0200 Subject: [FIX] sql_db: connection pool created lazily. - This is necessary to give a chance to change the config just after importing openerp. bzr revid: vmt@openerp.com-20110421103125-3lv609wnu3vh2m4f --- openerp/sql_db.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'openerp/sql_db.py') diff --git a/openerp/sql_db.py b/openerp/sql_db.py index 4b1d8aab794..9b6dffad3d2 100644 --- a/openerp/sql_db.py +++ b/openerp/sql_db.py @@ -374,9 +374,12 @@ def dsn_are_equals(first, second): return key(first) == key(second) -_Pool = ConnectionPool(int(tools.config['db_maxconn'])) +_Pool = None def db_connect(db_name): + global _Pool + if _Pool is None: + _Pool = ConnectionPool(int(tools.config['db_maxconn'])) currentThread().dbname = db_name return Connection(_Pool, db_name) -- cgit v1.2.3 From 2856d169128ba742a5c3985155381d5af1c651c0 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Fri, 22 Apr 2011 13:24:17 +0200 Subject: [ADD] sql_db: show file/line where the cursor was closed This will be printed along the error message whenever an attempt to use a closed cursor is made (only in debug_sql log level). bzr revid: vmt@openerp.com-20110422112417-dbeqq4qm59sr2wvt --- openerp/sql_db.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'openerp/sql_db.py') diff --git a/openerp/sql_db.py b/openerp/sql_db.py index 9b6dffad3d2..e759a13e1d3 100644 --- a/openerp/sql_db.py +++ b/openerp/sql_db.py @@ -67,17 +67,22 @@ sql_counter = 0 class Cursor(object): IN_MAX = 1000 # decent limit on size of IN queries - guideline = Oracle limit - __logger = logging.getLogger('db.cursor') + __logger = None def check(f): @wraps(f) def wrapper(self, *args, **kwargs): if self.__closed: - raise psycopg2.OperationalError('Unable to use the cursor after having closed it') + msg = 'Unable to use a closed cursor.' + if self.__closer: + msg += ' It was closed at %s, line %s' % self.__closer + raise psycopg2.OperationalError(msg) return f(self, *args, **kwargs) return wrapper def __init__(self, pool, dbname, serialized=False): + if self.__class__.__logger is None: + self.__class__.__logger = logging.getLogger('db.cursor') self.sql_from_log = {} self.sql_into_log = {} @@ -99,6 +104,7 @@ class Cursor(object): self.__caller = frame_codeinfo(currentframe(),2) else: self.__caller = False + self.__closer = False def __del__(self): if not self.__closed: @@ -197,6 +203,8 @@ class Cursor(object): if not self._obj: return + if self.sql_log: + self.__closer = frame_codeinfo(currentframe(),3) self.print_log() if not self._serialized: -- cgit v1.2.3