1
0
Fork 0
mirror of https://github.com/anyproto/any-sync.git synced 2025-06-07 21:47:02 +09:00
any-sync/client/storage/liststorage.go
2022-12-26 17:52:39 +01:00

119 lines
2.6 KiB
Go

package storage
import (
"context"
"errors"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/aclrecordproto"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/liststorage"
"github.com/dgraph-io/badger/v3"
)
var ErrIncorrectKey = errors.New("key format is incorrect")
type listStorage struct {
db *badger.DB
keys aclKeys
id string
root *aclrecordproto.RawAclRecordWithId
}
func newListStorage(spaceId string, db *badger.DB, txn *badger.Txn) (ls liststorage.ListStorage, err error) {
keys := newAclKeys(spaceId)
rootId, err := getTxn(txn, keys.RootIdKey())
if err != nil {
return
}
stringId := string(rootId)
value, err := getTxn(txn, keys.RawRecordKey(stringId))
if err != nil {
return
}
rootWithId := &aclrecordproto.RawAclRecordWithId{
Payload: value,
Id: stringId,
}
ls = &listStorage{
db: db,
keys: newACLKeys(spaceId),
id: stringId,
root: rootWithId,
}
return
}
func createListStorage(spaceId string, db *badger.DB, txn *badger.Txn, root *aclrecordproto.RawAclRecordWithId) (ls liststorage.ListStorage, err error) {
keys := newAclKeys(spaceId)
_, err = getTxn(txn, keys.RootIdKey())
if err != badger.ErrKeyNotFound {
if err == nil {
return newListStorage(spaceId, db, txn)
}
return
}
err = txn.Set(keys.HeadIdKey(), []byte(root.Id))
if err != nil {
return
}
err = txn.Set(keys.RawRecordKey(root.Id), root.Payload)
if err != nil {
return
}
err = txn.Set(keys.RootIdKey(), []byte(root.Id))
if err != nil {
return
}
ls = &listStorage{
db: db,
keys: newACLKeys(spaceId),
id: root.Id,
root: root,
}
return
}
func (l *listStorage) Id() string {
return l.id
}
func (l *listStorage) Root() (*aclrecordproto.RawAclRecordWithId, error) {
return l.root, nil
}
func (l *listStorage) Head() (head string, err error) {
bytes, err := getDB(l.db, l.keys.HeadIdKey())
if err != nil {
return
}
head = string(bytes)
return
}
func (l *listStorage) GetRawRecord(ctx context.Context, id string) (raw *aclrecordproto.RawAclRecordWithId, err error) {
res, err := getDB(l.db, l.keys.RawRecordKey(id))
if err != nil {
if err == badger.ErrKeyNotFound {
err = liststorage.ErrUnknownRecord
}
return
}
raw = &aclrecordproto.RawAclRecordWithId{
Payload: res,
Id: id,
}
return
}
func (l *listStorage) SetHead(headId string) (err error) {
return putDB(l.db, l.keys.HeadIdKey(), []byte(headId))
}
func (l *listStorage) AddRawRecord(ctx context.Context, rec *aclrecordproto.RawAclRecordWithId) error {
return putDB(l.db, l.keys.RawRecordKey(rec.Id), rec.Payload)
}