Source code for relstorage.config

##############################################################################
#
# Copyright (c) 2008 Zope Foundation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""ZConfig directive implementations for binding RelStorage to Zope"""
from __future__ import absolute_import

from relstorage.options import Options
from relstorage.storage import RelStorage

logger = __import__('logging').getLogger(__name__)

class BaseConfig(object):

    def __init__(self, config):
        self.config = config
        self.name = config.getSectionName()

[docs] class RelStorageFactory(BaseConfig): """Open a storage configured via ZConfig""" def open(self): config = self.config # Hoist the driver setting to the section we really want it. config.driver = config.adapter.config.driver # But don't remove it or otherwise mutate the config object; # that would prevent us from being correctly opened again. #config.adapter.config.driver = None options = Options.copy_valid_options(config) options.adapter = config.adapter # The adapter factories may modify the global options (or raise an exception) # if something at the top-level is specifically not allowed based on # their configuration. adapter = config.adapter.create(options) return RelStorage(adapter, name=config.name, options=options)
class PostgreSQLAdapterFactory(BaseConfig): def create(self, options): from .adapters.postgresql import PostgreSQLAdapter return PostgreSQLAdapter( dsn=self.config.dsn, options=options) class OracleAdapterFactory(BaseConfig): def create(self, options): from .adapters.oracle import OracleAdapter config = self.config return OracleAdapter( user=config.user, password=config.password, dsn=config.dsn, options=options) class MySQLAdapterFactory(BaseConfig): def create(self, options): from .adapters.mysql import MySQLAdapter params = {} for key in self.config.getSectionAttributes(): if key == 'driver': continue value = getattr(self.config, key) if value is not None: params[key] = value return MySQLAdapter(options=options, **params) class SQLitePragmas(BaseConfig): @property def pragmas(self): pragmas = self.config.pragmas # The keys could be repeated so the values are lists pragmas = {k: v for k, (v,) in pragmas.items()} # Ignore busy_timeout: That's the same thing as commit-lock-timeout pragmas.pop('busy_timeout', None) for attr in self.config.getSectionAttributes(): if attr == 'pragmas': continue val = getattr(self.config, attr) if val is not None: pragmas[attr] = val return pragmas class Sqlite3AdapterFactory(BaseConfig): def create(self, options): from .adapters.sqlite.adapter import Sqlite3Adapter if options.cache_local_dir: # A persistent cache makes absolutely no sense. # Disable. logger.info("Ignoring cache-local-dir setting.") del options.cache_local_dir if self.config.pragmas: pragmas = self.config.pragmas.pragmas else: pragmas = {} return Sqlite3Adapter( self.config.data_dir, pragmas=pragmas, options=options)