/
sequences.go
104 lines (86 loc) · 2.25 KB
/
sequences.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
package postgres
import (
"context"
"database/sql"
"errors"
"strconv"
"strings"
"github.com/georgysavva/scany/pgxscan"
"github.com/grpc-ecosystem/go-grpc-middleware/logging/zap/ctxzap"
)
type SequenceModel struct {
ID int64 `db:"oid"`
Name string `db:"relname"`
Schema string `db:"nspname"`
OwnerID int64 `db:"relowner"`
ACLs []string `db:"relacl"`
}
func (t *SequenceModel) GetOwnerID() int64 {
return t.OwnerID
}
func (t *SequenceModel) GetACLs() []string {
return t.ACLs
}
func (t *SequenceModel) AllPrivileges() PrivilegeSet {
return Select | Update | Usage
}
func (t *SequenceModel) DefaultPrivileges() PrivilegeSet {
return EmptyPrivilegeSet
}
func (c *Client) getClassQuery(ctx context.Context) string {
q := `
SELECT DISTINCT c."oid"::int, c."relname", c."relowner"::int, n."nspname", c."relacl"
FROM pg_class c
LEFT JOIN pg_namespace n ON n."oid" = c."relnamespace"
WHERE c."oid" = $1
`
return q
}
func (c *Client) GetSequence(ctx context.Context, sequenceID int64) (*SequenceModel, error) {
ret := &SequenceModel{}
q := c.getClassQuery(ctx)
err := pgxscan.Get(ctx, c.db, ret, q, sequenceID)
if err != nil {
return nil, err
}
return ret, nil
}
func (c *Client) ListSequences(ctx context.Context, schemaID int64, pager *Pager) ([]*SequenceModel, string, error) {
l := ctxzap.Extract(ctx)
l.Debug("listing sequences")
offset, limit, err := pager.Parse()
if err != nil {
return nil, "", err
}
var args []interface{}
sb := &strings.Builder{}
_, _ = sb.WriteString(`
SELECT c."oid"::int, c."relname", c."relowner"::int, n."nspname", c."relacl"
FROM pg_class c
LEFT JOIN pg_namespace n ON n."oid" = c."relnamespace"
WHERE n."oid" = $1
AND (c."relkind" = 'S')
`)
args = append(args, schemaID)
_, _ = sb.WriteString("LIMIT $2 ")
args = append(args, limit+1)
if offset > 0 {
_, _ = sb.WriteString("OFFSET $3")
args = append(args, offset)
}
var ret []*SequenceModel
err = pgxscan.Select(ctx, c.db, &ret, sb.String(), args...)
if err != nil {
if errors.Is(err, sql.ErrNoRows) {
return nil, "", nil
}
return nil, "", err
}
var nextPageToken string
if len(ret) > limit {
offset += limit
nextPageToken = strconv.Itoa(offset)
ret = ret[:limit]
}
return ret, nextPageToken, nil
}