// Copyright (C) 2019 Marius Schellenberger package db import ( "errors" "git.giftfish.de/ston1th/docstore/pkg/core" "git.giftfish.de/ston1th/docstore/pkg/log" "git.giftfish.de/ston1th/docstore/pkg/tags" ) const ( // schema: // key: id/ // value: idPrefix = "id/" // schema: // key: path/ // value: pathPrefix = "path/" ) func (db *DB) Reindex(path string, match []core.RTag) (err error) { if match == nil { match, err = db.GetAllRTags() if err != nil { return } } id, err := db.GetID(path) if err != nil { return } log.Debugf("db: reindexing: %s", path) doc, err := db.Index.Get(id) if err != nil { return } doc.Tags = tags.Find(doc.Text, match) err = db.Index.Reindex(id, doc) if err != nil { return } return db.SetTag(path, doc.Tags) } func (db *DB) ReindexAll() (err error) { var paths []string err = db.store.ForEachPrefix(idPrefix, func(k string, _ []byte) error { paths = append(paths, k) return nil }) if err != nil { return } match, err := db.GetAllRTags() if err != nil { return } for _, p := range paths { e := db.Reindex(p, match) if e != nil { if err == nil { err = errors.New("reindexAll had errors") } log.Printf("db: error reindexing %s: %s", p, e) } } return } func (db *DB) GetPaths(res []core.Result) { for i, v := range res { err := db.store.Get(pathPrefix+v.ID, &res[i].Path) if err != nil { res[i].Path = err.Error() } } } func (db *DB) GetIndexed(p core.Paths) { for i, v := range p { p[i].Flag = db.IsIndexed(v.Abs) p[i].Tags, _ = db.GetTag(v.Abs) } } func (db *DB) IsIndexed(path string) bool { return db.store.Get(idPrefix+path, nil) == nil } func (db *DB) GetPath(id string) (path string, err error) { err = db.store.Get(pathPrefix+id, &path) return } func (db *DB) GetID(path string) (id string, err error) { err = db.store.Get(idPrefix+path, &id) return } func (db *DB) DeletePath(id string) error { return db.store.Delete(pathPrefix + id) } func (db *DB) DeleteID(path string) error { return db.store.Delete(idPrefix + path) } func (db *DB) NewFile(id, path string, tag []string) (err error) { err = db.store.Set(idPrefix+path, id) if err != nil { return } err = db.store.Set(pathPrefix+id, path) if err != nil { return } return db.SetTag(path, tag) } func (db *DB) MoveFile(op, np string) (err error) { if !db.IsIndexed(op) { return nil } id, tag, err := db.DeleteFile(op) if err != nil { return } return db.NewFile(id, np, tag) } func (db *DB) DeleteFile(path string) (id string, tag []string, err error) { if !db.IsIndexed(path) { return } id, err = db.GetID(path) if err != nil { return } err = db.DeleteID(path) if err != nil { return } tag, err = db.UnsetTag(path) if err != nil { return } err = db.DeletePath(id) return }