-
Notifications
You must be signed in to change notification settings - Fork 0
/
links.go
106 lines (90 loc) · 1.83 KB
/
links.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
97
98
99
100
101
102
103
104
105
106
package db
import (
"context"
"fmt"
)
var (
linksTable string = "links"
)
type Link struct {
URL string `db:"url"`
Text string `db:"text"`
GID string `db:"gid"`
}
func (l *Link) Clone() *Link {
return &Link{
URL: l.URL,
Text: l.Text,
GID: l.GID,
}
}
func SelectLinkByURL(ctx context.Context, l *Link) error {
q, err := prepareStmt(
`SELECT url,text,gid FROM ` + linksTable + ` WHERE gid=? LIMIT 1`,
)
if err != nil {
return err
}
row := q.QueryRowContext(ctx, l.GID)
return row.Scan(&l.URL, &l.Text, &l.GID)
}
func SearchLinks(ctx context.Context, gid, term string) (links []*Link, err error) {
likeTerm := fmt.Sprintf("%%%s%%", term)
q, err := prepareStmt(
`SELECT text,url,gid FROM ` + linksTable + ` WHERE text LIKE ? AND gid=?`,
)
if err != nil {
return links, err
}
rows, err := q.QueryContext(ctx, likeTerm, gid)
if err != nil {
return links, err
}
defer rows.Close()
for rows.Next() {
var l *Link
if err := rows.Scan(&l.Text, &l.URL, &l.GID); err != nil {
return links, err
} else {
links = append(links, l)
}
}
return links, nil
}
func InsertLink(ctx context.Context, l *Link) error {
q, err := prepareStmt(
`INSERT OR REPLACE INTO ` + linksTable + `
(url,text,gid) VALUES(?,?,?)`,
)
if err != nil {
return err
}
res, err := q.ExecContext(ctx, l.URL, l.Text, l.GID)
if err != nil {
return err
}
if n, err := res.RowsAffected(); err != nil {
return err
} else if n != 1 {
return ErrInsert
}
return nil
}
func DeleteLink(ctx context.Context, l *Link) error {
q, err := prepareStmt(
`DELETE FROM ` + linksTable + ` WHERE url=? AND gid=?`,
)
if err != nil {
return err
}
r, err := q.ExecContext(ctx, l.URL, l.GID)
if err != nil {
return err
}
if n, err := r.RowsAffected(); err != nil {
return err
} else if n != 1 {
return ErrNotFound
}
return nil
}