Browse Source

update value

pull/2354/head
Chris Lu 3 years ago
parent
commit
d343b0db57
  1. 13
      weed/util/skiplist/skiplist.go
  2. 27
      weed/util/skiplist/skiplist_test.go

13
weed/util/skiplist/skiplist.go

@ -1,5 +1,7 @@
package skiplist
// adapted from https://github.com/MauriceGit/skiplist/blob/master/skiplist.go
import (
"bytes"
"fmt"
@ -402,6 +404,17 @@ func (t *SkipList) Prev(e *SkipListElement) *SkipListElement {
return e.Prev.Load()
}
// ChangeValue can be used to change the actual value of a node in the skiplist
// without the need of Deleting and reinserting the node again.
// Be advised, that ChangeValue only works, if the actual key from ExtractKey() will stay the same!
// ok is an indicator, wether the value is actually changed.
func (t *SkipList) ChangeValue(e *SkipListElement, newValue []byte) (ok bool) {
// The key needs to stay correct, so this is very important!
e.Value = newValue
e.Save()
return true
}
// String returns a string format of the skiplist. Useful to get a graphical overview and/or debugging.
func (t *SkipList) println() {

27
weed/util/skiplist/skiplist_test.go

@ -243,3 +243,30 @@ func TestFindGreaterOrEqual(t *testing.T) {
}
}
func TestChangeValue(t *testing.T) {
list := New()
for i := 0; i < maxN; i++ {
list.Insert(Element(i), []byte("value"))
}
for i := 0; i < maxN; i++ {
// The key only looks at the int so the string doesn't matter here!
f1, ok := list.Find(Element(i))
if !ok {
t.Fail()
}
ok = list.ChangeValue(f1, []byte("different value"))
if !ok {
t.Fail()
}
f2, ok := list.Find(Element(i))
if !ok {
t.Fail()
}
if bytes.Compare(f2.GetValue(), []byte("different value")) != 0 {
t.Fail()
}
}
}
Loading…
Cancel
Save