summaryrefslogtreecommitdiff
path: root/modules/cache/sqlitestore.go
diff options
context:
space:
mode:
authorPhilipp Tanlak <philipp.tanlak@gmail.com>2023-10-11 20:20:30 +0200
committerPhilipp Tanlak <philipp.tanlak@gmail.com>2023-10-11 20:20:30 +0200
commitfb84ca746e92e371161f1e1de3b01a048a9ae979 (patch)
tree5bb8fbb7fd654b241b389697cc46bad00ce2f8b7 /modules/cache/sqlitestore.go
parentcd40ab75f44e9f6ac86beca576a934fd790fc9fb (diff)
Implement file based caching
Diffstat (limited to 'modules/cache/sqlitestore.go')
-rw-r--r--modules/cache/sqlitestore.go60
1 files changed, 60 insertions, 0 deletions
diff --git a/modules/cache/sqlitestore.go b/modules/cache/sqlitestore.go
new file mode 100644
index 0000000..50c8007
--- /dev/null
+++ b/modules/cache/sqlitestore.go
@@ -0,0 +1,60 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+package cache
+
+import (
+ "database/sql"
+ "fmt"
+ "log"
+ "os"
+
+ _ "github.com/mattn/go-sqlite3"
+)
+
+func NewSQLiteStore(file string) *SQLiteStore {
+ db, err := sql.Open("sqlite3", fmt.Sprintf("file:%s?_timeout=5000&_journal=WAL", file))
+ if err != nil {
+ log.Printf("cache: failed to create database file %q: %v\n", file, err)
+ os.Exit(1)
+ }
+
+ c := &SQLiteStore{db: db}
+ c.migrate()
+
+ return c
+}
+
+type SQLiteStore struct {
+ db *sql.DB
+}
+
+func (s *SQLiteStore) Get(key string) ([]byte, bool) {
+ var value []byte
+ if err := s.db.QueryRow(`SELECT value FROM cache WHERE key = ? LIMIT 1`, key).Scan(&value); err != nil {
+ return nil, false
+ }
+ return value, true
+}
+
+func (s *SQLiteStore) Set(key string, value []byte) {
+ if _, err := s.db.Exec(`INSERT INTO cache (key, value) VALUES (?, ?)`, key, value); err != nil {
+ log.Printf("cache: failed to insert cache key %q: %v\n", key, value)
+ }
+}
+
+func (s *SQLiteStore) Close() {
+ s.db.Close()
+}
+
+func (s *SQLiteStore) migrate() {
+ if _, err := s.db.Exec(`CREATE TABLE IF NOT EXISTS cache (key TEXT, value BLOB)`); err != nil {
+ log.Printf("cache: failed to create cache table: %v\n", err)
+ os.Exit(1)
+ }
+ if _, err := s.db.Exec(`CREATE UNIQUE INDEX IF NOT EXISTS cache_key_idx ON cache(key)`); err != nil {
+ log.Printf("cache: failed to create cache index: %v\n", err)
+ os.Exit(1)
+ }
+}