docstore/pkg/db/index.go
2019-09-09 08:27:51 +02:00

146 lines
2.8 KiB
Go

// Copyright (C) 2019 Marius Schellenberger
package db
import "git.giftfish.de/ston1th/docstore/pkg/core"
const (
// schema:
// key: id/<path>
// value: <id>
idPrefix = "id/"
// schema:
// key: path/<id>
// value: <path>
pathPrefix = "path/"
)
func (db *DB) GetPaths(res core.Results) {
db.store.Tx(false, func(tx store.KVStore) error {
for i, v := range res {
err := tx.Get(pathPrefix+v.ID, &res[i].Path)
if err != nil {
res[i].Path = err.Error()
}
}
})
}
func (db *DB) GetIndexed(p core.Paths) {
db.store.Tx(false, func(tx store.KVStore) error {
for i, v := range p {
p[i].Flag = db.IsIndexed(tx, v.Abs)
p[i].Tags, _ = db.GetTag(tx, v.Abs)
}
})
}
func (db *DB) IsIndexed(tx store.KVStore, path string) bool {
f := func(tx store.KVStore) error {
return tx.Get(idPrefix+path, nil)
}
if tx != nil {
return f(tx) == nil
}
return f(db.store) == nil
}
func (db *DB) GetPath(tx store.KVStore, id string) (path string, err error) {
f := func(tx store.KVStore) error {
return tx.Get(pathPrefix+id, &path)
}
if tx != nil {
err = f(tx)
return
}
err = f(db.store)
return
}
func (db *DB) GetID(tx store.KVStore, path string) (id string, err error) {
f := func(tx store.KVStore) error {
return tx.Get(idPrefix+path, &id)
}
if tx != nil {
err = f(tx)
return
}
err = f(db.store)
return
}
func (db *DB) DeletePath(tx store.KVStore, id string) error {
f := func(tx store.KVStore) error {
return tx.Delete(pathPrefix + id)
}
if tx != nil {
return f(tx)
}
return f(db.store)
}
func (db *DB) DeleteID(tx store.KVStore, path string) error {
f := func(tx store.KVStore) error {
return tx.Delete(idPrefix + path)
}
if tx != nil {
return f(tx)
}
return f(db.store)
}
func (db *DB) NewFile(tx store.KVStore, id, path string, tag []string) (err error) {
f := func(tx store.KVStore) error {
err = tx.Set(idPrefix+path, id)
if err != nil {
return
}
err = tx.Set(pathPrefix+id, path)
if err != nil {
return
}
return tx.Set(tagPrefix+path, tag)
}
if tx != nil {
return f(tx)
}
return db.store.Tx(true, f)
}
func (db *DB) MoveFile(op, np string) (err error) {
return db.store.Tx(true, func(tx store.KVStore) error {
id, tag, err := db.DeleteFile(tx, op)
if err != nil {
return
}
return db.NewFile(tx, id, np, tag)
})
}
func (db *DB) DeleteFile(tx store.KVStore, path string) (id string, tags []string, err error) {
f := func(tx store.KVStore) error {
err = tx.Get(idPrefix+path, &id)
if err != nil {
return
}
err = tx.Delete(idPrefix + path)
if err != nil {
return
}
err = tx.Get(tagPrefix+path, &tags)
if err != nil {
return
}
err = tx.Delete(tagPrefix + path)
if err != nil {
return
}
return tx.Delete(pathPrefix + id)
}
if tx != nil {
err = f(tx)
return
}
err = db.store.Tx(true, f)
return
}