mirror of https://github.com/grafana/grafana.git
85 lines
2.5 KiB
Go
85 lines
2.5 KiB
Go
|
//go:build enterprise || pro
|
||
|
|
||
|
package migrator
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"fmt"
|
||
|
|
||
|
"cloud.google.com/go/spanner"
|
||
|
"google.golang.org/grpc/codes"
|
||
|
"xorm.io/core"
|
||
|
)
|
||
|
|
||
|
type SpannerDialect struct {
|
||
|
BaseDialect
|
||
|
d core.Dialect
|
||
|
}
|
||
|
|
||
|
func init() {
|
||
|
supportedDialects[Spanner] = NewSpannerDialect
|
||
|
}
|
||
|
|
||
|
func NewSpannerDialect() Dialect {
|
||
|
d := SpannerDialect{d: core.QueryDialect(Spanner)}
|
||
|
d.BaseDialect.dialect = &d
|
||
|
d.BaseDialect.driverName = Spanner
|
||
|
return &d
|
||
|
}
|
||
|
|
||
|
func (s *SpannerDialect) AutoIncrStr() string { return s.d.AutoIncrStr() }
|
||
|
func (s *SpannerDialect) Quote(name string) string { return s.d.Quote(name) }
|
||
|
func (s *SpannerDialect) SupportEngine() bool { return s.d.SupportEngine() }
|
||
|
func (s *SpannerDialect) IndexCheckSQL(tableName, indexName string) (string, []any) {
|
||
|
return s.d.IndexCheckSql(tableName, indexName)
|
||
|
}
|
||
|
func (s *SpannerDialect) SQLType(col *Column) string {
|
||
|
c := core.NewColumn(col.Name, "", core.SQLType{Name: col.Type}, col.Length, col.Length2, col.Nullable)
|
||
|
return s.d.SqlType(c)
|
||
|
}
|
||
|
|
||
|
func (s *SpannerDialect) BatchSize() int { return 1000 }
|
||
|
func (s *SpannerDialect) BooleanStr(b bool) string {
|
||
|
if b {
|
||
|
return "true"
|
||
|
}
|
||
|
return "false"
|
||
|
}
|
||
|
func (s *SpannerDialect) ErrorMessage(err error) string {
|
||
|
return spanner.ErrDesc(spanner.ToSpannerError(err))
|
||
|
}
|
||
|
func (s *SpannerDialect) IsDeadlock(err error) bool {
|
||
|
return spanner.ErrCode(spanner.ToSpannerError(err)) == codes.Aborted
|
||
|
}
|
||
|
func (s *SpannerDialect) IsUniqueConstraintViolation(err error) bool {
|
||
|
return spanner.ErrCode(spanner.ToSpannerError(err)) == codes.AlreadyExists
|
||
|
}
|
||
|
|
||
|
func (s *SpannerDialect) CreateTableSQL(table *Table) string {
|
||
|
t := core.NewEmptyTable()
|
||
|
t.Name = table.Name
|
||
|
t.PrimaryKeys = table.PrimaryKeys
|
||
|
for _, c := range table.Columns {
|
||
|
t.AddColumn(core.NewColumn(c.Name, c.Name, core.SQLType{Name: c.Type}, c.Length, c.Length2, c.Nullable))
|
||
|
}
|
||
|
return s.d.CreateTableSql(t, t.Name, "", "")
|
||
|
}
|
||
|
|
||
|
func (s *SpannerDialect) CreateIndexSQL(tableName string, index *Index) string {
|
||
|
idx := core.NewIndex(index.Name, index.Type)
|
||
|
idx.Cols = index.Cols
|
||
|
return s.d.CreateIndexSql(tableName, idx)
|
||
|
}
|
||
|
|
||
|
func (s *SpannerDialect) UpsertMultipleSQL(tableName string, keyCols, updateCols []string, count int) (string, error) {
|
||
|
return "", errors.New("not supported")
|
||
|
}
|
||
|
|
||
|
func (s *SpannerDialect) DropIndexSQL(tableName string, index *Index) string {
|
||
|
return fmt.Sprintf("DROP INDEX %v", s.Quote(index.XName(tableName)))
|
||
|
}
|
||
|
|
||
|
func (s *SpannerDialect) DropTable(tableName string) string {
|
||
|
return fmt.Sprintf("DROP TABLE %s", s.Quote(tableName))
|
||
|
}
|