refactor/serializing (#1)

Co-authored-by: matst80 <mats.tornberg@gmail.com>
Reviewed-on: https://git.tornberg.me/mats/go-cart-actor/pulls/1
This commit was merged in pull request #1.
This commit is contained in:
2024-11-08 23:02:09 +01:00
parent 4cc41bcec6
commit 1b75f81119
19 changed files with 576 additions and 409 deletions

View File

@@ -1,7 +1,7 @@
package main
import (
"encoding/json"
"encoding/gob"
"errors"
"fmt"
"log"
@@ -12,26 +12,26 @@ import (
type DiskStorage struct {
stateFile string
lastSave int64
LastSaves map[string]int64
LastSaves map[CartId]int64
}
func NewDiskStorage(stateFile string) (*DiskStorage, error) {
ret := &DiskStorage{
stateFile: stateFile,
LastSaves: make(map[string]int64),
LastSaves: make(map[CartId]int64),
}
err := ret.loadState()
return ret, err
}
func saveMessages(messages []StorableMessage, id string) error {
func saveMessages(messages []StorableMessage, id CartId) error {
log.Printf("%d messages to save for %s", len(messages), id)
if len(messages) == 0 {
return nil
}
var file *os.File
var err error
path := getCartPath(id)
path := getCartPath(id.String())
file, err = os.OpenFile(path, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
return err
@@ -39,11 +39,10 @@ func saveMessages(messages []StorableMessage, id string) error {
defer file.Close()
for _, m := range messages {
b, err := m.GetBytes()
err := m.Write(file)
if err != nil {
return err
}
file.Write(b)
}
return err
}
@@ -52,9 +51,9 @@ func getCartPath(id string) string {
return fmt.Sprintf("data/%s.prot", id)
}
func loadMessages(grain Grain, id string) error {
func loadMessages(grain Grain, id CartId) error {
var err error
path := getCartPath(id)
path := getCartPath(id.String())
if _, err = os.Stat(path); errors.Is(err, os.ErrNotExist) {
return err
}
@@ -64,13 +63,11 @@ func loadMessages(grain Grain, id string) error {
}
defer file.Close()
var reply CartGrain
for err == nil {
msg := &Message{}
err = msg.FromReader(file, msg)
var msg Message
err = MessageFromReader(file, &msg)
if err == nil {
grain.HandleMessage(msg, true, &reply)
grain.HandleMessage(&msg, true)
}
}
@@ -87,7 +84,7 @@ func (s *DiskStorage) saveState() error {
return err
}
defer file.Close()
err = json.NewEncoder(file).Encode(s.LastSaves)
err = gob.NewEncoder(file).Encode(s.LastSaves)
if err != nil {
return err
}
@@ -97,15 +94,15 @@ func (s *DiskStorage) saveState() error {
}
func (s *DiskStorage) loadState() error {
file, err := os.Open("data/state.json")
file, err := os.Open(s.stateFile)
if err != nil {
return err
}
defer file.Close()
return json.NewDecoder(file).Decode(&s.LastSaves)
return gob.NewDecoder(file).Decode(&s.LastSaves)
}
func (s *DiskStorage) Store(id string, grain Grain) error {
func (s *DiskStorage) Store(id CartId, grain *CartGrain) error {
lastSavedMessage, ok := s.LastSaves[id]
if ok && lastSavedMessage > grain.GetLastChange() {
return nil