Skip to content

Commit ca6801c

Browse files
add sqlite main storage example
1 parent f10566c commit ca6801c

File tree

1 file changed

+81
-0
lines changed

1 file changed

+81
-0
lines changed
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package main
2+
3+
/*
4+
CREATE TABLE main_storage (
5+
key TEXT NOT NULL PRIMARY KEY,
6+
value BLOB NOT NULL,
7+
counter INTEGER NOT NULL,
8+
expires_at INTEGER NOT NULL
9+
) STRICT;
10+
*/
11+
12+
import (
13+
"database/sql"
14+
"errors"
15+
"fmt"
16+
"time"
17+
18+
"github.com/faroedev/faroe"
19+
)
20+
21+
type mainStorageStruct struct {
22+
db *sql.DB
23+
}
24+
25+
func newMainStorage(db *sql.DB) *mainStorageStruct {
26+
storage := &mainStorageStruct{
27+
db: db,
28+
}
29+
return storage
30+
}
31+
32+
func (mainStorage *mainStorageStruct) Get(key string) ([]byte, int32, error) {
33+
row := mainStorage.db.QueryRow("SELECT value, counter FROM main_storage WHERE key = ?", key)
34+
35+
var value []byte
36+
var counter int32
37+
err := row.Scan(&value, &counter)
38+
if err != nil && errors.Is(err, sql.ErrNoRows) {
39+
return nil, 0, faroe.ErrMainStorageEntryNotFound
40+
}
41+
if err != nil {
42+
return nil, 0, fmt.Errorf("failed to run query: %s", err.Error())
43+
}
44+
45+
return value, counter, nil
46+
}
47+
48+
func (mainStorage *mainStorageStruct) Set(key string, value []byte, expiresAt time.Time) error {
49+
_, err := mainStorage.db.Exec("INSERT INTO main_storage (key, value, counter, expires_at) VALUES (?, ?, ?, ?)", key, value, 0, expiresAt.Unix())
50+
if err != nil {
51+
return fmt.Errorf("failed to run query: %s", err.Error())
52+
}
53+
54+
return nil
55+
}
56+
57+
func (mainStorage *mainStorageStruct) Update(key string, value []byte, expiresAt time.Time, counter int32) error {
58+
result, err := mainStorage.db.Exec("UPDATE main_storage SET value = ?, counter = counter + 1, expires_at = ? WHERE key = ? AND counter = ?", value, expiresAt, key, counter)
59+
if err != nil {
60+
return fmt.Errorf("failed to run query: %s", err.Error())
61+
}
62+
rowsAffected, _ := result.RowsAffected()
63+
if rowsAffected < 1 {
64+
return faroe.ErrMainStorageEntryNotFound
65+
}
66+
67+
return nil
68+
}
69+
70+
func (mainStorage *mainStorageStruct) Delete(key string) error {
71+
result, err := mainStorage.db.Exec("DELETE FROM main_storage WHERE key = ?", key)
72+
if err != nil {
73+
return fmt.Errorf("failed to run query: %s", err.Error())
74+
}
75+
rowsAffected, _ := result.RowsAffected()
76+
if rowsAffected < 1 {
77+
return faroe.ErrMainStorageEntryNotFound
78+
}
79+
80+
return nil
81+
}

0 commit comments

Comments
 (0)