-
Notifications
You must be signed in to change notification settings - Fork 0
/
service.go
95 lines (82 loc) · 2.59 KB
/
service.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
package database
import (
"fmt"
"gorm.io/driver/postgres"
"gorm.io/driver/sqlite"
"gorm.io/driver/sqlserver"
"gorm.io/gorm"
)
const DefaultDatabaseName = "default"
type Service struct {
databases map[string]*Database
}
type ConnectionConfig struct {
Driver string
User string
Password string
Host string
Port string
Database string
}
type Config struct {
Connections map[string]ConnectionConfig
}
func NewService(cfg Config) (*Service, error) {
databases := make(map[string]*Database, len(cfg.Connections))
for name, cfg := range cfg.Connections {
// log.Printf("Adding database %s...\n", name)
if name == "" {
name = DefaultDatabaseName
}
db, err := createConnection(cfg)
if err != nil {
return nil, fmt.Errorf("database service: new service: error creating database with name \"%s\": %w", name, err)
}
databases[name] = db
}
return &Service{
databases: databases,
}, nil
}
func createConnection(cfg ConnectionConfig) (*Database, error) {
if cfg.Driver == "" {
return nil, fmt.Errorf("database driver is empty, supported drivers are [sqlite, sqlserver, postgres]")
}
switch cfg.Driver {
case "sqlite":
// Contoh penggunaan adapter GORM dengan SQLite
// log.Println("Connecting to SQLite database...")
db, err := gorm.Open(sqlite.Open(cfg.Database), &gorm.Config{})
if err != nil {
return nil, fmt.Errorf("SQLite connection error: %w", err)
}
// log.Println("Successfully connected to SQLite database!")
return db, nil
case "sqlserver":
dsn := fmt.Sprintf("sqlserver://%s:%s@%s:%s?database=%s", cfg.User, cfg.Password, cfg.Host, cfg.Port, cfg.Database)
// log.Println("Connecting to SQL Server database...")
db, err := gorm.Open(sqlserver.Open(dsn), &gorm.Config{})
if err != nil {
return nil, fmt.Errorf("SQL Server connection error: %w", err)
}
// log.Println("Successfully connected to SQL Server database!")
return db, nil
case "postgres":
dsn := fmt.Sprintf("postgresql://%s:%s@%s:%s/%s", cfg.User, cfg.Password, cfg.Host, cfg.Port, cfg.Database)
// log.Println("Connecting to PostgreSQL database...")
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
if err != nil {
return nil, fmt.Errorf("PostgreSQL connection error: %w", err)
}
// log.Println("Successfully connected to PostgreSQL database!")
return db, nil
default:
return nil, fmt.Errorf("unknown database driver %s, supported drivers are [sqlite, sqlserver, postgres]", cfg.Driver)
}
}
func (m *Service) GetDatabase(name string) *Database {
return m.databases[name]
}
func (m *Service) GetDefault() *Database {
return m.databases[DefaultDatabaseName]
}