Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
B
BTrees
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
Kirill Smelkov
BTrees
Commits
5a1e5949
Commit
5a1e5949
authored
Nov 14, 2012
by
Tres Seaver
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Use names for states in conflict resolution.
parent
c34cbe31
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
73 additions
and
71 deletions
+73
-71
BTrees/_base.py
BTrees/_base.py
+73
-71
No files found.
BTrees/_base.py
View file @
5a1e5949
...
...
@@ -144,29 +144,32 @@ class _BucketBase(_Base):
has_key
=
__contains__
def
_p_resolveConflict
(
self
,
*
states
):
def
_p_resolveConflict
(
self
,
s_old
,
s_com
,
s_new
):
is_set
=
getattr
(
self
,
'_values'
,
self
)
is
self
buckets
=
[]
for
state
in
states
:
bucket
=
self
.
__class__
()
if
state
:
bucket
.
__setstate__
(
state
)
buckets
.
append
(
bucket
)
if
(
buckets
[
1
].
_next
!=
buckets
[
0
].
_next
or
buckets
[
2
].
_next
!=
buckets
[
0
].
_next
):
b_old
=
self
.
__class__
()
if
s_old
is
not
None
:
b_old
.
__setstate__
(
s_old
)
b_com
=
self
.
__class__
()
if
s_com
is
not
None
:
b_com
.
__setstate__
(
s_com
)
b_new
=
self
.
__class__
()
if
s_new
is
not
None
:
b_new
.
__setstate__
(
s_new
)
if
(
b_com
.
_next
!=
b_old
.
_next
or
b_new
.
_next
!=
b_old
.
_next
):
raise
BTreesConflictError
(
-
1
,
-
1
,
-
1
,
0
)
if
not
(
buckets
[
1
]
and
buckets
[
2
])
:
if
not
b_com
or
not
b_new
:
raise
BTreesConflictError
(
-
1
,
-
1
,
-
1
,
12
)
i
1
=
_SetIteration
(
buckets
[
0
]
,
True
)
i
2
=
_SetIteration
(
buckets
[
1
]
,
True
)
i
3
=
_SetIteration
(
buckets
[
2
]
,
True
)
i
_old
=
_SetIteration
(
b_old
,
True
)
i
_com
=
_SetIteration
(
b_com
,
True
)
i
_new
=
_SetIteration
(
b_new
,
True
)
def
merge_error
(
reason
):
return
BTreesConflictError
(
i
1
.
position
,
i2
.
position
,
i3
.
position
,
reason
)
i
_old
.
position
,
i_com
.
position
,
i_new
.
position
,
reason
)
result
=
self
.
__class__
()
...
...
@@ -180,106 +183,106 @@ class _BucketBase(_Base):
result
.
_values
.
append
(
it
.
value
)
it
.
advance
()
while
i
1
.
active
and
i2
.
active
and
i3
.
active
:
cmp12
=
cmp
(
i
1
.
key
,
i2
.
key
)
cmp13
=
cmp
(
i
1
.
key
,
i3
.
key
)
while
i
_old
.
active
and
i_com
.
active
and
i_new
.
active
:
cmp12
=
cmp
(
i
_old
.
key
,
i_com
.
key
)
cmp13
=
cmp
(
i
_old
.
key
,
i_new
.
key
)
if
cmp12
==
0
:
if
cmp13
==
0
:
if
is_set
:
result
.
add
(
i
1
.
key
)
elif
i
2
.
value
==
i1
.
value
:
result
[
i
1
.
key
]
=
i3
.
value
elif
i
3
.
value
==
i1
.
value
:
result
[
i
1
.
key
]
=
i2
.
value
result
.
add
(
i
_old
.
key
)
elif
i
_com
.
value
==
i_old
.
value
:
result
[
i
_old
.
key
]
=
i_new
.
value
elif
i
_new
.
value
==
i_old
.
value
:
result
[
i
_old
.
key
]
=
i_com
.
value
else
:
raise
merge_error
(
1
)
i
1
.
advance
()
i
2
.
advance
()
i
3
.
advance
()
i
_old
.
advance
()
i
_com
.
advance
()
i
_new
.
advance
()
elif
(
cmp13
>
0
):
# insert in new
merge_output
(
i
3
)
elif
is_set
or
i
1
.
value
==
i2
.
value
:
# deleted new
if
i
3
.
position
==
1
:
merge_output
(
i
_new
)
elif
is_set
or
i
_old
.
value
==
i_com
.
value
:
# deleted new
if
i
_new
.
position
==
1
:
# Deleted the first item. This will modify the
# parent node, so we don't know if merging will be
# safe
raise
merge_error
(
13
)
i
1
.
advance
()
i
2
.
advance
()
i
_old
.
advance
()
i
_com
.
advance
()
else
:
raise
merge_error
(
2
)
elif
cmp13
==
0
:
if
cmp12
>
0
:
# insert committed
merge_output
(
i
2
)
elif
is_set
or
i
1
.
value
==
i3
.
value
:
# delete committed
if
i
2
.
position
==
1
:
merge_output
(
i
_com
)
elif
is_set
or
i
_old
.
value
==
i_new
.
value
:
# delete committed
if
i
_com
.
position
==
1
:
# Deleted the first item. This will modify the
# parent node, so we don't know if merging will be
# safe
raise
merge_error
(
13
)
i
1
.
advance
()
i
3
.
advance
()
i
_old
.
advance
()
i
_new
.
advance
()
else
:
raise
merge_error
(
3
)
else
:
# both keys changed
cmp23
=
cmp
(
i
2
.
key
,
i3
.
key
)
cmp23
=
cmp
(
i
_com
.
key
,
i_new
.
key
)
if
cmp23
==
0
:
raise
merge_error
(
4
)
if
cmp12
>
0
:
# insert committed
if
cmp23
>
0
:
# insert i
3
first
merge_output
(
i
3
)
if
cmp23
>
0
:
# insert i
_new
first
merge_output
(
i
_new
)
else
:
merge_output
(
i
2
)
elif
cmp13
>
0
:
# insert i
3
merge_output
(
i
3
)
merge_output
(
i
_com
)
elif
cmp13
>
0
:
# insert i
_new
merge_output
(
i
_new
)
else
:
raise
merge_error
(
5
)
# both deleted same key
while
i
2
.
active
and
i3
.
active
:
# new inserts
cmp23
=
cmp
(
i
2
.
key
,
i3
.
key
)
while
i
_com
.
active
and
i_new
.
active
:
# new inserts
cmp23
=
cmp
(
i
_com
.
key
,
i_new
.
key
)
if
cmp23
==
0
:
raise
merge_error
(
6
)
# dueling insert
if
cmp23
>
0
:
# insert new
merge_output
(
i
3
)
merge_output
(
i
_new
)
else
:
# insert committed
merge_output
(
i
2
)
merge_output
(
i
_com
)
while
i
1
.
active
and
i2
.
active
:
# new deletes rest of original
cmp12
=
cmp
(
i
1
.
key
,
i2
.
key
)
while
i
_old
.
active
and
i_com
.
active
:
# new deletes rest of original
cmp12
=
cmp
(
i
_old
.
key
,
i_com
.
key
)
if
cmp12
>
0
:
# insert committed
merge_output
(
i
2
)
elif
cmp12
==
0
and
(
is_set
or
i
1
.
value
==
i2
.
value
):
# del in new
i
1
.
advance
()
i
2
.
advance
()
merge_output
(
i
_com
)
elif
cmp12
==
0
and
(
is_set
or
i
_old
.
value
==
i_com
.
value
):
# del in new
i
_old
.
advance
()
i
_com
.
advance
()
else
:
# dueling deletes or delete and change
raise
merge_error
(
7
)
while
i
1
.
active
and
i3
.
active
:
# committed deletes rest of original
cmp13
=
cmp
(
i
1
.
key
,
i3
.
key
)
while
i
_old
.
active
and
i_new
.
active
:
# committed deletes rest of original
cmp13
=
cmp
(
i
_old
.
key
,
i_new
.
key
)
if
cmp13
>
0
:
# insert new
merge_output
(
i
3
)
elif
cmp13
==
0
and
(
is_set
or
i
1
.
value
==
i3
.
value
):
merge_output
(
i
_new
)
elif
cmp13
==
0
and
(
is_set
or
i
_old
.
value
==
i_new
.
value
):
# deleted in committed
i
1
.
advance
()
i
3
.
advance
()
i
_old
.
advance
()
i
_new
.
advance
()
else
:
# dueling deletes or delete and change
raise
merge_error
(
8
)
if
i
1
.
active
:
# dueling deletes
if
i
_old
.
active
:
# dueling deletes
raise
merge_error
(
9
)
while
i
2
.
active
:
merge_output
(
i
2
)
while
i
_com
.
active
:
merge_output
(
i
_com
)
while
i
3
.
active
:
merge_output
(
i
3
)
while
i
_new
.
active
:
merge_output
(
i
_new
)
if
len
(
result
.
_keys
)
==
0
:
# If the output bucket is empty, conflict resolution doesn't have
# enough info to unlink it from its containing BTree correctly.
raise
merge_error
(
10
)
result
.
_next
=
b
uckets
[
0
]
.
_next
result
.
_next
=
b
_old
.
_next
return
result
.
__getstate__
()
...
...
@@ -832,31 +835,30 @@ class _Tree(_MappingBase):
else
:
assert_
(
False
,
"Incorrect child type"
)
def
_p_resolveConflict
(
self
,
*
states
):
states
=
map
(
_get_simple_btree_bucket_state
,
states
)
return
((
self
.
_bucket_type
().
_p_resolveConflict
(
*
states
),
),
)
def
_p_resolveConflict
(
self
,
old
,
com
,
new
):
s_old
=
_get_simple_btree_bucket_state
(
old
)
s_com
=
_get_simple_btree_bucket_state
(
com
)
s_new
=
_get_simple_btree_bucket_state
(
new
)
return
((
self
.
_bucket_type
().
_p_resolveConflict
(
s_old
,
s_com
,
s_new
),
),
)
def
_get_simple_btree_bucket_state
(
state
):
if
state
is
None
:
return
state
if
not
isinstance
(
state
,
tuple
):
raise
TypeError
(
"_p_resolveConflict: expected tuple or None for state"
)
if
len
(
state
)
==
2
:
raise
BTreesConflictError
(
-
1
,
-
1
,
-
1
,
11
)
if
len
(
state
)
!=
1
:
raise
TypeError
(
"_p_resolveConflict: expected 1- or 2-tuple for state"
)
state
=
state
[
0
]
if
not
isinstance
(
state
,
tuple
)
or
len
(
state
)
!=
1
:
raise
TypeError
(
"_p_resolveConflict: expected 1-tuple containing "
"bucket state"
)
;
"bucket state"
)
state
=
state
[
0
]
if
not
isinstance
(
state
,
tuple
):
raise
TypeError
(
"_p_resolveConflict: expected tuple for bucket state"
)
return
state
...
...
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