[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