103 lines
1.9 KiB
Go
103 lines
1.9 KiB
Go
// Copyright (C) 2017 Marius Schellenberger
|
|
|
|
package db
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"os"
|
|
)
|
|
|
|
type Dump struct {
|
|
Articles []DumpArticle `json:"articles"`
|
|
Snippets []Snippet `json:"snippets"`
|
|
Users []User `json:"users"`
|
|
}
|
|
|
|
type DumpArticle 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) {
|
|
i, err := NewDumpIndex(path)
|
|
if err != nil {
|
|
return
|
|
}
|
|
defer i.Close()
|
|
bs, err := NewBoltStore()
|
|
if err != nil {
|
|
return
|
|
}
|
|
art, err := i.Get(false, indexName)
|
|
if err != nil {
|
|
return
|
|
}
|
|
var dump Dump
|
|
titles, err := i.Dump()
|
|
if err != nil {
|
|
return
|
|
}
|
|
for _, title := range titles {
|
|
art, err = i.Get(false, title)
|
|
if err != nil {
|
|
return
|
|
}
|
|
verboseLog("dump:", art.Title, v)
|
|
dump.Articles = append(dump.Articles, DumpArticle{
|
|
Title: art.Title,
|
|
LinkTitle: art.LinkTitle,
|
|
MD: art.MD,
|
|
Created: art.Created,
|
|
Updated: art.Updated,
|
|
Public: art.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 Dump
|
|
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
|
|
}
|