Open opens a Postgres driver.
(_ context.Context, _ storepb.Engine, config db.ConnectionConfig)
| 68 | |
| 69 | // Open opens a Postgres driver. |
| 70 | func (d *Driver) Open(_ context.Context, _ storepb.Engine, config db.ConnectionConfig) (db.Driver, error) { |
| 71 | if config.DataSource.Username == "" { |
| 72 | return nil, errors.Errorf("user must be set") |
| 73 | } |
| 74 | |
| 75 | if (config.DataSource.GetSslCert() == "" && config.DataSource.GetSslKey() != "") || |
| 76 | (config.DataSource.GetSslCert() != "" && config.DataSource.GetSslKey() == "") { |
| 77 | return nil, errors.Errorf("ssl-cert and ssl-key must be both set or unset") |
| 78 | } |
| 79 | |
| 80 | pgxConnConfig, err := pgx.ParseConfig(fmt.Sprintf("host=%s port=%s", config.DataSource.Host, config.DataSource.Port)) |
| 81 | if err != nil { |
| 82 | return nil, err |
| 83 | } |
| 84 | pgxConnConfig.User = config.DataSource.Username |
| 85 | pgxConnConfig.Password = config.Password |
| 86 | if config.ConnectionContext.DatabaseName != "" { |
| 87 | pgxConnConfig.Database = config.ConnectionContext.DatabaseName |
| 88 | } else if config.DataSource.GetDatabase() != "" { |
| 89 | pgxConnConfig.Database = config.DataSource.GetDatabase() |
| 90 | } else { |
| 91 | pgxConnConfig.Database = "dev" |
| 92 | } |
| 93 | |
| 94 | if config.DataSource.GetSslCert() != "" { |
| 95 | tlscfg, err := util.GetTLSConfig(config.DataSource) |
| 96 | if err != nil { |
| 97 | return nil, err |
| 98 | } |
| 99 | pgxConnConfig.TLSConfig = tlscfg |
| 100 | } |
| 101 | if config.DataSource.GetSshHost() != "" { |
| 102 | sshClient, err := util.GetSSHClient(config.DataSource) |
| 103 | if err != nil { |
| 104 | return nil, err |
| 105 | } |
| 106 | d.sshClient = sshClient |
| 107 | |
| 108 | pgxConnConfig.DialFunc = func(_ context.Context, network, addr string) (net.Conn, error) { |
| 109 | conn, err := sshClient.Dial(network, addr) |
| 110 | if err != nil { |
| 111 | return nil, err |
| 112 | } |
| 113 | return &util.NoDeadlineConn{Conn: conn}, nil |
| 114 | } |
| 115 | } |
| 116 | d.databaseName = config.ConnectionContext.DatabaseName |
| 117 | d.datashare = config.ConnectionContext.DataShare |
| 118 | d.config = config |
| 119 | |
| 120 | // Datashare doesn't support read-only transactions. |
| 121 | if config.ConnectionContext.ReadOnly && !d.datashare { |
| 122 | pgxConnConfig.RuntimeParams["default_transaction_read_only"] = "true" |
| 123 | } |
| 124 | |
| 125 | d.connectionString = stdlib.RegisterConnConfig(pgxConnConfig) |
| 126 | db, err := sql.Open(driverName, d.connectionString) |
| 127 | if err != nil { |
nothing calls this directly
no test coverage detected