database.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package database
  2. import (
  3. "fmt"
  4. "time"
  5. "git.linuxforward.com/byom/byom-onboard/internal/common/models"
  6. "gorm.io/driver/sqlite"
  7. "gorm.io/gorm"
  8. "gorm.io/gorm/logger"
  9. )
  10. type Database struct {
  11. db *gorm.DB
  12. config *Config
  13. }
  14. type Config struct {
  15. MaxOpenConns int
  16. MaxIdleConns int
  17. ConnMaxLifetime time.Duration
  18. ConnMaxIdleTime time.Duration
  19. }
  20. var DefaultConfig = &Config{
  21. MaxOpenConns: 10,
  22. MaxIdleConns: 2,
  23. ConnMaxLifetime: 30 * time.Second,
  24. ConnMaxIdleTime: 30 * time.Second,
  25. }
  26. func NewDatabase(dsn string) (*Database, error) {
  27. gormConfig := &gorm.Config{
  28. Logger: logger.Default.LogMode(logger.Info),
  29. NowFunc: func() time.Time {
  30. return time.Now().UTC()
  31. },
  32. }
  33. db, err := gorm.Open(sqlite.Open(dsn), gormConfig)
  34. if err != nil {
  35. return nil, fmt.Errorf("failed to connect to database: %w", err)
  36. }
  37. sqlDB, err := db.DB()
  38. if err != nil {
  39. return nil, fmt.Errorf("failed to get database instance: %w", err)
  40. }
  41. // define
  42. // Configure connection pool
  43. sqlDB.SetMaxOpenConns(DefaultConfig.MaxOpenConns)
  44. sqlDB.SetMaxIdleConns(DefaultConfig.MaxIdleConns)
  45. sqlDB.SetConnMaxLifetime(DefaultConfig.ConnMaxLifetime)
  46. sqlDB.SetConnMaxIdleTime(DefaultConfig.ConnMaxIdleTime)
  47. // Migrate the schema
  48. err = db.AutoMigrate(&models.User{})
  49. if err != nil {
  50. return nil, fmt.Errorf("failed to migrate schema: %w", err)
  51. }
  52. return &Database{db: db, config: DefaultConfig}, nil
  53. }