| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- package dao
- import (
- "errors"
- "fmt"
- "github.com/allanpk716/ChineseSubFinder/internal/models"
- "github.com/allanpk716/ChineseSubFinder/internal/pkg"
- "github.com/allanpk716/ChineseSubFinder/internal/pkg/log_helper"
- "github.com/allanpk716/ChineseSubFinder/internal/pkg/sqlite"
- "gorm.io/gorm"
- "os"
- "path"
- "runtime"
- "sync"
- )
- // GetDb 获取数据库实例
- func GetDb() *gorm.DB {
- if db == nil {
- once.Do(func() {
- err := InitDb()
- if err != nil {
- log_helper.GetLogger().Errorln("dao.InitDb()", err)
- 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()
- if nowDbFileName == "" {
- return errors.New(fmt.Sprintf(`InitDb().getDbName() is empty, not support this OS.
- you need implement getDbName() in file: internal/dao/init.go `))
- }
- dbDir := path.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()))
- }
- // 迁移 schema
- err = db.AutoMigrate(&models.HotFix{}, &models.SubFormatRec{})
- if err != nil {
- return errors.New(fmt.Sprintf("db AutoMigrate error, %s", err.Error()))
- }
- return nil
- }
- func getDbName() string {
- nowDbFileName := ""
- sysType := runtime.GOOS
- if sysType == "linux" {
- nowDbFileName = dbFileNameLinux
- }
- if sysType == "windows" {
- nowDbFileName = dbFileNameWindows
- }
- return nowDbFileName
- }
- var (
- db *gorm.DB
- once sync.Once
- )
- const (
- dbFileNameLinux = "/config/settings.db"
- dbFileNameWindows = "settings.db"
- )
|