adjust errors and logger

This commit is contained in:
Shen Junzheng
2025-04-01 13:09:59 +08:00
parent f31953c42b
commit 67c9623cea
49 changed files with 553 additions and 981 deletions

View File

@@ -9,11 +9,12 @@ import (
"strings"
"time"
_ "github.com/mattn/go-sqlite3"
"github.com/rs/zerolog/log"
"github.com/sjzar/chatlog/internal/errors"
"github.com/sjzar/chatlog/internal/model"
"github.com/sjzar/chatlog/pkg/util"
_ "github.com/mattn/go-sqlite3"
log "github.com/sirupsen/logrus"
)
const (
@@ -45,19 +46,19 @@ func New(path string) (*DataSource, error) {
}
if err := ds.initMessageDbs(path); err != nil {
return nil, fmt.Errorf("初始化消息数据库失败: %w", err)
return nil, errors.DBInitFailed(err)
}
if err := ds.initContactDb(path); err != nil {
return nil, fmt.Errorf("初始化联系人数据库失败: %w", err)
return nil, errors.DBInitFailed(err)
}
if err := ds.initChatRoomDb(path); err != nil {
return nil, fmt.Errorf("初始化群聊数据库失败: %w", err)
return nil, errors.DBInitFailed(err)
}
if err := ds.initSessionDb(path); err != nil {
return nil, fmt.Errorf("初始化会话数据库失败: %w", err)
return nil, errors.DBInitFailed(err)
}
if err := ds.initMediaDb(path); err != nil {
return nil, fmt.Errorf("初始化会话数据库失败: %w", err)
return nil, errors.DBInitFailed(err)
}
return ds, nil
@@ -67,11 +68,11 @@ func (ds *DataSource) initMessageDbs(path string) error {
files, err := util.FindFilesWithPatterns(path, MessageFilePattern, true)
if err != nil {
return fmt.Errorf("查找消息数据库文件失败: %w", err)
return errors.DBFileNotFound(path, MessageFilePattern, err)
}
if len(files) == 0 {
return fmt.Errorf("未找到任何消息数据库文件: %s", path)
return errors.DBFileNotFound(path, MessageFilePattern, nil)
}
// 处理每个数据库文件
@@ -79,7 +80,7 @@ func (ds *DataSource) initMessageDbs(path string) error {
// 连接数据库
db, err := sql.Open("sqlite3", filePath)
if err != nil {
log.Printf("警告: 连接数据库 %s 失败: %v", filePath, err)
log.Err(err).Msgf("连接数据库 %s 失败", filePath)
continue
}
ds.messageDbs = append(ds.messageDbs, db)
@@ -87,14 +88,14 @@ func (ds *DataSource) initMessageDbs(path string) error {
// 获取所有表名
rows, err := db.Query("SELECT name FROM sqlite_master WHERE type='table' AND name LIKE 'Chat_%'")
if err != nil {
log.Printf("警告: 获取表名失败: %v", err)
log.Err(err).Msgf("数据库 %s 中没有 Chat 表", filePath)
continue
}
for rows.Next() {
var tableName string
if err := rows.Scan(&tableName); err != nil {
log.Printf("警告: 扫描表名失败: %v", err)
log.Err(err).Msgf("数据库 %s 扫描表名失败", filePath)
continue
}
@@ -115,16 +116,16 @@ func (ds *DataSource) initContactDb(path string) error {
files, err := util.FindFilesWithPatterns(path, ContactFilePattern, true)
if err != nil {
return fmt.Errorf("查找联系人数据库文件失败: %w", err)
return errors.DBFileNotFound(path, ContactFilePattern, err)
}
if len(files) == 0 {
return fmt.Errorf("未找到联系人数据库文件: %s", path)
return errors.DBFileNotFound(path, ContactFilePattern, nil)
}
ds.contactDb, err = sql.Open("sqlite3", files[0])
if err != nil {
return fmt.Errorf("连接联系人数据库失败: %w", err)
return errors.DBConnectFailed(files[0], err)
}
return nil
@@ -133,19 +134,19 @@ func (ds *DataSource) initContactDb(path string) error {
func (ds *DataSource) initChatRoomDb(path string) error {
files, err := util.FindFilesWithPatterns(path, ChatRoomFilePattern, true)
if err != nil {
return fmt.Errorf("查找群聊数据库文件失败: %w", err)
return errors.DBFileNotFound(path, ChatRoomFilePattern, err)
}
if len(files) == 0 {
return fmt.Errorf("未找到群聊数据库文件: %s", path)
return errors.DBFileNotFound(path, ChatRoomFilePattern, nil)
}
ds.chatRoomDb, err = sql.Open("sqlite3", files[0])
if err != nil {
return fmt.Errorf("连接群聊数据库失败: %w", err)
return errors.DBConnectFailed(files[0], err)
}
rows, err := ds.chatRoomDb.Query("SELECT m_nsUsrName, IFNULL(nickname,\"\") FROM GroupMember")
if err != nil {
log.Printf("警告: 获取群聊成员失败: %v", err)
log.Err(err).Msgf("数据库 %s 获取群聊成员失败", files[0])
return nil
}
@@ -153,7 +154,7 @@ func (ds *DataSource) initChatRoomDb(path string) error {
var user string
var nickName string
if err := rows.Scan(&user, &nickName); err != nil {
log.Printf("警告: 扫描表名失败: %v", err)
log.Err(err).Msgf("数据库 %s 扫描表名失败", files[0])
continue
}
ds.user2DisplayName[user] = nickName
@@ -166,14 +167,14 @@ func (ds *DataSource) initChatRoomDb(path string) error {
func (ds *DataSource) initSessionDb(path string) error {
files, err := util.FindFilesWithPatterns(path, SessionFilePattern, true)
if err != nil {
return fmt.Errorf("查找最近会话数据库文件失败: %w", err)
return errors.DBFileNotFound(path, SessionFilePattern, err)
}
if len(files) == 0 {
return fmt.Errorf("未找到最近会话数据库文件: %s", path)
return errors.DBFileNotFound(path, SessionFilePattern, nil)
}
ds.sessionDb, err = sql.Open("sqlite3", files[0])
if err != nil {
return fmt.Errorf("连接最近会话数据库失败: %w", err)
return errors.DBConnectFailed(files[0], err)
}
return nil
}
@@ -181,14 +182,14 @@ func (ds *DataSource) initSessionDb(path string) error {
func (ds *DataSource) initMediaDb(path string) error {
files, err := util.FindFilesWithPatterns(path, MediaFilePattern, true)
if err != nil {
return fmt.Errorf("查找媒体数据库文件失败: %w", err)
return errors.DBFileNotFound(path, MediaFilePattern, err)
}
if len(files) == 0 {
return fmt.Errorf("未找到媒体数据库文件: %s", path)
return errors.DBFileNotFound(path, MediaFilePattern, nil)
}
ds.mediaDb, err = sql.Open("sqlite3", files[0])
if err != nil {
return fmt.Errorf("连接媒体数据库失败: %w", err)
return errors.DBConnectFailed(files[0], err)
}
return nil
}
@@ -198,14 +199,14 @@ func (ds *DataSource) GetMessages(ctx context.Context, startTime, endTime time.T
// 在 darwinv3 中,每个联系人/群聊的消息存储在单独的表中,表名为 Chat_md5(talker)
// 首先需要找到对应的表名
if talker == "" {
return nil, fmt.Errorf("talker 不能为空")
return nil, errors.ErrTalkerEmpty
}
_talkerMd5Bytes := md5.Sum([]byte(talker))
talkerMd5 := hex.EncodeToString(_talkerMd5Bytes[:])
db, ok := ds.talkerDBMap[talkerMd5]
if !ok {
return nil, fmt.Errorf("未找到 talker %s 的消息数据库", talker)
return nil, errors.TalkerNotFound(talker)
}
tableName := fmt.Sprintf("Chat_%s", talkerMd5)
@@ -228,7 +229,7 @@ func (ds *DataSource) GetMessages(ctx context.Context, startTime, endTime time.T
// 执行查询
rows, err := db.QueryContext(ctx, query, startTime.Unix(), endTime.Unix())
if err != nil {
return nil, fmt.Errorf("查询表 %s 失败: %w", tableName, err)
return nil, errors.QueryFailed(query, err)
}
defer rows.Close()
@@ -243,7 +244,7 @@ func (ds *DataSource) GetMessages(ctx context.Context, startTime, endTime time.T
&msg.MesDes,
)
if err != nil {
log.Printf("警告: 扫描消息行失败: %v", err)
log.Err(err).Msgf("扫描消息行失败")
continue
}
@@ -298,7 +299,7 @@ func (ds *DataSource) GetContacts(ctx context.Context, key string, limit, offset
// 执行查询
rows, err := ds.contactDb.QueryContext(ctx, query, args...)
if err != nil {
return nil, fmt.Errorf("查询联系人失败: %w", err)
return nil, errors.QueryFailed(query, err)
}
defer rows.Close()
@@ -314,7 +315,7 @@ func (ds *DataSource) GetContacts(ctx context.Context, key string, limit, offset
)
if err != nil {
return nil, fmt.Errorf("扫描联系人行失败: %w", err)
return nil, errors.ScanRowFailed(err)
}
contacts = append(contacts, contactDarwinV3.Wrap())
@@ -352,7 +353,7 @@ func (ds *DataSource) GetChatRooms(ctx context.Context, key string, limit, offse
// 执行查询
rows, err := ds.chatRoomDb.QueryContext(ctx, query, args...)
if err != nil {
return nil, fmt.Errorf("查询群聊失败: %w", err)
return nil, errors.QueryFailed(query, err)
}
defer rows.Close()
@@ -368,7 +369,7 @@ func (ds *DataSource) GetChatRooms(ctx context.Context, key string, limit, offse
)
if err != nil {
return nil, fmt.Errorf("扫描群聊行失败: %w", err)
return nil, errors.ScanRowFailed(err)
}
chatRooms = append(chatRooms, chatRoomDarwinV3.Wrap(ds.user2DisplayName))
@@ -386,7 +387,7 @@ func (ds *DataSource) GetChatRooms(ctx context.Context, key string, limit, offse
contacts[0].UserName)
if err != nil {
return nil, fmt.Errorf("查询群聊失败: %w", err)
return nil, errors.QueryFailed(query, err)
}
defer rows.Close()
@@ -401,7 +402,7 @@ func (ds *DataSource) GetChatRooms(ctx context.Context, key string, limit, offse
)
if err != nil {
return nil, fmt.Errorf("扫描群聊行失败: %w", err)
return nil, errors.ScanRowFailed(err)
}
chatRooms = append(chatRooms, chatRoomDarwinV3.Wrap(ds.user2DisplayName))
@@ -449,7 +450,7 @@ func (ds *DataSource) GetSessions(ctx context.Context, key string, limit, offset
// 执行查询
rows, err := ds.sessionDb.QueryContext(ctx, query, args...)
if err != nil {
return nil, fmt.Errorf("查询会话失败: %w", err)
return nil, errors.QueryFailed(query, err)
}
defer rows.Close()
@@ -462,7 +463,7 @@ func (ds *DataSource) GetSessions(ctx context.Context, key string, limit, offset
)
if err != nil {
return nil, fmt.Errorf("扫描会话行失败: %w", err)
return nil, errors.ScanRowFailed(err)
}
// 包装成通用模型
@@ -488,7 +489,7 @@ func (ds *DataSource) GetSessions(ctx context.Context, key string, limit, offset
func (ds *DataSource) GetMedia(ctx context.Context, _type string, key string) (*model.Media, error) {
if key == "" {
return nil, fmt.Errorf("key 不能为空")
return nil, errors.ErrKeyEmpty
}
query := `SELECT
r.mediaMd5,
@@ -507,7 +508,7 @@ WHERE
// 执行查询
rows, err := ds.mediaDb.QueryContext(ctx, query, args...)
if err != nil {
return nil, fmt.Errorf("查询媒体失败: %w", err)
return nil, errors.QueryFailed(query, err)
}
defer rows.Close()
@@ -524,7 +525,7 @@ WHERE
)
if err != nil {
return nil, fmt.Errorf("扫描会话行失败: %w", err)
return nil, errors.ScanRowFailed(err)
}
// 包装成通用模型
@@ -532,7 +533,7 @@ WHERE
}
if media == nil {
return nil, fmt.Errorf("未找到媒体 %s", key)
return nil, errors.ErrMediaNotFound
}
return media, nil
@@ -543,42 +544,42 @@ func (ds *DataSource) Close() error {
var errs []error
// 关闭消息数据库连接
for i, db := range ds.messageDbs {
for _, db := range ds.messageDbs {
if err := db.Close(); err != nil {
errs = append(errs, fmt.Errorf("关闭消息数据库 %d 失败: %w", i, err))
errs = append(errs, err)
}
}
// 关闭联系人数据库连接
if ds.contactDb != nil {
if err := ds.contactDb.Close(); err != nil {
errs = append(errs, fmt.Errorf("关闭联系人数据库失败: %w", err))
errs = append(errs, err)
}
}
// 关闭群聊数据库连接
if ds.chatRoomDb != nil {
if err := ds.chatRoomDb.Close(); err != nil {
errs = append(errs, fmt.Errorf("关闭群聊数据库失败: %w", err))
errs = append(errs, err)
}
}
// 关闭会话数据库连接
if ds.sessionDb != nil {
if err := ds.sessionDb.Close(); err != nil {
errs = append(errs, fmt.Errorf("关闭会话数据库失败: %w", err))
errs = append(errs, err)
}
}
// 关闭媒体数据库连接
if ds.mediaDb != nil {
if err := ds.mediaDb.Close(); err != nil {
errs = append(errs, fmt.Errorf("关闭媒体数据库失败: %w", err))
errs = append(errs, err)
}
}
if len(errs) > 0 {
return fmt.Errorf("关闭数据库连接时发生错误: %v", errs)
return errors.DBCloseFailed(errs[0])
}
return nil