-
Notifications
You must be signed in to change notification settings - Fork 7
/
schema.go
115 lines (96 loc) · 2.48 KB
/
schema.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
package materialize
import (
"database/sql"
"fmt"
"github.com/jmoiron/sqlx"
"github.com/lib/pq"
)
// DDL
type SchemaBuilder struct {
ddl Builder
schemaName string
databaseName string
}
func NewSchemaBuilder(conn *sqlx.DB, obj MaterializeObject) *SchemaBuilder {
return &SchemaBuilder{
ddl: Builder{conn, Schema},
schemaName: obj.Name,
databaseName: obj.DatabaseName,
}
}
func (b *SchemaBuilder) QualifiedName() string {
return QualifiedName(b.databaseName, b.schemaName)
}
func (b *SchemaBuilder) Create() error {
q := fmt.Sprintf(`CREATE SCHEMA %s;`, b.QualifiedName())
return b.ddl.exec(q)
}
func (b *SchemaBuilder) Rename(newName string) error {
old := b.QualifiedName()
new := QualifiedName(newName)
return b.ddl.rename(old, new)
}
func (b *SchemaBuilder) Drop() error {
qn := b.QualifiedName()
return b.ddl.drop(qn)
}
// DML
type SchemaParams struct {
SchemaId sql.NullString `db:"id"`
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 schemaQuery = NewBaseQuery(`
SELECT
mz_schemas.id,
mz_schemas.name AS schema_name,
mz_databases.name AS database_name,
comments.comment AS comment,
mz_roles.name AS owner_name,
mz_schemas.privileges
FROM mz_schemas
JOIN mz_databases
ON mz_schemas.database_id = mz_databases.id
JOIN mz_roles
ON mz_schemas.owner_id = mz_roles.id
LEFT JOIN (
SELECT id, comment
FROM mz_internal.mz_comments
WHERE object_type = 'schema'
) comments
ON mz_schemas.id = comments.id`)
func SchemaId(conn *sqlx.DB, obj MaterializeObject) (string, error) {
p := map[string]string{
"mz_schemas.name": obj.Name,
"mz_databases.name": obj.DatabaseName,
}
q := schemaQuery.QueryPredicate(p)
var c SchemaParams
if err := conn.Get(&c, q); err != nil {
return "", err
}
return c.SchemaId.String, nil
}
func ScanSchema(conn *sqlx.DB, id string) (SchemaParams, error) {
p := map[string]string{
"mz_schemas.id": id,
}
q := schemaQuery.QueryPredicate(p)
var c SchemaParams
if err := conn.Get(&c, q); err != nil {
return c, err
}
return c, nil
}
func ListSchemas(conn *sqlx.DB, databaseName string) ([]SchemaParams, error) {
p := map[string]string{"mz_databases.name": databaseName}
q := schemaQuery.QueryPredicate(p)
var c []SchemaParams
if err := conn.Select(&c, q); err != nil {
return c, err
}
return c, nil
}