[REF] registry: begin to remove openerp.pooler:

- call openerp.modules.registry.RegistryManager instead
- expose openerp.get_pool()

bzr revid: vmt@openerp.com-20130327093125-iqsyvvjm0ej7do14
This commit is contained in:
Vo Minh Thu 2013-03-27 10:31:25 +01:00
parent 7fea92de51
commit 684bd35442
3 changed files with 42 additions and 26 deletions

View File

@ -53,5 +53,19 @@ multi_process = False
# Is the server running with gevent. # Is the server running with gevent.
evented = False evented = False
def registry(database_name):
"""
Return the model registry for the given database. If the registry does not
exist yet, it is created on the fly.
"""
return modules.registry.RegistryManager.get(database_name)
def new_registry(database_name):
"""
Return the model registry for the given database. If the registry already
existed, it is deleted and created again.
"""
return modules.registry.RegistryManager.new(database_name)
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -95,7 +95,7 @@ def preload_registry(dbname):
""" Preload a registry, and start the cron.""" """ Preload a registry, and start the cron."""
try: try:
update_module = True if openerp.tools.config['init'] or openerp.tools.config['update'] else False update_module = True if openerp.tools.config['init'] or openerp.tools.config['update'] else False
db, registry = openerp.pooler.get_db_and_pool(dbname,update_module=update_module) openerp.modules.registry.RegistryManager.new(dbname, update_module=update_module)
except Exception: except Exception:
_logger.exception('Failed to initialize database `%s`.', dbname) _logger.exception('Failed to initialize database `%s`.', dbname)
@ -103,8 +103,8 @@ def run_test_file(dbname, test_file):
""" Preload a registry, possibly run a test file, and start the cron.""" """ Preload a registry, possibly run a test file, and start the cron."""
try: try:
config = openerp.tools.config config = openerp.tools.config
db, registry = openerp.pooler.get_db_and_pool(dbname, update_module=config['init'] or config['update']) registry = openerp.modules.registry.RegistryManager.new(dbname, update_module=config['init'] or config['update'])
cr = db.cursor() cr = registry.db.cursor()
_logger.info('loading test file %s', test_file) _logger.info('loading test file %s', test_file)
openerp.tools.convert_yaml_import(cr, 'base', file(test_file), 'test', {}, 'test', True) openerp.tools.convert_yaml_import(cr, 'base', file(test_file), 'test', {}, 'test', True)
cr.rollback() cr.rollback()
@ -125,7 +125,8 @@ def export_translation():
fileformat = os.path.splitext(config["translate_out"])[-1][1:].lower() fileformat = os.path.splitext(config["translate_out"])[-1][1:].lower()
buf = file(config["translate_out"], "w") buf = file(config["translate_out"], "w")
cr = openerp.pooler.get_db(dbname).cursor() registry = openerp.modules.registry.RegistryManager.new(dbname)
cr = registry.db.cursor()
openerp.tools.trans_export(config["language"], openerp.tools.trans_export(config["language"],
config["translate_modules"] or ["all"], buf, fileformat, cr) config["translate_modules"] or ["all"], buf, fileformat, cr)
cr.close() cr.close()
@ -138,7 +139,8 @@ def import_translation():
context = {'overwrite': config["overwrite_existing_translations"]} context = {'overwrite': config["overwrite_existing_translations"]}
dbname = config['db_name'] dbname = config['db_name']
cr = openerp.pooler.get_db(dbname).cursor() registry = openerp.modules.registry.RegistryManager.new(dbname)
cr = registry.db.cursor()
openerp.tools.trans_load( cr, config["translate_in"], config["language"], openerp.tools.trans_load( cr, config["translate_in"], config["language"],
context=context) context=context)
cr.commit() cr.commit()

View File

