forked from mirror/ledisdb
add sscan/sflush
This commit is contained in:
parent
5b88f17470
commit
d78eb0bdb4
|
@ -71,6 +71,9 @@ func (db *DB) flushType(t *tx, dataType byte) (drop int64, err error) {
|
||||||
case BitType:
|
case BitType:
|
||||||
deleteFunc = db.bDelete
|
deleteFunc = db.bDelete
|
||||||
metaDataType = BitMetaType
|
metaDataType = BitMetaType
|
||||||
|
case SetType:
|
||||||
|
deleteFunc = db.sDelete
|
||||||
|
metaDataType = SSizeType
|
||||||
default:
|
default:
|
||||||
return 0, fmt.Errorf("invalid data type: %s", TypeName[dataType])
|
return 0, fmt.Errorf("invalid data type: %s", TypeName[dataType])
|
||||||
}
|
}
|
||||||
|
|
|
@ -78,6 +78,8 @@ func (db *DB) encodeMetaKey(dataType byte, key []byte) ([]byte, error) {
|
||||||
return db.zEncodeSizeKey(key), nil
|
return db.zEncodeSizeKey(key), nil
|
||||||
case BitMetaType:
|
case BitMetaType:
|
||||||
return db.bEncodeMetaKey(key), nil
|
return db.bEncodeMetaKey(key), nil
|
||||||
|
case SSizeType:
|
||||||
|
return db.sEncodeSizeKey(key), nil
|
||||||
default:
|
default:
|
||||||
return nil, errDataType
|
return nil, errDataType
|
||||||
}
|
}
|
||||||
|
|
|
@ -225,3 +225,53 @@ func TestDBBScan(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestDBSScan(t *testing.T) {
|
||||||
|
db := getTestDB()
|
||||||
|
|
||||||
|
db.bFlush()
|
||||||
|
|
||||||
|
k1 := []byte("k1")
|
||||||
|
if _, err := db.SAdd(k1, []byte("1")); err != nil {
|
||||||
|
t.Fatal(err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
k2 := []byte("k2")
|
||||||
|
if _, err := db.SAdd(k2, []byte("1")); err != nil {
|
||||||
|
t.Fatal(err.Error())
|
||||||
|
}
|
||||||
|
k3 := []byte("k3")
|
||||||
|
|
||||||
|
if _, err := db.SAdd(k3, []byte("1")); err != nil {
|
||||||
|
t.Fatal(err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
if v, err := db.SScan(nil, 1, true); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
} else if len(v) != 1 {
|
||||||
|
t.Fatal("invalid length ", len(v))
|
||||||
|
} else if string(v[0]) != "k1" {
|
||||||
|
t.Fatal("invalid value ", string(v[0]))
|
||||||
|
}
|
||||||
|
|
||||||
|
if v, err := db.SScan(k1, 2, true); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
} else if len(v) != 2 {
|
||||||
|
t.Fatal("invalid length ", len(v))
|
||||||
|
} else if string(v[0]) != "k1" {
|
||||||
|
t.Fatal("invalid value ", string(v[0]))
|
||||||
|
} else if string(v[1]) != "k2" {
|
||||||
|
t.Fatal("invalid value ", string(v[1]))
|
||||||
|
}
|
||||||
|
|
||||||
|
if v, err := db.SScan(k1, 2, false); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
} else if len(v) != 2 {
|
||||||
|
t.Fatal("invalid length ", len(v))
|
||||||
|
} else if string(v[0]) != "k2" {
|
||||||
|
t.Fatal("invalid value ", string(v[0]))
|
||||||
|
} else if string(v[1]) != "k3" {
|
||||||
|
t.Fatal("invalid value ", string(v[1]))
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -105,23 +105,12 @@ func (db *DB) sEncodeStopKey(key []byte) []byte {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *DB) sFlush() (drop int64, err error) {
|
func (db *DB) sFlush() (drop int64, err error) {
|
||||||
minKey := make([]byte, 2)
|
|
||||||
minKey[0] = db.index
|
|
||||||
minKey[1] = SetType
|
|
||||||
|
|
||||||
maxKey := make([]byte, 2)
|
|
||||||
maxKey[0] = db.index
|
|
||||||
maxKey[1] = SSizeType + 1
|
|
||||||
|
|
||||||
t := db.setTx
|
t := db.setTx
|
||||||
t.Lock()
|
t.Lock()
|
||||||
defer t.Unlock()
|
defer t.Unlock()
|
||||||
|
|
||||||
drop, err = db.flushRegion(t, minKey, maxKey)
|
return db.flushType(t, SetType)
|
||||||
err = db.expFlush(t, SetType)
|
|
||||||
|
|
||||||
err = t.Commit()
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *DB) sDelete(t *tx, key []byte) int64 {
|
func (db *DB) sDelete(t *tx, key []byte) int64 {
|
||||||
|
@ -605,3 +594,7 @@ func (db *DB) SPersist(key []byte) (int64, error) {
|
||||||
err = t.Commit()
|
err = t.Commit()
|
||||||
return n, err
|
return n, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (db *DB) SScan(key []byte, count int, inclusive bool) ([][]byte, error) {
|
||||||
|
return db.scan(SSizeType, key, count, inclusive)
|
||||||
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package ledis
|
package ledis
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
@ -339,3 +340,34 @@ func testDiff(db *DB, t *testing.T) {
|
||||||
t.Fatal(v)
|
t.Fatal(v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSFlush(t *testing.T) {
|
||||||
|
db := getTestDB()
|
||||||
|
db.FlushAll()
|
||||||
|
|
||||||
|
for i := 0; i < 2000; i++ {
|
||||||
|
key := fmt.Sprintf("%d", i)
|
||||||
|
if _, err := db.SAdd([]byte(key), []byte("v")); err != nil {
|
||||||
|
t.Fatal(err.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if v, err := db.SScan(nil, 3000, true); err != nil {
|
||||||
|
t.Fatal(err.Error())
|
||||||
|
} else if len(v) != 2000 {
|
||||||
|
t.Fatal("invalid value ", len(v))
|
||||||
|
}
|
||||||
|
|
||||||
|
if n, err := db.sFlush(); err != nil {
|
||||||
|
t.Fatal(err.Error())
|
||||||
|
} else if n != 2000 {
|
||||||
|
t.Fatal("invalid value ", n)
|
||||||
|
}
|
||||||
|
|
||||||
|
if v, err := db.SScan(nil, 3000, true); err != nil {
|
||||||
|
t.Fatal(err.Error())
|
||||||
|
} else if len(v) != 0 {
|
||||||
|
t.Fatal("invalid value length ", len(v))
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue