package model import ( "database/sql" "errors" "time" ) type Recipe struct { Id int64 `json:"id"` Title string `json:"title"` Portions int `json:"portions"` Url string `json:"url"` Notes string `json:"notes"` Created int64 `json:"created"` LastChanged int64 `json:"last_changed"` } func (r *Recipe) Create() error { now := time.Now().Unix() r.Created = now r.LastChanged = now query := `INSERT INTO recipes (title, portions, url, notes, created, last_changed) VALUES (?, ?, ?, ?, ?, ?)` result, err := db.Exec(query, r.Title, r.Portions, r.Url, r.Notes, r.Created, r.LastChanged) if err != nil { return err } r.Id, err = result.LastInsertId() if err != nil { return err } return nil } func (r *Recipe) Read() error { query := `SELECT id, title, portions, url, notes, created, last_changed FROM recipes WHERE id = ?` rows, err := db.Query(query, r.Id) if err != nil { return err } defer rows.Close() if !rows.Next() { return sql.ErrNoRows } err = rows.Scan( &r.Id, &r.Title, &r.Portions, &r.Url, &r.Notes, &r.Created, &r.LastChanged, ) if err != nil { return err } if rows.Next() { return errors.New("model: More than one object found on read") } return nil } func (r *Recipe) Update() error { query := `UPDATE recipes SET title = ?, portions = ?, url = ?, notes = ?, created = ?, last_changed = ? WHERE id = ?` _, err := db.Exec(query, r.Title, r.Portions, r.Url, r.Notes, r.Created, r.LastChanged, r.Id) if err != nil { return err } return nil } func (r *Recipe) Delete() error { query := `DELETE FROM recipes WHERE id = ?` result, err := db.Exec(query, r.Id) if err != nil { return err } rows, err := result.RowsAffected() if rows != 1 { return errors.New("Recipe deletion did not affect exactly one row") } return nil }