[Checkins] SVN: relstorage/trunk/relstorage/adapters/ Re-enabled the MySQL-specific pack optimizations and stubbed the history free object mover.

Shane Hathaway shane at hathawaymix.org
Thu Sep 24 14:46:07 EDT 2009


Log message for revision 104507:
  Re-enabled the MySQL-specific pack optimizations and stubbed the history free object mover.
  

Changed:
  A   relstorage/trunk/relstorage/adapters/hfmover.py
  U   relstorage/trunk/relstorage/adapters/hpmover.py
  U   relstorage/trunk/relstorage/adapters/mysql.py
  U   relstorage/trunk/relstorage/adapters/packundo.py

-=-
Added: relstorage/trunk/relstorage/adapters/hfmover.py
===================================================================
--- relstorage/trunk/relstorage/adapters/hfmover.py	                        (rev 0)
+++ relstorage/trunk/relstorage/adapters/hfmover.py	2009-09-24 18:46:07 UTC (rev 104507)
@@ -0,0 +1,55 @@
+##############################################################################
+#
+# Copyright (c) 2009 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.
+#
+##############################################################################
+"""History-free IObjectMover implementation.
+"""
+
+from base64 import decodestring
+from base64 import encodestring
+from relstorage.adapters.interfaces import IObjectMover
+from ZODB.POSException import StorageError
+from zope.interface import implements
+
+
+class HistoryFreeObjectMover(object):
+    implements(IObjectMover)
+
+    _method_names = (
+        'get_current_tid',
+        'load_current',
+        'load_revision',
+        'exists',
+        'load_before',
+        'get_object_tid_after',
+        'on_store_opened',
+        'store_temp',
+        'replace_temp',
+        'restore',
+        'detect_conflict',
+        'move_from_temp',
+        'update_current',
+        )
+
+    def __init__(self, database_name, runner=None,
+            Binary=None, inputsize_BLOB=None, inputsize_BINARY=None):
+        # The inputsize parameters are for Oracle only.
+        self.database_name = database_name
+        self.runner = runner
+        self.Binary = Binary
+        self.inputsize_BLOB = inputsize_BLOB
+        self.inputsize_BINARY = inputsize_BINARY
+
+        for method_name in self._method_names:
+            method = getattr(self, '%s_%s' % (database_name, method_name))
+            setattr(self, method_name, method)
+

Modified: relstorage/trunk/relstorage/adapters/hpmover.py
===================================================================
--- relstorage/trunk/relstorage/adapters/hpmover.py	2009-09-24 18:45:53 UTC (rev 104506)
+++ relstorage/trunk/relstorage/adapters/hpmover.py	2009-09-24 18:46:07 UTC (rev 104507)
@@ -34,13 +34,6 @@
         return None
 
 
-def for_databases(*database_names):
-    def decorate(f):
-        f._for_databases = database_names
-        return f
-    return decorate
-
-
 class HistoryPreservingObjectMover(object):
     implements(IObjectMover)
 

Modified: relstorage/trunk/relstorage/adapters/mysql.py
===================================================================
--- relstorage/trunk/relstorage/adapters/mysql.py	2009-09-24 18:45:53 UTC (rev 104506)
+++ relstorage/trunk/relstorage/adapters/mysql.py	2009-09-24 18:46:07 UTC (rev 104507)
@@ -53,12 +53,15 @@
 from zope.interface import implements
 
 from relstorage.adapters.connmanager import AbstractConnectionManager
+from relstorage.adapters.dbiter import HistoryFreeDatabaseIterator
 from relstorage.adapters.dbiter import HistoryPreservingDatabaseIterator
+from relstorage.adapters.hfmover import HistoryFreeObjectMover
 from relstorage.adapters.hpmover import HistoryPreservingObjectMover
 from relstorage.adapters.interfaces import IRelStorageAdapter
 from relstorage.adapters.locker import MySQLLocker
 from relstorage.adapters.oidallocator import MySQLOIDAllocator
-from relstorage.adapters.packundo import HistoryPreservingPackUndo
+from relstorage.adapters.packundo import HistoryFreePackUndo
+from relstorage.adapters.packundo import MySQLHistoryPreservingPackUndo
 from relstorage.adapters.poller import Poller
 from relstorage.adapters.schema import MySQLSchemaInstaller
 from relstorage.adapters.scriptrunner import ScriptRunner
@@ -80,9 +83,8 @@
     """MySQL adapter for RelStorage."""
     implements(IRelStorageAdapter)
 
