Cache cakes in memory and update SQL logic
This commit is contained in:
parent
4b2fcbc58a
commit
066295bbe5
4 changed files with 88 additions and 45 deletions
|
|
@ -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
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
13
main.go
|
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue