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) }