You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
2.5 KiB
95 lines
2.5 KiB
package database
|
|
|
|
import (
|
|
"log"
|
|
"os"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
|
|
"gorm.io/driver/mysql"
|
|
"gorm.io/driver/postgres"
|
|
"gorm.io/driver/sqlite"
|
|
"gorm.io/driver/sqlserver"
|
|
"gorm.io/gorm"
|
|
"gorm.io/gorm/logger"
|
|
)
|
|
|
|
type Credentials struct {
|
|
Host string
|
|
Port int
|
|
Dialect string
|
|
Database string
|
|
Table string
|
|
User string
|
|
Password string
|
|
Socket string
|
|
MaxOpenConn int
|
|
MaxIdleConn int
|
|
MaxLifeTime int
|
|
Debug bool
|
|
}
|
|
|
|
func (c *Credentials) getDSN() gorm.Dialector {
|
|
switch strings.ToLower(c.Dialect) {
|
|
case "mysql":
|
|
if c.Socket != "" {
|
|
dsn := c.User +
|
|
":" + c.Password +
|
|
"@unix(" + c.Socket +
|
|
")/" + c.Database +
|
|
"?charset=utf8mb4&collation=utf8mb4_unicode_ci&readTimeout=10s&writeTimeout=30s&timeout=5s&parseTime=True&loc=UTC&time_zone=%27%2B00%3A00%27"
|
|
return mysql.Open(dsn)
|
|
}
|
|
dsn := c.User +
|
|
":" + c.Password +
|
|
"@tcp(" + c.Host +
|
|
":" + strconv.Itoa(c.Port) +
|
|
")/" + c.Database +
|
|
"?charset=utf8mb4&collation=utf8mb4_unicode_ci&readTimeout=30s&writeTimeout=30s&timeout=5s&parseTime=True&loc=UTC&time_zone=%27%2B00%3A00%27"
|
|
return mysql.Open(dsn)
|
|
case "mssql":
|
|
dsn := "sqlserver://" + c.User +
|
|
":" + c.Password + "@" +
|
|
c.Host + ":" +
|
|
strconv.Itoa(c.Port) + "?database=" + c.Database + "&connection+timeout=5;SelectMethod=Cursor;integratedSecurity=true;"
|
|
return sqlserver.Open(dsn)
|
|
case "postgres":
|
|
dsn := "host=" + c.Host +
|
|
" port=" + strconv.Itoa(c.Port) +
|
|
" user=" + c.User +
|
|
" dbname=" + c.Database +
|
|
" password=" + c.Password +
|
|
" sslmode=disable connect_timeout=5"
|
|
return postgres.Open(dsn)
|
|
case "sqlite":
|
|
return sqlite.Open("gorm.db")
|
|
// return sqlite.Open("file::memory:?cache=shared")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func Connect(c Credentials) (*gorm.DB, error) {
|
|
newLogger := logger.New(
|
|
log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
|
|
logger.Config{
|
|
SlowThreshold: time.Second, // Slow SQL threshold
|
|
LogLevel: logger.Info, // Log level
|
|
Colorful: true, // Disable color
|
|
},
|
|
)
|
|
config := gorm.Config{Logger: newLogger}
|
|
if strings.EqualFold(c.Dialect, "sqlite") {
|
|
// FIXME HACK for sqlite
|
|
config.DisableForeignKeyConstraintWhenMigrating = true
|
|
}
|
|
db, err := gorm.Open(c.getDSN(), &config)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return db, nil
|
|
// sqlDB, err := db.DB()
|
|
// sqlDB.SetMaxOpenConns(config.Configuration.DBMaxOpenConn)
|
|
// sqlDB.SetMaxIdleConns(config.Configuration.DBMaxIdleConn)
|
|
// sqlDB.SetConnMaxLifetime(time.Duration(config.Configuration.DBMaxLifeTime) * time.Second)
|
|
}
|