main.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package main
  2. import (
  3. "database/sql"
  4. "encoding/json"
  5. "fmt"
  6. "io/ioutil"
  7. "log"
  8. "net/http"
  9. "os"
  10. "time"
  11. "github.com/gorilla/handlers"
  12. "github.com/gorilla/mux"
  13. _ "github.com/lib/pq"
  14. )
  15. func connect() (*sql.DB, error) {
  16. bin, err := ioutil.ReadFile("/run/secrets/db-password")
  17. if err != nil {
  18. return nil, err
  19. }
  20. return sql.Open("postgres", fmt.Sprintf("postgres://postgres:%s@db:5432/example?sslmode=disable", string(bin)))
  21. }
  22. func blogHandler(w http.ResponseWriter, r *http.Request) {
  23. db, err := connect()
  24. if err != nil {
  25. w.WriteHeader(500)
  26. return
  27. }
  28. defer db.Close()
  29. rows, err := db.Query("SELECT title FROM blog")
  30. if err != nil {
  31. w.WriteHeader(500)
  32. return
  33. }
  34. var titles []string
  35. for rows.Next() {
  36. var title string
  37. err = rows.Scan(&title)
  38. titles = append(titles, title)
  39. }
  40. json.NewEncoder(w).Encode(titles)
  41. }
  42. func main() {
  43. log.Print("Prepare db...")
  44. if err := prepare(); err != nil {
  45. log.Fatal(err)
  46. }
  47. log.Print("Listening 8000")
  48. r := mux.NewRouter()
  49. r.HandleFunc("/", blogHandler)
  50. log.Fatal(http.ListenAndServe(":8000", handlers.LoggingHandler(os.Stdout, r)))
  51. }
  52. func prepare() error {
  53. db, err := connect()
  54. if err != nil {
  55. return err
  56. }
  57. defer db.Close()
  58. for i := 0; i < 60; i++ {
  59. if err := db.Ping(); err == nil {
  60. break
  61. }
  62. time.Sleep(time.Second)
  63. }
  64. if _, err := db.Exec("DROP TABLE IF EXISTS blog"); err != nil {
  65. return err
  66. }
  67. if _, err := db.Exec("CREATE TABLE IF NOT EXISTS blog (id SERIAL, title VARCHAR)"); err != nil {
  68. return err
  69. }
  70. for i := 0; i < 5; i++ {
  71. if _, err := db.Exec("INSERT INTO blog (title) VALUES ($1);", fmt.Sprintf("Blog post #%d", i)); err != nil {
  72. return err
  73. }
  74. }
  75. return nil
  76. }