/
rateFetcher.go
89 lines (73 loc) · 1.67 KB
/
rateFetcher.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
package main
import "fmt"
import "net/http"
import "io/ioutil"
import "encoding/json"
import "database/sql"
import _ "github.com/mattn/go-sqlite3"
import "os"
import "strings"
func perror(err error) {
if err != nil {
panic(err)
}
}
func get_rates() {
url := "http://api.apirates.com/api/update"
res, err := http.Get(url)
perror(err)
defer res.Body.Close()
body, err := ioutil.ReadAll(res.Body)
perror(err)
var data interface{}
err = json.Unmarshal(body, &data)
if err != nil {
fmt.Printf("%T\n%s\n%#v\n", err, err, err)
switch v := err.(type) {
case *json.SyntaxError:
fmt.Println(string(body[v.Offset-40 : v.Offset]))
}
}
db, err := sql.Open("sqlite3", "./rates.db")
perror(err)
defer db.Close()
tx, err := db.Begin()
perror(err)
stmt, err := tx.Prepare("insert into rates(fxpair, fxrate) values(?, ?)")
perror(err)
defer stmt.Close()
mappedData := data.(map[string]interface{})
for k, v := range mappedData {
fmt.Println("Iterating over ", k)
if !strings.EqualFold(k, "Ticks") {
continue
}
mappedInnerData := v.(map[string]interface{})
for l, w := range mappedInnerData {
fmt.Println("Inserting ", l, "with rate ", w)
_, err := stmt.Exec(l, w)
perror(err)
}
}
tx.Commit()
}
func prepare_database() {
if _, err := os.Stat("./rates.db"); err == nil {
return
}
db, err := sql.Open("sqlite3", "./rates.db")
perror(err)
defer db.Close()
sqls := []string{
"create table rates (id integer not null primary key, fxpair text, fxrate real, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP)",
"delete from rates",
}
for _, sql := range sqls {
_, err = db.Exec(sql)
perror(err)
}
}
func main() {
prepare_database()
get_rates()
}