// Copyright (C) 2018 Marius Schellenberger package db import ( "fmt" "git.giftfish.de/ston1th/gowiki/pkg/cache" "git.giftfish.de/ston1th/gowiki/pkg/core" "git.giftfish.de/ston1th/gowiki/pkg/index" "git.giftfish.de/ston1th/gowiki/pkg/render" "git.giftfish.de/ston1th/gowiki/pkg/store" "io" ) const ( defUser = "admin" defPassword = "gowiki" storeFile = "store.db" bcryptCost = 13 welcome = `# Welcome to GoWiki This is the [Index](/wiki/Index) page. You can customize it how you like.` ) const blevePath = "bleve" func dbErr(i interface{}) error { return fmt.Errorf("db: %s", i) } type DB struct { store store.Store cache *cache.Cache Index *index.Index } func New(datadir string) (db *DB, err error) { db = &DB{cache: cache.NewCache()} db.Index, err = index.NewIndex(datadir + "/" + blevePath) if err != nil { return } db.store, err = store.NewBoltStore(storeFile, nil) if err != nil { return } if db.UserExists(defUser) != nil { err = db.CreateUser(defUser, defPassword, true) if err != nil { return } } err = db.UnlockUser(defUser) if err != nil { return } _, err = db.CreatePage(core.IndexPage, core.WikiSection, welcome, defUser, core.Public) if err != nil && err != store.ErrKeyNotFound { return } return } func (db *DB) Dump(w io.Writer) error { return db.store.Dump(w) } func (db *DB) Restore(r io.Reader) (err error) { err = db.store.Restore(r) if err != nil { return } err = db.store.ForEach(func(k string, _ []byte) error { if trim, ok := hasTrimPrefix(k, pagePrefix); ok { p := new(core.Page) db.store.Get(pagePrefix+trim, p) db.Index.Add(p.Title, p.StoreTitle, render.Render(p)) } return nil }) return } func (db *DB) Close() (err error) { err = db.store.Close() if err != nil { return } return db.Index.Close() }