added dump/restore and fixed title stuff
This commit is contained in:
parent
d4971cda89
commit
8d3187b160
13 changed files with 200627 additions and 189988 deletions
28
pkg/db/db.go
28
pkg/db/db.go
|
|
@ -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()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}*/
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue