88 lines
1.9 KiB
Go
88 lines
1.9 KiB
Go
package database
|
|
|
|
import (
|
|
"strconv"
|
|
|
|
"tomatentum.net/outfit-voting-abi26/internal"
|
|
)
|
|
|
|
const INITSTATEDB string = "CREATE TABLE IF NOT EXISTS state(key varchar(255) PRIMARY KEY, value TEXT)"
|
|
const STATEINSERT string = "INSERT INTO state(key, value) VALUES ($1, $2) ON CONFLICT (key) DO NOTHING;"
|
|
const STATESET string = "UPDATE state SET value = $1 WHERE key = $2"
|
|
const STATEGET string = "SELECT value FROM state WHERE key = $1"
|
|
|
|
const KEYVOTELOCKED string = "votinglocked"
|
|
const KEYRESULTLOCKED string = "resultlocked"
|
|
|
|
var voteLocked internal.CacheItem[bool] = internal.NewCache(func() (bool, error) {
|
|
res := db.QueryRow(STATEGET, KEYVOTELOCKED)
|
|
|
|
var valuestring string
|
|
|
|
if err := res.Scan(&valuestring); err != nil {
|
|
return false, err
|
|
}
|
|
value, err := strconv.ParseBool(valuestring)
|
|
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
return value, nil
|
|
}, 30)
|
|
|
|
var resultLocked internal.CacheItem[bool] = internal.NewCache(func() (bool, error) {
|
|
res := db.QueryRow(STATEGET, KEYRESULTLOCKED)
|
|
|
|
var valuestring string
|
|
|
|
if err := res.Scan(&valuestring); err != nil {
|
|
return false, err
|
|
}
|
|
|
|
value, err := strconv.ParseBool(valuestring)
|
|
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
return value, nil
|
|
}, 30)
|
|
|
|
func initStateDB() error {
|
|
_, err := db.Exec(INITSTATEDB)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
_, err = db.Exec(STATEINSERT, KEYVOTELOCKED, "true")
|
|
_, err = db.Exec(STATEINSERT, KEYRESULTLOCKED, "true")
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func setState(key string, value string) error {
|
|
_, err := db.Exec(STATESET, value, key)
|
|
return err
|
|
}
|
|
|
|
func GetVoteLocked() (bool, error) {
|
|
return voteLocked.Get()
|
|
}
|
|
|
|
func GetResultLocked() (bool, error) {
|
|
return resultLocked.Get()
|
|
}
|
|
|
|
func SetVoteLocked(value bool) error {
|
|
voteLocked.Invalidate()
|
|
return setState(KEYVOTELOCKED, strconv.FormatBool(value))
|
|
}
|
|
|
|
func SetResultLocked(value bool) error {
|
|
resultLocked.Invalidate()
|
|
return setState(KEYRESULTLOCKED, strconv.FormatBool(value))
|
|
}
|