Skip to content

Commit

Permalink
db migration
Browse files Browse the repository at this point in the history
  • Loading branch information
alireza0 committed Jun 6, 2024
1 parent 2cabf0a commit bfbf977
Show file tree
Hide file tree
Showing 3 changed files with 95 additions and 1 deletion.
4 changes: 4 additions & 0 deletions backend/cmd/cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ func ParseCmd() {
fmt.Println()
fmt.Println("Commands:")
fmt.Println(" admin set/reset/show first admin credentials")
fmt.Println(" migrate migrate form older version")
fmt.Println(" setting set/reset/show settings")
fmt.Println()
adminCmd.Usage()
Expand Down Expand Up @@ -70,6 +71,9 @@ func ParseCmd() {
showAdmin()
}

case "migrate":
migrateDb()

case "setting":
err := settingCmd.Parse(os.Args[2:])
if err != nil {
Expand Down
85 changes: 85 additions & 0 deletions backend/cmd/migration.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package cmd

import (
"encoding/json"
"fmt"
"log"
"s-ui/config"
"s-ui/database"
"s-ui/database/model"
"strings"

"gorm.io/gorm"
)

func migrateDb() {
err := database.OpenDB(config.GetDBPath())
if err != nil {
log.Fatal(err)
}
db := database.GetDB()
tx := db.Begin()
defer func() {
if err == nil {
tx.Commit()
} else {
tx.Rollback()
}
}()
fmt.Println("Start migrating database...")
err = migrateClientSchema(tx)
fmt.Println("Migration done!")
}

func migrateClientSchema(db *gorm.DB) error {
rows, err := db.Raw("PRAGMA table_info(clients)").Rows()
if err != nil {
fmt.Println(err)
return err
}
defer rows.Close()

for rows.Next() {
var (
cid int
cname string
ctype string
notnull int
dfltValue interface{}
pk int
)

rows.Scan(&cid, &cname, &ctype, &notnull, &dfltValue, &pk)
if cname == "config" || cname == "inbounds" || cname == "links" {
if ctype == "text" {
fmt.Printf("Column %s has type TEXT\n", cname)
oldData := make([]struct {
Id uint
Data string
}, 0)
db.Model(model.Client{}).Select("id", cname+" as data").Scan(&oldData)
for _, data := range oldData {
var newData []byte
switch cname {
case "inbounds":
inbounds := strings.Split(data.Data, ",")
newData, _ = json.MarshalIndent(inbounds, " ", " ")
case "config":
jsonData := map[string]interface{}{}
json.Unmarshal([]byte(data.Data), &jsonData)
newData, _ = json.MarshalIndent(jsonData, " ", " ")
case "links":
jsonData := make([]interface{}, 0)
json.Unmarshal([]byte(data.Data), &jsonData)
newData, _ = json.MarshalIndent(jsonData, " ", " ")
}
err = db.Model(model.Client{}).Where("id = ?", data.Id).UpdateColumn(cname, newData).Error
if err != nil {
return err
}
}
}
}
}
return nil
}
7 changes: 6 additions & 1 deletion backend/database/db.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ func initUser() error {
return nil
}

func InitDB(dbPath string) error {
func OpenDB(dbPath string) error {
dir := path.Dir(dbPath)
err := os.MkdirAll(dir, 01740)
if err != nil {
Expand All @@ -48,6 +48,11 @@ func InitDB(dbPath string) error {
Logger: gormLogger,
}
db, err = gorm.Open(sqlite.Open(dbPath), c)
return err
}

func InitDB(dbPath string) error {
err := OpenDB(dbPath)
if err != nil {
return err
}
Expand Down

0 comments on commit bfbf977

Please sign in to comment.