/
init.go
99 lines (84 loc) · 1.89 KB
/
init.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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"
)