1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
package model
import (
"database/sql"
"errors"
"fmt"
"time"
)
type Recipe struct {
Id string `json:"id"`
Title string `json:"title"`
Portions string `json:"portions"`
Url string `json:"url"`
Notes string `json:"notes"`
Created string `json:"created"`
LastChanged string `json:"last_changed"`
}
func (r *Recipe) Touch() {
now := time.Now().Unix()
r.LastChanged = fmt.Sprint(now)
}
func (r *Recipe) Create() error {
r.Touch()
r.Created = r.LastChanged
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
}
id, err := result.LastInsertId()
if err != nil {
return err
}
r.Id = fmt.Sprint(id)
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 {
r.Touch()
query := `UPDATE
recipes
SET
title = ?,
portions = ?,
url = ?,
notes = ?,
last_changed = ?
WHERE
id = ?`
res, err := db.Exec(query, r.Title, r.Portions, r.Url, r.Notes,
r.LastChanged, r.Id)
if err != nil {
return err
}
affected, err := res.RowsAffected()
if err != nil {
return err
}
if affected != 1 {
return fmt.Errorf("Recipe update affected %d rows instead of 1", affected)
}
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
}
|