123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- package gorm
- import (
- "database/sql"
- "fmt"
- "reflect"
- "strconv"
- "strings"
- )
- type Dialect interface {
-
- GetName() string
-
- SetDB(db SQLCommon)
-
- BindVar(i int) string
-
- Quote(key string) string
-
- DataTypeOf(field *StructField) string
-
- HasIndex(tableName string, indexName string) bool
-
- HasForeignKey(tableName string, foreignKeyName string) bool
-
- RemoveIndex(tableName string, indexName string) error
-
- HasTable(tableName string) bool
-
- HasColumn(tableName string, columnName string) bool
-
- ModifyColumn(tableName string, columnName string, typ string) error
-
- LimitAndOffsetSQL(limit, offset interface{}) string
-
- SelectFromDummyTable() string
-
- LastInsertIDReturningSuffix(tableName, columnName string) string
-
- DefaultValueStr() string
-
- BuildKeyName(kind, tableName string, fields ...string) string
-
- CurrentDatabase() string
- }
- var dialectsMap = map[string]Dialect{}
- func newDialect(name string, db SQLCommon) Dialect {
- if value, ok := dialectsMap[name]; ok {
- dialect := reflect.New(reflect.TypeOf(value).Elem()).Interface().(Dialect)
- dialect.SetDB(db)
- return dialect
- }
- fmt.Printf("`%v` is not officially supported, running under compatibility mode.\n", name)
- commontDialect := &commonDialect{}
- commontDialect.SetDB(db)
- return commontDialect
- }
- func RegisterDialect(name string, dialect Dialect) {
- dialectsMap[name] = dialect
- }
- func GetDialect(name string) (dialect Dialect, ok bool) {
- dialect, ok = dialectsMap[name]
- return
- }
- var ParseFieldStructForDialect = func(field *StructField, dialect Dialect) (fieldValue reflect.Value, sqlType string, size int, additionalType string) {
-
- var (
- reflectType = field.Struct.Type
- dataType, _ = field.TagSettingsGet("TYPE")
- )
- for reflectType.Kind() == reflect.Ptr {
- reflectType = reflectType.Elem()
- }
-
- fieldValue = reflect.Indirect(reflect.New(reflectType))
- if gormDataType, ok := fieldValue.Interface().(interface {
- GormDataType(Dialect) string
- }); ok {
- dataType = gormDataType.GormDataType(dialect)
- }
-
- if dataType == "" {
- var getScannerValue func(reflect.Value)
- getScannerValue = func(value reflect.Value) {
- fieldValue = value
- if _, isScanner := reflect.New(fieldValue.Type()).Interface().(sql.Scanner); isScanner && fieldValue.Kind() == reflect.Struct {
- getScannerValue(fieldValue.Field(0))
- }
- }
- getScannerValue(fieldValue)
- }
-
- if num, ok := field.TagSettingsGet("SIZE"); ok {
- size, _ = strconv.Atoi(num)
- } else {
- size = 255
- }
-
- notNull, _ := field.TagSettingsGet("NOT NULL")
- unique, _ := field.TagSettingsGet("UNIQUE")
- additionalType = notNull + " " + unique
- if value, ok := field.TagSettingsGet("DEFAULT"); ok {
- additionalType = additionalType + " DEFAULT " + value
- }
- return fieldValue, dataType, size, strings.TrimSpace(additionalType)
- }
- func currentDatabaseAndTable(dialect Dialect, tableName string) (string, string) {
- if strings.Contains(tableName, ".") {
- splitStrings := strings.SplitN(tableName, ".", 2)
- return splitStrings[0], splitStrings[1]
- }
- return dialect.CurrentDatabase(), tableName
- }
|