Files
trihuy-russian/database/db.go
T

124 lines
1.9 KiB
Go
Raw Normal View History

2023-02-09 22:48:06 +03:30
package database
import (
2023-05-05 22:51:39 +04:30
"bytes"
"io"
2023-02-09 22:48:06 +03:30
"io/fs"
"os"
"path"
2023-07-01 15:56:43 +03:30
2023-02-09 22:48:06 +03:30
"x-ui/config"
"x-ui/database/model"
2023-02-16 19:28:20 +03:30
"x-ui/xray"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
"gorm.io/gorm/logger"
2023-02-09 22:48:06 +03:30
)
var db *gorm.DB
2023-05-23 02:43:15 +03:30
var initializers = []func() error{
initUser,
initInbound,
initSetting,
initInboundClientIps,
initClientTraffic,
}
2023-02-09 22:48:06 +03:30
func initUser() error {
err := db.AutoMigrate(&model.User{})
if err != nil {
return err
}
var count int64
err = db.Model(&model.User{}).Count(&count).Error
if err != nil {
return err
}
if count == 0 {
user := &model.User{
2023-04-21 19:00:14 +03:30
Username: "admin",
Password: "admin",
LoginSecret: "",
2023-02-09 22:48:06 +03:30
}
return db.Create(user).Error
}
return nil
}
func initInbound() error {
return db.AutoMigrate(&model.Inbound{})
}
func initSetting() error {
return db.AutoMigrate(&model.Setting{})
}
2023-07-01 15:56:43 +03:30
2023-02-28 23:24:29 +03:30
func initInboundClientIps() error {
return db.AutoMigrate(&model.InboundClientIps{})
}
2023-07-01 15:56:43 +03:30
2023-02-09 22:48:06 +03:30
func initClientTraffic() error {
return db.AutoMigrate(&xray.ClientTraffic{})
}
func InitDB(dbPath string) error {
dir := path.Dir(dbPath)
2023-05-23 02:43:15 +03:30
err := os.MkdirAll(dir, fs.ModePerm)
2023-02-09 22:48:06 +03:30
if err != nil {
return err
}
var gormLogger logger.Interface
if config.IsDebug() {
gormLogger = logger.Default
} else {
gormLogger = logger.Discard
}
c := &gorm.Config{
Logger: gormLogger,
}
db, err = gorm.Open(sqlite.Open(dbPath), c)
if err != nil {
return err
}
2023-05-23 02:43:15 +03:30
for _, initialize := range initializers {
if err := initialize(); err != nil {
return err
}
2023-02-09 22:48:06 +03:30
}
2023-04-10 14:33:50 +03:30
2023-02-09 22:48:06 +03:30
return nil
}
func GetDB() *gorm.DB {
return db
}
func IsNotFound(err error) bool {
return err == gorm.ErrRecordNotFound
}
2023-05-05 22:51:39 +04:30
2023-05-23 02:43:15 +03:30
func IsSQLiteDB(file io.ReaderAt) (bool, error) {
2023-05-05 22:51:39 +04:30
signature := []byte("SQLite format 3\x00")
buf := make([]byte, len(signature))
2023-05-23 02:43:15 +03:30
_, err := file.ReadAt(buf, 0)
2023-05-05 22:51:39 +04:30
if err != nil {
return false, err
}
return bytes.Equal(buf, signature), nil
}
2023-12-08 20:35:10 +01:00
func Checkpoint() error {
// Update WAL
err := db.Exec("PRAGMA wal_checkpoint;").Error
if err != nil {
return err
}
return nil
}