-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpostgres.go
98 lines (80 loc) · 2.21 KB
/
postgres.go
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
package postgres
import (
"fmt"
"github.com/goravel/framework/contracts/config"
"github.com/goravel/framework/contracts/database"
"github.com/goravel/framework/contracts/database/driver"
contractsschema "github.com/goravel/framework/contracts/database/schema"
"github.com/goravel/framework/contracts/log"
"github.com/goravel/framework/contracts/testing"
"github.com/goravel/framework/errors"
"github.com/goravel/postgres/contracts"
"gorm.io/gorm"
)
var _ driver.Driver = &Postgres{}
type Postgres struct {
config contracts.ConfigBuilder
db *gorm.DB
log log.Log
}
func NewPostgres(config config.Config, log log.Log, connection string) *Postgres {
return &Postgres{
config: NewConfig(config, connection),
log: log,
}
}
func (r *Postgres) Config() database.Config {
writers := r.config.Writes()
if len(writers) == 0 {
return database.Config{}
}
return database.Config{
Connection: writers[0].Connection,
Database: writers[0].Database,
Driver: Name,
Host: writers[0].Host,
Password: writers[0].Password,
Port: writers[0].Port,
Prefix: writers[0].Prefix,
Schema: writers[0].Schema,
Username: writers[0].Username,
Version: r.version(),
}
}
func (r *Postgres) Docker() (testing.DatabaseDriver, error) {
writers := r.config.Writes()
if len(writers) == 0 {
return nil, errors.OrmDatabaseConfigNotFound
}
return NewDocker(r.config, writers[0].Database, writers[0].Username, writers[0].Password), nil
}
func (r *Postgres) Gorm() (*gorm.DB, driver.GormQuery, error) {
if r.db != nil {
return r.db, NewQuery(), nil
}
db, err := NewGorm(r.config, r.log).Build()
if err != nil {
return nil, nil, err
}
r.db = db
return db, NewQuery(), nil
}
func (r *Postgres) Grammar() contractsschema.Grammar {
return NewGrammar(r.config.Writes()[0].Prefix)
}
func (r *Postgres) Processor() contractsschema.Processor {
return NewProcessor()
}
func (r *Postgres) version() string {
instance, _, err := r.Gorm()
if err != nil {
return ""
}
var version struct {
Value string
}
if err := instance.Raw("SELECT current_setting('server_version') AS value;").Scan(&version).Error; err != nil {
return fmt.Sprintf("UNKNOWN: %s", err)
}
return version.Value
}