mirror of
https://github.com/trafficlunar/api.git
synced 2026-06-27 22:24:08 +00:00
feat: data store
This commit is contained in:
parent
4f8ee6cf9c
commit
19bdd27de1
8 changed files with 123 additions and 53 deletions
72
internal/storage/datastore.go
Normal file
72
internal/storage/datastore.go
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
package storage
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"log/slog"
|
||||
"os"
|
||||
"sync"
|
||||
)
|
||||
|
||||
type DataStore struct {
|
||||
Data map[string]any
|
||||
Mutex sync.Mutex
|
||||
}
|
||||
|
||||
var GlobalDataStore *DataStore
|
||||
|
||||
func InitDataStore() *DataStore {
|
||||
GlobalDataStore = &DataStore{
|
||||
Data: make(map[string]any),
|
||||
}
|
||||
|
||||
file, err := os.Open("./data.json")
|
||||
if err != nil {
|
||||
if os.IsNotExist(err) {
|
||||
slog.Warn("Data store file not found; creating new store")
|
||||
return GlobalDataStore
|
||||
}
|
||||
slog.Error("Could not load data store file!", slog.Any("error", err))
|
||||
return nil
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
decoder := json.NewDecoder(file)
|
||||
if err := decoder.Decode(&GlobalDataStore.Data); err != nil {
|
||||
slog.Error("Failed to decode data store file", slog.Any("error", err))
|
||||
return nil
|
||||
}
|
||||
|
||||
return GlobalDataStore
|
||||
}
|
||||
|
||||
func (store *DataStore) Get(key string) any {
|
||||
store.Mutex.Lock()
|
||||
defer store.Mutex.Unlock()
|
||||
return store.Data[key]
|
||||
}
|
||||
|
||||
func (store *DataStore) Set(key string, value any) {
|
||||
store.Mutex.Lock()
|
||||
defer store.Mutex.Unlock()
|
||||
store.Data[key] = value
|
||||
}
|
||||
|
||||
func (store *DataStore) Save() error {
|
||||
store.Mutex.Lock()
|
||||
defer store.Mutex.Unlock()
|
||||
|
||||
file, err := os.Create("./data.json")
|
||||
if err != nil {
|
||||
slog.Error("Could not create data store file", slog.Any("error", err))
|
||||
return err
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
encoder := json.NewEncoder(file)
|
||||
if err := encoder.Encode(store.Data); err != nil {
|
||||
slog.Error("Failed to encode data store", slog.Any("error", err))
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue