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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user