Files
eiblog/pkg/cache/store/store.go
2021-04-26 15:51:16 +08:00

71 lines
1.4 KiB
Go

// Package store provides ...
package store
import (
"fmt"
"sort"
"sync"
"github.com/eiblog/eiblog/v2/pkg/model"
)
var (
storeMu sync.RWMutex
stores = make(map[string]Driver)
)
// Store 存储后端
type Store interface {
LoadOrCreateAccount(acct *model.Account) (*model.Account, error)
LoadOrCreateBlogger(blogger *model.Blogger) (*model.Blogger, error)
LoadAllArticles() ([]*model.Article, error)
UpdateAccount(name string, fields map[string]interface{}) error
UpdateBlogger(fields map[string]interface{}) error
UpdateArticle(article *model.Article) error
CleanArticles() error
}
// Driver 存储驱动
type Driver interface {
Init(source string) (Store, error)
}
// Register 注册驱动
func Register(name string, driver Driver) {
storeMu.Lock()
defer storeMu.Unlock()
if driver == nil {
panic("store: register driver is nil")
}
if _, dup := stores[name]; dup {
panic("store: register called twice for driver " + name)
}
stores[name] = driver
}
// Drivers 获取所有
func Drivers() []string {
storeMu.Lock()
defer storeMu.Unlock()
list := make([]string, 0, len(stores))
for name := range stores {
list = append(list, name)
}
sort.Strings(list)
return list
}
// NewStore 新建存储
func NewStore(name string, source string) (Store, error) {
storeMu.RLock()
driver, ok := stores[name]
storeMu.RUnlock()
if !ok {
return nil, fmt.Errorf("store: unknown driver %q (forgotten import?)", name)
}
return driver.Init(source)
}