mirror of
https://github.com/KaySar12/NextZen-UserService.git
synced 2025-10-06 19:59:42 +07:00
fix migration from v0.3.3 (#11)
This commit is contained in:
@@ -1,3 +1,3 @@
|
|||||||
LEGACY_WITHOUT_VERSION v0.3.6-alpha5
|
LEGACY_WITHOUT_VERSION v0.3.6-alpha6
|
||||||
v0.3.5 v0.3.6-alpha5
|
v0.3.5 v0.3.6-alpha6
|
||||||
v0.3.5.1 v0.3.6-alpha5
|
v0.3.5.1 v0.3.6-alpha6
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"database/sql"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strconv"
|
"strconv"
|
||||||
@@ -94,16 +95,56 @@ func (u *migrationTool1) Migrate() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (u *migrationTool1) PostMigrate() error {
|
func (u *migrationTool1) PostMigrate() error {
|
||||||
_logger.Info("Deleting legacy `user` section in %s...", version.LegacyCasaOSConfigFilePath)
|
|
||||||
|
|
||||||
legacyConfigFile, err := ini.Load(version.LegacyCasaOSConfigFilePath)
|
legacyConfigFile, err := ini.Load(version.LegacyCasaOSConfigFilePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_logger.Info("Deleting legacy `user` section in %s...", version.LegacyCasaOSConfigFilePath)
|
||||||
|
|
||||||
legacyConfigFile.DeleteSection("user")
|
legacyConfigFile.DeleteSection("user")
|
||||||
|
|
||||||
return legacyConfigFile.SaveTo(version.LegacyCasaOSConfigFilePath)
|
if err := legacyConfigFile.SaveTo(version.LegacyCasaOSConfigFilePath); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
dbPath := legacyConfigFile.Section("app").Key("DBPath").String()
|
||||||
|
|
||||||
|
dbFile := filepath.Join(dbPath, "db", "casaOS.db")
|
||||||
|
|
||||||
|
if _, err := os.Stat(dbFile); err != nil {
|
||||||
|
dbFile = filepath.Join(defaultDBPath, "db", "casaOS.db")
|
||||||
|
|
||||||
|
if _, err := os.Stat(dbFile); err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
legacyDB, err := sql.Open("sqlite3", dbFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
defer legacyDB.Close()
|
||||||
|
|
||||||
|
for _, tableName := range []string{"o_users", "o_user"} {
|
||||||
|
tableExists, err := isTableExist(legacyDB, tableName)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if !tableExists {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
_logger.Info("Dropping `%s` table in legacy database...", tableName)
|
||||||
|
|
||||||
|
if _, err = legacyDB.Exec("DROP TABLE " + tableName); err != nil {
|
||||||
|
_logger.Error("Failed to drop `%s` table in legacy database: %s", tableName, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewMigrationToolFor032AndOlder() interfaces.MigrationTool {
|
func NewMigrationToolFor032AndOlder() interfaces.MigrationTool {
|
||||||
|
|||||||
@@ -125,6 +125,14 @@ func (u *migrationTool2) PostMigrate() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_logger.Info("Deleting legacy `user` section in %s...", version.LegacyCasaOSConfigFilePath)
|
||||||
|
|
||||||
|
legacyConfigFile.DeleteSection("user")
|
||||||
|
|
||||||
|
if err := legacyConfigFile.SaveTo(version.LegacyCasaOSConfigFilePath); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
dbPath := legacyConfigFile.Section("app").Key("DBPath").String()
|
dbPath := legacyConfigFile.Section("app").Key("DBPath").String()
|
||||||
|
|
||||||
dbFile := filepath.Join(dbPath, "db", "casaOS.db")
|
dbFile := filepath.Join(dbPath, "db", "casaOS.db")
|
||||||
@@ -133,7 +141,7 @@ func (u *migrationTool2) PostMigrate() error {
|
|||||||
dbFile = filepath.Join(defaultDBPath, "db", "casaOS.db")
|
dbFile = filepath.Join(defaultDBPath, "db", "casaOS.db")
|
||||||
|
|
||||||
if _, err := os.Stat(dbFile); err != nil {
|
if _, err := os.Stat(dbFile); err != nil {
|
||||||
return err
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,21 +152,24 @@ func (u *migrationTool2) PostMigrate() error {
|
|||||||
|
|
||||||
defer legacyDB.Close()
|
defer legacyDB.Close()
|
||||||
|
|
||||||
if tableExists, err := isTableExist(legacyDB, "o_users"); err != nil {
|
for _, tableName := range []string{"o_users", "o_user"} {
|
||||||
return err
|
tableExists, err := isTableExist(legacyDB, tableName)
|
||||||
} else if tableExists {
|
if err != nil {
|
||||||
_logger.Info("Dropping `o_users` table in legacy database...")
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
if _, err = legacyDB.Exec("DROP TABLE o_users"); err != nil {
|
if !tableExists {
|
||||||
_logger.Error("Failed to drop `o_users` table in legacy database: %s", err)
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
_logger.Info("Dropping `%s` table in legacy database...", tableName)
|
||||||
|
|
||||||
|
if _, err = legacyDB.Exec("DROP TABLE " + tableName); err != nil {
|
||||||
|
_logger.Error("Failed to drop `%s` table in legacy database: %s", tableName, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_logger.Info("Deleting legacy `user` section in %s...", version.LegacyCasaOSConfigFilePath)
|
return nil
|
||||||
|
|
||||||
legacyConfigFile.DeleteSection("user")
|
|
||||||
|
|
||||||
return legacyConfigFile.SaveTo(version.LegacyCasaOSConfigFilePath)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewMigrationToolFor033_034_035() interfaces.MigrationTool {
|
func NewMigrationToolFor033_034_035() interfaces.MigrationTool {
|
||||||
@@ -220,47 +231,54 @@ func migrateUser2(legacyConfigFile *ini.File) error {
|
|||||||
|
|
||||||
defer legacyDB.Close()
|
defer legacyDB.Close()
|
||||||
|
|
||||||
if tableExists, err := isTableExist(legacyDB, "o_users"); err != nil {
|
|
||||||
return err
|
|
||||||
} else if !tableExists {
|
|
||||||
_logger.Info("Table `o_users` not found in legacy database. Skipping...")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
sqlStatement := "SELECT id, username, password, role, email, nickname, avatar, description, created_at FROM o_users ORDER BY id ASC"
|
|
||||||
|
|
||||||
rows, err := legacyDB.Query(sqlStatement)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer rows.Close()
|
|
||||||
|
|
||||||
newDB := sqlite.GetDb(config.AppInfo.DBPath)
|
newDB := sqlite.GetDb(config.AppInfo.DBPath)
|
||||||
userService := service.NewUserService(newDB)
|
userService := service.NewUserService(newDB)
|
||||||
|
|
||||||
for rows.Next() {
|
// create an inline map from string to string
|
||||||
if err := rows.Scan(
|
sqlTableStatementMap := make(map[string]string)
|
||||||
&user.Id,
|
sqlTableStatementMap["o_users"] = "SELECT id, username, password, role, email, nickname, avatar, description, created_at FROM o_users ORDER BY id ASC"
|
||||||
&user.Username,
|
sqlTableStatementMap["o_user"] = "SELECT id, user_name, password, role, email, nick_name, avatar, description, created_at FROM o_user ORDER BY id ASC"
|
||||||
&user.Password,
|
|
||||||
&user.Role,
|
// historically there were two names for user table: o_users and users
|
||||||
&user.Email,
|
for tableName, sqlStatement := range sqlTableStatementMap {
|
||||||
&user.Nickname,
|
tableExists, err := isTableExist(legacyDB, tableName)
|
||||||
&user.Avatar,
|
if err != nil {
|
||||||
&user.Description,
|
|
||||||
&user.CreatedAt,
|
|
||||||
); err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if userService.GetUserAllInfoByName(user.Username).Id > 0 {
|
if !tableExists {
|
||||||
_logger.Info("User %s already exists in user database at %s, skipping...", user.Username, config.AppInfo.DBPath)
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
rows, err := legacyDB.Query(sqlStatement)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
_logger.Info("Creating user %s in user database...", user.Username)
|
defer rows.Close()
|
||||||
user = userService.CreateUser(user)
|
|
||||||
|
for rows.Next() {
|
||||||
|
if err := rows.Scan(
|
||||||
|
&user.Id,
|
||||||
|
&user.Username,
|
||||||
|
&user.Password,
|
||||||
|
&user.Role,
|
||||||
|
&user.Email,
|
||||||
|
&user.Nickname,
|
||||||
|
&user.Avatar,
|
||||||
|
&user.Description,
|
||||||
|
&user.CreatedAt,
|
||||||
|
); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if userService.GetUserAllInfoByName(user.Username).Id > 0 {
|
||||||
|
_logger.Info("User %s already exists in user database at %s, skipping...", user.Username, config.AppInfo.DBPath)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
_logger.Info("Creating user %s in user database...", user.Username)
|
||||||
|
user = userService.CreateUser(user)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
+6
-17
@@ -26,31 +26,20 @@ func GetDb(dbPath string) *gorm.DB {
|
|||||||
if gdb != nil {
|
if gdb != nil {
|
||||||
return gdb
|
return gdb
|
||||||
}
|
}
|
||||||
// Refer https://github.com/go-sql-driver/mysql#dsn-data-source-name
|
|
||||||
// dsn := fmt.Sprintf("%v:%v@tcp(%v:%v)/%v?charset=utf8mb4&parseTime=True&loc=Local", m.User, m.PWD, m.IP, m.Port, m.DBName)
|
|
||||||
// db, err := gorm.Open(mysql2.Open(dsn), &gorm.Config{})
|
|
||||||
file.IsNotExistMkDir(dbPath)
|
file.IsNotExistMkDir(dbPath)
|
||||||
db, err := gorm.Open(sqlite.Open(dbPath+"/user.db"), &gorm.Config{})
|
db, err := gorm.Open(sqlite.Open(dbPath+"/user.db"), &gorm.Config{})
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
c, _ := db.DB()
|
c, _ := db.DB()
|
||||||
c.SetMaxIdleConns(10)
|
c.SetMaxIdleConns(10)
|
||||||
c.SetMaxOpenConns(100)
|
c.SetMaxOpenConns(100)
|
||||||
c.SetConnMaxIdleTime(time.Second * 1000)
|
c.SetConnMaxIdleTime(time.Second * 1000)
|
||||||
if err != nil {
|
|
||||||
logger.Error("sqlite connect error", zap.Any("db connect error", err))
|
|
||||||
panic("sqlite connect error")
|
|
||||||
}
|
|
||||||
gdb = db
|
gdb = db
|
||||||
|
|
||||||
db.Exec(`alter table o_user rename to old_user;
|
|
||||||
|
|
||||||
create table o_users ( id integer primary key,username text,password text,role text,email text,nickname text,avatar text,description text,created_at datetime,updated_at datetime);
|
|
||||||
|
|
||||||
insert into o_users select id,user_name,password,role,email,nick_name,avatar,description,created_at,updated_at from old_user;
|
|
||||||
|
|
||||||
drop table old_user;
|
|
||||||
drop table o_user;
|
|
||||||
`)
|
|
||||||
|
|
||||||
err = db.AutoMigrate(model2.UserDBModel{})
|
err = db.AutoMigrate(model2.UserDBModel{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("check or create db error", zap.Any("error", err))
|
logger.Error("check or create db error", zap.Any("error", err))
|
||||||
|
|||||||
Reference in New Issue
Block a user