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
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Joshua
zodb
Commits
58769030
Commit
58769030
authored
May 14, 2010
by
Jim Fulton
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
reverted a premature commit
parent
7ee7c920
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
13 additions
and
70 deletions
+13
-70
src/CHANGES.txt
src/CHANGES.txt
+0
-5
src/ZEO/StorageServer.py
src/ZEO/StorageServer.py
+0
-1
src/ZODB/ConflictResolution.py
src/ZODB/ConflictResolution.py
+5
-11
src/ZODB/DB.py
src/ZODB/DB.py
+0
-2
src/ZODB/interfaces.py
src/ZODB/interfaces.py
+8
-33
src/ZODB/tests/ConflictResolution.py
src/ZODB/tests/ConflictResolution.py
+0
-18
No files found.
src/CHANGES.txt
View file @
58769030
...
...
@@ -32,11 +32,6 @@ New Features
- You can now pass None (rather than a storage or file name) to get
a database with a mapping storage.
- Renamed IStorageDB to IStorageWrapper and expanded it to provide
methods for transforming and untransforming data records. This was
needed to make storage wrappers that transform data work with
conflict resolution.
Bugs Fixed
----------
...
...
src/ZEO/StorageServer.py
View file @
58769030
...
...
@@ -778,7 +778,6 @@ class StorageServerDB:
def
invalidateCache
(
self
):
self
.
server
.
_invalidateCache
(
self
.
storage_id
)
transform_record_data
=
untransform_record_data
=
lambda
self
,
data
:
data
class
StorageServer
:
...
...
src/ZODB/ConflictResolution.py
View file @
58769030
...
...
@@ -53,7 +53,6 @@ def find_global(*args):
def
state
(
self
,
oid
,
serial
,
prfactory
,
p
=
''
):
p
=
p
or
self
.
loadSerial
(
oid
,
serial
)
p
=
self
.
_crs_wrapper
.
untransform_record_data
(
p
)
file
=
StringIO
(
p
)
unpickler
=
Unpickler
(
file
)
unpickler
.
find_global
=
find_global
...
...
@@ -81,13 +80,13 @@ class IPersistentReference(zope.interface.Interface):
def
__cmp__
(
other
):
'''if other is equivalent reference, return 0; else raise ValueError.
Equivalent in this case means that oid and database_name are the same.
If either is a weak reference, we only support `is` equivalence, and
otherwise raise a ValueError even if the datbase_names and oids are
the same, rather than guess at the correct semantics.
It is impossible to sort reliably, since the actual persistent
class may have its own comparison, and we have no idea what it is.
We assert that it is reasonably safe to assume that an object is
...
...
@@ -136,7 +135,7 @@ class PersistentReference(object):
def
__cmp__
(
self
,
other
):
if
self
is
other
or
(
isinstance
(
other
,
PersistentReference
)
and
isinstance
(
other
,
PersistentReference
)
and
self
.
oid
==
other
.
oid
and
self
.
database_name
==
other
.
database_name
and
not
self
.
weak
and
...
...
@@ -180,7 +179,6 @@ def tryToResolveConflict(self, oid, committedSerial, oldSerial, newpickle,
# class_tuple, old, committed, newstate = ('',''), 0, 0, 0
try
:
prfactory
=
PersistentReferenceFactory
()
newpickle
=
self
.
_crs_wrapper
.
untransform_record_data
(
newpickle
)
file
=
StringIO
(
newpickle
)
unpickler
=
Unpickler
(
file
)
unpickler
.
find_global
=
find_global
...
...
@@ -217,7 +215,7 @@ def tryToResolveConflict(self, oid, committedSerial, oldSerial, newpickle,
pickler
.
inst_persistent_id
=
persistent_id
pickler
.
dump
(
meta
)
pickler
.
dump
(
resolved
)
return
self
.
_crs_wrapper
.
transform_record_data
(
file
.
getvalue
(
1
)
)
return
file
.
getvalue
(
1
)
except
(
ConflictError
,
BadClassName
):
return
None
except
:
...
...
@@ -229,11 +227,7 @@ def tryToResolveConflict(self, oid, committedSerial, oldSerial, newpickle,
logger
.
error
(
"Unexpected error"
,
exc_info
=
True
)
return
None
class
ConflictResolvingStorage
(
object
)
:
class
ConflictResolvingStorage
:
"Mix-in class that provides conflict resolution handling for storages"
tryToResolveConflict
=
tryToResolveConflict
def
registerDB
(
self
,
wrapper
):
self
.
_crs_wrapper
=
wrapper
super
(
ConflictResolvingStorage
,
self
).
registerDB
(
wrapper
)
src/ZODB/DB.py
View file @
58769030
...
...
@@ -705,8 +705,6 @@ class DB(object):
"""
self
.
_connectionMap
(
lambda
c
:
c
.
invalidateCache
())
transform_record_data
=
untransform_record_data
=
lambda
self
,
data
:
data
def
objectCount
(
self
):
return
len
(
self
.
storage
)
...
...
src/ZODB/interfaces.py
View file @
58769030
...
...
@@ -287,32 +287,23 @@ class IConnection(Interface):
"""
class
IStorage
Wrapper
(
Interface
):
"""
Storage wrapper interface
class
IStorage
DB
(
Interface
):
"""
Database interface exposed to storages
This interface provides
3
facilities:
This interface provides
2
facilities:
- Out-of-band invalidation support
A storage can notify it's
wrapper
of object invalidations that
A storage can notify it's
database
of object invalidations that
don't occur due to direct operations on the storage. Currently
this is only used by ZEO client storages to pass invalidation
messages sent from a server.
- Record-reference extraction
- Record-reference extraction
.
The references method can be used to extract referenced object
IDs from a database record. This can be used by storages to
provide more advanced garbage collection. A wrapper storage
that transforms data will provide a references method that
untransforms data passed to it and then pass the data to the
layer above it.
- Record transformation
A storage wrapper may transform data, for example for
compression or encryption. Methods are provided to transform or
untransform data.
provide more advanced garbage collection.
This interface may be implemented by storage adapters or other
intermediaries. For example, a storage adapter that provides
...
...
@@ -346,16 +337,6 @@ class IStorageWrapper(Interface):
be created and returned.
"""
def
transform_record_data
(
data
):
"""Return transformed data
"""
def
untransform_record_data
(
data
):
"""Return untransformed data
"""
IStorageDB
=
IStorageWrapper
# for backward compatibility
class
IDatabase
(
IStorageDB
):
"""ZODB DB.
...
...
@@ -614,18 +595,12 @@ class IStorage(Interface):
revisions.
"""
def
registerDB
(
wrapper
):
"""Register a storage wrapper IStorageWrapper.
The passed object is a wrapper object that provides an upcall
interface to support composition.
def
registerDB
(
db
):
"""Register an IStorageDB.
Note that, for historical reasons, an implementation may
require a second argument, however, if required, the None will
be passed as the second argument.
Also, for historical reasons, this is called registerDB rather
than register_wrapper.
"""
def
sortKey
():
...
...
src/ZODB/tests/ConflictResolution.py
View file @
58769030
...
...
@@ -53,15 +53,9 @@ class PCounter4(PCounter):
def
_p_resolveConflict
(
self
,
oldState
,
savedState
):
raise
RuntimeError
(
"Can't get here; not enough args"
)
class
StorageWrapper
:
transform_record_data
=
untransform_record_data
=
lambda
self
,
data
:
data
class
ConflictResolvingStorage
:
def
checkResolve
(
self
):
self
.
_storage
.
registerDB
(
StorageWrapper
())
obj
=
PCounter
()
obj
.
inc
()
...
...
@@ -82,8 +76,6 @@ class ConflictResolvingStorage:
self
.
assertEqual
(
inst
.
_value
,
5
)
def
checkUnresolvable
(
self
):
self
.
_storage
.
registerDB
(
StorageWrapper
())
obj
=
PCounter2
()
obj
.
inc
()
...
...
@@ -105,15 +97,11 @@ class ConflictResolvingStorage:
self
.
fail
(
"Expected ConflictError"
)
def
checkZClassesArentResolved
(
self
):
self
.
_storage
.
registerDB
(
StorageWrapper
())
from
ZODB.ConflictResolution
import
find_global
,
BadClassName
dummy_class_tuple
=
(
'*foobar'
,
())
self
.
assertRaises
(
BadClassName
,
find_global
,
'*foobar'
,
())
def
checkBuggyResolve1
(
self
):
self
.
_storage
.
registerDB
(
StorageWrapper
())
obj
=
PCounter3
()
obj
.
inc
()
...
...
@@ -132,8 +120,6 @@ class ConflictResolvingStorage:
oid
,
revid
=
revid1
,
data
=
zodb_pickle
(
obj
))
def
checkBuggyResolve2
(
self
):
self
.
_storage
.
registerDB
(
StorageWrapper
())
obj
=
PCounter4
()
obj
.
inc
()
...
...
@@ -158,8 +144,6 @@ class ConflictResolvingTransUndoStorage:
# TransactionalUndoStorage test suite. Except here, conflict
# resolution should allow us to undo the transaction anyway.
self
.
_storage
.
registerDB
(
StorageWrapper
())
obj
=
PCounter
()
obj
.
inc
()
oid
=
self
.
_storage
.
new_oid
()
...
...
@@ -182,8 +166,6 @@ class ConflictResolvingTransUndoStorage:
# TransactionalUndoStorage test suite. Except here, conflict
# resolution should allow us to undo the transaction anyway.
self
.
_storage
.
registerDB
(
StorageWrapper
())
obj
=
PCounter2
()
obj
.
inc
()
oid
=
self
.
_storage
.
new_oid
()
...
...
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