[Zope-Checkins] CVS: ZODB3/ZODB - StorageConfig.py:1.4 StorageTypes.py:1.7
Guido van Rossum
guido@python.org
Fri, 10 Jan 2003 12:04:23 -0500
Update of /cvs-repository/ZODB3/ZODB
In directory cvs.zope.org:/tmp/cvs-serv22877
Added Files:
StorageConfig.py StorageTypes.py
Log Message:
Add back StorageConfig.py and friends;
these were still used by the test suite. :-(
=== ZODB3/ZODB/StorageConfig.py 1.3 => 1.4 ===
--- /dev/null Fri Jan 10 12:04:23 2003
+++ ZODB3/ZODB/StorageConfig.py Fri Jan 10 12:03:50 2003
@@ -0,0 +1,75 @@
+##############################################################################
+#
+# Copyright (c) 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (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.
+#
+##############################################################################
+"""Higher-level support for configuring storages.
+
+Storages are configured a la DBTab.
+
+A storage section has the form
+
+ <Storage Name (dependent)>
+ # For example
+ type FileStorage
+ file_name var/Data.fs
+ read_only 1
+ </Storage>
+
+where Name and (dependent) are optional. Once you have retrieved the
+section object (probably with getSection("Storage", name), the
+function creatStorage() in this module will create the storage object
+for you.
+"""
+
+from StorageTypes import storage_types
+
+def createStorage(section):
+ """Create a storage specified by a configuration section."""
+ klass, args = getStorageInfo(section)
+ return klass(**args)
+
+def getStorageInfo(section):
+ """Extract a storage description from a configuration section.
+
+ Return a tuple (klass, args) where klass is the storage class and
+ args is a dictionary of keyword arguments. To create the storage,
+ call klass(**args).
+
+ Adapted from DatabaseFactory.setStorageParams() in DBTab.py.
+ """
+ type = section.get("type")
+ if not type:
+ raise RuntimeError, "A storage type is required"
+ module = None
+ pos = type.rfind(".")
+ if pos >= 0:
+ # Specified the module
+ module, type = type[:pos], type[pos+1:]
+ converter = None
+ if not module:
+ # Use a default module and argument converter.
+ info = storage_types.get(type)
+ if not info:
+ raise RuntimeError, "Unknown storage type: %s" % type
+ module, converter = info
+ m = __import__(module, {}, {}, [type])
+ klass = getattr(m, type)
+
+ args = {}
+ if section.name:
+ args["name"] = section.name
+ for key in section.keys():
+ if key.lower() != "type":
+ args[key] = section.get(key)
+ if converter is not None:
+ args = converter(**args)
+ return (klass, args)
=== ZODB3/ZODB/StorageTypes.py 1.6 => 1.7 ===
--- /dev/null Fri Jan 10 12:04:23 2003
+++ ZODB3/ZODB/StorageTypes.py Fri Jan 10 12:03:50 2003
@@ -0,0 +1,122 @@
+##############################################################################
+#
+# Copyright (c) 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (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
+#
+##############################################################################
+"""Default storage types.
+
+Adapted from DBTab/StorageTypes.py.
+"""
+
+import re
+
+from ZConfig.Config import asBoolean
+
+
+def convertFileStorageArgs(quota=None, stop=None, **kw):
+ if kw.has_key('name'):
+ # FileStorage doesn't accept a 'name' arg
+ del kw['name']
+ if quota is not None:
+ kw['quota'] = long(quota) or None
+ if stop is not None:
+ stop = long(stop)
+ if not stop:
+ stop = None
+ else:
+ from ZODB.utils import p64
+ stop = p64(stop)
+ kw['stop'] = stop
+
+ # Boolean args
+ for name in (
+ 'create', 'read_only'
+ ):
+ if kw.has_key(name):
+ kw[name] = asBoolean(kw[name])
+
+ return kw
+
+
+# Match URLs of the form 'zeo://zope.example.com:1234'
+zeo_url_re = re.compile('zeo:/*(?P<host>[A-Za-z0-9\.-]+):(?P<port>[0-9]+)')
+
+def convertAddresses(s):
+ # Allow multiple addresses using semicolons as a split character.
+ res = []
+ for a in s.split(';'):
+ a = a.strip()
+ if a:
+ mo = zeo_url_re.match(a)
+ if mo is not None:
+ # ZEO URL
+ host, port = mo.groups()
+ res.append((host, int(port)))
+ else:
+ # Socket file
+ res.append(a)
+ return res
+
+
+def convertClientStorageArgs(addr=None, **kw):
+ if addr is None:
+ raise RuntimeError, 'An addr parameter is required for ClientStorage.'
+ kw['addr'] = convertAddresses(addr)
+
+ # Integer args
+ for name in (
+ 'cache_size', 'min_disconnect_poll', 'max_disconnect_poll',
+ ):
+ if kw.has_key(name):
+ kw[name] = int(kw[name])
+
+ # Boolean args
+ for name in (
+ 'wait', 'read_only', 'read_only_fallback',
+ ):
+ if kw.has_key(name):
+ kw[name] = asBoolean(kw[name])
+
+ # The 'client' parameter must be None to be false. Yuck.
+ if kw.has_key('client') and not kw['client']:
+ kw['client'] = None
+
+ return kw
+
+
+def convertBDBStorageArgs(**kw):
+ from BDBStorage.BerkeleyBase import BerkeleyConfig
+ config = BerkeleyConfig()
+ for name in dir(BerkeleyConfig):
+ if name.startswith('_'):
+ continue
+ val = kw.get(name)
+ if val is not None:
+ if name != 'logdir':
+ val = int(val)
+ setattr(config, name, val)
+ del kw[name]
+ # XXX: Nobody ever passes in env
+ assert not kw.has_key('env')
+ kw['config'] = config
+ return kw
+
+
+storage_types = {
+ 'FileStorage': ('ZODB.FileStorage', convertFileStorageArgs),
+ 'DemoStorage': ('ZODB.DemoStorage', None),
+ 'MappingStorage': ('ZODB.MappingStorage', None),
+ 'TemporaryStorage': ('Products.TemporaryFolder.TemporaryStorage', None),
+ 'ClientStorage': ('ZEO.ClientStorage', convertClientStorageArgs),
+ 'BDBFullStorage': ('BDBStorage.BDBFullStorage', convertBDBStorageArgs),
+ 'BDBMinimalStorage': ('BDBStorage.BDBMinimalStorage',
+ convertBDBStorageArgs),
+ }