// 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) } }