diff options
author | Martin Polden <mpolden@mpolden.no> | 2020-01-11 13:41:23 +0100 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2020-01-11 15:14:56 +0100 |
commit | 7bc6b84b2ddd3cdf6fad6ab2568f3e298530f0b0 (patch) | |
tree | 114c3b783d69f991d99eb35a2aa8e94a0c198ffb /sql/sql.go | |
parent | 541ec0a86c0d29c469bc48bce34493daf20a0ee4 (diff) |
Implement persistent cache backend
Diffstat (limited to 'sql/sql.go')
-rw-r--r-- | sql/sql.go | 64 |
1 files changed, 64 insertions, 0 deletions
@@ -53,6 +53,13 @@ CREATE TABLE IF NOT EXISTS log_rr_answer ( FOREIGN KEY (log_id) REFERENCES log(id), FOREIGN KEY (rr_answer_id) REFERENCES rr_answer(id) ); + +CREATE TABLE IF NOT EXISTS cache ( + id INTEGER PRIMARY KEY, + key INTEGER NOT NULL, + data TEXT NOT NULL, + CONSTRAINT key_unique UNIQUE(key) +); ` // Client implements a client for a SQLite database. @@ -72,6 +79,11 @@ type LogEntry struct { Answer string `db:"answer"` } +type cacheEntry struct { + Key uint32 `db:"key"` + Data string `db:"data"` +} + // New creates a new database client for given filename. func New(filename string) (*Client, error) { db, err := sqlx.Connect("sqlite3", filename) @@ -218,3 +230,55 @@ func (c *Client) DeleteLogBefore(t time.Time) (err error) { } return tx.Commit() } + +func (c *Client) writeCacheValue(key uint32, data string) error { + c.mu.Lock() + defer c.mu.Unlock() + tx, err := c.db.Beginx() + if err != nil { + return nil + } + defer tx.Rollback() + query := `INSERT INTO cache (key, data) VALUES ($1, $2) + ON CONFLICT(key) DO UPDATE SET data=excluded.data` + if _, err := tx.Exec(query, key, data); err != nil { + return err + } + return tx.Commit() +} + +func (c *Client) removeCacheValue(key uint32) error { + c.mu.Lock() + defer c.mu.Unlock() + tx, err := c.db.Beginx() + if err != nil { + return nil + } + defer tx.Rollback() + if _, err := tx.Exec("DELETE FROM cache WHERE key = $1", key); err != nil { + return err + } + return tx.Commit() +} + +func (c *Client) truncateCache() error { + c.mu.Lock() + defer c.mu.Unlock() + tx, err := c.db.Beginx() + if err != nil { + return nil + } + defer tx.Rollback() + if _, err := tx.Exec("DELETE FROM cache"); err != nil { + return err + } + return tx.Commit() +} + +func (c *Client) readCache() ([]cacheEntry, error) { + c.mu.RLock() + defer c.mu.RUnlock() + var entries []cacheEntry + err := c.db.Select(&entries, "SELECT key, data FROM cache ORDER BY id ASC") + return entries, err +} |