-    keep_history = True
-
-    def __init__(self, **params):
+    def __init__(self, keep_history=True, **params):
+        self.keep_history = keep_history
         self.connmanager = MySQLdbConnectionManager(params)
         self.runner = ScriptRunner()
         self.locker = MySQLLocker((MySQLdb.DatabaseError,))
@@ -91,11 +93,18 @@
             runner=self.runner,
             keep_history=self.keep_history,
             )
-        self.mover = HistoryPreservingObjectMover(
-            database_name='mysql',
-            runner=self.runner,
-            Binary=MySQLdb.Binary,
-            )
+        if self.keep_history:
+            self.mover = HistoryPreservingObjectMover(
+                database_name='mysql',
+                runner=self.runner,
+                Binary=MySQLdb.Binary,
+                )
+        else:
+            self.mover = HistoryFreeObjectMover(
+                database_name='mysql',
+                runner=self.runner,
+                Binary=MySQLdb.Binary,
+                )
         self.connmanager.set_on_store_opened(self.mover.on_store_opened)
         self.oidallocator = MySQLOIDAllocator()
         self.txncontrol = MySQLTransactionControl(
@@ -106,14 +115,24 @@
             keep_history=self.keep_history,
             runner=self.runner,
             )
-        self.packundo = HistoryPreservingPackUndo(
-            connmanager=self.connmanager,
-            runner=self.runner,
-            locker=self.locker,
-            )
-        self.dbiter = HistoryPreservingDatabaseIterator(
-            runner=self.runner,
-            )
+        if self.keep_history:
+            self.packundo = MySQLHistoryPreservingPackUndo(
+                connmanager=self.connmanager,
+                runner=self.runner,
+                locker=self.locker,
+                )
+            self.dbiter = HistoryPreservingDatabaseIterator(
+                runner=self.runner,
+                )
+        else:
+            self.packundo = HistoryFreePackUndo(
+                connmanager=self.connmanager,
+                runner=self.runner,
+                locker=self.locker,
+                )
+            self.dbiter = HistoryFreeDatabaseIterator(
+                runner=self.runner,
+                )
         self.stats = MySQLStats(
             connmanager=self.connmanager,
             )

Modified: relstorage/trunk/relstorage/adapters/packundo.py
===================================================================
--- relstorage/trunk/relstorage/adapters/packundo.py	2009-09-24 18:45:53 UTC (rev 104506)
+++ relstorage/trunk/relstorage/adapters/packundo.py	2009-09-24 18:46:07 UTC (rev 104507)
@@ -98,24 +98,13 @@
                         "object %d in transaction %d; state length = %d" % (
                         from_oid, tid, len(state)))
                     raise
-                if self.keep_history:
-                    for to_oid in to_oids:
-                        add_rows.append((from_oid, tid, to_oid))
-                else:
-                    for to_oid in to_oids:
-                        add_rows.append((from_oid, to_oid))
+                for to_oid in to_oids:
+                    add_rows.append((from_oid, tid, to_oid))
 
-        if self.keep_history:
+        if not self.keep_history:
             stmt = """
-            INSERT INTO object_ref (zoid, tid, to_zoid)
-            VALUES (%s, %s, %s)
-            """
-            self.runner.run_many(cursor, stmt, add_rows)
-
-        else:
-            stmt = """
             DELETE FROM object_ref
-            WHERE zoid in (
+            WHERE tid in (
                 SELECT zoid
                 FROM object_state
                 WHERE tid = %(tid)s
@@ -123,11 +112,11 @@
             """
             self.runner.run_script(cursor, stmt, {'tid': tid})
 
-            stmt = """
-            INSERT INTO object_ref (zoid, to_zoid)
-            VALUES (%s, %s)
-            """
-            self.runner.run_many(cursor, stmt, add_rows)
+        stmt = """
+        INSERT INTO object_ref (zoid, tid, to_zoid)
+        VALUES (%s, %s, %s)
+        """
+        self.runner.run_many(cursor, stmt, add_rows)
 
         # The references have been computed for this transaction.
         stmt = """
@@ -1027,7 +1016,7 @@
             self.connmanager.close(conn, cursor)
 
 
-    def _pack_cleaup(self, conn, cursor):
+    def _pack_cleanup(self, conn, cursor):
         # commit the work done so far
         conn.commit()
         self.locker.release_commit_lock(cursor)



More information about the checkins mailing list