limit database usage

This commit is contained in:
Emmanuel Garette 2017-07-16 10:57:43 +02:00
parent d445963429
commit dc9454be63
8 changed files with 46 additions and 16 deletions

View File

@ -21,6 +21,7 @@
from .error import PropertiesOptionError, ConfigError, SlaveError
from .i18n import _
from .setting import undefined
from .storage import get_default_values_storages, get_default_settings_storages
# ____________________________________________________________
@ -149,7 +150,9 @@ def carry_out_calculation(option, context, callback, callback_params,
return undefined
if callbk[0] is None: # pragma: optional cover
#Not an option, set full context
tcparams.setdefault(key, []).append((context.duplicate(), False))
tcparams.setdefault(key, []).append((context.duplicate(
force_values=get_default_values_storages(),
force_settings=get_default_settings_storages()), False))
elif callbk[0] == 'index':
tcparams.setdefault(key, []).append((index, False))
else:

View File

@ -30,7 +30,7 @@ from .option import OptionDescription, Option, SymLinkOption, \
from .option.baseoption import valid_name
from .setting import groups, Settings, default_encoding, undefined
from .storage import get_storages, get_storage, set_storage, \
_impl_getstate_setting, get_storages_validation
_impl_getstate_setting, get_default_values_storages
from .value import Values, Multi
from .i18n import _
@ -754,13 +754,14 @@ class _CommonConfig(SubConfig):
def _gen_fake_values(self, session):
fake_config = Config(self._impl_descr, persistent=False,
force_values=get_storages_validation(),
force_values=get_default_values_storages(),
force_settings=self.cfgimpl_get_settings())
fake_config.cfgimpl_get_values()._p_.importation(self.cfgimpl_get_values()._p_.exportation(session, fake=True))
return fake_config
def duplicate(self):
config = Config(self._impl_descr, _duplicate=True)
def duplicate(self, force_values=None, force_settings=None):
config = Config(self._impl_descr, _duplicate=True, force_values=force_values,
force_settings=force_settings)
session = self.cfgimpl_get_values()._p_.getsession()
config.cfgimpl_get_values()._p_.importation(self.cfgimpl_get_values()._p_.exportation(
session))
@ -792,6 +793,9 @@ class Config(_CommonConfig):
:type persistent: `boolean`
"""
if force_settings is not None and force_values is not None:
if isinstance(force_settings, tuple):
self._impl_settings = Settings(self, force_settings[0], force_settings[1])
else:
self._impl_settings = force_settings
self._impl_values = Values(self, force_values)
else:

View File

@ -942,7 +942,7 @@ class Option(OnlyOption):
:param load: `True` if we are at the init of the option description
:type load: bool
"""
if not load and self._get_consistencies() == ():
if not load and not self._has_consistencies():
self._state_consistencies = None
elif load and self._state_consistencies is None:
del(self._state_consistencies)
@ -1195,6 +1195,9 @@ class SymLinkOption(OnlyOption):
def _get_consistencies(self):
return ()
def _has_consistencies(self):
return False
class DynSymLinkOption(object):
__slots__ = ('_dyn', '_opt', '_name')

View File

@ -77,8 +77,8 @@ class StorageType(object):
storage_type = StorageType()
storage_option_type = StorageType()
storage_option_type.set(DEFAULT_STORAGE)
storage_validation = StorageType()
storage_validation.set(DEFAULT_STORAGE)
default_validation = StorageType()
default_validation.set(DEFAULT_STORAGE)
def set_storage(type_, name, **kwargs): # pragma: optional cover
@ -122,7 +122,7 @@ def get_storage(type_, session_id, persistent, test): # pragma: optional cover
elif type_ == 'config':
return storage_type.get().Storage(session_id, persistent, test)
else:
return storage_validation.get().Storage(session_id, persistent, test)
return default_validation.get().Storage(session_id, persistent, test)
def get_storages(context, session_id, persistent):
@ -149,12 +149,20 @@ def get_storages_option(type_):
return imp.StorageOptionDescription
def get_storages_validation():
imp = storage_validation.get()
def get_default_values_storages():
imp = default_validation.get()
storage = imp.Storage('__validator_storage', persistent=False, test=True)
return imp.Values(storage)
def get_default_settings_storages():
imp = default_validation.get()
storage = imp.Storage('__validator_storage', persistent=False, test=True)
properties = imp.Properties(storage)
permissives = imp.Permissives(storage)
return properties, permissives
def list_sessions(type_): # pragma: optional cover
"""List all available session (persistent or not persistent)
"""

View File

@ -166,6 +166,9 @@ class StorageBase(object):
def _get_consistencies(self):
return getattr(self, '_consistencies', static_tuple)
def _has_consistencies(self):
return hasattr(self, '_consistencies')
def _set_callback(self, callback, callback_params):
val = getattr(self, '_val_call', (None,))[0]
if callback_params is None or callback_params == {}:

View File

@ -21,6 +21,8 @@ from os.path import basename, splitext, join, isfile
import sqlite3
from glob import glob
from ..util import SerializeObject
global idx
idx = 0
class Setting(SerializeObject):
@ -93,6 +95,9 @@ class Storage(object):
self.execute(permissives_table)
def execute(self, sql, params=None, commit=True):
global idx
idx += 1
print(idx, sql, params)
if params is None:
params = tuple()
self._cursor.execute(sql, params)

View File

@ -152,7 +152,7 @@ class Values(Sqlite3DB):
try:
nowner = getattr(owners, owner[0])
except AttributeError:
owners.addowner(towner)
owners.addowner(owner[0])
nowner = getattr(owners, owner[0])
if not with_value:
return nowner

View File

@ -409,9 +409,13 @@ class Values(object):
_setting_properties = context.cfgimpl_get_settings()._getproperties(read_write=False)
if 'validator' in _setting_properties:
session = context.cfgimpl_get_values()._p_.getsession()
if opt._has_consistencies():
fake_context = context._gen_fake_values(session)
fake_values = fake_context.cfgimpl_get_values()
fake_values._setvalue(opt, path, value, index=index)
else:
fake_context = context
fake_values = self
props = fake_values.validate(opt, value, path,
check_frozen=check_frozen,
force_permissive=force_permissive,