[Checkins] SVN: relstorage/trunk/relstorage/ Added the new_instance() method to adapters, making it possible to
Shane Hathaway
shane at hathawaymix.org
Thu Oct 1 04:17:40 EDT 2009
Log message for revision 104668:
Added the new_instance() method to adapters, making it possible to
write an adapter that holds mutable state.
Also provide more adapter info in the default storage name.
Changed:
U relstorage/trunk/relstorage/adapters/interfaces.py
U relstorage/trunk/relstorage/adapters/mysql.py
U relstorage/trunk/relstorage/adapters/oracle.py
U relstorage/trunk/relstorage/adapters/postgresql.py
U relstorage/trunk/relstorage/storage.py
-=-
Modified: relstorage/trunk/relstorage/adapters/interfaces.py
===================================================================
--- relstorage/trunk/relstorage/adapters/interfaces.py 2009-10-01 07:31:16 UTC (rev 104667)
+++ relstorage/trunk/relstorage/adapters/interfaces.py 2009-10-01 08:17:40 UTC (rev 104668)
@@ -32,7 +32,17 @@
stats = Attribute("An IStats")
txncontrol = Attribute("An ITransactionControl")
+ def new_instance(self):
+ """Return an instance for use by another RelStorage instance.
+ Adapters that are stateless can simply return self. Adapters
+ that have mutable state must make a clone and return it.
+ """
+
+ def __str__(self):
+ """A short description of the adapter"""
+
+
class IConnectionManager(Interface):
"""Open and close database connections"""
Modified: relstorage/trunk/relstorage/adapters/mysql.py
===================================================================
--- relstorage/trunk/relstorage/adapters/mysql.py 2009-10-01 07:31:16 UTC (rev 104667)
+++ relstorage/trunk/relstorage/adapters/mysql.py 2009-10-01 08:17:40 UTC (rev 104668)
@@ -84,6 +84,7 @@
def __init__(self, keep_history=True, **params):
self.keep_history = keep_history
+ self._params = params
self.connmanager = MySQLdbConnectionManager(params)
self.runner = ScriptRunner()
self.locker = MySQLLocker(
@@ -140,7 +141,22 @@
connmanager=self.connmanager,
)
+ def new_instance(self):
+ # This adapter and its components are stateless, so it's
+ # safe to share it between threads.
+ return self
+ def __str__(self):
+ if self.keep_history:
+ t = 'history preserving'
+ else:
+ t = 'history free'
+ p = self._params.copy()
+ if 'passwd' in p:
+ del p['passwd']
+ return "%s, %s, %r" % (self.__class__.__name__, t, p)
+
+
class MySQLdbConnectionManager(AbstractConnectionManager):
isolation_read_committed = "ISOLATION LEVEL READ COMMITTED"
Modified: relstorage/trunk/relstorage/adapters/oracle.py
===================================================================
--- relstorage/trunk/relstorage/adapters/oracle.py 2009-10-01 07:31:16 UTC (rev 104667)
+++ relstorage/trunk/relstorage/adapters/oracle.py 2009-10-01 08:17:40 UTC (rev 104668)
@@ -71,6 +71,8 @@
if use_inline_lobs is None:
use_inline_lobs = (cx_Oracle.version >= '5.0')
self.keep_history = keep_history
+ self._user = user
+ self._dsn = dsn
self.connmanager = CXOracleConnectionManager(
params=(user, password, dsn),
@@ -140,7 +142,20 @@
connmanager=self.connmanager,
)
+ def new_instance(self):
+ # This adapter and its components are stateless, so it's
+ # safe to share it between threads.
+ return self
+ def __str__(self):
+ if self.keep_history:
+ t = 'history preserving'
+ else:
+ t = 'history free'
+ return "%s, %s, user=%r, dsn=%r" % (
+ self.__class__.__name__, t, self._user, self._dsn)
+
+
class CXOracleScriptRunner(OracleScriptRunner):
def __init__(self, use_inline_lobs):
Modified: relstorage/trunk/relstorage/adapters/postgresql.py
===================================================================
--- relstorage/trunk/relstorage/adapters/postgresql.py 2009-10-01 07:31:16 UTC (rev 104667)
+++ relstorage/trunk/relstorage/adapters/postgresql.py 2009-10-01 08:17:40 UTC (rev 104668)
@@ -52,6 +52,7 @@
def __init__(self, dsn='', keep_history=True):
self.keep_history = keep_history
+ self._dsn = dsn
self.connmanager = Psycopg2ConnectionManager(
dsn=dsn,
keep_history=self.keep_history,
@@ -107,7 +108,21 @@
connmanager=self.connmanager,
)
+ def new_instance(self):
+ # This adapter and its components are stateless, so it's
+ # safe to share it between threads.
+ return self
+ def __str__(self):
+ if self.keep_history:
+ t = 'history preserving'
+ else:
+ t = 'history free'
+ parts = self._dsn.split()
+ s = ' '.join(p for p in parts if not p.startswith('password'))
+ return "%s, %s, dsn=%r" % (self.__class__.__name__, t, s)
+
+
class Psycopg2ConnectionManager(AbstractConnectionManager):
isolation_read_committed = (
Modified: relstorage/trunk/relstorage/storage.py
===================================================================
--- relstorage/trunk/relstorage/storage.py 2009-10-01 07:31:16 UTC (rev 104667)
+++ relstorage/trunk/relstorage/storage.py 2009-10-01 08:17:40 UTC (rev 104668)
@@ -77,7 +77,7 @@
def __init__(self, adapter, name=None, create=True,
read_only=False, options=None, **kwoptions):
if name is None:
- name = 'RelStorage on %s' % adapter.__class__.__name__
+ name = 'RelStorage: %s' % adapter
self._adapter = adapter
self._name = name
@@ -283,7 +283,8 @@
See ZODB.interfaces.IMVCCStorage.
"""
- other = RelStorage(adapter=self._adapter, name=self._name,
+ adapter = self._adapter.new_instance()
+ other = RelStorage(adapter=adapter, name=self._name,
create=False, read_only=self._is_read_only,
options=self._options)
self._instances.append(weakref.ref(other))
More information about the checkins
mailing list