Skip to content

Commit 552c76c

Browse files
author
Stephane Wirtel
committed
[REF] Use the contextlib.closing function instead of a couple of try/catch for
the release of the database cursor. bzr revid: [email protected]
1 parent 5237d95 commit 552c76c

File tree

3 files changed

+47
-76
lines changed

3 files changed

+47
-76
lines changed

openerp/cli/server.py

+4-5
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,9 @@ def setup_pid_file():
8585
"""
8686
config = openerp.tools.config
8787
if config['pidfile']:
88-
fd = open(config['pidfile'], 'w')
89-
pidtext = "%d" % (os.getpid())
90-
fd.write(pidtext)
91-
fd.close()
88+
with open(config['pidfile'], 'w') as fd:
89+
pidtext = "%d" % (os.getpid())
90+
fd.write(pidtext)
9291

9392
def preload_registry(dbname):
9493
""" Preload a registry, and start the cron."""
@@ -173,7 +172,7 @@ def main(args):
173172
if config['workers']:
174173
openerp.multi_process = True
175174

176-
# preload registryies, needed for -u --stop_after_init
175+
# preload registries, needed for -u --stop_after_init
177176
rc = 0
178177
if config['db_name']:
179178
for dbname in config['db_name'].split(','):

openerp/service/db.py

+21-45
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import os
77
import threading
88
import traceback
9+
from contextlib import contextmanager, closing
910

1011
import openerp
1112
from openerp import SUPERUSER_ID
@@ -24,24 +25,17 @@
2425
# This should be moved to openerp.modules.db, along side initialize().
2526
def _initialize_db(id, db_name, demo, lang, user_password):
2627
try:
27-
cr = None
28-
try:
29-
self_actions[id]['progress'] = 0
30-
cr = openerp.sql_db.db_connect(db_name).cursor()
28+
self_actions[id]['progress'] = 0
29+
db = openerp.sql_db.db_connect(db_name)
30+
with closing(db.cursor()) as cr:
3131
openerp.modules.db.initialize(cr) # TODO this should be removed as it is done by RegistryManager.new().
3232
openerp.tools.config['lang'] = lang
3333
cr.commit()
34-
finally:
35-
if cr:
36-
cr.close()
37-
cr = None
3834

3935
registry = openerp.modules.registry.RegistryManager.new(
4036
db_name, demo, self_actions[id], update_module=True)
4137

42-
try:
43-
cr = openerp.sql_db.db_connect(db_name).cursor()
44-
38+
with closing(db.cursor()) as cr:
4539
if lang:
4640
modobj = registry['ir.module.module']
4741
mids = modobj.search(cr, SUPERUSER_ID, [('state', '=', 'installed')])
@@ -54,9 +48,7 @@ def _initialize_db(id, db_name, demo, lang, user_password):
5448
cr.execute('SELECT login, password FROM res_users ORDER BY login')
5549
self_actions[id].update(users=cr.dictfetchall(), clean=True)
5650
cr.commit()
57-
finally:
58-
if cr:
59-
cr.close()
51+
6052
except Exception, e:
6153
self_actions[id].update(clean=False, exception=e)
6254
_logger.exception('CREATE DATABASE failed:')
@@ -81,19 +73,15 @@ def dispatch(method, params):
8173

8274
def _create_empty_database(name):
8375
db = openerp.sql_db.db_connect('postgres')
84-
cr = db.cursor()
85-
chosen_template = openerp.tools.config['db_template']
86-
cr.execute("""SELECT datname
87-
FROM pg_database
88-
WHERE datname = %s """,
89-
(name,))
90-
if cr.fetchall():
91-
raise openerp.exceptions.Warning(" %s database already exists!" % name )
92-
try:
93-
cr.autocommit(True) # avoid transaction block
94-
cr.execute("""CREATE DATABASE "%s" ENCODING 'unicode' TEMPLATE "%s" """ % (name, chosen_template))
95-
finally:
96-
cr.close()
76+
with closing(db.cursor()) as cr:
77+
chosen_template = openerp.tools.config['db_template']
78+
cr.execute("SELECT datname FROM pg_database WHERE datname = %s",
79+
(name,))
80+
if cr.fetchall():
81+
raise openerp.exceptions.Warning(" %s database already exists!" % name )
82+
else:
83+
cr.autocommit(True) # avoid transaction block
84+
cr.execute("""CREATE DATABASE "%s" ENCODING 'unicode' TEMPLATE "%s" """ % (name, chosen_template))
9785

9886
def exp_create(db_name, demo, lang, user_password='admin'):
9987
self_id_protect.acquire()
@@ -132,12 +120,9 @@ def exp_duplicate_database(db_original_name, db_name):
132120
_logger.info('Duplicate database `%s` to `%s`.', db_original_name, db_name)
133121
openerp.sql_db.close_db(db_original_name)
134122
db = openerp.sql_db.db_connect('postgres')
135-
cr = db.cursor()
136-
try:
123+
with closing(db.cursor()) as cr:
137124
cr.autocommit(True) # avoid transaction block
138125
cr.execute("""CREATE DATABASE "%s" ENCODING 'unicode' TEMPLATE "%s" """ % (db_name, db_original_name))
139-
finally:
140-
cr.close()
141126
return True
142127

143128
def exp_get_progress(id):
@@ -166,9 +151,8 @@ def exp_drop(db_name):
166151
openerp.sql_db.close_db(db_name)
167152

168153
db = openerp.sql_db.db_connect('postgres')
169-
cr = db.cursor()
170-
cr.autocommit(True) # avoid transaction block
171-
try:
154+
with closing(db.cursor()) as cr:
155+
cr.autocommit(True) # avoid transaction block
172156
# Try to terminate all other connections that might prevent
173157
# dropping the database
174158
try:
@@ -192,8 +176,6 @@ def exp_drop(db_name):
192176
raise Exception("Couldn't drop database %s: %s" % (db_name, e))
193177
else:
194178
_logger.info('DROP DB: %s', db_name)
195-
finally:
196-
cr.close()
197179
return True
198180

199181
@contextlib.contextmanager
@@ -290,9 +272,8 @@ def exp_rename(old_name, new_name):
290272
openerp.sql_db.close_db(old_name)
291273

292274
db = openerp.sql_db.db_connect('postgres')
293-
cr = db.cursor()
294-
cr.autocommit(True) # avoid transaction block
295-
try:
275+
with closing(db.cursor()) as cr:
276+
cr.autocommit(True) # avoid transaction block
296277
try:
297278
cr.execute('ALTER DATABASE "%s" RENAME TO "%s"' % (old_name, new_name))
298279
except Exception, e:
@@ -304,8 +285,6 @@ def exp_rename(old_name, new_name):
304285
os.rename(os.path.join(fs, old_name), os.path.join(fs, new_name))
305286

306287
_logger.info('RENAME DB: %s -> %s', old_name, new_name)
307-
finally:
308-
cr.close()
309288
return True
310289

311290
def exp_db_exist(db_name):
@@ -318,8 +297,7 @@ def exp_list(document=False):
318297
chosen_template = openerp.tools.config['db_template']
319298
templates_list = tuple(set(['template0', 'template1', 'postgres', chosen_template]))
320299
db = openerp.sql_db.db_connect('postgres')
321-
cr = db.cursor()
322-
try:
300+
with closing(db.cursor()) as cr:
323301
try:
324302
db_user = openerp.tools.config["db_user"]
325303
if not db_user and os.name == 'posix':
@@ -336,8 +314,6 @@ def exp_list(document=False):
336314
res = [str(name) for (name,) in cr.fetchall()]
337315
except Exception:
338316
res = []
339-
finally:
340-
cr.close()
341317
res.sort()
342318
return res
343319

openerp/service/model.py

+22-26
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import openerp
1111
from openerp.tools.translate import translate
1212
from openerp.osv.orm import except_orm
13+
from contextlib import contextmanager
1314

1415
import security
1516

@@ -159,41 +160,36 @@ def execute_cr(cr, uid, obj, method, *args, **kw):
159160
def execute_kw(db, uid, obj, method, args, kw=None):
160161
return execute(db, uid, obj, method, *args, **kw or {})
161162

162-
@check
163-
def execute(db, uid, obj, method, *args, **kw):
164-
threading.currentThread().dbname = db
165-
cr = openerp.registry(db).db.cursor()
163+
@contextmanager
164+
def closing_cr_and_commit(cr):
166165
try:
167-
try:
168-
if method.startswith('_'):
169-
raise except_orm('Access Denied', 'Private methods (such as %s) cannot be called remotely.' % (method,))
170-
res = execute_cr(cr, uid, obj, method, *args, **kw)
171-
if res is None:
172-
_logger.warning('The method %s of the object %s can not return `None` !', method, obj)
173-
cr.commit()
174-
except Exception:
175-
cr.rollback()
176-
raise
166+
yield cr
167+
cr.commit()
168+
except Exception:
169+
cr.rollback()
170+
raise
177171
finally:
178172
cr.close()
179-
return res
173+
174+
@check
175+
def execute(db, uid, obj, method, *args, **kw):
176+
threading.currentThread().dbname = db
177+
with closing_cr_and_commit(openerp.registry(db).db.cursor()) as cr:
178+
if method.startswith('_'):
179+
raise except_orm('Access Denied', 'Private methods (such as %s) cannot be called remotely.' % (method,))
180+
res = execute_cr(cr, uid, obj, method, *args, **kw)
181+
if res is None:
182+
_logger.warning('The method %s of the object %s can not return `None` !', method, obj)
183+
return res
180184

181185
def exec_workflow_cr(cr, uid, obj, signal, *args):
182186
res_id = args[0]
183187
return execute_cr(cr, uid, obj, 'signal_workflow', [res_id], signal)[res_id]
184188

189+
185190
@check
186191
def exec_workflow(db, uid, obj, signal, *args):
187-
cr = openerp.registry(db).db.cursor()
188-
try:
189-
try:
190-
res = exec_workflow_cr(cr, uid, obj, signal, *args)
191-
cr.commit()
192-
except Exception:
193-
cr.rollback()
194-
raise
195-
finally:
196-
cr.close()
197-
return res
192+
with closing_cr_and_commit(openerp.registry(db).db.cursor()) as cr:
193+
return exec_workflow_cr(cr, uid, obj, signal, *args)
198194

199195
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

0 commit comments

Comments
 (0)