added dump/restore and fixed title stuff

This commit is contained in:
ston1th 2018-10-16 21:26:39 +02:00
commit 8d3187b160
13 changed files with 200627 additions and 189988 deletions

View file

@ -7,7 +7,9 @@ import (
"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 (
@ -61,10 +63,30 @@ func New(datadir string) (db *DB, err error) {
return
}
func (db *DB) Close() error {
err := db.store.Close()
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
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()
}

View file

@ -1,93 +0,0 @@
// Copyright (C) 2018 Marius Schellenberger
package db
/*import (
"encoding/json"
"fmt"
"os"
"git.giftfish.de/ston1th/gowiki/pkg/core"
)
type DBDump struct {
Pages []DumpPage `json:"pages"`
Snippets []Snippet `json:"snippets"`
Users []User `json:"users"`
}
type DumpPage struct {
Title string `json:"title"`
LinkTitle string `json:"link_title"`
MD string `json:"md"`
Created string `json:"created"`
Updated string `json:"updated"`
Public bool `json:"public"`
}
func verboseLog(prefix, title string, v bool) {
if v {
fmt.Fprintln(os.Stderr, prefix, title)
}
}
func Dump(path string, v bool) (err error) {
bs, err := NewBoltStore()
if err != nil {
return
}
var dump DBDump
//TODO bs.GetAllPages
var pages []*core.Page
for _, p := range pages {
if err != nil {
return
}
verboseLog("dump:", p.Title, v)
dump.Pages = append(dump.Pages, DumpPage{
Title: p.Title,
LinkTitle: p.LinkTitle,
MD: p.MD,
Created: p.Created,
Updated: p.Updated,
Public: p.Public,
})
}
//TODO snippets
//verboseLog("dump:", "snippets", v)
verboseLog("dump:", "users", v)
dump.Users, err = bs.DumpUsers()
if err != nil {
return
}
return json.NewEncoder(os.Stdout).Encode(dump)
}
func Restore(path string, v bool) (err error) {
i, err := NewIndex(path)
if err != nil {
return
}
defer i.Close()
bs, err := NewBoltStore()
if err != nil {
return
}
var dump DBDump
err = json.NewDecoder(os.Stdin).Decode(&dump)
if err != nil {
return
}
for _, art := range dump.Articles {
verboseLog("restore:", art.Title, v)
err = i.Restore(&art)
if err != nil {
return
}
}
//TODO snippets
//verboseLog("restore:", "snippets", v)
verboseLog("restore:", "users", v)
err = bs.RestoreUsers(dump.Users)
return
}*/

View file

@ -25,7 +25,7 @@ func (db *DB) GetAllPages(username string) (pages core.Pages) {
if trim == core.IndexURI {
return nil
}
p, err := db.GetPage(trim, username)
p, err := db.getPage(trim, username)
if err == nil {
pages = append(pages, *p)
}
@ -36,11 +36,12 @@ func (db *DB) GetAllPages(username string) (pages core.Pages) {
return
}
func (db *DB) GetPage(title, username string) (p *core.Page, err error) {
p = db.cache.Get(title)
func (db *DB) GetPage(section, title, username string) (p *core.Page, err error) {
st := render.StoreTitle(section, title)
p = db.cache.Get(st)
if p == nil {
p, err = db.getPage(title, username)
db.cache.Add(title, p)
p, err = db.getPage(st, username)
db.cache.Add(st, p)
return
}
if !core.ReadPerm(username, p) {
@ -74,7 +75,7 @@ func (db *DB) CreatePage(title, section, markdown, username string, p core.Permi
return
}
}
st := render.StoreTitle(section, title)
st := render.StoreTitle(section, render.Title(title))
if _, err = db.getPage(st, username); err != nil && err != store.ErrKeyNotFound {
return
}
@ -130,7 +131,7 @@ func (db *DB) UpdatePage(title, section, markdown, username string, p core.Permi
return
}
err = db.Index.Add(title, st, search)
err = db.Index.Add(page.Title, st, search)
if err != nil {
return
}

View file

@ -8,6 +8,7 @@ import (
"git.giftfish.de/ston1th/gowiki/pkg/log"
"git.giftfish.de/ston1th/jwt/v3"
"golang.org/x/crypto/bcrypt"
"regexp"
"sort"
"strconv"
"strings"
@ -19,26 +20,21 @@ var (
errUserNotFound = dbErr("user not found")
errUserExists = dbErr("user already exist")
errUserReserved = dbErr("username is reserved")
userRe = regexp.MustCompile("[^a-zA-Z0-9]+")
)
func (db *DB) DumpUsers() (users core.Users, err error) {
db.store.ForEach(func(k string, _ []byte) error {
func (db *DB) GetUsers() (users core.Users, err error) {
err = db.store.ForEach(func(k string, _ []byte) error {
if trim, ok := hasTrimPrefix(k, userPrefix); ok {
u, err := db.GetUser(trim)
u.Password = ""
if err == nil {
users = append(users, u)
}
}
return nil
})
return
}
func (db *DB) GetUsers() (users core.Users, err error) {
users, err = db.DumpUsers()
for i := range users {
users[i].Password = ""
}
sort.Sort(users)
return
}
@ -58,31 +54,8 @@ func (db *DB) UserExists(username string) error {
return db.store.Get(userPrefix+username, nil)
}
// TODO
/*func (bs *BoltStore) RestoreUsers(users []User) error {
return bs.db.Update(func(tx *bolt.Tx) error {
b := tx.Bucket([]byte(userTable))
err := b.ForEach(func(k, v []byte) error {
return b.Delete(k)
})
if err != nil {
return err
}
for _, u := range users {
v, err := bs.Marshal(u)
if err != nil {
return err
}
err = b.Put([]byte(u.Username), v)
if err != nil {
return err
}
}
return nil
})
}*/
func (db *DB) CreateUser(username, password string, admin bool) error {
username = userRe.ReplaceAllString(username, "")
if reservedUser(username) {
return errUserReserved
}