This repository was archived by the owner on Jan 17, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathstore.go
97 lines (77 loc) · 1.58 KB
/
store.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
package sqlstore
import (
"osinniy/cryptobot/internal/store"
"github.com/jmoiron/sqlx"
_ "github.com/mattn/go-sqlite3"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
)
const (
MODULE = "store"
MAX_IDLE_CONS = 20
)
type SqlStore struct {
Path string
db *sqlx.DB
logger zerolog.Logger
usersRepo *UsersRepository
dataRepo *DataRepository
}
// Initializes and opens database.
// Aborts if database can't be initialized
func Init(path string) *SqlStore {
store := New(path)
err := store.Open()
if err != nil {
store.logger.Fatal().Err(err).Str("db", path).Msg("failed to connect to database")
} else {
store.logger.Info().Str("db", path).Msg("database connected")
}
return store
}
// Creates empty storage.
// Do not forget to open it
func New(path string) *SqlStore {
return &SqlStore{
Path: path,
logger: log.With().Str("module", MODULE).Logger(),
}
}
// Connect to a database and verify with a ping
func (s *SqlStore) Open() error {
db, err := sqlx.Connect("sqlite3", s.Path)
if err != nil {
return err
}
db.SetMaxIdleConns(MAX_IDLE_CONS)
s.db = db
return nil
}
func (s *SqlStore) Close() error {
if s.db != nil {
if s.usersRepo != nil {
s.usersRepo = nil
}
if s.dataRepo != nil {
s.dataRepo = nil
}
return s.db.Close()
}
return nil
}
func (s *SqlStore) Users() store.UsersRepository {
if s.usersRepo == nil {
s.usersRepo = &UsersRepository{
store: s,
}
}
return s.usersRepo
}
func (s *SqlStore) Data() store.DataRepository {
if s.dataRepo == nil {
s.dataRepo = &DataRepository{
store: s,
}
}
return s.dataRepo
}