summaryrefslogtreecommitdiff
path: root/storage
diff options
context:
space:
mode:
authorewy <ewy0@protonmail.com>2026-05-22 16:54:49 +0200
committerewy <ewy0@protonmail.com>2026-05-22 16:54:49 +0200
commit007e2de369f9fc26da3237646de14f2af5052ee8 (patch)
treef81557385628fc93f1ef9616b8bc75a304f9d740 /storage
initial commit
Diffstat (limited to 'storage')
-rw-r--r--storage/cgo.go10
-rw-r--r--storage/duckdb.go9
-rw-r--r--storage/storage.go98
-rw-r--r--storage/wasm.go10
4 files changed, 127 insertions, 0 deletions
diff --git a/storage/cgo.go b/storage/cgo.go
new file mode 100644
index 0000000..3549bc5
--- /dev/null
+++ b/storage/cgo.go
@@ -0,0 +1,10 @@
+//go:build sqlite
+
+package storage
+
+import (
+ // cgo driver
+ _ "github.com/mattn/go-sqlite3"
+)
+
+var driver = "sqlite3"
diff --git a/storage/duckdb.go b/storage/duckdb.go
new file mode 100644
index 0000000..e145384
--- /dev/null
+++ b/storage/duckdb.go
@@ -0,0 +1,9 @@
+//go:build !sqlite && !sqlite_wasm
+
+package storage
+
+import (
+ _ "github.com/duckdb/duckdb-go/v2"
+)
+
+var driver = "duckdb"
diff --git a/storage/storage.go b/storage/storage.go
new file mode 100644
index 0000000..6351ba3
--- /dev/null
+++ b/storage/storage.go
@@ -0,0 +1,98 @@
+package storage
+
+import (
+ "database/sql"
+ "github.com/adrg/xdg"
+ "github.com/go-gorp/gorp"
+ "github.com/spf13/pflag"
+ "os"
+ "path/filepath"
+ "sts2stats/spool"
+ "sync"
+)
+
+var (
+ Cache, CacheErr = xdg.CacheFile("sts2stats/db." + driver)
+ Db = pflag.String("database", Cache, "file path for database")
+ Reset = pflag.BoolP("reindex", "r", true, "reindex all runs")
+)
+
+var conn *sql.DB
+var dbmap gorp.DbMap
+var lock = &sync.Mutex{}
+
+func Init(items ...any) error {
+ if *Reset {
+ spool.Warn("reindex expected, removing database\n")
+ err := os.Remove(*Db)
+ if err != nil {
+ return err
+ }
+ }
+
+ if CacheErr != nil {
+ return CacheErr
+ }
+ spool.Info("opening %v database in %s\n", driver, *Db)
+ dir, _ := filepath.Split(Cache)
+ _ = os.MkdirAll(dir, 0600)
+ db, err := sql.Open(driver, *Db)
+ if err != nil {
+ return err
+ }
+ conn = db
+
+ dbmap = gorp.DbMap{
+ Db: conn,
+ Dialect: gorp.SqliteDialect{},
+ }
+
+ err = register(items...)
+ if err != nil {
+ return err
+ }
+
+ return dbmap.CreateTablesIfNotExists()
+}
+
+func register(item ...any) error {
+ for _, t := range item {
+ dbmap.AddTable(t)
+ }
+ return dbmap.CreateTablesIfNotExists()
+}
+
+func SaveNow(item ...any) error {
+ lock.Lock()
+ err := dbmap.Insert(item...)
+ lock.Unlock()
+ return err
+}
+
+func Close() {
+ if conn != nil {
+ err := conn.Close()
+ if err != nil {
+ spool.Warn("%v\n", err)
+ }
+ }
+}
+
+func UI() error {
+ _, err := dbmap.Db.Exec("SET ui_local_port = 4213; CALL start_ui_server();")
+ return err
+}
+
+func Query(query string, args ...any) (*sql.Rows, error) {
+ return dbmap.Query(query, args...)
+}
+
+func Entities[T any](query string, args ...any) ([]T, error) {
+ thing := new(T)
+ res, err := dbmap.Select(thing, query, args...)
+ var result []T
+ for _, r := range res {
+ result = append(result, r.(T))
+ }
+ return result, err
+}
diff --git a/storage/wasm.go b/storage/wasm.go
new file mode 100644
index 0000000..dd0c5df
--- /dev/null
+++ b/storage/wasm.go
@@ -0,0 +1,10 @@
+//go:build sqlite_wasm
+
+package storage
+
+import (
+ // wasm driver
+ _ "github.com/ncruces/go-sqlite3/driver"
+)
+
+var driver = "sqlite3"