Spaces:
Running
Running
package bootstrap | |
import ( | |
"fmt" | |
stdlog "log" | |
"strings" | |
"time" | |
"github.com/alist-org/alist/v3/cmd/flags" | |
"github.com/alist-org/alist/v3/internal/conf" | |
"github.com/alist-org/alist/v3/internal/db" | |
log "github.com/sirupsen/logrus" | |
"gorm.io/driver/mysql" | |
"gorm.io/driver/postgres" | |
"gorm.io/driver/sqlite" | |
"gorm.io/gorm" | |
"gorm.io/gorm/logger" | |
"gorm.io/gorm/schema" | |
) | |
func InitDB() { | |
logLevel := logger.Silent | |
if flags.Debug || flags.Dev { | |
logLevel = logger.Info | |
} | |
newLogger := logger.New( | |
stdlog.New(log.StandardLogger().Out, "\r\n", stdlog.LstdFlags), | |
logger.Config{ | |
SlowThreshold: time.Second, | |
LogLevel: logLevel, | |
IgnoreRecordNotFoundError: true, | |
Colorful: true, | |
}, | |
) | |
gormConfig := &gorm.Config{ | |
NamingStrategy: schema.NamingStrategy{ | |
TablePrefix: conf.Conf.Database.TablePrefix, | |
}, | |
Logger: newLogger, | |
} | |
var dB *gorm.DB | |
var err error | |
if flags.Dev { | |
dB, err = gorm.Open(sqlite.Open("file::memory:?cache=shared"), gormConfig) | |
conf.Conf.Database.Type = "sqlite3" | |
} else { | |
database := conf.Conf.Database | |
switch database.Type { | |
case "sqlite3": | |
{ | |
if !(strings.HasSuffix(database.DBFile, ".db") && len(database.DBFile) > 3) { | |
log.Fatalf("db name error.") | |
} | |
dB, err = gorm.Open(sqlite.Open(fmt.Sprintf("%s?_journal=WAL&_vacuum=incremental", | |
database.DBFile)), gormConfig) | |
} | |
case "mysql": | |
{ | |
//[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...¶mN=valueN] | |
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local&tls=%s", | |
database.User, database.Password, database.Host, database.Port, database.Name, database.SSLMode) | |
if database.DSN != "" { | |
dsn = database.DSN | |
} | |
dB, err = gorm.Open(mysql.Open(dsn), gormConfig) | |
} | |
case "postgres": | |
{ | |
dsn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%d sslmode=%s TimeZone=Asia/Shanghai", | |
database.Host, database.User, database.Password, database.Name, database.Port, database.SSLMode) | |
if database.DSN != "" { | |
dsn = database.DSN | |
} | |
dB, err = gorm.Open(postgres.Open(dsn), gormConfig) | |
} | |
default: | |
log.Fatalf("not supported database type: %s", database.Type) | |
} | |
} | |
if err != nil { | |
log.Fatalf("failed to connect database:%s", err.Error()) | |
} | |
db.Init(dB) | |
} | |