Платформа ЦРНП "Мирокод" для разработки проектов
https://git.mirocod.ru
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
199 lines
5.4 KiB
199 lines
5.4 KiB
// Copyright 2015 PingCAP, Inc. |
|
// |
|
// Licensed under the Apache License, Version 2.0 (the "License"); |
|
// you may not use this file except in compliance with the License. |
|
// You may obtain a copy of the License at |
|
// |
|
// http://www.apache.org/licenses/LICENSE-2.0 |
|
// |
|
// Unless required by applicable law or agreed to in writing, software |
|
// distributed under the License is distributed on an "AS IS" BASIS, |
|
// See the License for the specific language governing permissions and |
|
// limitations under the License. |
|
|
|
package model |
|
|
|
import ( |
|
"strings" |
|
|
|
"github.com/pingcap/tidb/util/types" |
|
) |
|
|
|
// SchemaState is the state for schema elements. |
|
type SchemaState byte |
|
|
|
const ( |
|
// StateNone means this schema element is absent and can't be used. |
|
StateNone SchemaState = iota |
|
// StateDeleteOnly means we can only delete items for this schema element. |
|
StateDeleteOnly |
|
// StateWriteOnly means we can use any write operation on this schema element, |
|
// but outer can't read the changed data. |
|
StateWriteOnly |
|
// StateWriteReorganization means we are re-organizating whole data after write only state. |
|
StateWriteReorganization |
|
// StateDeleteReorganization means we are re-organizating whole data after delete only state. |
|
StateDeleteReorganization |
|
// StatePublic means this schema element is ok for all write and read operations. |
|
StatePublic |
|
) |
|
|
|
// String implements fmt.Stringer interface. |
|
func (s SchemaState) String() string { |
|
switch s { |
|
case StateDeleteOnly: |
|
return "delete only" |
|
case StateWriteOnly: |
|
return "write only" |
|
case StateWriteReorganization: |
|
return "write reorganization" |
|
case StateDeleteReorganization: |
|
return "delete reorganization" |
|
case StatePublic: |
|
return "public" |
|
default: |
|
return "none" |
|
} |
|
} |
|
|
|
// ColumnInfo provides meta data describing of a table column. |
|
type ColumnInfo struct { |
|
ID int64 `json:"id"` |
|
Name CIStr `json:"name"` |
|
Offset int `json:"offset"` |
|
DefaultValue interface{} `json:"default"` |
|
types.FieldType `json:"type"` |
|
State SchemaState `json:"state"` |
|
} |
|
|
|
// Clone clones ColumnInfo. |
|
func (c *ColumnInfo) Clone() *ColumnInfo { |
|
nc := *c |
|
return &nc |
|
} |
|
|
|
// TableInfo provides meta data describing a DB table. |
|
type TableInfo struct { |
|
ID int64 `json:"id"` |
|
Name CIStr `json:"name"` |
|
Charset string `json:"charset"` |
|
Collate string `json:"collate"` |
|
// Columns are listed in the order in which they appear in the schema. |
|
Columns []*ColumnInfo `json:"cols"` |
|
Indices []*IndexInfo `json:"index_info"` |
|
State SchemaState `json:"state"` |
|
PKIsHandle bool `json:"pk_is_handle"` |
|
Comment string `json:"comment"` |
|
} |
|
|
|
// Clone clones TableInfo. |
|
func (t *TableInfo) Clone() *TableInfo { |
|
nt := *t |
|
nt.Columns = make([]*ColumnInfo, len(t.Columns)) |
|
nt.Indices = make([]*IndexInfo, len(t.Indices)) |
|
|
|
for i := range t.Columns { |
|
nt.Columns[i] = t.Columns[i].Clone() |
|
} |
|
|
|
for i := range t.Indices { |
|
nt.Indices[i] = t.Indices[i].Clone() |
|
} |
|
return &nt |
|
} |
|
|
|
// IndexColumn provides index column info. |
|
type IndexColumn struct { |
|
Name CIStr `json:"name"` // Index name |
|
Offset int `json:"offset"` // Index offset |
|
Length int `json:"length"` // Index length |
|
} |
|
|
|
// Clone clones IndexColumn. |
|
func (i *IndexColumn) Clone() *IndexColumn { |
|
ni := *i |
|
return &ni |
|
} |
|
|
|
// IndexType is the type of index |
|
type IndexType int |
|
|
|
// String implements Stringer interface. |
|
func (t IndexType) String() string { |
|
switch t { |
|
case IndexTypeBtree: |
|
return "BTREE" |
|
case IndexTypeHash: |
|
return "HASH" |
|
} |
|
return "" |
|
} |
|
|
|
// IndexTypes |
|
const ( |
|
IndexTypeBtree IndexType = iota + 1 |
|
IndexTypeHash |
|
) |
|
|
|
// IndexInfo provides meta data describing a DB index. |
|
// It corresponds to the statement `CREATE INDEX Name ON Table (Column);` |
|
// See: https://dev.mysql.com/doc/refman/5.7/en/create-index.html |
|
type IndexInfo struct { |
|
ID int64 `json:"id"` |
|
Name CIStr `json:"idx_name"` // Index name. |
|
Table CIStr `json:"tbl_name"` // Table name. |
|
Columns []*IndexColumn `json:"idx_cols"` // Index columns. |
|
Unique bool `json:"is_unique"` // Whether the index is unique. |
|
Primary bool `json:"is_primary"` // Whether the index is primary key. |
|
State SchemaState `json:"state"` |
|
Comment string `json:"comment"` // Comment |
|
Tp IndexType `json:"index_type"` // Index type: Btree or Hash |
|
} |
|
|
|
// Clone clones IndexInfo. |
|
func (index *IndexInfo) Clone() *IndexInfo { |
|
ni := *index |
|
ni.Columns = make([]*IndexColumn, len(index.Columns)) |
|
for i := range index.Columns { |
|
ni.Columns[i] = index.Columns[i].Clone() |
|
} |
|
return &ni |
|
} |
|
|
|
// DBInfo provides meta data describing a DB. |
|
type DBInfo struct { |
|
ID int64 `json:"id"` // Database ID |
|
Name CIStr `json:"db_name"` // DB name. |
|
Charset string `json:"charset"` |
|
Collate string `json:"collate"` |
|
Tables []*TableInfo `json:"-"` // Tables in the DB. |
|
State SchemaState `json:"state"` |
|
} |
|
|
|
// Clone clones DBInfo. |
|
func (db *DBInfo) Clone() *DBInfo { |
|
newInfo := *db |
|
newInfo.Tables = make([]*TableInfo, len(db.Tables)) |
|
for i := range db.Tables { |
|
newInfo.Tables[i] = db.Tables[i].Clone() |
|
} |
|
return &newInfo |
|
} |
|
|
|
// CIStr is case insensitve string. |
|
type CIStr struct { |
|
O string `json:"O"` // Original string. |
|
L string `json:"L"` // Lower case string. |
|
} |
|
|
|
// String implements fmt.Stringer interface. |
|
func (cis CIStr) String() string { |
|
return cis.O |
|
} |
|
|
|
// NewCIStr creates a new CIStr. |
|
func NewCIStr(s string) (cs CIStr) { |
|
cs.O = s |
|
cs.L = strings.ToLower(s) |
|
return |
|
}
|
|
|