ziggs/internal/data/db.go

76 lines
1.3 KiB
Go

package data
import (
"os"
"path/filepath"
"strconv"
"sync"
"time"
"git.tcp.direct/tcp.direct/database/bitcask"
"github.com/rs/zerolog/log"
"git.tcp.direct/kayos/ziggs/internal/common"
)
var (
stores = []string{"macros", "users", "sequences"}
isTest = false
once = &sync.Once{}
target string
db *bitcask.DB
testLocation string
)
func testMode() {
isTest = true
}
func setTarget() {
if !isTest {
target = common.Home + "/.local/share/" + common.Title + "/"
}
testLocation = filepath.Join("/tmp", common.Title, strconv.FormatInt(time.Now().UnixNano(), 10))
target = testLocation
}
func kv() *bitcask.DB {
Start()
return db
}
func startDB() {
setTarget()
if isTest {
_ = os.RemoveAll(testLocation)
}
if err := os.MkdirAll(target, 0o755); err != nil {
log.Fatal().Err(err).Msg("error creating data directory")
}
db = bitcask.OpenDB(target)
for _, store := range stores {
if err := db.Init(store); err != nil {
log.Fatal().Err(err).Str("store", store).Msg("error initializing store")
}
}
}
func Start() {
if !isTest {
once.Do(startDB)
return
}
startDB()
}
func StartTest() {
testMode()
Start()
}
func Close() {
if err := db.SyncAndCloseAll(); err != nil {
log.Warn().Err(err).Msg("error syncing and closing db")
}
}