-
Notifications
You must be signed in to change notification settings - Fork 0
/
artist.go
96 lines (77 loc) · 1.64 KB
/
artist.go
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
package database
import "database/sql"
type Artist struct {
ID int `json:"id,omitempty"`
Name string `json:"name"`
Albums []Album `json:"albums,omitempty"`
Singles []Song `json:"singles,omitempty"`
}
func GetArtists(page int) ([]Artist, error) {
q := `
SELECT id, name FROM artists
ORDER BY name
LIMIT 24
OFFSET ?
`
r, err := DB.Query(q, (page-1)*24)
if err != nil {
return nil, err
}
var artists []Artist
for r.Next() {
var a Artist
r.Scan(&a.ID, &a.Name)
artists = append(artists, a)
}
return artists, nil
}
func GetArtist(id int) (Artist, error) {
var a Artist
q := "SELECT name FROM artists WHERE id = ?"
stmt, err := DB.Prepare(q)
if err != nil {
return a, err
}
r := stmt.QueryRow(id)
r.Scan(&a.Name)
q = "SELECT id, name, picture FROM albums WHERE artist = ?"
stmt, err = DB.Prepare(q)
if err != nil {
return a, err
}
rows, err := stmt.Query(id)
if err != nil {
return a, err
}
for rows.Next() {
var ab Album
rows.Scan(&ab.ID, &ab.Name, &ab.Picture)
a.Albums = append(a.Albums, ab)
}
q = "SELECT id, title, picture FROM songs WHERE artist = ? AND album IS NULL"
stmt, err = DB.Prepare(q)
if err != nil {
return a, err
}
rows, err = stmt.Query(id)
if err != nil {
return a, err
}
for rows.Next() {
var s Song
rows.Scan(&s.ID, &s.Title, &s.Picture)
a.Singles = append(a.Singles, s)
}
return a, nil
}
func CreateArtist(tx *sql.Tx, name string) error {
q := "INSERT INTO artists (name) VALUES(?) ON CONFLICT (name) DO NOTHING"
stmt, err := tx.Prepare(q)
if err != nil {
return err
}
if _, err := stmt.Exec(name); err != nil {
return err
}
return nil
}