/store/db.go

https://github.com/drone/autoscaler · Go · 70 lines · 50 code · 9 blank · 11 comment · 12 complexity · b96ea8876213af8227aef56389b255e5 MD5 · raw file

  1. // Copyright 2018 Drone.IO Inc
  2. // Use of this source code is governed by the Polyform License
  3. // that can be found in the LICENSE file.
  4. package store
  5. import (
  6. "context"
  7. "database/sql"
  8. "time"
  9. ddl "github.com/drone/autoscaler/store/migrate"
  10. "github.com/jmoiron/sqlx"
  11. )
  12. var noContext = context.Background()
  13. // Connect to a database and verify with a ping.
  14. func Connect(driver, datasource string) (*sqlx.DB, error) {
  15. db, err := sql.Open(driver, datasource)
  16. if err != nil {
  17. return nil, err
  18. }
  19. switch driver {
  20. case "postgres":
  21. db.SetMaxIdleConns(0)
  22. case "mysql":
  23. db.SetMaxIdleConns(0)
  24. case "sqlite3":
  25. db.SetMaxOpenConns(1)
  26. }
  27. dbx := sqlx.NewDb(db, driver)
  28. if err := pingDatabase(dbx); err != nil {
  29. return nil, err
  30. }
  31. if err := setupDatabase(dbx); err != nil {
  32. return nil, err
  33. }
  34. return dbx, nil
  35. }
  36. // Must is a helper function that wraps a call to Connect
  37. // and panics if the error is non-nil.
  38. func Must(db *sqlx.DB, err error) *sqlx.DB {
  39. if err != nil {
  40. panic(err)
  41. }
  42. return db
  43. }
  44. // helper function to ping the database with backoff to ensure
  45. // a connection can be established before we proceed with the
  46. // database setup and migration.
  47. func pingDatabase(db *sqlx.DB) (err error) {
  48. for i := 0; i < 30; i++ {
  49. err = db.Ping()
  50. if err == nil {
  51. return
  52. }
  53. time.Sleep(time.Second)
  54. }
  55. return
  56. }
  57. // helper function to setup the databsae by performing automated
  58. // database migration steps.
  59. func setupDatabase(db *sqlx.DB) error {
  60. return ddl.Migrate(db)
  61. }