forked from apilayer/goiban-data
-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathsql_store.go
More file actions
133 lines (103 loc) · 2.67 KB
/
sql_store.go
File metadata and controls
133 lines (103 loc) · 2.67 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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package data
import (
"database/sql"
"log"
)
var (
INSERT_BANK_DATA *sql.Stmt
SELECT_SOURCE_ID *sql.Stmt
SELECT_BANK_INFORMATION = "SELECT bankcode, name, zip, city, bic FROM BANK_DATA WHERE bankcode = ? AND country = ?;"
SELECT_BANK_INFORMATION_STMT *sql.Stmt
)
type SQLStore struct {
db *sql.DB
}
func NewSQLStore(dbType string, url string) *SQLStore {
db, err := sql.Open(dbType, url)
if err != nil {
log.Fatalf("DB Connection error: %v", err)
return nil
}
err = prepareStatements(db)
if err != nil {
log.Fatalf("DB Prepare Statement error: %v", err)
return nil
}
return &SQLStore{
db,
}
}
func (s *SQLStore) Find(countryCode string, bankCode string) (*BankInfo, error) {
var dbBankcode, dbName, dbZip, dbCity, dbBic string
err := SELECT_BANK_INFORMATION_STMT.QueryRow(bankCode, countryCode).Scan(&dbBankcode, &dbName, &dbZip, &dbCity, &dbBic)
if err != nil {
return nil, err
}
return &BankInfo{
Bankcode: dbBankcode,
Name: dbName,
Zip: dbZip,
City: dbCity,
Bic: dbBic,
}, nil
}
func (s *SQLStore) Store(data BankInfo) (bool, error) {
_, err := INSERT_BANK_DATA.Exec(
data.Source,
data.Bankcode,
data.Name,
data.Zip,
data.City,
data.Bic,
data.Country,
data.CheckAlgo)
if err != nil {
log.Fatalf("Failed to insert %v: %v", err, data)
}
return true, nil
}
func (s *SQLStore) Clear(source string) (int, error) {
sourceID, err := getDataSourceId(source)
log.Printf("Removing entries for source '%v' (%v)", source, sourceID)
result, err := s.db.Exec("DELETE FROM BANK_DATA WHERE source = ?;", source)
if err != nil {
return -1, err
}
n, err := result.RowsAffected()
if err != nil {
return -1, err
}
return int(n), nil
}
func getDataSourceId(sourceName string) (int, error) {
var id int
result := SELECT_SOURCE_ID.QueryRow(sourceName)
err := result.Scan(&id)
if err != nil {
log.Fatalf("Data source %v not found: %v", sourceName, err)
return -1, err
}
return id, nil
}
func prepareStatements(db *sql.DB) error {
var err error
INSERT_BANK_DATA, err = db.Prepare(`INSERT INTO BANK_DATA
(id, source, bankcode, name, zip, city, bic, country, algorithm, created, last_update)
VALUES
(NULL, ?, ?, ?, ?, ?, ?, ?, ?, NULL, NULL);`)
if err != nil {
log.Fatalf("Error while preparing statement: %v", err)
return err
}
SELECT_SOURCE_ID, err = db.Prepare(`SELECT id FROM DATA_SOURCE where name = ?`)
if err != nil {
log.Fatalf("Error while preparing statement: %v", err)
return err
}
SELECT_BANK_INFORMATION_STMT, err = db.Prepare(SELECT_BANK_INFORMATION)
if err != nil {
log.Fatalf("Error while preparing statement: %v", err)
return err
}
return nil
}