106 lines
2.7 KiB
Go
106 lines
2.7 KiB
Go
package db
|
|
|
|
import (
|
|
"fmt"
|
|
)
|
|
|
|
type FoodID uint64
|
|
|
|
type Food struct {
|
|
ID FoodID `db:"rowid"`
|
|
Name string `db:"name"`
|
|
|
|
Cals float32 `db:"cals"`
|
|
Carbs float32 `db:"carbs"`
|
|
Protein float32 `db:"protein"`
|
|
Fat float32 `db:"fat"`
|
|
Sugar float32 `db:"sugar"`
|
|
Alcohol float32 `db:"alcohol"`
|
|
|
|
Water float32 `db:"water"`
|
|
|
|
Potassium float32 `db:"potassium"`
|
|
Calcium float32 `db:"calcium"`
|
|
Sodium float32 `db:"sodium"`
|
|
Magnesium float32 `db:"magnesium"`
|
|
Phosphorus float32 `db:"phosphorus"`
|
|
Iron float32 `db:"iron"`
|
|
Zinc float32 `db:"zinc"`
|
|
|
|
Mass float32 `db:"mass"`
|
|
Price float32 `db:"price"`
|
|
Density float32 `db:"density"`
|
|
CookRatio float32 `db:"cook_ratio"`
|
|
}
|
|
|
|
// Format as string
|
|
func (f Food) String() string {
|
|
return fmt.Sprintf("%s(%d)", f.Name, f.ID)
|
|
}
|
|
|
|
func (db *DB) SaveFood(f *Food) {
|
|
if f.ID == FoodID(0) {
|
|
// Do create
|
|
result, err := db.DB.NamedExec(`
|
|
insert into foods (name, cals, carbs, protein, fat, sugar, alcohol, water, potassium, calcium, sodium,
|
|
magnesium, phosphorus, iron, zinc, mass, price, density, cook_ratio)
|
|
values (:name, :cals, :carbs, :protein, :fat, :sugar, :alcohol, :water, :potassium, :calcium,
|
|
:sodium, :magnesium, :phosphorus, :iron, :zinc, :mass, :price, :density, :cook_ratio)
|
|
`, f)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
// Update the ID if necessary
|
|
id, err := result.LastInsertId()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
f.ID = FoodID(id)
|
|
} else {
|
|
// Do update
|
|
result, err := db.DB.NamedExec(`
|
|
update foods
|
|
set name=:name,
|
|
cals=:cals,
|
|
carbs=:carbs,
|
|
protein=:protein,
|
|
fat=:fat,
|
|
sugar=:sugar,
|
|
alcohol=:alcohol,
|
|
water=:water,
|
|
potassium=:potassium,
|
|
calcium=:calcium,
|
|
sodium=:sodium,
|
|
magnesium=:magnesium,
|
|
phosphorus=:phosphorus,
|
|
iron=:iron,
|
|
zinc=:zinc,
|
|
mass=:mass,
|
|
price=:price,
|
|
density=:density,
|
|
cook_ratio=:cook_ratio
|
|
where rowid = :rowid
|
|
`, f)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
count, err := result.RowsAffected()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
if count != 1 {
|
|
panic(fmt.Errorf("Got food with ID (%d), so attempted update, but it doesn't exist", f.ID))
|
|
}
|
|
}
|
|
}
|
|
|
|
func (db *DB) GetFoodByID(id FoodID) (ret Food, err error) {
|
|
err = db.DB.Get(&ret, `
|
|
select rowid, name, cals, carbs, protein, fat, sugar, alcohol, water, potassium, calcium, sodium,
|
|
magnesium, phosphorus, iron, zinc, mass, price, density, cook_ratio
|
|
from foods
|
|
where rowid = ?
|
|
`, id)
|
|
return
|
|
}
|