config.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package rest
  2. import (
  3. "fmt"
  4. "net/url"
  5. "strings"
  6. )
  7. const (
  8. DriverSqlite3 = "sqlite3"
  9. DriverMysql = "mysql"
  10. DriverPostgres = "postgres"
  11. )
  12. type Config struct {
  13. Driver string `json:"driver"`
  14. Filename string `json:"filename"`
  15. Host string `json:"host"`
  16. Port int `json:"port"`
  17. Username string `json:"username"`
  18. Password string `json:"password"`
  19. Database string `json:"database"`
  20. Params map[string]string `json:"params"`
  21. }
  22. func (cfg *Config) ParseDSN() string {
  23. if cfg.Driver == DriverSqlite3 {
  24. return cfg.Filename
  25. } else if cfg.Driver == DriverMysql {
  26. ps := map[string]string{
  27. "collation": "utf8mb4_general_ci",
  28. "parseTime": "True",
  29. "loc": "Local",
  30. "allowNativePasswords": "true",
  31. }
  32. if cfg.Params != nil {
  33. for k, v := range cfg.Params {
  34. ps[k] = v
  35. }
  36. }
  37. u := url.Values{}
  38. for k, v := range ps {
  39. u.Set(k, v)
  40. }
  41. return fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?",
  42. cfg.Username,
  43. cfg.Password,
  44. cfg.Host,
  45. cfg.Port,
  46. cfg.Database) + u.Encode()
  47. } else if cfg.Driver == DriverPostgres {
  48. var s string
  49. if cfg.Params != nil {
  50. for k, v := range cfg.Params {
  51. s += k + "=" + v + " "
  52. }
  53. }
  54. s = strings.TrimRight(s, " ")
  55. return fmt.Sprintf("host=%s port=%d user=%s dbname=%s password=%s",
  56. cfg.Host,
  57. cfg.Port,
  58. cfg.Username,
  59. cfg.Database,
  60. cfg.Password) + s
  61. }
  62. return ""
  63. }