mirror of
https://github.com/talent-plan/tinykv.git
synced 2025-02-14 22:00:08 +08:00
111 lines
2.1 KiB
Go
111 lines
2.1 KiB
Go
|
package engine_util
|
||
|
|
||
|
import (
|
||
|
"github.com/Connor1996/badger"
|
||
|
"github.com/golang/protobuf/proto"
|
||
|
"github.com/pingcap/errors"
|
||
|
)
|
||
|
|
||
|
type WriteBatch struct {
|
||
|
entries []*badger.Entry
|
||
|
size int
|
||
|
safePoint int
|
||
|
safePointSize int
|
||
|
safePointUndo int
|
||
|
}
|
||
|
|
||
|
const (
|
||
|
CfDefault string = "default"
|
||
|
CfWrite string = "write"
|
||
|
CfLock string = "lock"
|
||
|
)
|
||
|
|
||
|
var CFs [3]string = [3]string{CfDefault, CfWrite, CfLock}
|
||
|
|
||
|
func (wb *WriteBatch) Len() int {
|
||
|
return len(wb.entries)
|
||
|
}
|
||
|
|
||
|
func (wb *WriteBatch) SetCF(cf string, key, val []byte) {
|
||
|
wb.entries = append(wb.entries, &badger.Entry{
|
||
|
Key: KeyWithCF(cf, key),
|
||
|
Value: val,
|
||
|
})
|
||
|
wb.size += len(key) + len(val)
|
||
|
}
|
||
|
|
||
|
func (wb *WriteBatch) DeleteMeta(key []byte) {
|
||
|
wb.entries = append(wb.entries, &badger.Entry{
|
||
|
Key: key,
|
||
|
})
|
||
|
wb.size += len(key)
|
||
|
}
|
||
|
|
||
|
func (wb *WriteBatch) DeleteCF(cf string, key []byte) {
|
||
|
wb.entries = append(wb.entries, &badger.Entry{
|
||
|
Key: KeyWithCF(cf, key),
|
||
|
})
|
||
|
wb.size += len(key)
|
||
|
}
|
||
|
|
||
|
func (wb *WriteBatch) SetMeta(key []byte, msg proto.Message) error {
|
||
|
val, err := proto.Marshal(msg)
|
||
|
if err != nil {
|
||
|
return errors.WithStack(err)
|
||
|
}
|
||
|
wb.entries = append(wb.entries, &badger.Entry{
|
||
|
Key: key,
|
||
|
Value: val,
|
||
|
})
|
||
|
wb.size += len(key) + len(val)
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (wb *WriteBatch) SetSafePoint() {
|
||
|
wb.safePoint = len(wb.entries)
|
||
|
wb.safePointSize = wb.size
|
||
|
}
|
||
|
|
||
|
func (wb *WriteBatch) RollbackToSafePoint() {
|
||
|
wb.entries = wb.entries[:wb.safePoint]
|
||
|
wb.size = wb.safePointSize
|
||
|
}
|
||
|
|
||
|
func (wb *WriteBatch) WriteToDB(db *badger.DB) error {
|
||
|
if len(wb.entries) > 0 {
|
||
|
err := db.Update(func(txn *badger.Txn) error {
|
||
|
for _, entry := range wb.entries {
|
||
|
var err1 error
|
||
|
if len(entry.Value) == 0 {
|
||
|
err1 = txn.Delete(entry.Key)
|
||
|
} else {
|
||
|
err1 = txn.SetEntry(entry)
|
||
|
}
|
||
|
if err1 != nil {
|
||
|
return err1
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
})
|
||
|
if err != nil {
|
||
|
return errors.WithStack(err)
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (wb *WriteBatch) MustWriteToDB(db *badger.DB) {
|
||
|
err := wb.WriteToDB(db)
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (wb *WriteBatch) Reset() {
|
||
|
wb.entries = wb.entries[:0]
|
||
|
wb.size = 0
|
||
|
wb.safePoint = 0
|
||
|
wb.safePointSize = 0
|
||
|
wb.safePointUndo = 0
|
||
|
}
|