-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCache.go
121 lines (92 loc) · 2.21 KB
/
Cache.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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package main
import (
"database/sql"
"fmt"
"log"
"os"
"path/filepath"
"time"
_ "github.com/mattn/go-sqlite3"
)
type CacheStruct struct {
File string
sqliteDatabase *sql.DB
}
func (c *CacheStruct) Open() {
var err error
Path, err := os.UserCacheDir()
c.File = filepath.Join(Path, "weatherdata-cache.sqlite3")
c.sqliteDatabase, err = sql.Open("sqlite3", c.File)
SQL := `PRAGMA SYNCHRONOUS = NORMAL`
_, err = c.sqliteDatabase.Exec(SQL)
if err != nil {
log.Panic(err)
}
SQL = `PRAGMA journal_mode = WAL2`
_, err = c.sqliteDatabase.Exec(SQL)
if err != nil {
log.Panic(err)
}
c.sqliteDatabase.SetMaxOpenConns(4)
SQL = `CREATE TABLE IF NOT EXISTS Cache (
"URL" TEXT PRIMARY KEY,
"XML" TEXT,
"Timestamp" INTEGER
) WITHOUT ROWID;`
statement, err := c.sqliteDatabase.Prepare(SQL)
if err != nil {
log.Fatal(err.Error())
}
statement.Exec()
}
func (c *CacheStruct) GetSQLConnection() *sql.DB {
return c.sqliteDatabase
}
func (c *CacheStruct) Get(URL string, MaxAge time.Duration) (string, error) {
var err error
var Text string
var Timestamp int
SQL := "SELECT Timestamp, Xml FROM Cache WHERE Url = ?"
err = c.sqliteDatabase.QueryRow(SQL, URL).Scan(&Timestamp, &Text)
if err != nil && err != sql.ErrNoRows {
return "", err
}
if err == sql.ErrNoRows {
return "", nil
}
t := time.Unix(int64(Timestamp), 0)
if t.Before(time.Now().UTC().Add(-MaxAge)) {
if Verbose {
fmt.Println("Expired", URL)
}
SQL := "DELETE FROM Cache WHERE Url = ?"
_, err = c.sqliteDatabase.Exec(SQL, URL)
if err != nil {
log.Panic(err)
}
return "", nil
}
return Text, nil
}
func (c *CacheStruct) Put(URL string, Text string) error {
SQL := "INSERT OR REPLACE INTO Cache (Xml, Url, Timestamp) VALUES (?, ?, ?)"
Timestamp := time.Now().Unix()
_, err := c.sqliteDatabase.Exec(SQL, Text, URL, Timestamp)
if err != nil {
return err
}
return nil
}
func (c *CacheStruct) Close() {
SQL := "DELETE FROM Cache WHERE Timestamp < ?"
Timestamp := time.Now().Add(-30 * 24 * time.Hour).Unix() // 30 days
_, err := c.sqliteDatabase.Exec(SQL, Timestamp)
if err != nil {
log.Panic(err)
}
_, err = c.sqliteDatabase.Exec("VACUUM")
if err != nil {
log.Panic(err)
}
c.sqliteDatabase.Close()
}