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"
2016-01-19 15:58:38 +03:00
"strconv"
2015-02-17 17:55:14 +03:00
"time"
2013-11-14 14:59:11 +04:00
)
2015-03-17 05:40:42 +03:00
type sqlite3 struct {
commonDialect
2013-11-14 14:59:11 +04:00
}
2016-01-19 15:58:38 +03:00
func ( sqlite3 ) DataTypeOf ( dataValue reflect . Value , tagSettings map [ string ] string ) string {
var size int
if num , ok := tagSettings [ "SIZE" ] ; ok {
size , _ = strconv . Atoi ( num )
}
switch dataValue . Kind ( ) {
2014-03-16 05:28:43 +04:00
case reflect . Bool :
2013-11-14 14:59:11 +04:00
return "bool"
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 :
2016-01-19 15:58:38 +03:00
if _ , ok := tagSettings [ "AUTO_INCREMENT" ] ; ok {
2015-09-20 20:58:12 +03:00
return "integer primary key autoincrement"
}
2013-11-14 14:59:11 +04:00
return "integer"
2014-03-16 05:28:43 +04:00
case reflect . Int64 , reflect . Uint64 :
2016-01-19 15:58:38 +03:00
if _ , ok := tagSettings [ "AUTO_INCREMENT" ] ; ok {
2015-09-20 20:58:12 +03:00
return "integer primary key autoincrement"
2015-03-11 12:05:58 +03:00
}
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 "real"
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 "text"
2014-03-16 05:28:43 +04:00
case reflect . Struct :
2016-01-19 15:58:38 +03:00
if _ , ok := dataValue . Interface ( ) . ( time . Time ) ; ok {
2014-03-16 05:28:43 +04:00
return "datetime"
}
2013-11-14 14:59:11 +04:00
default :
2016-01-19 15:58:38 +03:00
if _ , ok := dataValue . Interface ( ) . ( [ ] byte ) ; ok {
2014-03-16 05:28:43 +04:00
return "blob"
}
2013-11-14 14:59:11 +04:00
}
2016-01-19 15:58:38 +03:00
panic ( fmt . Sprintf ( "invalid sql type %s (%s) for sqlite3" , dataValue . Type ( ) . Name ( ) , dataValue . Kind ( ) . String ( ) ) )
2013-11-14 14:59:11 +04:00
}
2016-01-18 15:32:52 +03:00
func ( s sqlite3 ) HasIndex ( scope * Scope , tableName string , indexName string ) bool {
2014-04-25 05:08:48 +04:00
var count int
2016-01-18 15:32:52 +03:00
s . RawScanInt ( scope , & count , fmt . Sprintf ( "SELECT count(*) FROM sqlite_master WHERE tbl_name = ? AND sql LIKE '%%INDEX %v ON%%'" , indexName ) , tableName )
2014-04-25 05:08:48 +04:00
return count > 0
}
2016-01-18 15:32:52 +03:00
func ( sqlite3 ) RemoveIndex ( scope * Scope , indexName string ) {
scope . Err ( scope . NewDB ( ) . Exec ( fmt . Sprintf ( "DROP INDEX %v" , indexName ) ) . Error )
2014-04-25 05:08:48 +04:00
}
2014-07-29 08:02:03 +04:00
2016-01-18 15:32:52 +03:00
func ( s sqlite3 ) HasTable ( scope * Scope , tableName string ) bool {
2015-03-02 18:02:40 +03:00
var count int
2016-01-18 15:32:52 +03:00
s . RawScanInt ( scope , & count , "SELECT count(*) FROM sqlite_master WHERE type='table' AND name=?" , tableName )
2015-03-02 18:02:40 +03:00
return count > 0
}
2016-01-18 15:32:52 +03:00
func ( s sqlite3 ) HasColumn ( scope * Scope , tableName string , columnName string ) bool {
var count int
s . RawScanInt ( scope , & count , fmt . Sprintf ( "SELECT count(*) FROM sqlite_master WHERE tbl_name = ? AND (sql LIKE '%%(\"%v\" %%' OR sql LIKE '%%,\"%v\" %%' OR sql LIKE '%%, \"%v\" %%' OR sql LIKE '%%( %v %%' OR sql LIKE '%%, %v %%' OR sql LIKE '%%,%v %%');\n" , columnName , columnName , columnName , columnName , columnName , columnName ) , tableName )
return count > 0
2014-07-29 08:02:03 +04:00
}
2015-08-06 22:37:26 +03:00
2016-01-19 06:53:53 +03:00
func ( sqlite3 ) currentDatabase ( scope * Scope ) ( name string ) {
2015-08-06 22:37:26 +03:00
var (
ifaces = make ( [ ] interface { } , 3 )
pointers = make ( [ ] * string , 3 )
i int
)
for i = 0 ; i < 3 ; i ++ {
ifaces [ i ] = & pointers [ i ]
}
if err := scope . NewDB ( ) . Raw ( "PRAGMA database_list" ) . Row ( ) . Scan ( ifaces ... ) ; scope . Err ( err ) != nil {
return
}
if pointers [ 1 ] != nil {
2015-08-11 18:59:59 +03:00
name = * pointers [ 1 ]
2015-08-06 22:37:26 +03:00
}
2015-08-11 18:59:59 +03:00
return
2015-08-06 22:37:26 +03:00
}