[IMP] prevent to use the pool remotely while the database is not loaded
bzr revid: christophe@cobalt-20090103002930-rfyzwj45nz0e9g1j
This commit is contained in:
parent
c4889f7f45
commit
5396621ab0
|
@ -47,9 +47,37 @@ class except_osv(Exception):
|
||||||
self.args = (exc_type, name)
|
self.args = (exc_type, name)
|
||||||
|
|
||||||
|
|
||||||
|
from tools.func import wraps
|
||||||
class osv_pool(netsvc.Service):
|
class osv_pool(netsvc.Service):
|
||||||
|
|
||||||
|
def check(f):
|
||||||
|
@wraps(f)
|
||||||
|
def wrapper(self, dbname, *args, **kwargs):
|
||||||
|
try:
|
||||||
|
if not pooler.get_pool(dbname)._ready:
|
||||||
|
raise except_osv('Database not ready', 'Currently, this database is not fully loaded and can not be used.')
|
||||||
|
return f(self, dbname, *args, **kwargs)
|
||||||
|
except orm.except_orm, inst:
|
||||||
|
self.abortResponse(1, inst.name, 'warning', inst.value)
|
||||||
|
except except_osv, inst:
|
||||||
|
self.abortResponse(1, inst.name, inst.exc_type, inst.value)
|
||||||
|
except IntegrityError, inst:
|
||||||
|
for key in self._sql_error.keys():
|
||||||
|
if key in inst[0]:
|
||||||
|
self.abortResponse(1, 'Constraint Error', 'warning', self._sql_error[key])
|
||||||
|
self.abortResponse(1, 'Integrity Error', 'warning', inst[0])
|
||||||
|
except Exception, e:
|
||||||
|
import traceback
|
||||||
|
tb_s = reduce(lambda x, y: x+y, traceback.format_exception( sys.exc_type, sys.exc_value, sys.exc_traceback))
|
||||||
|
logger = Logger()
|
||||||
|
logger.notifyChannel('web-services', LOG_ERROR, tb_s)
|
||||||
|
raise
|
||||||
|
|
||||||
|
return wrapper
|
||||||
|
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
self._ready = False
|
||||||
self.obj_pool = {}
|
self.obj_pool = {}
|
||||||
self.module_object_list = {}
|
self.module_object_list = {}
|
||||||
self.created = []
|
self.created = []
|
||||||
|
@ -63,42 +91,27 @@ class osv_pool(netsvc.Service):
|
||||||
self.exportMethod(self.obj_list)
|
self.exportMethod(self.obj_list)
|
||||||
self.exportMethod(self.exec_workflow)
|
self.exportMethod(self.exec_workflow)
|
||||||
self.exportMethod(self.execute)
|
self.exportMethod(self.execute)
|
||||||
self.exportMethod(self.execute_cr)
|
|
||||||
|
|
||||||
def init_set(self, cr, mode):
|
def init_set(self, cr, mode):
|
||||||
if mode <> self._init:
|
different = mode != self._init
|
||||||
|
if different:
|
||||||
if mode:
|
if mode:
|
||||||
self._init_parent = {}
|
self._init_parent = {}
|
||||||
if not mode:
|
if not mode:
|
||||||
for o in self._init_parent:
|
for o in self._init_parent:
|
||||||
self.get(o)._parent_store_compute(cr)
|
self.get(o)._parent_store_compute(cr)
|
||||||
self._init = mode
|
self._init = mode
|
||||||
return True
|
|
||||||
return False
|
self._ready = True
|
||||||
|
return different
|
||||||
|
|
||||||
def execute_cr(self, cr, uid, obj, method, *args, **kw):
|
def execute_cr(self, cr, uid, obj, method, *args, **kw):
|
||||||
try:
|
object = pooler.get_pool(cr.dbname).get(obj)
|
||||||
object = pooler.get_pool(cr.dbname).get(obj)
|
if not object:
|
||||||
if not object:
|
raise except_osv('Object Error', 'Object %s doesn\'t exist' % str(obj))
|
||||||
self.abortResponse(1, 'Object Error', 'warning',
|
return getattr(object, method)(cr, uid, *args, **kw)
|
||||||
'Object %s doesn\'t exist' % str(obj))
|
|
||||||
return getattr(object, method)(cr, uid, *args, **kw)
|
@check
|
||||||
except orm.except_orm, inst:
|
|
||||||
self.abortResponse(1, inst.name, 'warning', inst.value)
|
|
||||||
except except_osv, inst:
|
|
||||||
self.abortResponse(1, inst.name, inst.exc_type, inst.value)
|
|
||||||
except IntegrityError, inst:
|
|
||||||
for key in self._sql_error.keys():
|
|
||||||
if key in inst[0]:
|
|
||||||
self.abortResponse(1, 'Constraint Error', 'warning', self._sql_error[key])
|
|
||||||
self.abortResponse(1, 'Integrity Error', 'warning', inst[0])
|
|
||||||
except Exception, e:
|
|
||||||
import traceback
|
|
||||||
tb_s = reduce(lambda x, y: x+y, traceback.format_exception( sys.exc_type, sys.exc_value, sys.exc_traceback))
|
|
||||||
logger = Logger()
|
|
||||||
logger.notifyChannel('web-services', LOG_ERROR, tb_s)
|
|
||||||
raise
|
|
||||||
|
|
||||||
def execute(self, db, uid, obj, method, *args, **kw):
|
def execute(self, db, uid, obj, method, *args, **kw):
|
||||||
db, pool = pooler.get_db_and_pool(db)
|
db, pool = pooler.get_db_and_pool(db)
|
||||||
cr = db.cursor()
|
cr = db.cursor()
|
||||||
|
@ -117,18 +130,16 @@ class osv_pool(netsvc.Service):
|
||||||
wf_service = netsvc.LocalService("workflow")
|
wf_service = netsvc.LocalService("workflow")
|
||||||
return wf_service.trg_validate(uid, obj, args[0], method, cr)
|
return wf_service.trg_validate(uid, obj, args[0], method, cr)
|
||||||
|
|
||||||
|
@check
|
||||||
def exec_workflow(self, db, uid, obj, method, *args):
|
def exec_workflow(self, db, uid, obj, method, *args):
|
||||||
cr = pooler.get_db(db).cursor()
|
cr = pooler.get_db(db).cursor()
|
||||||
try:
|
try:
|
||||||
try:
|
try:
|
||||||
res = self.exec_workflow_cr(cr, uid, obj, method, *args)
|
res = self.exec_workflow_cr(cr, uid, obj, method, *args)
|
||||||
cr.commit()
|
cr.commit()
|
||||||
except orm.except_orm, inst:
|
except Exception:
|
||||||
cr.rollback()
|
cr.rollback()
|
||||||
self.abortResponse(1, inst.name, 'warning', inst.value)
|
raise
|
||||||
except except_osv, inst:
|
|
||||||
cr.rollback()
|
|
||||||
self.abortResponse(1, inst.name, inst[0], inst.value)
|
|
||||||
finally:
|
finally:
|
||||||
cr.close()
|
cr.close()
|
||||||
return res
|
return res
|
||||||
|
@ -148,7 +159,7 @@ class osv_pool(netsvc.Service):
|
||||||
module = module.split('.')[0][2:]
|
module = module.split('.')[0][2:]
|
||||||
self.module_object_list.setdefault(module, []).append(obj_inst)
|
self.module_object_list.setdefault(module, []).append(obj_inst)
|
||||||
|
|
||||||
# Return False if object does not exist
|
# Return None if object does not exist
|
||||||
def get(self, name):
|
def get(self, name):
|
||||||
obj = self.obj_pool.get(name, None)
|
obj = self.obj_pool.get(name, None)
|
||||||
return obj
|
return obj
|
||||||
|
|
Loading…
Reference in New Issue