123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- package dao
- import (
- "errors"
- "fmt"
- "os"
- "path/filepath"
- "sync"
- "gorm.io/gorm/logger"
- "github.com/ChineseSubFinder/ChineseSubFinder/pkg"
- "github.com/ChineseSubFinder/ChineseSubFinder/internal/models"
- "gorm.io/driver/sqlite"
- "gorm.io/gorm"
- )
- // GetDb 获取数据库实例
- func GetDb() *gorm.DB {
- if db == nil {
- once.Do(func() {
- err := InitDb()
- if err != nil {
- panic(err)
- }
- })
- }
- return db
- }
- // DeleteDbFile 删除 Db 文件
- func DeleteDbFile() error {
- if db != nil {
- sqlDB, err := db.DB()
- if err != nil {
- return err
- }
- err = sqlDB.Close()
- if err != nil {
- return err
- }
- }
- // 这里需要考虑是 Windows 的时候就是在本程序的允许目录下新建数据库即可
- // 如果是 Linux 则在 /config 目录下
- nowDbFileName := getDbName()
- if pkg.IsFile(nowDbFileName) == true {
- return os.Remove(nowDbFileName)
- }
- return nil
- }
- // InitDb 初始化数据库
- func InitDb() error {
- var err error
- // 新建数据库
- nowDbFileName := getDbName()
- dbDir := filepath.Dir(nowDbFileName)
- if pkg.IsDir(dbDir) == false {
- _ = os.MkdirAll(dbDir, os.ModePerm)
- }
- db, err = gorm.Open(sqlite.Open(nowDbFileName), &gorm.Config{})
- if err != nil {
- return errors.New(fmt.Sprintf("failed to connect database, %s", err.Error()))
- }
- // 降低 gorm 的日志级别
- db.Logger = logger.Default.LogMode(logger.Silent)
- // 迁移 schema
- err = db.AutoMigrate(&models.HotFix{}, &models.SubFormatRec{},
- &models.IMDBInfo{}, &models.VideoSubInfo{},
- &models.ThirdPartSetVideoPlayedInfo{},
- &models.MediaInfo{},
- &models.LowVideoSubInfo{},
- &models.Info{},
- &models.SkipScanInfo{},
- )
- if err != nil {
- return errors.New(fmt.Sprintf("db AutoMigrate error, %s", err.Error()))
- }
- return nil
- }
- func getDbName() string {
- return filepath.Join(pkg.GetConfigRootDirFPath(), dbFileName)
- }
- var (
- db *gorm.DB
- once sync.Once
- )
- const (
- dbFileName = "ChineseSubFinder-Cache.db"
- )
|