/pkg/store/sql/sql.go

https://github.com/keel-hq/keel · Go · 84 lines · 66 code · 15 blank · 3 comment · 10 complexity · 8f4121d851d6f16ea569bd2cb92faacc MD5 · raw file

  1. package sql
  2. import (
  3. "context"
  4. "fmt"
  5. "time"
  6. "github.com/jinzhu/gorm"
  7. "github.com/keel-hq/keel/types"
  8. // importing sqlite driver
  9. _ "github.com/jinzhu/gorm/dialects/sqlite"
  10. log "github.com/sirupsen/logrus"
  11. )
  12. type SQLStore struct {
  13. db *gorm.DB
  14. }
  15. type Opts struct {
  16. DatabaseType string // sqlite3 / postgres
  17. URI string // path or conn string
  18. }
  19. func New(opts Opts) (*SQLStore, error) {
  20. ctx, cancel := context.WithTimeout(context.Background(), 300*time.Second)
  21. defer cancel()
  22. db, err := connect(ctx, opts)
  23. if err != nil {
  24. return nil, err
  25. }
  26. err = db.AutoMigrate(
  27. &types.Approval{},
  28. &types.AuditLog{},
  29. ).Error
  30. if err != nil {
  31. log.WithFields(log.Fields{
  32. "error": err,
  33. }).Error("database migration failed ")
  34. return nil, err
  35. }
  36. return &SQLStore{
  37. db: db,
  38. }, nil
  39. }
  40. // Close - closes database connection
  41. func (s *SQLStore) Close() error {
  42. s.db.Close()
  43. return nil
  44. }
  45. func (s *SQLStore) OK() bool {
  46. err := s.db.DB().Ping()
  47. return err == nil
  48. }
  49. func connect(ctx context.Context, opts Opts) (*gorm.DB, error) {
  50. for {
  51. select {
  52. case <-ctx.Done():
  53. return nil, fmt.Errorf("sql store startup deadline exceeded")
  54. default:
  55. db, err := gorm.Open(opts.DatabaseType, opts.URI)
  56. if err != nil {
  57. time.Sleep(1 * time.Second)
  58. log.WithFields(log.Fields{
  59. "error": err,
  60. "uri": opts.URI,
  61. }).Warn("sql store connector: can't reach DB, waiting")
  62. continue
  63. }
  64. db.DB().SetMaxOpenConns(40)
  65. // success
  66. return db, nil
  67. }
  68. }
  69. }