-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathevo.database.go
More file actions
137 lines (122 loc) · 2.87 KB
/
evo.database.go
File metadata and controls
137 lines (122 loc) · 2.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
package evo
import (
"context"
"fmt"
"log"
"os"
"strings"
"time"
dbpkg "github.com/getevo/evo/v2/lib/db"
"github.com/getevo/evo/v2/lib/db/schema"
evolog "github.com/getevo/evo/v2/lib/log"
"github.com/getevo/evo/v2/lib/settings"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
var db *gorm.DB
func setupDatabase() error {
var err error
var config = DatabaseConfig{}
settings.Register("Database", &config)
settings.Get("Database").Cast(&config)
if !config.Enabled {
return nil
}
var logLevel logger.LogLevel
switch config.Debug {
case 4:
logLevel = logger.Info
case 3:
logLevel = logger.Warn
case 2:
logLevel = logger.Error
default:
logLevel = logger.Silent
}
var newLog = logger.New(
log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
logger.Config{
SlowThreshold: config.SlowQueryThreshold, // Slow SQL threshold
LogLevel: logLevel, // Log level
Colorful: true, // Disable color
},
)
cfg := &gorm.Config{
Logger: newLog,
}
driver := dbpkg.GetDriver()
if driver == nil {
return fmt.Errorf("no database driver registered")
}
driverCfg := dbpkg.DriverConfig{
Server: config.Server,
Username: config.Username,
Password: config.Password,
Database: config.Database,
Schema: config.Schema,
SSLMode: config.SSLMode,
Params: config.Params,
}
db, err = driver.Open(driverCfg, cfg)
if err != nil {
return fmt.Errorf("unable to connect to database: %w", err)
}
return nil
}
// GetDBO return database object instance
func GetDBO(ctx ...context.Context) *gorm.DB {
if db == nil {
if err := setupDatabase(); err != nil {
evolog.Fatal("failed to setup database", "error", err)
}
}
if len(ctx) > 0 {
return db.WithContext(ctx[0])
}
return db
}
// GetDB returns a database instance with context for proper context propagation.
// This is the preferred method for obtaining database connections.
func GetDB(ctx ...context.Context) *gorm.DB {
return GetDBO(ctx...)
}
type Model struct {
ID uint `json:"id" gorm:"primary_key"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt *time.Time `json:"deleted_at" sql:"index"`
}
func DoMigration() error {
driver := dbpkg.GetDriver()
if driver == nil {
return fmt.Errorf("no database driver registered")
}
for _, fn := range schema.OnBeforeMigration {
fn(db)
}
queries := driver.GetMigrationScript(db)
var err error
for _, query := range queries {
query = strings.TrimSpace(query)
if query == "" || strings.HasPrefix(query, "--") {
if query != "" {
fmt.Println(query)
}
continue
}
if e := db.Exec(query).Error; e != nil {
evolog.Error(e)
err = e
}
}
for _, fn := range schema.OnAfterMigration {
fn(db)
}
return err
}
func Models() []schema.Model {
return schema.Models
}
func GetModel(name string) *schema.Model {
return schema.Find(name)
}