1
0
mirror of https://github.com/Mrs4s/go-cqhttp.git synced 2025-05-04 19:17:37 +08:00

feat: multi database support - multi db wrapper.

This commit is contained in:
Mrs4s 2021-09-22 16:43:27 +08:00
parent 28078d9c8e
commit a56e70d07c
No known key found for this signature in database
GPG Key ID: 3186E98FA19CE3A7
3 changed files with 74 additions and 12 deletions

View File

@ -107,16 +107,14 @@ func NewQQBot(cli *client.QQClient, conf *config.Config) *CQBot {
_ = node.Decode(lconf)
enableLevelDB = lconf.Enable
}
multiDB := db.NewMultiDatabase()
if enableLevelDB {
level := db.UseLevelDB()
if err := level.Open(); err != nil {
multiDB.UseDB(db.UseLevelDB())
}
if err := multiDB.Open(); err != nil {
log.Fatalf("打开数据库失败: %v", err)
}
bot.db = level
log.Info("信息数据库初始化完成.")
} else {
log.Warn("警告: 信息数据库已关闭,将无法使用 [回复/撤回] 等功能。")
}
bot.db = multiDB
bot.Client.OnPrivateMessage(bot.privateMessageEvent)
bot.Client.OnGroupMessage(bot.groupMessageEvent)
if conf.Message.ReportSelfMessage {

View File

@ -72,10 +72,6 @@ type (
PrevGlobalID int32 `bson:"prevGlobalId"`
QuotedContent []global.MSG `bson:"quotedContent"`
}
// MultiDatabase todo
MultiDatabase struct {
}
)
// ToGlobalID 构建`code`-`msgID`的字符串并返回其CRC32 Checksum的值

68
db/multidb.go Normal file
View File

@ -0,0 +1,68 @@
package db
import "github.com/pkg/errors"
// MultiDatabase 多数据库支持
// 写入会对所有 Backend 进行写入
// 读取只会读取第一个库
type MultiDatabase struct {
backends []IDatabase
}
func NewMultiDatabase(backends ...IDatabase) *MultiDatabase {
return &MultiDatabase{
backends: backends,
}
}
func (db *MultiDatabase) UseDB(backend IDatabase) {
db.backends = append(db.backends, backend)
}
func (db *MultiDatabase) Open() error {
for _, b := range db.backends {
if err := b.Open(); err != nil {
return errors.Wrap(err, "open backend error")
}
}
return nil
}
func (db *MultiDatabase) GetMessageByGlobalID(id int32) (IStoredMessage, error) {
if len(db.backends) == 0 {
return nil, errors.New("database disabled")
}
return db.backends[0].GetMessageByGlobalID(id)
}
func (db *MultiDatabase) GetGroupMessageByGlobalID(id int32) (*StoredGroupMessage, error) {
if len(db.backends) == 0 {
return nil, errors.New("database disabled")
}
return db.backends[0].GetGroupMessageByGlobalID(id)
}
func (db *MultiDatabase) GetPrivateMessageByGlobalID(id int32) (*StoredPrivateMessage, error) {
if len(db.backends) == 0 {
return nil, errors.New("database disabled")
}
return db.backends[0].GetPrivateMessageByGlobalID(id)
}
func (db *MultiDatabase) InsertGroupMessage(m *StoredGroupMessage) error {
for _, b := range db.backends {
if err := b.InsertGroupMessage(m); err != nil {
return errors.Wrap(err, "insert message to backend error")
}
}
return nil
}
func (db *MultiDatabase) InsertPrivateMessage(m *StoredPrivateMessage) error {
for _, b := range db.backends {
if err := b.InsertPrivateMessage(m); err != nil {
return errors.Wrap(err, "insert message to backend error")
}
}
return nil
}