mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2025-12-23 14:52:43 +00:00
Compare commits
1 commit
bb65faed53
...
6d8589d7b5
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6d8589d7b5 |
2 changed files with 6 additions and 46 deletions
|
|
@ -4,7 +4,6 @@ package database
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"errors"
|
|
||||||
"io"
|
"io"
|
||||||
"io/fs"
|
"io/fs"
|
||||||
"log"
|
"log"
|
||||||
|
|
@ -201,29 +200,3 @@ func Checkpoint() error {
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ValidateSQLiteDB opens the provided sqlite DB path with a throw-away connection
|
|
||||||
// and runs a PRAGMA integrity_check to ensure the file is structurally sound.
|
|
||||||
// It does not mutate global state or run migrations.
|
|
||||||
func ValidateSQLiteDB(dbPath string) error {
|
|
||||||
if _, err := os.Stat(dbPath); err != nil { // file must exist
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
gdb, err := gorm.Open(sqlite.Open(dbPath), &gorm.Config{Logger: logger.Discard})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
sqlDB, err := gdb.DB()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer sqlDB.Close()
|
|
||||||
var res string
|
|
||||||
if err := gdb.Raw("PRAGMA integrity_check;").Scan(&res).Error; err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if res != "ok" {
|
|
||||||
return errors.New("sqlite integrity check failed: " + res)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -942,26 +942,13 @@ func (s *ServerService) ImportDB(file multipart.File) error {
|
||||||
return common.NewErrorf("Error saving db: %v", err)
|
return common.NewErrorf("Error saving db: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close temp file before opening via sqlite
|
// Check if we can init the db or not
|
||||||
if err = tempFile.Close(); err != nil {
|
if err = database.InitDB(tempPath); err != nil {
|
||||||
return common.NewErrorf("Error closing temporary db file: %v", err)
|
return common.NewErrorf("Error checking db: %v", err)
|
||||||
}
|
|
||||||
tempFile = nil
|
|
||||||
|
|
||||||
// Validate integrity (no migrations / side effects)
|
|
||||||
if err = database.ValidateSQLiteDB(tempPath); err != nil {
|
|
||||||
return common.NewErrorf("Invalid or corrupt db file: %v", err)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stop Xray (ignore error but log)
|
// Stop Xray
|
||||||
if errStop := s.StopXrayService(); errStop != nil {
|
s.StopXrayService()
|
||||||
logger.Warningf("Failed to stop Xray before DB import: %v", errStop)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close existing DB to release file locks (especially on Windows)
|
|
||||||
if errClose := database.CloseDB(); errClose != nil {
|
|
||||||
logger.Warningf("Failed to close existing DB before replacement: %v", errClose)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Backup the current database for fallback
|
// Backup the current database for fallback
|
||||||
fallbackPath := fmt.Sprintf("%s.backup", config.GetDBPath())
|
fallbackPath := fmt.Sprintf("%s.backup", config.GetDBPath())
|
||||||
|
|
@ -996,7 +983,7 @@ func (s *ServerService) ImportDB(file multipart.File) error {
|
||||||
return common.NewErrorf("Error moving db file: %v", err)
|
return common.NewErrorf("Error moving db file: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open & migrate new DB
|
// Migrate DB
|
||||||
if err = database.InitDB(config.GetDBPath()); err != nil {
|
if err = database.InitDB(config.GetDBPath()); err != nil {
|
||||||
if errRename := os.Rename(fallbackPath, config.GetDBPath()); errRename != nil {
|
if errRename := os.Rename(fallbackPath, config.GetDBPath()); errRename != nil {
|
||||||
return common.NewErrorf("Error migrating db and restoring fallback: %v", errRename)
|
return common.NewErrorf("Error migrating db and restoring fallback: %v", errRename)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue