6
6
import os
7
7
import threading
8
8
import traceback
9
+ from contextlib import contextmanager , closing
9
10
10
11
import openerp
11
12
from openerp import SUPERUSER_ID
24
25
# This should be moved to openerp.modules.db, along side initialize().
25
26
def _initialize_db (id , db_name , demo , lang , user_password ):
26
27
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 :
31
31
openerp .modules .db .initialize (cr ) # TODO this should be removed as it is done by RegistryManager.new().
32
32
openerp .tools .config ['lang' ] = lang
33
33
cr .commit ()
34
- finally :
35
- if cr :
36
- cr .close ()
37
- cr = None
38
34
39
35
registry = openerp .modules .registry .RegistryManager .new (
40
36
db_name , demo , self_actions [id ], update_module = True )
41
37
42
- try :
43
- cr = openerp .sql_db .db_connect (db_name ).cursor ()
44
-
38
+ with closing (db .cursor ()) as cr :
45
39
if lang :
46
40
modobj = registry ['ir.module.module' ]
47
41
mids = modobj .search (cr , SUPERUSER_ID , [('state' , '=' , 'installed' )])
@@ -54,9 +48,7 @@ def _initialize_db(id, db_name, demo, lang, user_password):
54
48
cr .execute ('SELECT login, password FROM res_users ORDER BY login' )
55
49
self_actions [id ].update (users = cr .dictfetchall (), clean = True )
56
50
cr .commit ()
57
- finally :
58
- if cr :
59
- cr .close ()
51
+
60
52
except Exception , e :
61
53
self_actions [id ].update (clean = False , exception = e )
62
54
_logger .exception ('CREATE DATABASE failed:' )
@@ -81,19 +73,15 @@ def dispatch(method, params):
81
73
82
74
def _create_empty_database (name ):
83
75
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 ))
97
85
98
86
def exp_create (db_name , demo , lang , user_password = 'admin' ):
99
87
self_id_protect .acquire ()
@@ -132,12 +120,9 @@ def exp_duplicate_database(db_original_name, db_name):
132
120
_logger .info ('Duplicate database `%s` to `%s`.' , db_original_name , db_name )
133
121
openerp .sql_db .close_db (db_original_name )
134
122
db = openerp .sql_db .db_connect ('postgres' )
135
- cr = db .cursor ()
136
- try :
123
+ with closing (db .cursor ()) as cr :
137
124
cr .autocommit (True ) # avoid transaction block
138
125
cr .execute ("""CREATE DATABASE "%s" ENCODING 'unicode' TEMPLATE "%s" """ % (db_name , db_original_name ))
139
- finally :
140
- cr .close ()
141
126
return True
142
127
143
128
def exp_get_progress (id ):
@@ -166,9 +151,8 @@ def exp_drop(db_name):
166
151
openerp .sql_db .close_db (db_name )
167
152
168
153
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
172
156
# Try to terminate all other connections that might prevent
173
157
# dropping the database
174
158
try :
@@ -192,8 +176,6 @@ def exp_drop(db_name):
192
176
raise Exception ("Couldn't drop database %s: %s" % (db_name , e ))
193
177
else :
194
178
_logger .info ('DROP DB: %s' , db_name )
195
- finally :
196
- cr .close ()
197
179
return True
198
180
199
181
@contextlib .contextmanager
@@ -290,9 +272,8 @@ def exp_rename(old_name, new_name):
290
272
openerp .sql_db .close_db (old_name )
291
273
292
274
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
296
277
try :
297
278
cr .execute ('ALTER DATABASE "%s" RENAME TO "%s"' % (old_name , new_name ))
298
279
except Exception , e :
@@ -304,8 +285,6 @@ def exp_rename(old_name, new_name):
304
285
os .rename (os .path .join (fs , old_name ), os .path .join (fs , new_name ))
305
286
306
287
_logger .info ('RENAME DB: %s -> %s' , old_name , new_name )
307
- finally :
308
- cr .close ()
309
288
return True
310
289
311
290
def exp_db_exist (db_name ):
@@ -318,8 +297,7 @@ def exp_list(document=False):
318
297
chosen_template = openerp .tools .config ['db_template' ]
319
298
templates_list = tuple (set (['template0' , 'template1' , 'postgres' , chosen_template ]))
320
299
db = openerp .sql_db .db_connect ('postgres' )
321
- cr = db .cursor ()
322
- try :
300
+ with closing (db .cursor ()) as cr :
323
301
try :
324
302
db_user = openerp .tools .config ["db_user" ]
325
303
if not db_user and os .name == 'posix' :
@@ -336,8 +314,6 @@ def exp_list(document=False):
336
314
res = [str (name ) for (name ,) in cr .fetchall ()]
337
315
except Exception :
338
316
res = []
339
- finally :
340
- cr .close ()
341
317
res .sort ()
342
318
return res
343
319
0 commit comments