[Zodb-checkins] SVN: ZODB/branches/3.3/ Merge/port checkins to ZODB
code made from Zope3.
Tim Peters
tim.one at comcast.net
Thu Aug 12 09:43:28 EDT 2004
Log message for revision 27043:
Merge/port checkins to ZODB code made from Zope3.
This includes:
r26945 | jim | 2004-08-06 18:30:44 -0400 (Fri, 06 Aug 2004) | 6 lines
M /Zope3/trunk/src/persistent/tests/test_persistent.py
M /Zope3/trunk/src/zope/event/tests.py
Updated to work with the versions of doctest from Python with versions
greater than or equal to 2.3.0 and less than 2.4.0.a2 and with
versions greater than 2.4.0a2.
r26482 | srichter | 2004-07-13 13:07:03 -0400 (Tue, 13 Jul 2004) | 2 lines
M /Zope3/trunk/src/transaction/__init__.py
M /Zope3/trunk/src/transaction/_transaction.py
M /Zope3/trunk/src/transaction/tests/test_transaction.py
Converted XXX to TODO.
r25953 | sidnei | 2004-06-23 13:14:20 -0400 (Wed, 23 Jun 2004) | 1 line
M /Zope3/trunk/src/ZODB/interfaces.py
M /Zope3/trunk/src/transaction/_transaction.py
M /Zope3/trunk/src/zope/app/rdb/__init__.py
M /Zope3/trunk/src/zope/app/rdb/tests/test_zopedbtransactionmanager.py
Add missing sortKey method to ZopeDBTransactionManager and DataManagerAdapter, and also add it to the interface.
r25330 | alga | 2004-06-10 10:07:45 -0400 (Thu, 10 Jun 2004) | 4 lines
M /Zope3/trunk/src/ZODB/Connection.py
M /Zope3/trunk/src/ZODB/interfaces.py
M /Zope3/trunk/src/ZODB/tests/testConnection.py
Added an IConnection interface declaration on ZODB Connection.
Jim says Tim Peters will be mad at him, but that's the right way to go.
r25273 | philikon | 2004-06-06 04:43:57 -0400 (Sun, 06 Jun 2004) | 4 lines
Changed paths:
M /Zope3/trunk/src/BTrees
M /Zope3/trunk/src/ZODB
M /Zope3/trunk/src/persistent
Ignore .so files.
This fix should probably be merged to the original ZODB tree.
Changed:
U ZODB/branches/3.3/README.txt
_U ZODB/branches/3.3/src/BTrees/
_U ZODB/branches/3.3/src/ZODB/
U ZODB/branches/3.3/src/ZODB/Connection.py
U ZODB/branches/3.3/src/ZODB/interfaces.py
U ZODB/branches/3.3/src/ZODB/tests/testConnection.py
_U ZODB/branches/3.3/src/persistent/
U ZODB/branches/3.3/src/persistent/tests/test_persistent.py
U ZODB/branches/3.3/src/transaction/__init__.py
U ZODB/branches/3.3/src/transaction/_transaction.py
U ZODB/branches/3.3/src/transaction/tests/test_transaction.py
-=-
Modified: ZODB/branches/3.3/README.txt
===================================================================
--- ZODB/branches/3.3/README.txt 2004-08-12 13:34:39 UTC (rev 27042)
+++ ZODB/branches/3.3/README.txt 2004-08-12 13:43:28 UTC (rev 27043)
@@ -28,7 +28,7 @@
Compatibility
-------------
-ZODB 3.3 is requires Python 2.3.4 or later.
+ZODB 3.3 requires Python 2.3.4 or later.
The Zope 2.8 release should be compatible with this version of ZODB.
Note that Zope 2.7 and higher includes ZEO, so this package should
Property changes on: ZODB/branches/3.3/src/BTrees
___________________________________________________________________
Name: svn:ignore
+ *.so
Property changes on: ZODB/branches/3.3/src/ZODB
___________________________________________________________________
Name: svn:ignore
+ *.so
Modified: ZODB/branches/3.3/src/ZODB/Connection.py
===================================================================
--- ZODB/branches/3.3/src/ZODB/Connection.py 2004-08-12 13:34:39 UTC (rev 27042)
+++ ZODB/branches/3.3/src/ZODB/Connection.py 2004-08-12 13:43:28 UTC (rev 27043)
@@ -35,6 +35,8 @@
from ZODB.TmpStore import TmpStore
from ZODB.utils import oid_repr, z64, positive_id
from ZODB.serialize import ObjectWriter, ConnectionObjectReader, myhasattr
+from ZODB.interfaces import IConnection
+from ZODB.interfaces import implements
global_reset_counter = 0
@@ -147,6 +149,7 @@
getTransferCounts
"""
+ implements(IConnection)
_tmp = None
_code_timestamp = 0
Modified: ZODB/branches/3.3/src/ZODB/interfaces.py
===================================================================
--- ZODB/branches/3.3/src/ZODB/interfaces.py 2004-08-12 13:34:39 UTC (rev 27042)
+++ ZODB/branches/3.3/src/ZODB/interfaces.py 2004-08-12 13:43:28 UTC (rev 27043)
@@ -17,7 +17,8 @@
"""
try:
- from zope.interface import Interface, Attribute
+ from zope.interface import Interface, Attribute, implements
+ from zope.interface.verify import verifyObject
except ImportError:
class Interface:
pass
@@ -27,7 +28,12 @@
self.__name__ = __name__
self.__doc__ = __doc__
+ def implements(*args):
+ pass
+ def verifyObject(*args):
+ pass
+
class IDataManager(Interface):
"""Objects that manage transactional storage.
@@ -144,7 +150,17 @@
"""
+ def sortKey():
+ """
+ Return a key to use for ordering registered DataManagers
+ ZODB uses a global sort order to prevent deadlock when it commits
+ transactions involving multiple resource managers. The resource
+ manager must define a sortKey() method that provides a global ordering
+ for resource managers.
+ """
+
+
class ITransaction(Interface):
"""Object representing a running transaction.
@@ -224,3 +240,26 @@
"""
# XXX is this this allowed to cause an exception here, during
# the two-phase commit, or can it toss data silently?
+
+
+class IConnection(Interface):
+ """ZODB connection.
+
+ XXX: This interface is incomplete.
+ """
+
+ def add(ob):
+ """Add a new object 'obj' to the database and assign it an oid.
+
+ A persistent object is normally added to the database and
+ assigned an oid when it becomes reachable to an object already in
+ the database. In some cases, it is useful to create a new
+ object and use its oid (_p_oid) in a single transaction.
+
+ This method assigns a new oid regardless of whether the object
+ is reachable.
+
+ The object is added when the transaction commits. The object
+ must implement the IPersistent interface and must not
+ already be associated with a Connection.
+ """
Modified: ZODB/branches/3.3/src/ZODB/tests/testConnection.py
===================================================================
--- ZODB/branches/3.3/src/ZODB/tests/testConnection.py 2004-08-12 13:34:39 UTC (rev 27042)
+++ ZODB/branches/3.3/src/ZODB/tests/testConnection.py 2004-08-12 13:43:28 UTC (rev 27043)
@@ -22,6 +22,7 @@
from ZODB.config import databaseFromString
from ZODB.utils import p64, u64
from ZODB.tests.warnhook import WarningsHook
+from ZODB.interfaces import verifyObject
class ConnectionDotAdd(unittest.TestCase):
@@ -595,6 +596,15 @@
return None
+class TestConnectionInterface(unittest.TestCase):
+
+ def test(self):
+ from ZODB.interfaces import IConnection
+ db = databaseFromString("<zodb>\n<mappingstorage/>\n</zodb>")
+ cn = db.open()
+ verifyObject(IConnection, cn)
+
+
class StubDatabase:
def __init__(self):
@@ -608,4 +618,5 @@
def test_suite():
s = unittest.makeSuite(ConnectionDotAdd, 'check')
s.addTest(doctest.DocTestSuite())
+ s.addTest(unittest.makeSuite(TestConnectionInterface))
return s
Property changes on: ZODB/branches/3.3/src/persistent
___________________________________________________________________
Name: svn:ignore
+ *.so
Modified: ZODB/branches/3.3/src/persistent/tests/test_persistent.py
===================================================================
--- ZODB/branches/3.3/src/persistent/tests/test_persistent.py 2004-08-12 13:34:39 UTC (rev 27042)
+++ ZODB/branches/3.3/src/persistent/tests/test_persistent.py 2004-08-12 13:43:28 UTC (rev 27043)
@@ -25,23 +25,30 @@
def inc(self):
self.x += 1
-def DocFileSuite(path, globs=None):
- # It's not entirely obvious how to connection this single string
- # with unittest. For now, re-use the _utest() function that comes
- # standard with doctest in Python 2.3. One problem is that the
- # error indicator doesn't point to the line of the doctest file
- # that failed.
- source = open(path).read()
- if globs is None:
- globs = sys._getframe(1).f_globals
- t = doctest.Tester(globs=globs)
- def runit():
- doctest._utest(t, path, source, path, 0)
- f = unittest.FunctionTestCase(runit, description="doctest from %s" % path)
- suite = unittest.TestSuite()
- suite.addTest(f)
- return suite
+try:
+ DocFileSuite = doctest.DocFileSuite # >= Python 2.4.0a2
+except AttributeError:
+ # <= Python 2.4.0a1
+ def DocFileSuite(path, globs=None):
+ # It's not entirely obvious how to connection this single string
+ # with unittest. For now, re-use the _utest() function that comes
+ # standard with doctest in Python 2.3. One problem is that the
+ # error indicator doesn't point to the line of the doctest file
+ # that failed.
+ path = os.path.join(persistent.tests.__path__[0], path)
+
+ source = open(path).read()
+ if globs is None:
+ globs = sys._getframe(1).f_globals
+ t = doctest.Tester(globs=globs)
+ def runit():
+ doctest._utest(t, path, source, path, 0)
+ f = unittest.FunctionTestCase(runit,
+ description="doctest from %s" % path)
+ suite = unittest.TestSuite()
+ suite.addTest(f)
+ return suite
+
def test_suite():
- path = os.path.join(persistent.tests.__path__[0], "persistent.txt")
- return DocFileSuite(path, {"P": P})
+ return DocFileSuite("persistent.txt", globs={"P": P})
Modified: ZODB/branches/3.3/src/transaction/__init__.py
===================================================================
--- ZODB/branches/3.3/src/transaction/__init__.py 2004-08-12 13:34:39 UTC (rev 27042)
+++ ZODB/branches/3.3/src/transaction/__init__.py 2004-08-12 13:43:28 UTC (rev 27043)
@@ -11,7 +11,11 @@
# FOR A PARTICULAR PURPOSE.
#
############################################################################
+"""Exported transaction functions.
+$Id$
+"""
+
from transaction._transaction import Transaction
from transaction._manager import TransactionManager, ThreadTransactionManager
@@ -29,5 +33,5 @@
def abort(sub=False):
manager.get().abort(sub)
-# XXX Issue deprecation warning if this variant is used?
+# TODO: Issue deprecation warning if this variant is used?
get_transaction = get
Modified: ZODB/branches/3.3/src/transaction/_transaction.py
===================================================================
--- ZODB/branches/3.3/src/transaction/_transaction.py 2004-08-12 13:34:39 UTC (rev 27042)
+++ ZODB/branches/3.3/src/transaction/_transaction.py 2004-08-12 13:43:28 UTC (rev 27043)
@@ -25,7 +25,7 @@
participate in a transaction -- register() and join(). join() takes a
resource manager and adds it to the list of resources. register() is
for backwards compatibility. It takes a persistent object and
-registers its _p_jar attribute. XXX explain adapter
+registers its _p_jar attribute. TODO: explain adapter
Subtransactions
---------------
@@ -54,7 +54,7 @@
The second argument to tpc_begin() indicates that a subtransaction
commit is beginning (if it is true). In a subtransaction, there is no
-tpc_vote() call. (XXX I don't have any idea why.) The tpc_finish()
+tpc_vote() call. (XXX: I don't have any idea why.) The tpc_finish()
or tpc_abort() call applies just to that subtransaction.
Once a resource manager is involved in a subtransaction, all
@@ -187,11 +187,11 @@
def join(self, resource):
if self.status != Status.ACTIVE:
- # XXX Should it be possible to join a committing transaction?
+ # TODO: Should it be possible to join a committing transaction?
# I think some users want it.
raise ValueError("expected txn status %r, but it's %r" % (
Status.ACTIVE, self.status))
- # XXX the prepare check is a bit of a hack, perhaps it would
+ # TODO: the prepare check is a bit of a hack, perhaps it would
# be better to use interfaces. If this is a ZODB4-style
# resource manager, it needs to be adapted, too.
if myhasattr(resource, "prepare"):
@@ -219,7 +219,7 @@
self._adapters[manager] = adapter
self.join(adapter)
else:
- # XXX comment out this expensive assert later
+ # TODO: comment out this expensive assert later
# Use id() to guard against proxies.
assert id(obj) not in map(id, adapter.objects)
adapter.objects.append(obj)
@@ -230,7 +230,7 @@
self._resources.append(adapter)
def begin(self):
- # XXX I'm not sure how this should be implemented. Not doing
+ # TODO: I'm not sure how this should be implemented. Not doing
# anything now, but my best guess is: If nothing has happened
# yet, it's fine. Otherwise, abort this transaction and let
# the txn manager create a new one.
@@ -293,8 +293,8 @@
for rm in L:
rm.tpc_finish(self)
except:
- # XXX do we need to make this warning stronger?
- # XXX It would be nice if the system could be configured
+ # TODO: do we need to make this warning stronger?
+ # TODO: It would be nice if the system could be configured
# to stop committing transactions at this point.
self.log.critical("A storage error occured during the second "
"phase of the two-phase commit. Resources "
@@ -365,8 +365,8 @@
# Merge all of _sub, _nonsub, and _resources.
d = dict(self._sub)
d.update(self._nonsub)
- # XXX I think _sub and _nonsub are disjoint, and that
- # XXX _resources is empty. If so, we can simplify this code.
+ # TODO: I think _sub and _nonsub are disjoint, and that
+ # _resources is empty. If so, we can simplify this code.
assert len(d) == len(self._sub) + len(self._nonsub)
assert not self._resources
for rm in self._resources:
@@ -430,7 +430,7 @@
def setExtendedInfo(self, name, value):
self._extension[name] = value
-# XXX We need a better name for the adapters.
+# TODO: We need a better name for the adapters.
class MultiObjectResourceAdapter(object):
"""Adapt the old-style register() call to the new-style join().
@@ -538,7 +538,7 @@
self._datamanager = datamanager
self._rollback = None
- # XXX I'm not sure why commit() doesn't do anything
+ # TODO: I'm not sure why commit() doesn't do anything
def commit(self, transaction):
pass
@@ -580,3 +580,7 @@
def tpc_vote(self, transaction):
if not self._sub:
self._datamanager.prepare(transaction)
+
+ def sortKey(self):
+ return self._datamanager.sortKey()
+
Modified: ZODB/branches/3.3/src/transaction/tests/test_transaction.py
===================================================================
--- ZODB/branches/3.3/src/transaction/tests/test_transaction.py 2004-08-12 13:34:39 UTC (rev 27042)
+++ ZODB/branches/3.3/src/transaction/tests/test_transaction.py 2004-08-12 13:43:28 UTC (rev 27043)
@@ -203,7 +203,7 @@
assert self.nosub1._p_jar.ctpc_finish == 0
assert self.nosub1._p_jar.cabort == 1
- # XXX
+ # XXX:
def BUGtestNSJSubTransactionCommitAbort(self):
"""
this reveals a bug in transaction.py
More information about the Zodb-checkins
mailing list