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 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333
|
// Copyright 2021-present The Atlas Authors. All rights reserved.
// This source code is licensed under the Apache 2.0 license found
// in the LICENSE file in the root directory of this source tree.
package schema
type (
// A Realm or a database describes a domain of schema resources that are logically connected
// and can be accessed and queried in the same connection (e.g. a physical database instance).
Realm struct {
Schemas []*Schema
Attrs []Attr
}
// A Schema describes a database schema (i.e. named database).
Schema struct {
Name string
Realm *Realm
Tables []*Table
Attrs []Attr // Attrs and options.
}
// A Table represents a table definition.
Table struct {
Name string
Schema *Schema
Columns []*Column
Indexes []*Index
PrimaryKey *Index
ForeignKeys []*ForeignKey
Attrs []Attr // Attrs, constraints and options.
}
// A Column represents a column definition.
Column struct {
Name string
Type *ColumnType
Default Expr
Attrs []Attr
Indexes []*Index
// Foreign keys that this column is
// part of their child columns.
ForeignKeys []*ForeignKey
}
// ColumnType represents a column type that is implemented by the dialect.
ColumnType struct {
Type Type
Raw string
Null bool
}
// An Index represents an index definition.
Index struct {
Name string
Unique bool
Table *Table
Attrs []Attr
Parts []*IndexPart
}
// An IndexPart represents an index part that
// can be either an expression or a column.
IndexPart struct {
// SeqNo represents the sequence number of the key part
// in the index.
SeqNo int
// Desc indicates if the key part is stored in descending
// order. All databases use ascending order as default.
Desc bool
X Expr
C *Column
Attrs []Attr
}
// A ForeignKey represents an index definition.
ForeignKey struct {
Symbol string
Table *Table
Columns []*Column
RefTable *Table
RefColumns []*Column
OnUpdate ReferenceOption
OnDelete ReferenceOption
}
)
// Schema returns the first schema that matched the given name.
func (r *Realm) Schema(name string) (*Schema, bool) {
for _, s := range r.Schemas {
if s.Name == name {
return s, true
}
}
return nil, false
}
// Table returns the first table that matched the given name.
func (s *Schema) Table(name string) (*Table, bool) {
for _, t := range s.Tables {
if t.Name == name {
return t, true
}
}
return nil, false
}
// Column returns the first column that matched the given name.
func (t *Table) Column(name string) (*Column, bool) {
for _, c := range t.Columns {
if c.Name == name {
return c, true
}
}
return nil, false
}
// Index returns the first index that matched the given name.
func (t *Table) Index(name string) (*Index, bool) {
for _, i := range t.Indexes {
if i.Name == name {
return i, true
}
}
return nil, false
}
// ForeignKey returns the first foreign-key that matched the given symbol (constraint name).
func (t *Table) ForeignKey(symbol string) (*ForeignKey, bool) {
for _, f := range t.ForeignKeys {
if f.Symbol == symbol {
return f, true
}
}
return nil, false
}
// Column returns the first column that matches the given name.
func (f *ForeignKey) Column(name string) (*Column, bool) {
for _, c := range f.Columns {
if c.Name == name {
return c, true
}
}
return nil, false
}
// RefColumn returns the first referenced column that matches the given name.
func (f *ForeignKey) RefColumn(name string) (*Column, bool) {
for _, c := range f.RefColumns {
if c.Name == name {
return c, true
}
}
return nil, false
}
// ReferenceOption for constraint actions.
type ReferenceOption string
// Reference options (actions) specified by ON UPDATE and ON DELETE
// subclauses of the FOREIGN KEY clause.
const (
NoAction ReferenceOption = "NO ACTION"
Restrict ReferenceOption = "RESTRICT"
Cascade ReferenceOption = "CASCADE"
SetNull ReferenceOption = "SET NULL"
SetDefault ReferenceOption = "SET DEFAULT"
)
type (
// A Type represents a database type. The types below implements this
// interface and can be used for describing schemas.
//
// The Type interface can also be implemented outside this package as follows:
//
// type SpatialType struct {
// schema.Type
// T string
// }
//
// var t schema.Type = &SpatialType{T: "point"}
//
Type interface {
typ()
}
// EnumType represents an enum type.
EnumType struct {
T string // Optional type.
Values []string // Enum values.
Schema *Schema // Optional schema.
}
// BinaryType represents a type that stores a binary data.
BinaryType struct {
T string
Size *int
}
// StringType represents a string type.
StringType struct {
T string
Size int
}
// BoolType represents a boolean type.
BoolType struct {
T string
}
// IntegerType represents an int type.
IntegerType struct {
T string
Unsigned bool
Attrs []Attr
}
// DecimalType represents a fixed-point type that stores exact numeric values.
DecimalType struct {
T string
Precision int
Scale int
Unsigned bool
}
// FloatType represents a floating-point type that stores approximate numeric values.
FloatType struct {
T string
Unsigned bool
Precision int
}
// TimeType represents a date/time type.
TimeType struct {
T string
Precision *int
}
// JSONType represents a JSON type.
JSONType struct {
T string
}
// SpatialType represents a spatial/geometric type.
SpatialType struct {
T string
}
// UnsupportedType represents a type that is not supported by the drivers.
UnsupportedType struct {
T string
}
)
type (
// Expr defines an SQL expression in schema DDL.
Expr interface {
expr()
}
// Literal represents a basic literal expression like 1, or '1'.
// String literals are usually quoted with single or double quotes.
Literal struct {
V string
}
// RawExpr represents a raw expression like "uuid()" or "current_timestamp()".
// Unlike literals, raw expression are usually inlined as is on migration.
RawExpr struct {
X string
}
)
type (
// Attr represents the interface that all attributes implement.
Attr interface {
attr()
}
// Comment describes a schema element comment.
Comment struct {
Text string
}
// Charset describes a column or a table character-set setting.
Charset struct {
V string
}
// Collation describes a column or a table collation setting.
Collation struct {
V string
}
// Check describes a CHECK constraint.
Check struct {
Name string // Optional constraint name.
Expr string // Actual CHECK.
Attrs []Attr // Additional attributes (e.g. ENFORCED).
}
// GeneratedExpr describes the expression used for generating
// the value of a generated/virtual column.
GeneratedExpr struct {
Expr string
Type string // Optional type. e.g. STORED or VIRTUAL.
}
)
// expressions.
func (*Literal) expr() {}
func (*RawExpr) expr() {}
// types.
func (*BoolType) typ() {}
func (*EnumType) typ() {}
func (*TimeType) typ() {}
func (*JSONType) typ() {}
func (*FloatType) typ() {}
func (*StringType) typ() {}
func (*BinaryType) typ() {}
func (*SpatialType) typ() {}
func (*IntegerType) typ() {}
func (*DecimalType) typ() {}
func (*UnsupportedType) typ() {}
// attributes.
func (*Check) attr() {}
func (*Comment) attr() {}
func (*Charset) attr() {}
func (*Collation) attr() {}
func (*GeneratedExpr) attr() {}
|