-
Notifications
You must be signed in to change notification settings - Fork 1
/
ref.go
148 lines (117 loc) · 2.48 KB
/
ref.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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package db
import (
"database/sql"
)
// Refs represents all refs to a given tag, where the key is the tag the row(s) came from
type Refs map[Tag][]Row
func sqlAddRef(tx *sql.Tx, tagID int64, rowID int64) error {
var statement *sql.Stmt
var err error
statement, err = tx.Prepare("INSERT INTO ref (tag_id, row_id) VALUES ($1, $2)")
if err != nil {
goto End
}
_, err = statement.Exec(tagID, rowID)
if err != nil {
goto End
}
End:
return err
}
func sqlClearRefsToRow(tx *sql.Tx, rowID int64) error {
var statement *sql.Stmt
var err error
statement, err = tx.Prepare("DELETE FROM ref WHERE row_id = $1")
if err != nil {
goto End
}
_, err = statement.Exec(rowID)
if err != nil {
goto End
}
End:
return err
}
func sqlGetRefsToTagByTagID(tx *sql.Tx, tagID int64) (Refs, error) {
var statement *sql.Stmt
var sqlRows *sql.Rows
var refs Refs
var tag Tag
var row Row
var err error
statement, err = tx.Prepare(`SELECT r.id, r.tag_id, r.parent_row_id, r.text, r.rank, r.updated_ts
FROM row as r, tag, ref
WHERE tag.id = $1
AND tag.id = ref.tag_id
AND r.id = ref.row_id
ORDER BY r.tag_id asc, r.rank asc`)
if err != nil {
goto End
}
sqlRows, err = statement.Query(tagID)
if err != nil {
goto End
}
defer sqlRows.Close()
refs = make(Refs)
for sqlRows.Next() {
err = sqlRows.Scan(&row.ID, &row.TagID, &row.ParentRowID, &row.Text, &row.Rank, &row.UpdatedTS)
if err != nil {
goto End
}
tag, err = sqlGetTagByID(tx, row.TagID)
if err != nil {
goto End
}
refs[tag] = append(refs[tag], row)
}
End:
return refs, err
}
func sqlGetRefsToTagByTagName(tx *sql.Tx, name string) (Refs, error) {
var refs Refs
var tag Tag
var err error
tag, err = sqlGetTagByName(tx, name)
if err != nil {
goto End
}
refs, err = sqlGetRefsToTagByTagID(tx, tag.ID)
if err != nil {
goto End
}
End:
return refs, err
}
func (e *ExoDB) GetRefsToTagByTagName(name string) (Refs, error) {
var tx *sql.Tx
var refs Refs
var err error
tx, err = e.conn.Begin()
if err != nil {
goto End
}
refs, err = sqlGetRefsToTagByTagName(tx, name)
if err != nil {
goto End
}
End:
sqlCommitOrRollback(tx, err)
return refs, err
}
func (e *ExoDB) GetRefsToTagByTagID(tagID int64) (Refs, error) {
var tx *sql.Tx
var refs Refs
var err error
tx, err = e.conn.Begin()
if err != nil {
goto End
}
refs, err = sqlGetRefsToTagByTagID(tx, tagID)
if err != nil {
goto End
}
End:
sqlCommitOrRollback(tx, err)
return refs, err
}