@ -35,7 +35,6 @@ import openerp.modules.db
import openerp.modules.graph import openerp.modules.graph
import openerp.modules.migration import openerp.modules.migration
import openerp.osv as osv import openerp.osv as osv
import openerp.pooler as pooler
import openerp.tools as tools import openerp.tools as tools
from openerp import SUPERUSER_ID from openerp import SUPERUSER_ID
@ -129,17 +128,17 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules=
processed_modules = [] processed_modules = []
loaded_modules = [] loaded_modules = []
pool = pooler.get_pool(cr.dbname) registry = openerp.registry(cr.dbname)
migrations = openerp.modules.migration.MigrationManager(cr, graph) migrations = openerp.modules.migration.MigrationManager(cr, graph)
_logger.debug('loading %d packages...', len(graph)) _logger.debug('loading %d packages...', len(graph))
# Query manual fields for all models at once and save them on the registry # Query manual fields for all models at once and save them on the registry
# so the initialization code for each model does not have to do it # so the initialization code for each model does not have to do it
# one model at a time. # one model at a time.
pool.fields_by_model = {} registry.fields_by_model = {}
cr.execute('SELECT * FROM ir_model_fields WHERE state=%s', ('manual',)) cr.execute('SELECT * FROM ir_model_fields WHERE state=%s', ('manual',))
for field in cr.dictfetchall(): for field in cr.dictfetchall():
pool.fields_by_model.setdefault(field['model'], []).append(field) registry.fields_by_model.setdefault(field['model'], []).append(field)
# register, instantiate and initialize models for each modules # register, instantiate and initialize models for each modules
for index, package in enumerate(graph): for index, package in enumerate(graph):
@ -153,17 +152,17 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules=
migrations.migrate_module(package, 'pre') migrations.migrate_module(package, 'pre')
load_openerp_module(package.name) load_openerp_module(package.name)
models = pool.load(cr, package) models = registry.load(cr, package)
loaded_modules.append(package.name) loaded_modules.append(package.name)
if hasattr(package, 'init') or hasattr(package, 'update') or package.state in ('to install', 'to upgrade'): if hasattr(package, 'init') or hasattr(package, 'update') or package.state in ('to install', 'to upgrade'):
init_module_models(cr, package.name, models) init_module_models(cr, package.name, models)
pool._init_modules.add(package.name) registry._init_modules.add(package.name)
status['progress'] = float(index) / len(graph) status['progress'] = float(index) / len(graph)
# Can't put this line out of the loop: ir.module.module will be # Can't put this line out of the loop: ir.module.module will be
# registered by init_module_models() above. # registered by init_module_models() above.
modobj = pool.get('ir.module.module') modobj = registry['ir.module.module']
if perform_checks: if perform_checks:
modobj.check(cr, SUPERUSER_ID, [module_id]) modobj.check(cr, SUPERUSER_ID, [module_id])
@ -219,7 +218,7 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules=
# The query won't be valid for models created later (i.e. custom model # The query won't be valid for models created later (i.e. custom model
# created after the registry has been loaded), so empty its result. # created after the registry has been loaded), so empty its result.
pool.fields_by_model = None registry.fields_by_model = None
cr.commit() cr.commit()
@ -258,7 +257,7 @@ def load_marked_modules(cr, graph, states, force, progressdict, report, loaded_m
def load_modules(db, force_demo=False, status=None, update_module=False): def load_modules(db, force_demo=False, status=None, update_module=False):
# TODO status['progress'] reporting is broken: used twice (and reset each # TODO status['progress'] reporting is broken: used twice (and reset each
# time to zero) in load_module_graph, not fine-grained enough. # time to zero) in load_module_graph, not fine-grained enough.
# It should be a method exposed by the pool. # It should be a method exposed by the registry.
initialize_sys_path() initialize_sys_path()
force = [] force = []
@ -275,8 +274,9 @@ def load_modules(db, force_demo=False, status=None, update_module=False):
if not tools.config['without_demo']: if not tools.config['without_demo']:
tools.config["demo"]['all'] = 1 tools.config["demo"]['all'] = 1
# This is a brand new pool, just created in pooler.get_db_and_pool() # This is a brand new registry, just created in
pool = pooler.get_pool(cr.dbname) # openerp.modules.registry.RegistryManger.new().
registry = openerp.registry(cr.dbname)
if 'base' in tools.config['update'] or 'all' in tools.config['update']: if 'base' in tools.config['update'] or 'all' in tools.config['update']:
cr.execute("update ir_module_module set state=%s where name=%s and state=%s", ('to upgrade', 'base', 'installed')) cr.execute("update ir_module_module set state=%s where name=%s and state=%s", ('to upgrade', 'base', 'installed'))
@ -290,7 +290,7 @@ def load_modules(db, force_demo=False, status=None, update_module=False):
# processed_modules: for cleanup step after install # processed_modules: for cleanup step after install
# loaded_modules: to avoid double loading # loaded_modules: to avoid double loading
report = pool._assertion_report report = registry._assertion_report
loaded_modules, processed_modules = load_module_graph(cr, graph, status, perform_checks=update_module, report=report) loaded_modules, processed_modules = load_module_graph(cr, graph, status, perform_checks=update_module, report=report)
if tools.config['load_language']: if tools.config['load_language']:
@ -299,7 +299,7 @@ def load_modules(db, force_demo=False, status=None, update_module=False):
# STEP 2: Mark other modules to be loaded/updated # STEP 2: Mark other modules to be loaded/updated
if update_module: if update_module:
modobj = pool.get('ir.module.module') modobj = registry['ir.module.module']
if ('base' in tools.config['init']) or ('base' in tools.config['update']): if ('base' in tools.config['init']) or ('base' in tools.config['update']):
_logger.info('updating modules list') _logger.info('updating modules list')
modobj.update_list(cr, SUPERUSER_ID) modobj.update_list(cr, SUPERUSER_ID)
@ -341,13 +341,13 @@ def load_modules(db, force_demo=False, status=None, update_module=False):
# load custom models # load custom models
cr.execute('select model from ir_model where state=%s', ('manual',)) cr.execute('select model from ir_model where state=%s', ('manual',))
for model in cr.dictfetchall(): for model in cr.dictfetchall():
pool.get('ir.model').instanciate(cr, SUPERUSER_ID, model['model'], {}) registry['ir.model'].instanciate(cr, SUPERUSER_ID, model['model'], {})
# STEP 4: Finish and cleanup installations # STEP 4: Finish and cleanup installations
if processed_modules: if processed_modules:
cr.execute("""select model,name from ir_model where id NOT IN (select distinct model_id from ir_model_access)""") cr.execute("""select model,name from ir_model where id NOT IN (select distinct model_id from ir_model_access)""")
for (model, name) in cr.fetchall(): for (model, name) in cr.fetchall():
model_obj = pool.get(model) model_obj = registry.get(model)
if model_obj and not model_obj.is_transient(): if model_obj and not model_obj.is_transient():
_logger.warning('The model %s has no access rules, consider adding one. E.g. access_%s,access_%s,model_%s,,1,1,1,1', _logger.warning('The model %s has no access rules, consider adding one. E.g. access_%s,access_%s,model_%s,,1,1,1,1',
model, model.replace('.', '_'), model.replace('.', '_'), model.replace('.', '_')) model, model.replace('.', '_'), model.replace('.', '_'), model.replace('.', '_'))
@ -356,20 +356,20 @@ def load_modules(db, force_demo=False, status=None, update_module=False):
# been replaced by owner-only access rights # been replaced by owner-only access rights
cr.execute("""select distinct mod.model, mod.name from ir_model_access acc, ir_model mod where acc.model_id = mod.id""") cr.execute("""select distinct mod.model, mod.name from ir_model_access acc, ir_model mod where acc.model_id = mod.id""")
for (model, name) in cr.fetchall(): for (model, name) in cr.fetchall():
model_obj = pool.get(model) model_obj = registry.get(model)
if model_obj and model_obj.is_transient(): if model_obj and model_obj.is_transient():
_logger.warning('The transient model %s (%s) should not have explicit access rules!', model, name) _logger.warning('The transient model %s (%s) should not have explicit access rules!', model, name)
cr.execute("SELECT model from ir_model") cr.execute("SELECT model from ir_model")
for (model,) in cr.fetchall(): for (model,) in cr.fetchall():
obj = pool.get(model) obj = registry.get(model)
if obj: if obj:
obj._check_removed_columns(cr, log=True) obj._check_removed_columns(cr, log=True)
else: else:
_logger.warning("Model %s is declared but cannot be loaded! (Perhaps a module was partially removed or renamed)", model) _logger.warning("Model %s is declared but cannot be loaded! (Perhaps a module was partially removed or renamed)", model)
# Cleanup orphan records # Cleanup orphan records
pool.get('ir.model.data')._process_end(cr, SUPERUSER_ID, processed_modules) registry['ir.model.data']._process_end(cr, SUPERUSER_ID, processed_modules)
for kind in ('init', 'demo', 'update'): for kind in ('init', 'demo', 'update'):
tools.config[kind] = {} tools.config[kind] = {}
@ -403,12 +403,12 @@ def load_modules(db, force_demo=False, status=None, update_module=False):
cr.execute("SELECT id FROM ir_module_module WHERE state=%s", ('to remove',)) cr.execute("SELECT id FROM ir_module_module WHERE state=%s", ('to remove',))
mod_ids_to_remove = [x[0] for x in cr.fetchall()] mod_ids_to_remove = [x[0] for x in cr.fetchall()]
if mod_ids_to_remove: if mod_ids_to_remove:
pool.get('ir.module.module').module_uninstall(cr, SUPERUSER_ID, mod_ids_to_remove) registry['ir.module.module'].module_uninstall(cr, SUPERUSER_ID, mod_ids_to_remove)
# Recursive reload, should only happen once, because there should be no # Recursive reload, should only happen once, because there should be no
# modules to remove next time # modules to remove next time
cr.commit() cr.commit()
_logger.info('Reloading registry once more after uninstalling modules') _logger.info('Reloading registry once more after uninstalling modules')
return pooler.restart_pool(cr.dbname, force_demo, status, update_module) return openerp.modules.registry.RegistryManger.new(cr.dbname, force_demo, status, update_module)
if report.failures: if report.failures:
_logger.error('At least one test failed when loading the modules.') _logger.error('At least one test failed when loading the modules.')
@ -416,7 +416,7 @@ def load_modules(db, force_demo=False, status=None, update_module=False):
_logger.info('Modules loaded.') _logger.info('Modules loaded.')
# STEP 7: call _register_hook on every model # STEP 7: call _register_hook on every model
for model in pool.models.values(): for model in registry.models.values():
model._register_hook(cr) model._register_hook(cr)
finally: finally: