Skip to content

Commit fb38ea0

Browse files
author
Vladimir Smirnov
committed
Refactor main.go
Move all database-related stuff to db package
1 parent 011d29d commit fb38ea0

2 files changed

Lines changed: 114 additions & 114 deletions

File tree

db/sqlite.go

Lines changed: 109 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,124 @@ import (
55
"fmt"
66
"time"
77

8+
"github.com/Civil/github2telegram/configs"
89
"github.com/lomik/zapwriter"
910
"go.uber.org/zap"
1011
)
1112

13+
const (
14+
currentSchemaVersion = 2
15+
)
16+
1217
type SQLite struct {
1318
db *sql.DB
1419
}
1520

16-
func NewSQLite(db *sql.DB) *SQLite {
17-
return &SQLite{
18-
db: db,
21+
func initSqlite() Database {
22+
var err error
23+
logger := zapwriter.Logger("main")
24+
25+
configs.Config.DB, err = sql.Open("sqlite3", configs.Config.DatabaseURL)
26+
if err != nil {
27+
logger.Fatal("unable to open database file",
28+
zap.Any("config", configs.Config),
29+
zap.Error(err),
30+
)
31+
}
32+
33+
db := &SQLite{
34+
db: configs.Config.DB,
35+
}
36+
37+
rows, err := configs.Config.DB.Query("SELECT version from 'schema_version' where id=1")
38+
if err != nil {
39+
if err.Error() == "no such table: schema_version" {
40+
_, err = configs.Config.DB.Exec(`
41+
CREATE TABLE IF NOT EXISTS 'schema_version' (
42+
'id' INTEGER PRIMARY KEY AUTOINCREMENT,
43+
'version' INTEGER NOT NULL
44+
);
45+
46+
CREATE TABLE IF NOT EXISTS 'last_version' (
47+
'id' INTEGER PRIMARY KEY AUTOINCREMENT,
48+
'url' VARCHAR(255) NOT NULL,
49+
'filter' VARCHAR(255) NOT NULL,
50+
'last_tag' VARCHAR(255) NOT NULL DEFAULT '',
51+
'date' DATE NOT NULL
52+
);
53+
54+
CREATE TABLE IF NOT EXISTS 'subscriptions' (
55+
'id' INTEGER PRIMARY KEY AUTOINCREMENT,
56+
'chat_id' Int64,
57+
'endpoint' VARCHAR(255) NOT NULL,
58+
'url' VARCHAR(255) NOT NULL,
59+
'filter' VARCHAR(255) NOT NULL
60+
);
61+
62+
CREATE TABLE IF NOT EXISTS 'feeds' (
63+
'id' INTEGER PRIMARY KEY AUTOINCREMENT,
64+
'repo' VARCHAR(255) NOT NULL,
65+
'filter' VARCHAR(255) NOT NULL,
66+
'name' VARCHAR(255) NOT NULL,
67+
'message_pattern' VARCHAR(255) NOT NULL
68+
);
69+
70+
INSERT INTO 'schema_version' (id, version) values (1, 2);
71+
`)
72+
if err != nil {
73+
logger.Fatal("failed to initialize database",
74+
zap.Any("config", configs.Config),
75+
zap.Error(err),
76+
)
77+
}
78+
} else {
79+
logger.Fatal("failed to query database version",
80+
zap.Error(err),
81+
)
82+
}
83+
} else {
84+
schemaVersion := int(0)
85+
for rows.Next() {
86+
err = rows.Scan(&schemaVersion)
87+
if err != nil {
88+
logger.Fatal("unable to fetch value",
89+
zap.Error(err),
90+
)
91+
}
92+
}
93+
rows.Close()
94+
95+
if schemaVersion != currentSchemaVersion {
96+
switch schemaVersion {
97+
case 1:
98+
_, err = configs.Config.DB.Exec(`
99+
ALTER TABLE last_version ADD COLUMN 'last_tag' VARCHAR(255) NOT NULL DEFAULT '';
100+
101+
UPDATE schema_version SET version = 2 WHERE id=1;
102+
`)
103+
104+
if err != nil {
105+
logger.Fatal("failed to migrate database",
106+
zap.Int("databaseVersion", schemaVersion),
107+
zap.Int("upgradingTo", currentSchemaVersion),
108+
zap.Error(err),
109+
)
110+
}
111+
// 'last_tag' VARCHAR(255) NOT NULL DEFAULT '',
112+
default:
113+
// Don't know how to migrate from this version
114+
logger.Fatal("Unknown schema version specified",
115+
zap.Int("version", schemaVersion),
116+
)
117+
}
118+
}
19119
}
120+
121+
return db
122+
}
123+
124+
func NewSQLite() Database {
125+
return initSqlite()
20126
}
21127

22128
var ErrAlreadyExists error = fmt.Errorf("already exists")

main.go

Lines changed: 5 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package main
22

33
import (
4-
"database/sql"
54
"flag"
65
"go.uber.org/zap"
76
"gopkg.in/yaml.v2"
@@ -18,111 +17,6 @@ import (
1817
_ "github.com/mattn/go-sqlite3"
1918
)
2019

21-
const (
22-
currentSchemaVersion = 2
23-
)
24-
25-
func initSqlite() db.Database {
26-
var err error
27-
logger := zapwriter.Logger("main")
28-
29-
configs.Config.DB, err = sql.Open("sqlite3", configs.Config.DatabaseURL)
30-
if err != nil {
31-
logger.Fatal("unable to open database file",
32-
zap.Any("config", configs.Config),
33-
zap.Error(err),
34-
)
35-
}
36-
37-
db := db.NewSQLite(configs.Config.DB)
38-
39-
rows, err := configs.Config.DB.Query("SELECT version from 'schema_version' where id=1")
40-
if err != nil {
41-
if err.Error() == "no such table: schema_version" {
42-
_, err = configs.Config.DB.Exec(`
43-
CREATE TABLE IF NOT EXISTS 'schema_version' (
44-
'id' INTEGER PRIMARY KEY AUTOINCREMENT,
45-
'version' INTEGER NOT NULL
46-
);
47-
48-
CREATE TABLE IF NOT EXISTS 'last_version' (
49-
'id' INTEGER PRIMARY KEY AUTOINCREMENT,
50-
'url' VARCHAR(255) NOT NULL,
51-
'filter' VARCHAR(255) NOT NULL,
52-
'last_tag' VARCHAR(255) NOT NULL DEFAULT '',
53-
'date' DATE NOT NULL
54-
);
55-
56-
CREATE TABLE IF NOT EXISTS 'subscriptions' (
57-
'id' INTEGER PRIMARY KEY AUTOINCREMENT,
58-
'chat_id' Int64,
59-
'endpoint' VARCHAR(255) NOT NULL,
60-
'url' VARCHAR(255) NOT NULL,
61-
'filter' VARCHAR(255) NOT NULL
62-
);
63-
64-
CREATE TABLE IF NOT EXISTS 'feeds' (
65-
'id' INTEGER PRIMARY KEY AUTOINCREMENT,
66-
'repo' VARCHAR(255) NOT NULL,
67-
'filter' VARCHAR(255) NOT NULL,
68-
'name' VARCHAR(255) NOT NULL,
69-
'message_pattern' VARCHAR(255) NOT NULL
70-
);
71-
72-
INSERT INTO 'schema_version' (id, version) values (1, 2);
73-
`)
74-
if err != nil {
75-
logger.Fatal("failed to initialize database",
76-
zap.Any("config", configs.Config),
77-
zap.Error(err),
78-
)
79-
}
80-
} else {
81-
logger.Fatal("failed to query database version",
82-
zap.Error(err),
83-
)
84-
}
85-
} else {
86-
schemaVersion := int(0)
87-
for rows.Next() {
88-
err = rows.Scan(&schemaVersion)
89-
if err != nil {
90-
logger.Fatal("unable to fetch value",
91-
zap.Error(err),
92-
)
93-
}
94-
}
95-
rows.Close()
96-
97-
if schemaVersion != currentSchemaVersion {
98-
switch schemaVersion {
99-
case 1:
100-
_, err = configs.Config.DB.Exec(`
101-
ALTER TABLE last_version ADD COLUMN 'last_tag' VARCHAR(255) NOT NULL DEFAULT '';
102-
103-
UPDATE schema_version SET version = 2 WHERE id=1;
104-
`)
105-
106-
if err != nil {
107-
logger.Fatal("failed to migrate database",
108-
zap.Int("databaseVersion", schemaVersion),
109-
zap.Int("upgradingTo", currentSchemaVersion),
110-
zap.Error(err),
111-
)
112-
}
113-
// 'last_tag' VARCHAR(255) NOT NULL DEFAULT '',
114-
default:
115-
// Don't know how to migrate from this version
116-
logger.Fatal("Unknown schema version specified",
117-
zap.Int("version", schemaVersion),
118-
)
119-
}
120-
}
121-
}
122-
123-
return db
124-
}
125-
12620
func main() {
12721
err := zapwriter.ApplyConfig([]zapwriter.Config{configs.DefaultLoggerConfig})
12822
if err != nil {
@@ -171,9 +65,9 @@ func main() {
17165
}
17266

17367
// TODO: Generalize to support other databases (e.x. mysql)
174-
var db db.Database
68+
var database db.Database
17569
if configs.Config.DatabaseType == "sqlite3" || configs.Config.DatabaseType == "sqlite" {
176-
db = initSqlite()
70+
database = db.NewSQLite()
17771
}
17872

17973
exitChan := make(chan struct{})
@@ -186,7 +80,7 @@ func main() {
18680
zap.Any("endpoint_config", cfg),
18781
)
18882
if cfg.Type == "telegram" {
189-
configs.Config.Senders[name], err = endpoints.InitializeTelegramEndpoint(cfg.Token, exitChan, db)
83+
configs.Config.Senders[name], err = endpoints.InitializeTelegramEndpoint(cfg.Token, exitChan, database)
19084
if err != nil {
19185
logger.Fatal("Error initializing telegram endpoint",
19286
zap.Error(err),
@@ -212,7 +106,7 @@ func main() {
212106
zap.Any("config", configs.Config),
213107
)
214108

215-
feedsListDB, err := db.ListFeeds()
109+
feedsListDB, err := database.ListFeeds()
216110
if err != nil {
217111
logger.Fatal("unknown error quering database",
218112
zap.Error(err),
@@ -221,7 +115,7 @@ func main() {
221115

222116
feedsList := make([]*feeds.Feed, 0, len(feedsListDB))
223117
for _, f := range feedsListDB {
224-
f2, err := feeds.NewFeed(f.Repo, f.Filter, f.Name, f.MessagePattern, db)
118+
f2, err := feeds.NewFeed(f.Repo, f.Filter, f.Name, f.MessagePattern, database)
225119
if err != nil {
226120
continue
227121
}

0 commit comments

Comments
 (0)