Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alist-org
GitHub Repository: alist-org/alist
Path: blob/main/internal/bootstrap/db.go
1560 views
1
package bootstrap
2
3
import (
4
"fmt"
5
stdlog "log"
6
"strings"
7
"time"
8
9
"github.com/alist-org/alist/v3/cmd/flags"
10
"github.com/alist-org/alist/v3/internal/conf"
11
"github.com/alist-org/alist/v3/internal/db"
12
log "github.com/sirupsen/logrus"
13
"gorm.io/driver/mysql"
14
"gorm.io/driver/postgres"
15
"gorm.io/driver/sqlite"
16
"gorm.io/gorm"
17
"gorm.io/gorm/logger"
18
"gorm.io/gorm/schema"
19
)
20
21
func InitDB() {
22
logLevel := logger.Silent
23
if flags.Debug || flags.Dev {
24
logLevel = logger.Info
25
}
26
newLogger := logger.New(
27
stdlog.New(log.StandardLogger().Out, "\r\n", stdlog.LstdFlags),
28
logger.Config{
29
SlowThreshold: time.Second,
30
LogLevel: logLevel,
31
IgnoreRecordNotFoundError: true,
32
Colorful: true,
33
},
34
)
35
gormConfig := &gorm.Config{
36
NamingStrategy: schema.NamingStrategy{
37
TablePrefix: conf.Conf.Database.TablePrefix,
38
},
39
Logger: newLogger,
40
}
41
var dB *gorm.DB
42
var err error
43
if flags.Dev {
44
dB, err = gorm.Open(sqlite.Open("file::memory:?cache=shared"), gormConfig)
45
conf.Conf.Database.Type = "sqlite3"
46
} else {
47
database := conf.Conf.Database
48
switch database.Type {
49
case "sqlite3":
50
{
51
if !(strings.HasSuffix(database.DBFile, ".db") && len(database.DBFile) > 3) {
52
log.Fatalf("db name error.")
53
}
54
dB, err = gorm.Open(sqlite.Open(fmt.Sprintf("%s?_journal=WAL&_vacuum=incremental",
55
database.DBFile)), gormConfig)
56
}
57
case "mysql":
58
{
59
dsn := database.DSN
60
if dsn == "" {
61
//[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...&paramN=valueN]
62
dsn = fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local&tls=%s",
63
database.User, database.Password, database.Host, database.Port, database.Name, database.SSLMode)
64
}
65
dB, err = gorm.Open(mysql.Open(dsn), gormConfig)
66
}
67
case "postgres":
68
{
69
dsn := database.DSN
70
if dsn == "" {
71
if database.Password != "" {
72
dsn = fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%d sslmode=%s TimeZone=Asia/Shanghai",
73
database.Host, database.User, database.Password, database.Name, database.Port, database.SSLMode)
74
} else {
75
dsn = fmt.Sprintf("host=%s user=%s dbname=%s port=%d sslmode=%s TimeZone=Asia/Shanghai",
76
database.Host, database.User, database.Name, database.Port, database.SSLMode)
77
}
78
}
79
dB, err = gorm.Open(postgres.Open(dsn), gormConfig)
80
}
81
default:
82
log.Fatalf("not supported database type: %s", database.Type)
83
}
84
}
85
if err != nil {
86
log.Fatalf("failed to connect database:%s", err.Error())
87
}
88
db.Init(dB)
89
}
90
91