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 @@
##############################################################################
"""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
sys
...
...
@@ -60,7 +60,7 @@ class Connection(ExportImport, object):
Connection that loaded them. When a transaction commits, it uses
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
to the same database. A thread is associated with a Connection by
loading objects from that Connection. Objects loaded by one
...
...
@@ -168,7 +168,7 @@ class Connection(ExportImport, object):
# the lock must be held when reading _invalidated.
# 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
# GIL. But some storage might generate oids where hash or
# compare invokes Python code. In that case, the GIL can't
...
...
@@ -200,8 +200,8 @@ class Connection(ExportImport, object):
def
setLocalTransaction
(
self
):
"""Use a transaction bound to the connection rather than the thread"""
# XXX mark this method as dep
crecated? note that it's
#
signature changed?
# XXX mark this method as dep
recated?
#
Note that its signature has changed.
if
self
.
_txn_mgr
is
transaction
:
self
.
_txn_mgr
=
transaction
.
TransactionManager
()
...
...
@@ -277,9 +277,9 @@ class Connection(ExportImport, object):
"""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 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
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
is reachable.
...
...
@@ -357,7 +357,7 @@ class Connection(ExportImport, object):
self
.
_db
.
classFactory
)
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.
"""
...
...
@@ -509,9 +509,9 @@ class Connection(ExportImport, object):
serial
=
getattr
(
obj
,
"_p_serial"
,
z64
)
if
serial
==
z64
:
# new object
#
obj is a
new object
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.
self
.
_added
.
pop
(
oid
,
None
)
else
:
...
...
@@ -528,7 +528,7 @@ class Connection(ExportImport, object):
try
:
self
.
_cache
[
oid
]
=
obj
except
:
# Dang, I bet its wrapped:
# Dang, I bet it
'
s wrapped:
if
hasattr
(
obj
,
'aq_base'
):
self
.
_cache
[
oid
]
=
obj
.
aq_base
else
:
...
...
@@ -538,7 +538,7 @@ class Connection(ExportImport, object):
self
.
_added_during_commit
=
None
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
:
return
src
=
self
.
_storage
...
...
@@ -559,7 +559,7 @@ class Connection(ExportImport, object):
self
.
_handle_serial
(
s
,
oid
,
change
=
False
)
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
:
return
src
=
self
.
_storage
...
...
@@ -708,6 +708,7 @@ class Connection(ExportImport, object):
# There is a harmless data race with self._invalidated. A
# dict update could go on in another thread, but we don't care
# because we have to check again after the load anyway.
if
(
obj
.
_p_oid
in
self
.
_invalidated
and
not
myhasattr
(
obj
,
"_p_independent"
)):
# If the object has _p_independent(), we will handle it below.
...
...
@@ -787,7 +788,7 @@ class Connection(ExportImport, object):
def
oldstate
(
self
,
obj
,
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
to other peristent objects are handled.
...
...
@@ -899,12 +900,12 @@ class Connection(ExportImport, object):
del
obj
.
_p_changed
# transition from changed to ghost
else
:
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
def
tpc_finish
(
self
,
transaction
):
# It's important that the storage call the function we pass
# while it still has it
'
s lock. We don't want another thread
# It's important that the storage call
s
the function we pass
# 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 send an invalidation message to all of the other
# connections!
...
...
@@ -939,10 +940,10 @@ class Connection(ExportImport, object):
def
setDebugInfo
(
self
,
*
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.
Set the clear argument to
reset the counters.
If clear is True,
reset the counters.
"""
res
=
self
.
_load_count
,
self
.
_store_count
if
clear
:
...
...
src/ZODB/serialize.py
View file @
61a3376b
...
...
@@ -154,7 +154,7 @@ class BaseObjectWriter:
>>> bob._p_jar is jar
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
>>> oid, cls = writer.persistent_id(bob)
...
...
@@ -173,7 +173,7 @@ class BaseObjectWriter:
"""foreign database connection
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
cache even the object's class.
...
...
@@ -210,7 +210,7 @@ class BaseObjectWriter:
# Not persistent, pickle normally
return
None
# Any persistent object m
osy
have an oid:
# Any persistent object m
ust
have an oid:
try
:
oid
=
obj
.
_p_oid
except
AttributeError
:
...
...
@@ -237,10 +237,10 @@ class BaseObjectWriter:
if
oid
is
None
:
# Here we are causing the object to be saved in
# 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
# assume that the object will be added eventually.
oid
=
self
.
_jar
.
new_oid
()
obj
.
_p_jar
=
self
.
_jar
obj
.
_p_oid
=
oid
...
...
@@ -275,7 +275,7 @@ class BaseObjectWriter:
def
serialize
(
self
,
obj
):
# 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
)
newargs
=
getattr
(
obj
,
"__getnewargs__"
,
None
)
...
...
@@ -375,7 +375,7 @@ class BaseObjectReader:
if
args
is
None
:
args
=
()
else
:
# Defin
a
tely new style direct class reference
# Defin
i
tely new style direct class reference
args
=
()
if
issubclass
(
klass
,
Broken
):
...
...
@@ -527,7 +527,7 @@ def referencesf(p, rootl=None):
# tuples, so that we wrap oids that are lists or tuples in
# tuples.
#
# - oids may *not* be
f
alse. I'm not sure why.
# - oids may *not* be
F
alse. I'm not sure why.
out
=
[]
for
v
in
rootl
:
...
...
src/ZODB/tests/testConnection.py
View file @
61a3376b
...
...
@@ -50,7 +50,7 @@ class ConnectionDotAdd(unittest.TestCase):
self
.
datamgr
.
add
(
obj
)
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
.
_p_jar
=
object
()
self
.
assertRaises
(
InvalidObjectReference
,
self
.
datamgr
.
add
,
obj2
)
...
...
@@ -71,10 +71,11 @@ class ConnectionDotAdd(unittest.TestCase):
self
.
datamgr
.
add
(
obj
)
oid
=
obj
.
_p_oid
#
This case simulates when an error occurred committing some other
# object, so tpc_abort is called, clearing everything.
#
Simulate an error while committing some other object.
self
.
datamgr
.
tpc_begin
(
self
.
transaction
)
# Let's pretend something bad happens here.
# Call tpc_abort, clearing everything.
self
.
datamgr
.
tpc_abort
(
self
.
transaction
)
self
.
assert_
(
obj
.
_p_oid
is
None
)
self
.
assert_
(
obj
.
_p_jar
is
None
)
...
...
@@ -114,7 +115,7 @@ class ConnectionDotAdd(unittest.TestCase):
def
checkModifyOnGetstate
(
self
):
subobj
=
StubObject
()
obj
=
ModifyOnGetStateObject
(
subobj
)
self
.
datamgr
.
tpc_begin
(
self
.
transaction
)
self
.
datamgr
.
commit
(
obj
,
self
.
transaction
)
self
.
datamgr
.
tpc_finish
(
self
.
transaction
)
...
...
@@ -135,7 +136,7 @@ class ConnectionDotAdd(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.
# XXX the version tests would require a storage that supports versions
...
...
@@ -147,7 +148,7 @@ class UserMethodTests(unittest.TestCase):
The root() method is simple, and the tests are pretty minimal.
Ensure that a new database has a root and that it is a
PersistentMapping.
>>> db = databaseFromString("<zodb>\n<mappingstorage/>\n</zodb>")
>>> cn = db.open()
>>> root = cn.root()
...
...
@@ -173,12 +174,12 @@ class UserMethodTests(unittest.TestCase):
'\x00\x00\x00\x00\x00\x00\x00\x00'
The object is a ghost.
>>> obj._p_state
-1
And multiple calls with the same oid, return the same object.
>>> obj2 = cn.get(p64(0))
>>> obj is obj2
True
...
...
@@ -187,7 +188,7 @@ class UserMethodTests(unittest.TestCase):
object will be returned. The cache doesn't keep unreferenced
ghosts alive. (The next object returned my still have the
same id, because Python may re-use the same memory.)
>>> del obj, obj2
>>> cn._cache.get(p64(0), None)
...
...
@@ -217,8 +218,8 @@ class UserMethodTests(unittest.TestCase):
r"""doctest of close() method
This is a minimal test, because most of the interesting
effects on closing a connection involve
d its interaction
the
database and transaction.
effects on closing a connection involve
its interaction with
the
database and t
he t
ransaction.
>>> db = databaseFromString("<zodb>\n<mappingstorage/>\n</zodb>")
>>> cn = db.open()
...
...
@@ -228,9 +229,8 @@ class UserMethodTests(unittest.TestCase):
>>> cn.close()
>>> cn.close()
It's not possible to load or store objects once the storage is
closed.
It's not possible to load or store objects once the storage is closed.
>>> cn.get(p64(0))
Traceback (most recent call last):
...
...
...
@@ -270,7 +270,7 @@ class UserMethodTests(unittest.TestCase):
The implementation keeps a list of callbacks that is reset
to a class variable (which is bound to None) after the connection
is closed.
>>> cn._Connection__onCloseCallbacks
"""
...
...
@@ -299,7 +299,7 @@ class UserMethodTests(unittest.TestCase):
RuntimeError: The database connection is closed
An expedient way to create a read-only storage:
>>> db._storage._is_read_only = True
>>> cn = db.open()
>>> cn.isReadOnly()
...
...
@@ -348,9 +348,9 @@ class UserMethodTests(unittest.TestCase):
warnings, one from the Connection and one from the
cPickleCache. Maybe we should drop the cPickleCache warning,
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().
>>> r._p_activate()
>>> cn.cacheFullSweep(12)
>>> r._p_state
...
...
@@ -368,11 +368,10 @@ class UserMethodTests(unittest.TestCase):
>>> category.__name__
'DeprecationWarning'
We have to uninstall the hook so that other warnings don't get
lost.
We have to uninstall the hook so that other warnings don't get lost.
>>> hook.uninstall()
"""
class
InvalidationTests
(
unittest
.
TestCase
):
...
...
@@ -408,7 +407,7 @@ class InvalidationTests(unittest.TestCase):
True
>>> p2._p_oid in cn._invalidated
False
>>> cn.invalidate(p64(10), {p2._p_oid: 1, p64(76): 1})
>>> cn._txn_time
'\x00\x00\x00\x00\x00\x00\x00\x01'
...
...
@@ -419,7 +418,7 @@ class InvalidationTests(unittest.TestCase):
Calling invalidate() doesn't affect the object state until
a transaction boundary.
>>> p1._p_state
0
>>> p2._p_state
...
...
@@ -439,7 +438,7 @@ class InvalidationTests(unittest.TestCase):
0
>>> cn._invalidated
{}
"""
# ---- 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