-
Notifications
You must be signed in to change notification settings - Fork 1
/
xpg.go
92 lines (81 loc) · 2.17 KB
/
xpg.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
package xpg
import (
"context"
"fmt"
"sync"
"time"
"github.com/jackc/pgx/v4/pgxpool"
)
var (
mu sync.RWMutex
pools = make(map[string]*Pool)
)
// NewConnectionPool Создаст новое подключение к БД
func NewConnectionPool(ctx context.Context, poolName string, connConfig *pgxpool.Config, migrationsPath string) error {
pool, err := pgxpool.ConnectConfig(ctx, connConfig)
if err != nil {
return fmt.Errorf("xpg: Unable to connection to database: %w\n", err)
}
return AddConnectionsPool(poolName, pool, migrationsPath)
}
// AddConnectionsPool Добавит существующее подключение в коллекцию
func AddConnectionsPool(poolName string, pool *pgxpool.Pool, migrationsPath string) error {
mu.Lock()
defer mu.Unlock()
if c, ok := pools[poolName]; ok && c != nil {
c.Close()
}
pools[poolName] = addPool(pool, migrationsPath)
return nil
}
// New Вернёт подключение для работы с моделью
func New(model Modeler) *Pool {
p, err := pool(model.PoolName())
if err != nil {
panic(err)
}
return p.new(model)
}
// DB Вернёт нативное подключение к БД
func DB(poolName string) *pgxpool.Pool {
p, err := pool(poolName)
if err != nil {
panic(err)
}
return p.pool
}
// MigrationsPath Вернёт путь к директории с миграциями
func MigrationsPath(poolName string) string {
p, err := pool(poolName)
if err != nil {
panic(err)
}
return p.migrationsPath
}
// SetTimezone Задаст часовой пояс
func SetTimezone(ctx context.Context, poolName string, location *time.Location) error {
p, err := pool(poolName)
if err != nil {
return err
}
_, err = p.pool.Exec(ctx, `SET TIMEZONE='`+location.String()+`'`)
return err
}
// Close Закроет все подключения к БД
func Close() {
mu.Lock()
defer mu.Unlock()
for _, c := range pools {
c.Close()
}
pools = make(map[string]*Pool)
}
func pool(connectionName string) (*Pool, error) {
mu.RLock()
defer mu.RUnlock()
p, ok := pools[connectionName]
if !ok {
return nil, fmt.Errorf("xpg: Pool of connections `%s` not found", connectionName)
}
return p, nil
}