| 1006 | } |
| 1007 | |
| 1008 | func postgresBuildDSN(config database.Config) string { |
| 1009 | dsn := &url.URL{ |
| 1010 | Scheme: "postgres", |
| 1011 | User: url.UserPassword(config.User, config.Password), |
| 1012 | Path: "/" + config.DbName, |
| 1013 | } |
| 1014 | |
| 1015 | options := url.Values{} |
| 1016 | |
| 1017 | if config.Socket == "" { |
| 1018 | dsn.Host = fmt.Sprintf("%s:%d", config.Host, config.Port) |
| 1019 | } else { |
| 1020 | // Socket connection uses the host query parameter |
| 1021 | options.Set("host", config.Socket) |
| 1022 | } |
| 1023 | |
| 1024 | // Use config.SslMode if set, otherwise check environment variable |
| 1025 | if config.SslMode != "" { |
| 1026 | options.Set("sslmode", config.SslMode) |
| 1027 | } else if sslmode, ok := os.LookupEnv("PGSSLMODE"); ok { |
| 1028 | options.Set("sslmode", sslmode) |
| 1029 | } |
| 1030 | |
| 1031 | // TODO: Add SslRootCert, SslCert, SslKey fields to database.Config for consistency with SslMode, |
| 1032 | // or allow passing a raw DSN string to avoid field-by-field mapping entirely. |
| 1033 | if sslrootcert, ok := os.LookupEnv("PGSSLROOTCERT"); ok { |
| 1034 | options.Set("sslrootcert", sslrootcert) |
| 1035 | } |
| 1036 | if sslcert, ok := os.LookupEnv("PGSSLCERT"); ok { |
| 1037 | options.Set("sslcert", sslcert) |
| 1038 | } |
| 1039 | if sslkey, ok := os.LookupEnv("PGSSLKEY"); ok { |
| 1040 | options.Set("sslkey", sslkey) |
| 1041 | } |
| 1042 | |
| 1043 | dsn.RawQuery = options.Encode() |
| 1044 | return dsn.String() |
| 1045 | } |
| 1046 | |
| 1047 | func forceQuoteIdentifier(name string) string { |
| 1048 | return fmt.Sprintf("\"%s\"", name) |