2014-04-25 03:20:23 +04:00
package gorm
2013-11-14 14:59:11 +04:00
import (
"fmt"
2014-03-16 05:28:43 +04:00
"reflect"
2014-12-08 14:03:42 +03:00
"strings"
2015-02-17 17:55:14 +03:00
"time"
2013-11-14 14:59:11 +04:00
)
type mysql struct { }
2013-11-16 16:47:25 +04:00
func ( s * mysql ) BinVar ( i int ) string {
2013-11-21 10:33:06 +04:00
return "$$" // ?
2013-11-14 14:59:11 +04:00
}
func ( s * mysql ) SupportLastInsertId ( ) bool {
return true
}
2014-09-16 00:03:14 +04:00
func ( s * mysql ) HasTop ( ) bool {
2014-09-16 19:32:35 +04:00
return false
2014-09-16 00:03:14 +04:00
}
2015-02-17 03:34:01 +03:00
func ( s * mysql ) SqlTag ( value reflect . Value , size int ) string {
2014-03-16 05:28:43 +04:00
switch value . Kind ( ) {
case reflect . Bool :
2013-11-14 14:59:11 +04:00
return "boolean"
2014-03-16 05:28:43 +04:00
case reflect . Int , reflect . Int8 , reflect . Int16 , reflect . Int32 , reflect . Uint , reflect . Uint8 , reflect . Uint16 , reflect . Uint32 , reflect . Uintptr :
2013-11-14 14:59:11 +04:00
return "int"
2014-03-16 05:28:43 +04:00
case reflect . Int64 , reflect . Uint64 :
2013-11-14 14:59:11 +04:00
return "bigint"
2014-03-16 05:28:43 +04:00
case reflect . Float32 , reflect . Float64 :
2013-11-14 14:59:11 +04:00
return "double"
2014-03-16 05:28:43 +04:00
case reflect . String :
2013-11-14 14:59:11 +04:00
if size > 0 && size < 65532 {
return fmt . Sprintf ( "varchar(%d)" , size )
}
2015-02-17 03:34:01 +03:00
return "longtext"
2014-03-16 05:28:43 +04:00
case reflect . Struct :
2015-02-17 17:55:14 +03:00
if _ , ok := value . Interface ( ) . ( time . Time ) ; ok {
2015-01-20 07:15:24 +03:00
return "timestamp NULL"
2014-03-16 05:28:43 +04:00
}
2013-11-14 14:59:11 +04:00
default :
2014-03-16 05:28:43 +04:00
if _ , ok := value . Interface ( ) . ( [ ] byte ) ; ok {
if size > 0 && size < 65532 {
return fmt . Sprintf ( "varbinary(%d)" , size )
}
2015-02-17 03:34:01 +03:00
return "longblob"
2014-03-16 05:28:43 +04:00
}
2013-11-14 14:59:11 +04:00
}
2014-03-16 05:28:43 +04:00
panic ( fmt . Sprintf ( "invalid sql type %s (%s) for mysql" , value . Type ( ) . Name ( ) , value . Kind ( ) . String ( ) ) )
2013-11-14 14:59:11 +04:00
}
2014-03-16 05:28:43 +04:00
func ( s * mysql ) PrimaryKeyTag ( value reflect . Value , size int ) string {
2015-02-17 03:34:01 +03:00
suffix := " NOT NULL AUTO_INCREMENT PRIMARY KEY"
2014-03-16 05:28:43 +04:00
switch value . Kind ( ) {
case reflect . Int , reflect . Int8 , reflect . Int16 , reflect . Int32 , reflect . Uint , reflect . Uint8 , reflect . Uint16 , reflect . Uint32 , reflect . Uintptr :
2015-02-17 03:34:01 +03:00
return "int" + suffix
2014-03-16 05:28:43 +04:00
case reflect . Int64 , reflect . Uint64 :
2015-02-17 03:34:01 +03:00
return "bigint" + suffix
2013-11-14 14:59:11 +04:00
default :
panic ( "Invalid primary key type" )
}
}
2014-12-08 14:03:42 +03:00
func ( s * mysql ) ReturningStr ( tableName , key string ) string {
2014-04-25 03:20:23 +04:00
return ""
2013-11-14 14:59:11 +04:00
}
2013-11-30 10:52:01 +04:00
2014-07-30 10:18:15 +04:00
func ( s * mysql ) SelectFromDummyTable ( ) string {
return "FROM DUAL"
}
2014-04-25 03:20:23 +04:00
func ( s * mysql ) Quote ( key string ) string {
2013-11-30 10:52:01 +04:00
return fmt . Sprintf ( "`%s`" , key )
}
2014-04-25 03:20:23 +04:00
2014-04-25 05:26:02 +04:00
func ( s * mysql ) databaseName ( scope * Scope ) string {
from := strings . Index ( scope . db . parent . source , "/" ) + 1
to := strings . Index ( scope . db . parent . source , "?" )
if to == - 1 {
to = len ( scope . db . parent . source )
}
return scope . db . parent . source [ from : to ]
}
2014-04-25 05:08:48 +04:00
func ( s * mysql ) HasTable ( scope * Scope , tableName string ) bool {
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_schema = ?" , tableName , s . databaseName ( scope ) ) . Row ( ) . Scan ( & count )
2014-04-25 05:08:48 +04:00
return count > 0
2014-04-25 03:20:23 +04:00
}
2014-04-25 05:08:48 +04:00
func ( s * mysql ) HasColumn ( scope * Scope , tableName string , columnName string ) bool {
var count int
2015-02-28 12:01:27 +03:00
scope . NewDB ( ) . Raw ( "SELECT count(*) FROM information_schema.columns WHERE table_schema = ? AND table_name = ? AND column_name = ?" , s . databaseName ( scope ) , tableName , columnName ) . Row ( ) . Scan ( & count )
2014-04-25 05:08:48 +04:00
return count > 0
2014-04-25 03:20:23 +04:00
}
2014-07-29 08:02:03 +04:00
2015-03-02 18:02:40 +03:00
func ( s * mysql ) HasIndex ( scope * Scope , tableName string , indexName string ) bool {
var count int
scope . NewDB ( ) . Raw ( "SELECT count(*) FROM INFORMATION_SCHEMA.STATISTICS where table_name = ? AND index_name = ?" , tableName , indexName ) . Row ( ) . Scan ( & count )
return count > 0
}
2014-07-29 08:02:03 +04:00
func ( s * mysql ) RemoveIndex ( scope * Scope , indexName string ) {
2015-02-28 12:01:27 +03:00
scope . NewDB ( ) . Exec ( fmt . Sprintf ( "DROP INDEX %v ON %v" , indexName , scope . QuotedTableName ( ) ) )
2014-07-29 08:02:03 +04:00
}