2014-09-16 19:32:35 +04:00
package gorm
import (
"fmt"
"reflect"
"strings"
2015-02-17 17:55:14 +03:00
"time"
2014-09-16 19:32:35 +04:00
)
2015-03-17 05:40:42 +03:00
type mssql struct {
commonDialect
2014-09-16 19:32:35 +04:00
}
2015-03-17 05:40:42 +03:00
func ( mssql ) HasTop ( ) bool {
2014-09-16 19:32:35 +04:00
return true
}
2015-03-17 05:40:42 +03:00
func ( mssql ) SqlTag ( value reflect . Value , size int , autoIncrease bool ) string {
2014-09-16 19:32:35 +04:00
switch value . Kind ( ) {
case reflect . Bool :
return "bit"
case reflect . Int , reflect . Int8 , reflect . Int16 , reflect . Int32 , reflect . Uint , reflect . Uint8 , reflect . Uint16 , reflect . Uint32 , reflect . Uintptr :
2015-03-11 12:05:58 +03:00
if autoIncrease {
return "int IDENTITY(1,1)"
}
2014-09-16 19:32:35 +04:00
return "int"
case reflect . Int64 , reflect . Uint64 :
2015-03-11 12:05:58 +03:00
if autoIncrease {
return "bigint IDENTITY(1,1)"
}
2014-09-16 19:32:35 +04:00
return "bigint"
case reflect . Float32 , reflect . Float64 :
return "float"
case reflect . String :
if size > 0 && size < 65532 {
return fmt . Sprintf ( "nvarchar(%d)" , size )
}
2015-02-17 03:34:01 +03:00
return "text"
2014-09-16 19:32:35 +04:00
case reflect . Struct :
2015-02-17 17:55:14 +03:00
if _ , ok := value . Interface ( ) . ( time . Time ) ; ok {
2014-09-16 19:32:35 +04:00
return "datetime2"
}
default :
if _ , ok := value . Interface ( ) . ( [ ] byte ) ; ok {
if size > 0 && size < 65532 {
return fmt . Sprintf ( "varchar(%d)" , size )
}
2015-02-17 03:34:01 +03:00
return "text"
2014-09-16 19:32:35 +04:00
}
}
panic ( fmt . Sprintf ( "invalid sql type %s (%s) for mssql" , value . Type ( ) . Name ( ) , value . Kind ( ) . String ( ) ) )
}
2015-03-17 05:40:42 +03:00
func ( mssql ) databaseName ( scope * Scope ) string {
2014-09-16 19:32:35 +04:00
dbStr := strings . Split ( scope . db . parent . source , ";" )
for _ , value := range dbStr {
s := strings . Split ( value , "=" )
if s [ 0 ] == "database" {
return s [ 1 ]
}
}
return ""
}
2015-03-17 05:40:42 +03:00
func ( s mssql ) HasTable ( scope * Scope , tableName string ) bool {
2014-09-16 19:32:35 +04:00
var count int
2015-02-28 12:01:27 +03:00
scope . NewDB ( ) . Raw ( "SELECT count(*) FROM INFORMATION_SCHEMA.tables WHERE table_name = ? AND table_catalog = ?" , tableName , s . databaseName ( scope ) ) . Row ( ) . Scan ( & count )
2014-09-16 19:32:35 +04:00
return count > 0
}
2015-03-17 05:40:42 +03:00
func ( s mssql ) HasColumn ( scope * Scope , tableName string , columnName string ) bool {
2014-09-16 19:32:35 +04:00
var count int
2015-02-28 12:01:27 +03:00
scope . NewDB ( ) . Raw ( "SELECT count(*) FROM information_schema.columns WHERE table_catalog = ? AND table_name = ? AND column_name = ?" , s . databaseName ( scope ) , tableName , columnName ) . Row ( ) . Scan ( & count )
2014-09-16 19:32:35 +04:00
return count > 0
}
2015-03-17 05:40:42 +03:00
func ( mssql ) HasIndex ( scope * Scope , tableName string , indexName string ) bool {
2015-03-02 18:02:40 +03:00
var count int
scope . NewDB ( ) . Raw ( "SELECT count(*) FROM sys.indexes WHERE name=? AND object_id=OBJECT_ID(?)" , indexName , tableName ) . Row ( ) . Scan ( & count )
return count > 0
}