-
Notifications
You must be signed in to change notification settings - Fork 7
/
secret.go
135 lines (114 loc) · 3.03 KB
/
secret.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
package materialize
import (
"database/sql"
"fmt"
"github.com/jmoiron/sqlx"
"github.com/lib/pq"
)
// DDL
type SecretBuilder struct {
ddl Builder
secretName string
schemaName string
databaseName string
value string
}
func NewSecretBuilder(conn *sqlx.DB, obj MaterializeObject) *SecretBuilder {
return &SecretBuilder{
ddl: Builder{conn, Secret},
secretName: obj.Name,
schemaName: obj.SchemaName,
databaseName: obj.DatabaseName,
}
}
func (b *SecretBuilder) QualifiedName() string {
return QualifiedName(b.databaseName, b.schemaName, b.secretName)
}
func (b *SecretBuilder) Value(v string) *SecretBuilder {
b.value = v
return b
}
func (b *SecretBuilder) Create() error {
q := fmt.Sprintf(`CREATE SECRET %s AS %s;`, b.QualifiedName(), QuoteString(b.value))
return b.ddl.exec(q)
}
func (b *SecretBuilder) Rename(newName string) error {
n := QualifiedName(newName)
return b.ddl.rename(b.QualifiedName(), n)
}
func (b *SecretBuilder) UpdateValue(newValue string) error {
q := fmt.Sprintf(`ALTER SECRET %s AS %s;`, b.QualifiedName(), QuoteString(newValue))
return b.ddl.exec(q)
}
func (b *SecretBuilder) Drop() error {
qn := b.QualifiedName()
return b.ddl.drop(qn)
}
// DML
type SecretParams struct {
SecretId sql.NullString `db:"id"`
SecretName sql.NullString `db:"name"`
SchemaName sql.NullString `db:"schema_name"`
DatabaseName sql.NullString `db:"database_name"`
Comment sql.NullString `db:"comment"`
OwnerName sql.NullString `db:"owner_name"`
Privileges pq.StringArray `db:"privileges"`
}
var secretQuery = NewBaseQuery(`
SELECT
mz_secrets.id,
mz_secrets.name,
mz_schemas.name AS schema_name,
mz_databases.name AS database_name,
comments.comment AS comment,
mz_roles.name AS owner_name,
mz_secrets.privileges
FROM mz_secrets
JOIN mz_schemas
ON mz_secrets.schema_id = mz_schemas.id
JOIN mz_databases
ON mz_schemas.database_id = mz_databases.id
JOIN mz_roles
ON mz_secrets.owner_id = mz_roles.id
LEFT JOIN (
SELECT id, comment
FROM mz_internal.mz_comments
WHERE object_type = 'secret'
) comments
ON mz_secrets.id = comments.id`)
func SecretId(conn *sqlx.DB, obj MaterializeObject) (string, error) {
p := map[string]string{
"mz_secrets.name": obj.Name,
"mz_schemas.name": obj.SchemaName,
"mz_databases.name": obj.DatabaseName,
}
q := secretQuery.QueryPredicate(p)
var c SecretParams
if err := conn.Get(&c, q); err != nil {
return "", err
}
return c.SecretId.String, nil
}
func ScanSecret(conn *sqlx.DB, id string) (SecretParams, error) {
p := map[string]string{
"mz_secrets.id": id,
}
q := secretQuery.QueryPredicate(p)
var c SecretParams
if err := conn.Get(&c, q); err != nil {
return c, err
}
return c, nil
}
func ListSecrets(conn *sqlx.DB, schemaName, databaseName string) ([]SecretParams, error) {
p := map[string]string{
"mz_schemas.name": schemaName,
"mz_databases.name": databaseName,
}
q := secretQuery.QueryPredicate(p)
var c []SecretParams
if err := conn.Select(&c, q); err != nil {
return c, err
}
return c, nil
}