Cache cakes in memory and update SQL logic

This commit is contained in:
bronku 2025-03-26 12:12:33 +01:00
parent 4b2fcbc58a
commit 066295bbe5
4 changed files with 88 additions and 45 deletions

View file

@ -2,7 +2,6 @@ package store
import ( import (
"errors" "errors"
"strconv"
) )
type Cake struct { type Cake struct {
@ -14,60 +13,90 @@ type Cake struct {
Availability string Availability string
} }
func (s *Store) GetCake(id int) (Cake, error) { func (s *Store) cakeCount() int {
var out Cake out := 0
query := "select name, price from cake where id = ?;" rows, err := s.db.Query("select count(*) from cake;")
if err != nil {
return out
}
rows.Close()
_ = rows.Next()
_ = rows.Scan(&out)
return out
}
row, err := s.db.Query(query, id) func (s *Store) loadCakes() ([]Cake, error) {
out := make([]Cake, 0, s.cakeCount())
rows, err := s.db.Query("select id, name, price, category, availability from cake order by id asc;")
if err != nil { if err != nil {
return out, err return out, err
} }
defer row.Close() defer rows.Close()
if !row.Next() { for rows.Next() {
return out, errors.New("cake not found") var cake Cake
err = rows.Scan(&cake.ID, &cake.Name, &cake.Price, &cake.Category, &cake.Availability)
if err != nil {
continue
}
out = append(out, cake)
} }
out.ID = id return out, nil
err = row.Scan(&out.Name, &out.Price) }
return out, err
func (s *Store) searchCakes(id int) (int, error) {
for i, e := range s.cakes {
if e.ID != id {
continue
}
return i, nil
}
return -1, errors.New("cake not found")
}
func (s *Store) GetCake(id int) (Cake, error) {
if id <= 0 {
return Cake{}, errors.New("Invalid cake id")
}
if len(s.cakes) < id {
i, err := s.searchCakes(id)
return s.cakes[i], err
}
if s.cakes[id-1].ID != id {
i, err := s.searchCakes(id)
return s.cakes[i], err
}
return s.cakes[id-1], nil
} }
func (s *Store) GetCakes() ([]Cake, error) { func (s *Store) GetCakes() ([]Cake, error) {
rows, err := s.db.Query("select id, name, price from cake") result := make([]Cake, len(s.cakes))
copy(result, s.cakes)
return result, nil
}
func (s *Store) updateCake(newCake Cake) error {
i, err := s.searchCakes(newCake.ID)
if err != nil { if err != nil {
return nil, err return err
} }
defer rows.Close() s.cakes[i] = newCake
cakes := make([]Cake, 0) return nil
for rows.Next() { }
var c Cake
c.Amount = 0 // #todo: implement
err = rows.Scan(&c.ID, &c.Name, &c.Price) func (s *Store) SyncCakes() error {
if err != nil { return nil
return nil, err
}
cakes = append(cakes, c)
}
return cakes, err
} }
func (s *Store) SaveCake(newCake Cake) (int, error) { func (s *Store) SaveCake(newCake Cake) (int, error) {
query := "insert into cake(name, price) values (?, ?) returning id;"
if newCake.ID != 0 { if newCake.ID != 0 {
query = "update cake set name = ? , price = ? where id = " return newCake.ID, s.updateCake(newCake)
query += strconv.Itoa(newCake.ID) + " returning id;"
} }
newCake.ID = len(s.cakes) + 1
row, err := s.db.Query(query, newCake.Name, newCake.Price) s.cakes = append(s.cakes, newCake)
if err != nil { return newCake.ID, nil
return 0, err
}
defer row.Close()
if !row.Next() {
return 0, errors.New("The database didn't respond with an id")
}
err = row.Scan(&newCake.ID)
return newCake.ID, err
} }

View file

@ -22,6 +22,10 @@ func OpenStore(filename string) *Store {
} }
out.loadMigrations() out.loadMigrations()
out.cakes, err = out.loadCakes()
if err != nil {
log.Fatal(err)
}
return &out return &out
} }

View file

@ -6,10 +6,7 @@ import (
) )
func TestStore(t *testing.T) { func TestStore(t *testing.T) {
s, err := OpenStore("file:memdb1?mode=memory&cache=shared") s := OpenStore("file:memdb1?mode=memory&cache=shared")
if err != nil {
t.Fatalf("Failed to create store: %v", err)
}
defer s.Close() defer s.Close()
// ensure db is empty // ensure db is empty
@ -87,7 +84,7 @@ func TestStore(t *testing.T) {
t.Error("not found newCake") t.Error("not found newCake")
} }
if cakes[newCake.Amount].ID != newCake.ID || cakes[newCake.Amount].Name != newCake.Name || cakes[newCake.Amount].Price != newCake.Price { if cakes[newCake.Amount].ID != newCake.ID || cakes[newCake.Amount].Name != newCake.Name || cakes[newCake.Amount].Price != newCake.Price {
t.Errorf("Want %v\nGot %v", newCake, cakes) t.Errorf("Want %v\nGot %v", newCake, cakes[newCake.Amount])
} }
if anotherCake.Amount == -1 { if anotherCake.Amount == -1 {
t.Error("not found anotherCake") t.Error("not found anotherCake")

13
main.go
View file

@ -2,6 +2,19 @@ package main
import "github.com/Bronku/iroon/cmd/iroon" import "github.com/Bronku/iroon/cmd/iroon"
type test struct {
data []int
}
func (t *test) xd() []int {
return t.data
}
func (t *test) setData(input []int) {
t.data = make([]int, len(input))
copy(t.data, input)
}
func main() { func main() {
iroon.Run() iroon.Run()
} }