Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Z
ZODB
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Nicolas Wavrant
ZODB
Commits
61a3376b
Commit
61a3376b
authored
Apr 09, 2004
by
Gintautas Miliauskas
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Harmless stuff: fixed several typos and removed trailing whitespace in a few
places.
parent
293a358c
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
52 additions
and
52 deletions
+52
-52
src/ZODB/Connection.py
src/ZODB/Connection.py
+20
-19
src/ZODB/serialize.py
src/ZODB/serialize.py
+8
-8
src/ZODB/tests/testConnection.py
src/ZODB/tests/testConnection.py
+24
-25
No files found.
src/ZODB/Connection.py
View file @
61a3376b
...
@@ -13,7 +13,7 @@
...
@@ -13,7 +13,7 @@
##############################################################################
##############################################################################
"""Database connection support
"""Database connection support
$Id: Connection.py,v 1.14
5 2004/04/08 18:12:25 tim_one
Exp $"""
$Id: Connection.py,v 1.14
6 2004/04/09 11:11:32 gintautasm
Exp $"""
import
logging
import
logging
import
sys
import
sys
...
@@ -60,7 +60,7 @@ class Connection(ExportImport, object):
...
@@ -60,7 +60,7 @@ class Connection(ExportImport, object):
Connection that loaded them. When a transaction commits, it uses
Connection that loaded them. When a transaction commits, it uses
the Connection to store modified objects.
the Connection to store modified objects.
T
he t
ypical use of ZODB is for each thread to have its own
Typical use of ZODB is for each thread to have its own
Connection and that no thread should have more than one Connection
Connection and that no thread should have more than one Connection
to the same database. A thread is associated with a Connection by
to the same database. A thread is associated with a Connection by
loading objects from that Connection. Objects loaded by one
loading objects from that Connection. Objects loaded by one
...
@@ -168,7 +168,7 @@ class Connection(ExportImport, object):
...
@@ -168,7 +168,7 @@ class Connection(ExportImport, object):
# the lock must be held when reading _invalidated.
# the lock must be held when reading _invalidated.
# XXX It sucks that we have to hold the lock to read
# XXX It sucks that we have to hold the lock to read
# _invalidated. Normally, _invalidated is written by call
# _invalidated. Normally, _invalidated is written by call
ing
# dict.update, which will execute atomically by virtue of the
# dict.update, which will execute atomically by virtue of the
# GIL. But some storage might generate oids where hash or
# GIL. But some storage might generate oids where hash or
# compare invokes Python code. In that case, the GIL can't
# compare invokes Python code. In that case, the GIL can't
...
@@ -200,8 +200,8 @@ class Connection(ExportImport, object):
...
@@ -200,8 +200,8 @@ class Connection(ExportImport, object):
def
setLocalTransaction
(
self
):
def
setLocalTransaction
(
self
):
"""Use a transaction bound to the connection rather than the thread"""
"""Use a transaction bound to the connection rather than the thread"""
# XXX mark this method as dep
crecated? note that it's
# XXX mark this method as dep
recated?
#
signature changed?
#
Note that its signature has changed.
if
self
.
_txn_mgr
is
transaction
:
if
self
.
_txn_mgr
is
transaction
:
self
.
_txn_mgr
=
transaction
.
TransactionManager
()
self
.
_txn_mgr
=
transaction
.
TransactionManager
()
...
@@ -277,9 +277,9 @@ class Connection(ExportImport, object):
...
@@ -277,9 +277,9 @@ class Connection(ExportImport, object):
"""Add a new object 'obj' to the database and assign it an oid.
"""Add a new object 'obj' to the database and assign it an oid.
A persistent object is normally added to the database and
A persistent object is normally added to the database and
assigned an oid when it becomes reachable an object already in
assigned an oid when it becomes reachable
to
an object already in
the database. In some cases, it is useful to create a new
the database. In some cases, it is useful to create a new
object and use
s
its oid (_p_oid) in a single transaction.
object and use its oid (_p_oid) in a single transaction.
This method assigns a new oid regardless of whether the object
This method assigns a new oid regardless of whether the object
is reachable.
is reachable.
...
@@ -357,7 +357,7 @@ class Connection(ExportImport, object):
...
@@ -357,7 +357,7 @@ class Connection(ExportImport, object):
self
.
_db
.
classFactory
)
self
.
_db
.
classFactory
)
def
_resetCache
(
self
):
def
_resetCache
(
self
):
"""Creates a new cache, discarding the old.
"""Creates a new cache, discarding the old
one
.
See the docstring for the resetCaches() function.
See the docstring for the resetCaches() function.
"""
"""
...
@@ -509,9 +509,9 @@ class Connection(ExportImport, object):
...
@@ -509,9 +509,9 @@ class Connection(ExportImport, object):
serial
=
getattr
(
obj
,
"_p_serial"
,
z64
)
serial
=
getattr
(
obj
,
"_p_serial"
,
z64
)
if
serial
==
z64
:
if
serial
==
z64
:
# new object
#
obj is a
new object
self
.
_creating
.
append
(
oid
)
self
.
_creating
.
append
(
oid
)
#
If this object was added, it is now in _creating, so
can
#
Because obj was added, it is now in _creating, so it
can
# be removed from _added.
# be removed from _added.
self
.
_added
.
pop
(
oid
,
None
)
self
.
_added
.
pop
(
oid
,
None
)
else
:
else
:
...
@@ -528,7 +528,7 @@ class Connection(ExportImport, object):
...
@@ -528,7 +528,7 @@ class Connection(ExportImport, object):
try
:
try
:
self
.
_cache
[
oid
]
=
obj
self
.
_cache
[
oid
]
=
obj
except
:
except
:
# Dang, I bet its wrapped:
# Dang, I bet it
'
s wrapped:
if
hasattr
(
obj
,
'aq_base'
):
if
hasattr
(
obj
,
'aq_base'
):
self
.
_cache
[
oid
]
=
obj
.
aq_base
self
.
_cache
[
oid
]
=
obj
.
aq_base
else
:
else
:
...
@@ -538,7 +538,7 @@ class Connection(ExportImport, object):
...
@@ -538,7 +538,7 @@ class Connection(ExportImport, object):
self
.
_added_during_commit
=
None
self
.
_added_during_commit
=
None
def
commit_sub
(
self
,
t
):
def
commit_sub
(
self
,
t
):
"""Commit all work done in all subtransactions for this transaction"""
"""Commit all work done in all subtransactions for this transaction
.
"""
if
self
.
_tmp
is
None
:
if
self
.
_tmp
is
None
:
return
return
src
=
self
.
_storage
src
=
self
.
_storage
...
@@ -559,7 +559,7 @@ class Connection(ExportImport, object):
...
@@ -559,7 +559,7 @@ class Connection(ExportImport, object):
self
.
_handle_serial
(
s
,
oid
,
change
=
False
)
self
.
_handle_serial
(
s
,
oid
,
change
=
False
)
def
abort_sub
(
self
,
t
):
def
abort_sub
(
self
,
t
):
"""Abort work done in all subtransactions for this transaction"""
"""Abort work done in all subtransactions for this transaction
.
"""
if
self
.
_tmp
is
None
:
if
self
.
_tmp
is
None
:
return
return
src
=
self
.
_storage
src
=
self
.
_storage
...
@@ -708,6 +708,7 @@ class Connection(ExportImport, object):
...
@@ -708,6 +708,7 @@ class Connection(ExportImport, object):
# There is a harmless data race with self._invalidated. A
# There is a harmless data race with self._invalidated. A
# dict update could go on in another thread, but we don't care
# dict update could go on in another thread, but we don't care
# because we have to check again after the load anyway.
# because we have to check again after the load anyway.
if
(
obj
.
_p_oid
in
self
.
_invalidated
if
(
obj
.
_p_oid
in
self
.
_invalidated
and
not
myhasattr
(
obj
,
"_p_independent"
)):
and
not
myhasattr
(
obj
,
"_p_independent"
)):
# If the object has _p_independent(), we will handle it below.
# If the object has _p_independent(), we will handle it below.
...
@@ -787,7 +788,7 @@ class Connection(ExportImport, object):
...
@@ -787,7 +788,7 @@ class Connection(ExportImport, object):
def
oldstate
(
self
,
obj
,
tid
):
def
oldstate
(
self
,
obj
,
tid
):
"""Return copy of obj that was written by tid.
"""Return copy of obj that was written by tid.
XXX The returned object does not have the typical metdata
XXX The returned object does not have the typical met
a
data
(_p_jar, _p_oid, _p_serial) set. I'm not sure how references
(_p_jar, _p_oid, _p_serial) set. I'm not sure how references
to other peristent objects are handled.
to other peristent objects are handled.
...
@@ -899,12 +900,12 @@ class Connection(ExportImport, object):
...
@@ -899,12 +900,12 @@ class Connection(ExportImport, object):
del
obj
.
_p_changed
# transition from changed to ghost
del
obj
.
_p_changed
# transition from changed to ghost
else
:
else
:
if
change
:
if
change
:
obj
.
_p_changed
=
0
# trans
. from changed to upto
date
obj
.
_p_changed
=
0
# trans
ition from changed to up-to-
date
obj
.
_p_serial
=
serial
obj
.
_p_serial
=
serial
def
tpc_finish
(
self
,
transaction
):
def
tpc_finish
(
self
,
transaction
):
# It's important that the storage call the function we pass
# It's important that the storage call
s
the function we pass
# while it still has it
'
s lock. We don't want another thread
# while it still has its lock. We don't want another thread
# to be able to read any updated data until we've had a chance
# to be able to read any updated data until we've had a chance
# to send an invalidation message to all of the other
# to send an invalidation message to all of the other
# connections!
# connections!
...
@@ -939,10 +940,10 @@ class Connection(ExportImport, object):
...
@@ -939,10 +940,10 @@ class Connection(ExportImport, object):
def
setDebugInfo
(
self
,
*
args
):
def
setDebugInfo
(
self
,
*
args
):
self
.
_debug_info
=
self
.
_debug_info
+
args
self
.
_debug_info
=
self
.
_debug_info
+
args
def
getTransferCounts
(
self
,
clear
=
0
):
def
getTransferCounts
(
self
,
clear
=
False
):
"""Returns the number of objects loaded and stored.
"""Returns the number of objects loaded and stored.
Set the clear argument to
reset the counters.
If clear is True,
reset the counters.
"""
"""
res
=
self
.
_load_count
,
self
.
_store_count
res
=
self
.
_load_count
,
self
.
_store_count
if
clear
:
if
clear
:
...
...
src/ZODB/serialize.py
View file @
61a3376b
...
@@ -154,7 +154,7 @@ class BaseObjectWriter:
...
@@ -154,7 +154,7 @@ class BaseObjectWriter:
>>> bob._p_jar is jar
>>> bob._p_jar is jar
True
True
If the object already has a persistent id,
it
is not changed:
If the object already has a persistent id,
the id
is not changed:
>>> bob._p_oid = 24
>>> bob._p_oid = 24
>>> oid, cls = writer.persistent_id(bob)
>>> oid, cls = writer.persistent_id(bob)
...
@@ -173,7 +173,7 @@ class BaseObjectWriter:
...
@@ -173,7 +173,7 @@ class BaseObjectWriter:
"""foreign database connection
"""foreign database connection
Constructor arguments used by __new__(), as returned by
Constructor arguments used by __new__(), as returned by
__getnewargs__(), can affect memory allocation, but
also may
__getnewargs__(), can affect memory allocation, but
may also
change over the life of the object. This makes it useless to
change over the life of the object. This makes it useless to
cache even the object's class.
cache even the object's class.
...
@@ -210,7 +210,7 @@ class BaseObjectWriter:
...
@@ -210,7 +210,7 @@ class BaseObjectWriter:
# Not persistent, pickle normally
# Not persistent, pickle normally
return
None
return
None
# Any persistent object m
osy
have an oid:
# Any persistent object m
ust
have an oid:
try
:
try
:
oid
=
obj
.
_p_oid
oid
=
obj
.
_p_oid
except
AttributeError
:
except
AttributeError
:
...
@@ -237,10 +237,10 @@ class BaseObjectWriter:
...
@@ -237,10 +237,10 @@ class BaseObjectWriter:
if
oid
is
None
:
if
oid
is
None
:
# Here we are causing the object to be saved in
# Here we are causing the object to be saved in
# the database. One could argue that we shouldn't
# the database. One could argue that we shouldn't
# do this, because a wekref should not cause an object
# do this, because a we
a
kref should not cause an object
# to be added. We'll be optimistic, though, and
# to be added. We'll be optimistic, though, and
# assume that the object will be added eventually.
# assume that the object will be added eventually.
oid
=
self
.
_jar
.
new_oid
()
oid
=
self
.
_jar
.
new_oid
()
obj
.
_p_jar
=
self
.
_jar
obj
.
_p_jar
=
self
.
_jar
obj
.
_p_oid
=
oid
obj
.
_p_oid
=
oid
...
@@ -275,7 +275,7 @@ class BaseObjectWriter:
...
@@ -275,7 +275,7 @@ class BaseObjectWriter:
def
serialize
(
self
,
obj
):
def
serialize
(
self
,
obj
):
# We don't use __class__ here, because obj could be a persistent proxy.
# We don't use __class__ here, because obj could be a persistent proxy.
# We don't want to be fo
l
led by proxies.
# We don't want to be fo
o
led by proxies.
klass
=
type
(
obj
)
klass
=
type
(
obj
)
newargs
=
getattr
(
obj
,
"__getnewargs__"
,
None
)
newargs
=
getattr
(
obj
,
"__getnewargs__"
,
None
)
...
@@ -375,7 +375,7 @@ class BaseObjectReader:
...
@@ -375,7 +375,7 @@ class BaseObjectReader:
if
args
is
None
:
if
args
is
None
:
args
=
()
args
=
()
else
:
else
:
# Defin
a
tely new style direct class reference
# Defin
i
tely new style direct class reference
args
=
()
args
=
()
if
issubclass
(
klass
,
Broken
):
if
issubclass
(
klass
,
Broken
):
...
@@ -527,7 +527,7 @@ def referencesf(p, rootl=None):
...
@@ -527,7 +527,7 @@ def referencesf(p, rootl=None):
# tuples, so that we wrap oids that are lists or tuples in
# tuples, so that we wrap oids that are lists or tuples in
# tuples.
# tuples.
#
#
# - oids may *not* be
f
alse. I'm not sure why.
# - oids may *not* be
F
alse. I'm not sure why.
out
=
[]
out
=
[]
for
v
in
rootl
:
for
v
in
rootl
:
...
...
src/ZODB/tests/testConnection.py
View file @
61a3376b
...
@@ -50,7 +50,7 @@ class ConnectionDotAdd(unittest.TestCase):
...
@@ -50,7 +50,7 @@ class ConnectionDotAdd(unittest.TestCase):
self
.
datamgr
.
add
(
obj
)
self
.
datamgr
.
add
(
obj
)
self
.
assertEqual
(
obj
.
_p_oid
,
oid
)
self
.
assertEqual
(
obj
.
_p_oid
,
oid
)
# Cannot add an object from a diff
r
erent connection.
# Cannot add an object from a different connection.
obj2
=
StubObject
()
obj2
=
StubObject
()
obj2
.
_p_jar
=
object
()
obj2
.
_p_jar
=
object
()
self
.
assertRaises
(
InvalidObjectReference
,
self
.
datamgr
.
add
,
obj2
)
self
.
assertRaises
(
InvalidObjectReference
,
self
.
datamgr
.
add
,
obj2
)
...
@@ -71,10 +71,11 @@ class ConnectionDotAdd(unittest.TestCase):
...
@@ -71,10 +71,11 @@ class ConnectionDotAdd(unittest.TestCase):
self
.
datamgr
.
add
(
obj
)
self
.
datamgr
.
add
(
obj
)
oid
=
obj
.
_p_oid
oid
=
obj
.
_p_oid
#
This case simulates when an error occurred committing some other
#
Simulate an error while committing some other object.
# object, so tpc_abort is called, clearing everything.
self
.
datamgr
.
tpc_begin
(
self
.
transaction
)
self
.
datamgr
.
tpc_begin
(
self
.
transaction
)
# Let's pretend something bad happens here.
# Let's pretend something bad happens here.
# Call tpc_abort, clearing everything.
self
.
datamgr
.
tpc_abort
(
self
.
transaction
)
self
.
datamgr
.
tpc_abort
(
self
.
transaction
)
self
.
assert_
(
obj
.
_p_oid
is
None
)
self
.
assert_
(
obj
.
_p_oid
is
None
)
self
.
assert_
(
obj
.
_p_jar
is
None
)
self
.
assert_
(
obj
.
_p_jar
is
None
)
...
@@ -114,7 +115,7 @@ class ConnectionDotAdd(unittest.TestCase):
...
@@ -114,7 +115,7 @@ class ConnectionDotAdd(unittest.TestCase):
def
checkModifyOnGetstate
(
self
):
def
checkModifyOnGetstate
(
self
):
subobj
=
StubObject
()
subobj
=
StubObject
()
obj
=
ModifyOnGetStateObject
(
subobj
)
obj
=
ModifyOnGetStateObject
(
subobj
)
self
.
datamgr
.
tpc_begin
(
self
.
transaction
)
self
.
datamgr
.
tpc_begin
(
self
.
transaction
)
self
.
datamgr
.
commit
(
obj
,
self
.
transaction
)
self
.
datamgr
.
commit
(
obj
,
self
.
transaction
)
self
.
datamgr
.
tpc_finish
(
self
.
transaction
)
self
.
datamgr
.
tpc_finish
(
self
.
transaction
)
...
@@ -135,7 +136,7 @@ class ConnectionDotAdd(unittest.TestCase):
...
@@ -135,7 +136,7 @@ class ConnectionDotAdd(unittest.TestCase):
class
UserMethodTests
(
unittest
.
TestCase
):
class
UserMethodTests
(
unittest
.
TestCase
):
# XXX add isn't tested here, because there are
a
bunch of traditional
# XXX add isn't tested here, because there are
is
bunch of traditional
# unit tests for it.
# unit tests for it.
# XXX the version tests would require a storage that supports versions
# XXX the version tests would require a storage that supports versions
...
@@ -147,7 +148,7 @@ class UserMethodTests(unittest.TestCase):
...
@@ -147,7 +148,7 @@ class UserMethodTests(unittest.TestCase):
The root() method is simple, and the tests are pretty minimal.
The root() method is simple, and the tests are pretty minimal.
Ensure that a new database has a root and that it is a
Ensure that a new database has a root and that it is a
PersistentMapping.
PersistentMapping.
>>> db = databaseFromString("<zodb>\n<mappingstorage/>\n</zodb>")
>>> db = databaseFromString("<zodb>\n<mappingstorage/>\n</zodb>")
>>> cn = db.open()
>>> cn = db.open()
>>> root = cn.root()
>>> root = cn.root()
...
@@ -173,12 +174,12 @@ class UserMethodTests(unittest.TestCase):
...
@@ -173,12 +174,12 @@ class UserMethodTests(unittest.TestCase):
'\x00\x00\x00\x00\x00\x00\x00\x00'
'\x00\x00\x00\x00\x00\x00\x00\x00'
The object is a ghost.
The object is a ghost.
>>> obj._p_state
>>> obj._p_state
-1
-1
And multiple calls with the same oid, return the same object.
And multiple calls with the same oid, return the same object.
>>> obj2 = cn.get(p64(0))
>>> obj2 = cn.get(p64(0))
>>> obj is obj2
>>> obj is obj2
True
True
...
@@ -187,7 +188,7 @@ class UserMethodTests(unittest.TestCase):
...
@@ -187,7 +188,7 @@ class UserMethodTests(unittest.TestCase):
object will be returned. The cache doesn't keep unreferenced
object will be returned. The cache doesn't keep unreferenced
ghosts alive. (The next object returned my still have the
ghosts alive. (The next object returned my still have the
same id, because Python may re-use the same memory.)
same id, because Python may re-use the same memory.)
>>> del obj, obj2
>>> del obj, obj2
>>> cn._cache.get(p64(0), None)
>>> cn._cache.get(p64(0), None)
...
@@ -217,8 +218,8 @@ class UserMethodTests(unittest.TestCase):
...
@@ -217,8 +218,8 @@ class UserMethodTests(unittest.TestCase):
r"""doctest of close() method
r"""doctest of close() method
This is a minimal test, because most of the interesting
This is a minimal test, because most of the interesting
effects on closing a connection involve
d its interaction
the
effects on closing a connection involve
its interaction with
the
database and transaction.
database and t
he t
ransaction.
>>> db = databaseFromString("<zodb>\n<mappingstorage/>\n</zodb>")
>>> db = databaseFromString("<zodb>\n<mappingstorage/>\n</zodb>")
>>> cn = db.open()
>>> cn = db.open()
...
@@ -228,9 +229,8 @@ class UserMethodTests(unittest.TestCase):
...
@@ -228,9 +229,8 @@ class UserMethodTests(unittest.TestCase):
>>> cn.close()
>>> cn.close()
>>> cn.close()
>>> cn.close()
It's not possible to load or store objects once the storage is
It's not possible to load or store objects once the storage is closed.
closed.
>>> cn.get(p64(0))
>>> cn.get(p64(0))
Traceback (most recent call last):
Traceback (most recent call last):
...
...
...
@@ -270,7 +270,7 @@ class UserMethodTests(unittest.TestCase):
...
@@ -270,7 +270,7 @@ class UserMethodTests(unittest.TestCase):
The implementation keeps a list of callbacks that is reset
The implementation keeps a list of callbacks that is reset
to a class variable (which is bound to None) after the connection
to a class variable (which is bound to None) after the connection
is closed.
is closed.
>>> cn._Connection__onCloseCallbacks
>>> cn._Connection__onCloseCallbacks
"""
"""
...
@@ -299,7 +299,7 @@ class UserMethodTests(unittest.TestCase):
...
@@ -299,7 +299,7 @@ class UserMethodTests(unittest.TestCase):
RuntimeError: The database connection is closed
RuntimeError: The database connection is closed
An expedient way to create a read-only storage:
An expedient way to create a read-only storage:
>>> db._storage._is_read_only = True
>>> db._storage._is_read_only = True
>>> cn = db.open()
>>> cn = db.open()
>>> cn.isReadOnly()
>>> cn.isReadOnly()
...
@@ -348,9 +348,9 @@ class UserMethodTests(unittest.TestCase):
...
@@ -348,9 +348,9 @@ class UserMethodTests(unittest.TestCase):
warnings, one from the Connection and one from the
warnings, one from the Connection and one from the
cPickleCache. Maybe we should drop the cPickleCache warning,
cPickleCache. Maybe we should drop the cPickleCache warning,
but it's there for now. When passed an argument, it acts like
but it's there for now. When passed an argument, it acts like
cacheGC(). When t isn't passed an argument it acts like
cacheGC(). When
i
t isn't passed an argument it acts like
cacheMinimize().
cacheMinimize().
>>> r._p_activate()
>>> r._p_activate()
>>> cn.cacheFullSweep(12)
>>> cn.cacheFullSweep(12)
>>> r._p_state
>>> r._p_state
...
@@ -368,11 +368,10 @@ class UserMethodTests(unittest.TestCase):
...
@@ -368,11 +368,10 @@ class UserMethodTests(unittest.TestCase):
>>> category.__name__
>>> category.__name__
'DeprecationWarning'
'DeprecationWarning'
We have to uninstall the hook so that other warnings don't get
We have to uninstall the hook so that other warnings don't get lost.
lost.
>>> hook.uninstall()
>>> hook.uninstall()
"""
"""
class
InvalidationTests
(
unittest
.
TestCase
):
class
InvalidationTests
(
unittest
.
TestCase
):
...
@@ -408,7 +407,7 @@ class InvalidationTests(unittest.TestCase):
...
@@ -408,7 +407,7 @@ class InvalidationTests(unittest.TestCase):
True
True
>>> p2._p_oid in cn._invalidated
>>> p2._p_oid in cn._invalidated
False
False
>>> cn.invalidate(p64(10), {p2._p_oid: 1, p64(76): 1})
>>> cn.invalidate(p64(10), {p2._p_oid: 1, p64(76): 1})
>>> cn._txn_time
>>> cn._txn_time
'\x00\x00\x00\x00\x00\x00\x00\x01'
'\x00\x00\x00\x00\x00\x00\x00\x01'
...
@@ -419,7 +418,7 @@ class InvalidationTests(unittest.TestCase):
...
@@ -419,7 +418,7 @@ class InvalidationTests(unittest.TestCase):
Calling invalidate() doesn't affect the object state until
Calling invalidate() doesn't affect the object state until
a transaction boundary.
a transaction boundary.
>>> p1._p_state
>>> p1._p_state
0
0
>>> p2._p_state
>>> p2._p_state
...
@@ -439,7 +438,7 @@ class InvalidationTests(unittest.TestCase):
...
@@ -439,7 +438,7 @@ class InvalidationTests(unittest.TestCase):
0
0
>>> cn._invalidated
>>> cn._invalidated
{}
{}
"""
"""
# ---- stubs
# ---- stubs
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment