aboutsummaryrefslogtreecommitdiffstats
path: root/sql/sql.go
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2020-01-11 13:41:23 +0100
committerMartin Polden <mpolden@mpolden.no>2020-01-11 15:14:56 +0100
commit7bc6b84b2ddd3cdf6fad6ab2568f3e298530f0b0 (patch)
tree114c3b783d69f991d99eb35a2aa8e94a0c198ffb /sql/sql.go
parent541ec0a86c0d29c469bc48bce34493daf20a0ee4 (diff)
Implement persistent cache backend
Diffstat (limited to 'sql/sql.go')
-rw-r--r--sql/sql.go64
1 files changed, 64 insertions, 0 deletions
diff --git a/sql/sql.go b/sql/sql.go
index eeafd90..ac39e09 100644
--- a/sql/sql.go
+++ b/sql/sql.go
@@ -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
+}