-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathsqlserver.go
More file actions
109 lines (91 loc) · 2.88 KB
/
sqlserver.go
File metadata and controls
109 lines (91 loc) · 2.88 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
package sqlserver
import (
"fmt"
"github.com/goravel/framework/contracts/config"
"github.com/goravel/framework/contracts/database"
"github.com/goravel/framework/contracts/database/driver"
"github.com/goravel/framework/contracts/log"
"github.com/goravel/framework/contracts/process"
"github.com/goravel/framework/contracts/testing/docker"
"github.com/goravel/framework/errors"
"gorm.io/driver/sqlserver"
"gorm.io/gorm"
"github.com/goravel/sqlserver/contracts"
)
var _ driver.Driver = &Sqlserver{}
type Sqlserver struct {
config contracts.ConfigBuilder
log log.Log
process process.Process
}
func NewSqlserver(config config.Config, log log.Log, process process.Process, connection string) *Sqlserver {
return &Sqlserver{
config: NewConfig(config, connection),
log: log,
process: process,
}
}
func (r *Sqlserver) Docker() (docker.DatabaseDriver, error) {
if r.process == nil {
return nil, fmt.Errorf("process facade not set")
}
writers := r.config.Writers()
if len(writers) == 0 {
return nil, errors.DatabaseConfigNotFound
}
return NewDocker(r.config, r.process, writers[0].Database, writers[0].Username, writers[0].Password), nil
}
func (r *Sqlserver) Grammar() driver.Grammar {
return NewGrammar(r.config.Writers()[0].Prefix)
}
func (r *Sqlserver) Pool() database.Pool {
return database.Pool{
Readers: r.fullConfigsToConfigs(r.config.Readers()),
Writers: r.fullConfigsToConfigs(r.config.Writers()),
}
}
func (r *Sqlserver) Processor() driver.Processor {
return NewProcessor()
}
func (r *Sqlserver) fullConfigsToConfigs(fullConfigs []contracts.FullConfig) []database.Config {
configs := make([]database.Config, len(fullConfigs))
for i, fullConfig := range fullConfigs {
configs[i] = database.Config{
Charset: fullConfig.Charset,
Connection: fullConfig.Connection,
Dsn: fullConfig.Dsn,
Database: fullConfig.Database,
Dialector: fullConfigToDialector(fullConfig),
Driver: Name,
Host: fullConfig.Host,
NameReplacer: fullConfig.NameReplacer,
NoLowerCase: fullConfig.NoLowerCase,
Password: fullConfig.Password,
Port: fullConfig.Port,
Prefix: fullConfig.Prefix,
Singular: fullConfig.Singular,
Username: fullConfig.Username,
Timezone: fullConfig.Timezone,
}
}
return configs
}
func dsn(fullConfig contracts.FullConfig) string {
if fullConfig.Dsn != "" {
return fullConfig.Dsn
}
if fullConfig.Host == "" {
return ""
}
return fmt.Sprintf("sqlserver://%s:%s@%s:%d?database=%s&charset=%s&timezone=%s&MultipleActiveResultSets=true",
fullConfig.Username, fullConfig.Password, fullConfig.Host, fullConfig.Port, fullConfig.Database, fullConfig.Charset, fullConfig.Timezone)
}
func fullConfigToDialector(fullConfig contracts.FullConfig) gorm.Dialector {
dsn := dsn(fullConfig)
if dsn == "" {
return nil
}
return sqlserver.New(sqlserver.Config{
DSN: dsn,
})
}