init.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package dao
  2. import (
  3. "errors"
  4. "fmt"
  5. "os"
  6. "path/filepath"
  7. "sync"
  8. "gorm.io/gorm/logger"
  9. "github.com/ChineseSubFinder/ChineseSubFinder/pkg"
  10. "github.com/ChineseSubFinder/ChineseSubFinder/internal/models"
  11. "gorm.io/driver/sqlite"
  12. "gorm.io/gorm"
  13. )
  14. // GetDb 获取数据库实例
  15. func GetDb() *gorm.DB {
  16. if db == nil {
  17. once.Do(func() {
  18. err := InitDb()
  19. if err != nil {
  20. panic(err)
  21. }
  22. })
  23. }
  24. return db
  25. }
  26. // DeleteDbFile 删除 Db 文件
  27. func DeleteDbFile() error {
  28. if db != nil {
  29. sqlDB, err := db.DB()
  30. if err != nil {
  31. return err
  32. }
  33. err = sqlDB.Close()
  34. if err != nil {
  35. return err
  36. }
  37. }
  38. // 这里需要考虑是 Windows 的时候就是在本程序的允许目录下新建数据库即可
  39. // 如果是 Linux 则在 /config 目录下
  40. nowDbFileName := getDbName()
  41. if pkg.IsFile(nowDbFileName) == true {
  42. return os.Remove(nowDbFileName)
  43. }
  44. return nil
  45. }
  46. // InitDb 初始化数据库
  47. func InitDb() error {
  48. var err error
  49. // 新建数据库
  50. nowDbFileName := getDbName()
  51. dbDir := filepath.Dir(nowDbFileName)
  52. if pkg.IsDir(dbDir) == false {
  53. _ = os.MkdirAll(dbDir, os.ModePerm)
  54. }
  55. db, err = gorm.Open(sqlite.Open(nowDbFileName), &gorm.Config{})
  56. if err != nil {
  57. return errors.New(fmt.Sprintf("failed to connect database, %s", err.Error()))
  58. }
  59. // 降低 gorm 的日志级别
  60. db.Logger = logger.Default.LogMode(logger.Silent)
  61. // 迁移 schema
  62. err = db.AutoMigrate(&models.HotFix{}, &models.SubFormatRec{},
  63. &models.IMDBInfo{}, &models.VideoSubInfo{},
  64. &models.ThirdPartSetVideoPlayedInfo{},
  65. &models.MediaInfo{},
  66. &models.LowVideoSubInfo{},
  67. &models.Info{},
  68. &models.SkipScanInfo{},
  69. )
  70. if err != nil {
  71. return errors.New(fmt.Sprintf("db AutoMigrate error, %s", err.Error()))
  72. }
  73. return nil
  74. }
  75. func getDbName() string {
  76. return filepath.Join(pkg.GetConfigRootDirFPath(), dbFileName)
  77. }
  78. var (
  79. db *gorm.DB
  80. once sync.Once
  81. )
  82. const (
  83. dbFileName = "ChineseSubFinder-Cache.db"
  84. )