init.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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. "github.com/allanpk716/ChineseSubFinder/internal/pkg/sqlite"
  9. "gorm.io/gorm"
  10. "os"
  11. "path/filepath"
  12. "runtime"
  13. "sync"
  14. )
  15. // GetDb 获取数据库实例
  16. func GetDb() *gorm.DB {
  17. if db == nil {
  18. once.Do(func() {
  19. err := InitDb()
  20. if err != nil {
  21. log_helper.GetLogger().Errorln("dao.InitDb()", err)
  22. panic(err)
  23. }
  24. })
  25. }
  26. return db
  27. }
  28. // DeleteDbFile 删除 Db 文件
  29. func DeleteDbFile() error {
  30. if db != nil {
  31. sqlDB, err := db.DB()
  32. if err != nil {
  33. return err
  34. }
  35. err = sqlDB.Close()
  36. if err != nil {
  37. return err
  38. }
  39. }
  40. // 这里需要考虑是 Windows 的时候就是在本程序的允许目录下新建数据库即可
  41. // 如果是 Linux 则在 /config 目录下
  42. nowDbFileName := getDbName()
  43. if my_util.IsFile(nowDbFileName) == true {
  44. return os.Remove(nowDbFileName)
  45. }
  46. return nil
  47. }
  48. // InitDb 初始化数据库
  49. func InitDb() error {
  50. var err error
  51. // 新建数据库
  52. nowDbFileName := getDbName()
  53. if nowDbFileName == "" {
  54. return errors.New(fmt.Sprintf(`InitDb().getDbName() is empty, not support this OS.
  55. you need implement getDbName() in file: internal/dao/init.go `))
  56. }
  57. dbDir := filepath.Dir(nowDbFileName)
  58. if my_util.IsDir(dbDir) == false {
  59. _ = os.MkdirAll(dbDir, os.ModePerm)
  60. }
  61. db, err = gorm.Open(sqlite.Open(nowDbFileName), &gorm.Config{})
  62. if err != nil {
  63. return errors.New(fmt.Sprintf("failed to connect database, %s", err.Error()))
  64. }
  65. // 迁移 schema
  66. err = db.AutoMigrate(&models.HotFix{}, &models.SubFormatRec{},
  67. &models.UserInfo{})
  68. if err != nil {
  69. return errors.New(fmt.Sprintf("db AutoMigrate error, %s", err.Error()))
  70. }
  71. return nil
  72. }
  73. func getDbName() string {
  74. nowDbFileName := ""
  75. sysType := runtime.GOOS
  76. if sysType == "linux" {
  77. nowDbFileName = dbFileNameLinux
  78. }
  79. if sysType == "windows" {
  80. nowDbFileName = dbFileNameWindows
  81. }
  82. if sysType == "darwin" {
  83. home, _ := os.UserHomeDir()
  84. nowDbFileName = home + "/.config/chinesesubfinder/" + dbFileNameDarwin
  85. }
  86. return nowDbFileName
  87. }
  88. var (
  89. db *gorm.DB
  90. once sync.Once
  91. )
  92. const (
  93. dbFileNameLinux = "/config/settings.db"
  94. dbFileNameWindows = "settings.db"
  95. dbFileNameDarwin = "settings.db"
  96. )