[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