mirror of
https://github.com/Mrs4s/go-cqhttp.git
synced 2025-05-05 03:23:49 +08:00
106 lines
2.5 KiB
Go
106 lines
2.5 KiB
Go
package db
|
|
|
|
import (
|
|
"github.com/pkg/errors"
|
|
"gopkg.in/yaml.v3"
|
|
|
|
"github.com/Mrs4s/go-cqhttp/internal/base"
|
|
)
|
|
|
|
// backends 多数据库支持, 后端支持
|
|
// 写入会对所有 Backend 进行写入
|
|
// 读取只会读取第一个库
|
|
var backends []Database
|
|
|
|
// drivers 多数据库启动
|
|
var drivers = make(map[string]func(node yaml.Node) Database)
|
|
|
|
// DatabaseDisabledError 没有可用的db
|
|
var DatabaseDisabledError = errors.New("database disabled")
|
|
|
|
// Register 添加数据库后端
|
|
func Register(name string, init func(yaml.Node) Database) {
|
|
if _, ok := drivers[name]; ok {
|
|
panic("database driver conflict: " + name)
|
|
}
|
|
drivers[name] = init
|
|
}
|
|
|
|
// Init 加载所有后端配置文件
|
|
func Init() {
|
|
backends = make([]Database, 0, len(drivers))
|
|
for name, init := range drivers {
|
|
if n, ok := base.Database[name]; ok {
|
|
db := init(n)
|
|
if db != nil {
|
|
backends = append(backends, db)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func Open() error {
|
|
for _, b := range backends {
|
|
if err := b.Open(); err != nil {
|
|
return errors.Wrap(err, "open backend error")
|
|
}
|
|
}
|
|
base.Database = nil
|
|
return nil
|
|
}
|
|
|
|
func GetMessageByGlobalID(id int32) (StoredMessage, error) {
|
|
if len(backends) == 0 {
|
|
return nil, DatabaseDisabledError
|
|
}
|
|
return backends[0].GetMessageByGlobalID(id)
|
|
}
|
|
|
|
func GetGroupMessageByGlobalID(id int32) (*StoredGroupMessage, error) {
|
|
if len(backends) == 0 {
|
|
return nil, DatabaseDisabledError
|
|
}
|
|
return backends[0].GetGroupMessageByGlobalID(id)
|
|
}
|
|
|
|
func GetPrivateMessageByGlobalID(id int32) (*StoredPrivateMessage, error) {
|
|
if len(backends) == 0 {
|
|
return nil, DatabaseDisabledError
|
|
}
|
|
return backends[0].GetPrivateMessageByGlobalID(id)
|
|
}
|
|
|
|
func GetGuildChannelMessageByID(id string) (*StoredGuildChannelMessage, error) {
|
|
if len(backends) == 0 {
|
|
return nil, DatabaseDisabledError
|
|
}
|
|
return backends[0].GetGuildChannelMessageByID(id)
|
|
}
|
|
|
|
func InsertGroupMessage(m *StoredGroupMessage) error {
|
|
for _, b := range backends {
|
|
if err := b.InsertGroupMessage(m); err != nil {
|
|
return errors.Wrap(err, "insert message to backend error")
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func InsertPrivateMessage(m *StoredPrivateMessage) error {
|
|
for _, b := range backends {
|
|
if err := b.InsertPrivateMessage(m); err != nil {
|
|
return errors.Wrap(err, "insert message to backend error")
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func InsertGuildChannelMessage(m *StoredGuildChannelMessage) error {
|
|
for _, b := range backends {
|
|
if err := b.InsertGuildChannelMessage(m); err != nil {
|
|
return errors.Wrap(err, "insert message to backend error")
|
|
}
|
|
}
|
|
return nil
|
|
}
|