init.go 1.8 KB

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