1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
package storage
import (
"database/sql"
"errors"
"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")
Headless = pflag.BoolP("headless", "h", false, "do not open ui")
)
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 && !errors.Is(err, os.ErrNotExist) {
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
}
|