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)) }