mirror of
https://github.com/eiblog/eiblog.git
synced 2026-02-04 13:52:26 +08:00
fix(backup): restore db and tests
This commit is contained in:
5
pkg/cache/store/mongodb.go
vendored
5
pkg/cache/store/mongodb.go
vendored
@@ -326,6 +326,11 @@ func (db *mongodb) LoadArticleList(ctx context.Context, search SearchArticles) (
|
||||
return articles, int(count), nil
|
||||
}
|
||||
|
||||
// DropDatabase drop eiblog database
|
||||
func (db *mongodb) DropDatabase(ctx context.Context) error {
|
||||
return db.Database(mongoDBName).Drop(ctx)
|
||||
}
|
||||
|
||||
// counter counter
|
||||
type counter struct {
|
||||
Name string
|
||||
|
||||
84
pkg/cache/store/mongodb_test.go
vendored
84
pkg/cache/store/mongodb_test.go
vendored
@@ -13,7 +13,7 @@ var (
|
||||
store Store
|
||||
acct *model.Account
|
||||
blogger *model.Blogger
|
||||
series *model.Series
|
||||
series *model.Serie
|
||||
article *model.Article
|
||||
)
|
||||
|
||||
@@ -25,12 +25,12 @@ func init() {
|
||||
}
|
||||
// account
|
||||
acct = &model.Account{
|
||||
Username: "deepzz",
|
||||
Password: "deepzz",
|
||||
Email: "deepzz@example.com",
|
||||
PhoneN: "12345678900",
|
||||
Address: "address",
|
||||
CreateTime: time.Now(),
|
||||
Username: "deepzz",
|
||||
Password: "deepzz",
|
||||
Email: "deepzz@example.com",
|
||||
PhoneN: "12345678900",
|
||||
Address: "address",
|
||||
CreatedAt: time.Now(),
|
||||
}
|
||||
// blogger
|
||||
blogger = &model.Blogger{
|
||||
@@ -41,11 +41,11 @@ func init() {
|
||||
Copyright: "Copyright",
|
||||
}
|
||||
// series
|
||||
series = &model.Series{
|
||||
Slug: "slug",
|
||||
Name: "series name",
|
||||
Desc: "series desc",
|
||||
CreateTime: time.Now(),
|
||||
series = &model.Serie{
|
||||
Slug: "slug",
|
||||
Name: "series name",
|
||||
Desc: "series desc",
|
||||
CreatedAt: time.Now(),
|
||||
}
|
||||
// article
|
||||
article = &model.Article{
|
||||
@@ -55,21 +55,20 @@ func init() {
|
||||
Count: 0,
|
||||
Content: "### count",
|
||||
SerieID: 0,
|
||||
Tags: "",
|
||||
Tags: nil,
|
||||
IsDraft: false,
|
||||
|
||||
UpdateTime: time.Now(),
|
||||
CreateTime: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
CreatedAt: time.Now(),
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoadInsertAccount(t *testing.T) {
|
||||
acct2, err := store.LoadInsertAccount(context.Background(), acct)
|
||||
ok, err := store.LoadInsertAccount(context.Background(), acct)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Log(acct2)
|
||||
t.Log(acct == acct2)
|
||||
t.Log(ok)
|
||||
}
|
||||
|
||||
func TestUpdateAccount(t *testing.T) {
|
||||
@@ -86,12 +85,11 @@ func TestUpdateAccount(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestLoadInsertBlogger(t *testing.T) {
|
||||
blogger2, err := store.LoadInsertBlogger(context.Background(), blogger)
|
||||
ok, err := store.LoadInsertBlogger(context.Background(), blogger)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Log(blogger2)
|
||||
t.Log(blogger == blogger2)
|
||||
t.Log(ok)
|
||||
}
|
||||
|
||||
func TestUpdateBlogger(t *testing.T) {
|
||||
@@ -104,21 +102,21 @@ func TestUpdateBlogger(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestInsertSeries(t *testing.T) {
|
||||
err := store.InsertSeries(context.Background(), series)
|
||||
err := store.InsertSerie(context.Background(), series)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestRemoveSeries(t *testing.T) {
|
||||
err := store.RemoveSeries(context.Background(), 1)
|
||||
err := store.RemoveSerie(context.Background(), 1)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestUpdateSeries(t *testing.T) {
|
||||
err := store.UpdateSeries(context.Background(), 2, map[string]interface{}{
|
||||
err := store.UpdateSerie(context.Background(), 2, map[string]interface{}{
|
||||
"desc": "update desc",
|
||||
})
|
||||
if err != nil {
|
||||
@@ -127,7 +125,7 @@ func TestUpdateSeries(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestLoadAllSeries(t *testing.T) {
|
||||
series, err := store.LoadAllSeries(context.Background())
|
||||
series, err := store.LoadAllSerie(context.Background())
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
@@ -136,7 +134,7 @@ func TestLoadAllSeries(t *testing.T) {
|
||||
|
||||
func TestInsertArticle(t *testing.T) {
|
||||
article.ID = 12
|
||||
err := store.InsertArticle(context.Background(), article)
|
||||
err := store.InsertArticle(context.Background(), article, 10)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
@@ -150,14 +148,14 @@ func TestRemoveArticle(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestDeleteArticle(t *testing.T) {
|
||||
err := store.DeleteArticle(context.Background(), 12)
|
||||
err := store.RemoveArticle(context.Background(), 12)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestCleanArticles(t *testing.T) {
|
||||
err := store.CleanArticles(context.Background())
|
||||
err := store.CleanArticles(context.Background(), time.Now())
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
@@ -173,33 +171,13 @@ func TestUpdateArticle(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestRecoverArticle(t *testing.T) {
|
||||
err := store.RecoverArticle(context.Background(), 12)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoadAllArticle(t *testing.T) {
|
||||
articles, err := store.LoadAllArticle(context.Background())
|
||||
_, total, err := store.LoadArticleList(context.Background(), SearchArticles{
|
||||
Page: 1,
|
||||
Limit: 1000,
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Logf("load all articles: %d", len(articles))
|
||||
}
|
||||
|
||||
func TestLoadTrashArticles(t *testing.T) {
|
||||
articles, err := store.LoadTrashArticles(context.Background())
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Logf("load trash articles: %d", len(articles))
|
||||
}
|
||||
|
||||
func TestLoadDraftArticles(t *testing.T) {
|
||||
articles, err := store.LoadDraftArticles(context.Background())
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Logf("load draft articles: %d", len(articles))
|
||||
t.Logf("load all articles: %d", total)
|
||||
}
|
||||
|
||||
8
pkg/cache/store/rdbms.go
vendored
8
pkg/cache/store/rdbms.go
vendored
@@ -3,6 +3,7 @@ package store
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"time"
|
||||
|
||||
"github.com/eiblog/eiblog/pkg/model"
|
||||
@@ -129,7 +130,7 @@ func (db *rdbms) InsertArticle(ctx context.Context, article *model.Article, star
|
||||
if id < startID {
|
||||
id = startID
|
||||
} else {
|
||||
id += 1
|
||||
id++
|
||||
}
|
||||
article.ID = id
|
||||
}
|
||||
@@ -190,6 +191,11 @@ func (db *rdbms) LoadArticleList(ctx context.Context, search SearchArticles) (mo
|
||||
return articles, int(count), err
|
||||
}
|
||||
|
||||
// DropDatabase drop eiblog database
|
||||
func (db *rdbms) DropDatabase(ctx context.Context) error {
|
||||
return errors.New("can not drop eiblog database in rdbms")
|
||||
}
|
||||
|
||||
// register store
|
||||
func init() {
|
||||
Register("mysql", &rdbms{})
|
||||
|
||||
3
pkg/cache/store/store.go
vendored
3
pkg/cache/store/store.go
vendored
@@ -64,6 +64,9 @@ type Store interface {
|
||||
LoadArticle(ctx context.Context, id int) (*model.Article, error)
|
||||
// LoadArticleList 查找文章列表
|
||||
LoadArticleList(ctx context.Context, search SearchArticles) (model.SortedArticles, int, error)
|
||||
|
||||
// 危险操作
|
||||
DropDatabase(ctx context.Context) error
|
||||
}
|
||||
|
||||
// Driver 存储驱动
|
||||
|
||||
@@ -11,6 +11,7 @@ import (
|
||||
"path/filepath"
|
||||
"time"
|
||||
|
||||
"github.com/eiblog/eiblog/pkg/cache/store"
|
||||
"github.com/eiblog/eiblog/pkg/config"
|
||||
"github.com/eiblog/eiblog/pkg/internal"
|
||||
)
|
||||
@@ -97,6 +98,7 @@ func backupFromMongoDB(now time.Time) error {
|
||||
}
|
||||
|
||||
func restoreToMongoDB() error {
|
||||
// backup file
|
||||
params := internal.ContentParams{
|
||||
Prefix: "blog/",
|
||||
|
||||
@@ -115,6 +117,16 @@ func restoreToMongoDB() error {
|
||||
|
||||
ctx, cancel := context.WithTimeout(context.Background(), time.Minute*20)
|
||||
defer cancel()
|
||||
// drop database
|
||||
store, err := store.NewStore(config.Conf.Database.Driver,
|
||||
config.Conf.Database.Source)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = store.DropDatabase(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// unarchive
|
||||
arg := fmt.Sprintf("tar xzf /tmp/eiblog.tar.gz -C /tmp")
|
||||
cmd := exec.CommandContext(ctx, "sh", "-c", arg)
|
||||
@@ -123,7 +135,11 @@ func restoreToMongoDB() error {
|
||||
return err
|
||||
}
|
||||
// restore
|
||||
arg = fmt.Sprintf("mongorestore -h %s -d eiblog /tmp/eiblog", config.Conf.Database.Source)
|
||||
u, err := url.Parse(config.Conf.Database.Source)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
arg = fmt.Sprintf("mongorestore -h %s -d eiblog /tmp/eiblog", u.Host)
|
||||
cmd = exec.CommandContext(ctx, "sh", "-c", arg)
|
||||
return cmd.Run()
|
||||
}
|
||||
|
||||
@@ -29,6 +29,7 @@ func Start(restore bool) (err error) {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
logrus.Info("timer: RestoreData success")
|
||||
}
|
||||
// parse duration
|
||||
interval, err := ParseDuration(config.Conf.BackupApp.Interval)
|
||||
|
||||
Reference in New Issue
Block a user