2
0

gorm.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package adapter
  2. import (
  3. "fmt"
  4. "log"
  5. "os"
  6. "time"
  7. "gorm.io/gorm/logger"
  8. "github.com/glebarez/sqlite"
  9. "github.com/porter-dev/porter/api/server/shared/config/env"
  10. "gorm.io/driver/postgres"
  11. "gorm.io/gorm"
  12. )
  13. // New returns a new gorm database instance
  14. func New(conf *env.DBConf) (*gorm.DB, error) {
  15. logger := logger.New(
  16. log.New(os.Stdout, "\r\n", log.LstdFlags),
  17. logger.Config{
  18. SlowThreshold: time.Second,
  19. LogLevel: logger.Silent,
  20. Colorful: false,
  21. },
  22. )
  23. if conf.SQLLite {
  24. // we add DisableForeignKeyConstraintWhenMigrating since our sqlite does
  25. // not support foreign key constraints
  26. return gorm.Open(sqlite.Open(conf.SQLLitePath), &gorm.Config{
  27. DisableForeignKeyConstraintWhenMigrating: true,
  28. FullSaveAssociations: true,
  29. Logger: logger,
  30. })
  31. }
  32. // connect to default postgres instance first
  33. baseDSN := fmt.Sprintf(
  34. "user=%s password=%s port=%d host=%s",
  35. conf.Username,
  36. conf.Password,
  37. conf.Port,
  38. conf.Host,
  39. )
  40. if conf.ForceSSL {
  41. baseDSN = baseDSN + " sslmode=require"
  42. } else {
  43. baseDSN = baseDSN + " sslmode=disable"
  44. }
  45. postgresDSN := baseDSN + " database=postgres"
  46. targetDSN := baseDSN + " database=" + conf.DbName
  47. defaultDB, err := gorm.Open(postgres.Open(postgresDSN), &gorm.Config{
  48. FullSaveAssociations: true,
  49. Logger: logger,
  50. })
  51. // attempt to create the database
  52. if conf.DbName != "" {
  53. defaultDB.Exec(fmt.Sprintf("CREATE DATABASE %s;", conf.DbName))
  54. }
  55. // open the database connection
  56. res, err := gorm.Open(postgres.Open(targetDSN), &gorm.Config{
  57. FullSaveAssociations: true,
  58. Logger: logger,
  59. })
  60. // retry the connection 3 times
  61. retryCount := 0
  62. timeout, _ := time.ParseDuration("5s")
  63. if err != nil {
  64. for {
  65. time.Sleep(timeout)
  66. res, err = gorm.Open(postgres.Open(targetDSN), &gorm.Config{
  67. FullSaveAssociations: true,
  68. Logger: logger,
  69. })
  70. if retryCount > 3 {
  71. return nil, err
  72. }
  73. if err == nil {
  74. return res, nil
  75. }
  76. retryCount++
  77. }
  78. }
  79. return res, err
  80. }