Files
tryton/trytond/pooler.py
T

133 lines
3.8 KiB
Python

#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
from trytond.backend import Database
import logging
from threading import RLock
_LOCK = RLock()
_LOCKS = {}
_DB = {}
_POOL = {}
_POOL_WIZARD = {}
_POOL_REPORT = {}
def get_db_and_pool(db_name, update_module=False, wizard=False, report=False,
lang=None):
restart = False
_LOCK.acquire()
lock = _LOCKS.setdefault(db_name, RLock())
_LOCK.release()
lock.acquire()
try:
if db_name in _DB:
database = _DB[db_name]
else:
logging.getLogger('pooler').info(
'Connecting to %s' % (db_name))
database = Database(db_name).connect()
cursor = database.cursor()
if not cursor.test():
raise Exception('UserError', 'Invalid database!')
cursor.close()
_DB[db_name] = database
if db_name in _POOL:
pool = _POOL[db_name]
pool_wizard = _POOL_WIZARD[db_name]
pool_report = _POOL_REPORT[db_name]
else:
logging.getLogger('pooler').info(
'Instanciate pooler for %s' % (db_name))
from trytond.osv import OSVService
pool = OSVService()
_POOL[db_name] = pool
from trytond.wizard import WizardService
pool_wizard = WizardService()
_POOL_WIZARD[db_name] = pool_wizard
from trytond.report import ReportService
pool_report = ReportService()
_POOL_REPORT[db_name] = pool_report
from trytond.modules import load_modules
restart = not load_modules(database, pool, pool_wizard, pool_report,
update_module, lang)
finally:
lock.release()
if restart:
restart_pool(db_name)
if wizard:
return database, pool_wizard
if report:
return database, pool_report
return database, pool
def restart_pool(db_name, update_module=False, lang=None):
_LOCK.acquire()
lock = _LOCKS.setdefault(db_name, RLock())
_LOCK.release()
lock.acquire()
try:
del _POOL[db_name]
del _POOL_WIZARD[db_name]
del _POOL_REPORT[db_name]
finally:
lock.release()
return get_db_and_pool(db_name, update_module=update_module, lang=lang)
def close_db(db_name):
_LOCK.acquire()
lock = _LOCKS.setdefault(db_name, RLock())
_LOCK.release()
lock.acquire()
try:
if db_name in _DB:
_DB[db_name].close()
del _DB[db_name]
if db_name in _POOL:
del _POOL[db_name]
finally:
lock.release()
def get_db_only(db_name, verbose=True, blocking=True):
_LOCK.acquire()
lock = _LOCKS.setdefault(db_name, RLock())
_LOCK.release()
if not lock.acquire(blocking):
return None
try:
if db_name in _DB:
database = _DB[db_name]
else:
if verbose:
logging.getLogger('pooler').info(
'Connecting to %s' % (db_name))
database = Database(db_name)
database.connect()
_DB[db_name] = database
finally:
lock.release()
return database
def get_db(db_name):
return get_db_and_pool(db_name)[0]
def get_db_list():
return _POOL.keys()
def get_pool(db_name, update_module=False, lang=None):
pool = get_db_and_pool(db_name, update_module, lang=lang)[1]
return pool
def get_pool_wizard(db_name, update_module=False, lang=None):
pool = get_db_and_pool(db_name, update_module, wizard=True,
lang=lang)[1]
return pool
def get_pool_report(db_name, update_module=False, lang=None):
pool = get_db_and_pool(db_name, update_module, report=True, lang=lang)[1]
return pool