|
|
package model |
|
|
|
|
|
import ( |
|
|
"gorm.io/driver/mysql" |
|
|
"gorm.io/driver/postgres" |
|
|
"gorm.io/driver/sqlite" |
|
|
"gorm.io/gorm" |
|
|
"one-api/common" |
|
|
"os" |
|
|
"strings" |
|
|
"time" |
|
|
) |
|
|
|
|
|
var DB *gorm.DB |
|
|
|
|
|
func createRootAccountIfNeed() error { |
|
|
var user User |
|
|
|
|
|
if err := DB.First(&user).Error; err != nil { |
|
|
common.SysLog("no user exists, create a root user for you: username is root, password is 123456") |
|
|
hashedPassword, err := common.Password2Hash("123456") |
|
|
if err != nil { |
|
|
return err |
|
|
} |
|
|
rootUser := User{ |
|
|
Username: "root", |
|
|
Password: hashedPassword, |
|
|
Role: common.RoleRootUser, |
|
|
Status: common.UserStatusEnabled, |
|
|
DisplayName: "Root User", |
|
|
AccessToken: common.GetUUID(), |
|
|
Quota: 100000000, |
|
|
} |
|
|
DB.Create(&rootUser) |
|
|
} |
|
|
return nil |
|
|
} |
|
|
|
|
|
func chooseDB() (*gorm.DB, error) { |
|
|
if os.Getenv("SQL_DSN") != "" { |
|
|
dsn := os.Getenv("SQL_DSN") |
|
|
if strings.HasPrefix(dsn, "postgres://") { |
|
|
|
|
|
common.SysLog("using PostgreSQL as database") |
|
|
return gorm.Open(postgres.New(postgres.Config{ |
|
|
DSN: dsn, |
|
|
PreferSimpleProtocol: true, |
|
|
}), &gorm.Config{ |
|
|
PrepareStmt: true, |
|
|
}) |
|
|
} |
|
|
|
|
|
common.SysLog("using MySQL as database") |
|
|
return gorm.Open(mysql.Open(dsn), &gorm.Config{ |
|
|
PrepareStmt: true, |
|
|
}) |
|
|
} |
|
|
|
|
|
common.SysLog("SQL_DSN not set, using SQLite as database") |
|
|
common.UsingSQLite = true |
|
|
return gorm.Open(sqlite.Open(common.SQLitePath), &gorm.Config{ |
|
|
PrepareStmt: true, |
|
|
}) |
|
|
} |
|
|
|
|
|
func InitDB() (err error) { |
|
|
db, err := chooseDB() |
|
|
if err == nil { |
|
|
if common.DebugEnabled { |
|
|
db = db.Debug() |
|
|
} |
|
|
DB = db |
|
|
sqlDB, err := DB.DB() |
|
|
if err != nil { |
|
|
return err |
|
|
} |
|
|
sqlDB.SetMaxIdleConns(common.GetOrDefault("SQL_MAX_IDLE_CONNS", 100)) |
|
|
sqlDB.SetMaxOpenConns(common.GetOrDefault("SQL_MAX_OPEN_CONNS", 1000)) |
|
|
sqlDB.SetConnMaxLifetime(time.Second * time.Duration(common.GetOrDefault("SQL_MAX_LIFETIME", 60))) |
|
|
|
|
|
if !common.IsMasterNode { |
|
|
return nil |
|
|
} |
|
|
err = db.AutoMigrate(&Channel{}) |
|
|
if err != nil { |
|
|
return err |
|
|
} |
|
|
err = db.AutoMigrate(&Token{}) |
|
|
if err != nil { |
|
|
return err |
|
|
} |
|
|
err = db.AutoMigrate(&User{}) |
|
|
if err != nil { |
|
|
return err |
|
|
} |
|
|
err = db.AutoMigrate(&Option{}) |
|
|
if err != nil { |
|
|
return err |
|
|
} |
|
|
err = db.AutoMigrate(&Redemption{}) |
|
|
if err != nil { |
|
|
return err |
|
|
} |
|
|
err = db.AutoMigrate(&Ability{}) |
|
|
if err != nil { |
|
|
return err |
|
|
} |
|
|
err = db.AutoMigrate(&Log{}) |
|
|
if err != nil { |
|
|
return err |
|
|
} |
|
|
common.SysLog("database migrated") |
|
|
err = createRootAccountIfNeed() |
|
|
return err |
|
|
} else { |
|
|
common.FatalLog(err) |
|
|
} |
|
|
return err |
|
|
} |
|
|
|
|
|
func CloseDB() error { |
|
|
sqlDB, err := DB.DB() |
|
|
if err != nil { |
|
|
return err |
|
|
} |
|
|
err = sqlDB.Close() |
|
|
return err |
|
|
} |
|
|
|