aboutsummaryrefslogtreecommitdiffhomepage
path: root/vendor/github.com/lib/pq/conn_go18.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/lib/pq/conn_go18.go')
-rw-r--r--vendor/github.com/lib/pq/conn_go18.go28
1 files changed, 23 insertions, 5 deletions
diff --git a/vendor/github.com/lib/pq/conn_go18.go b/vendor/github.com/lib/pq/conn_go18.go
index a5254f2..0fdd06a 100644
--- a/vendor/github.com/lib/pq/conn_go18.go
+++ b/vendor/github.com/lib/pq/conn_go18.go
@@ -1,5 +1,3 @@
-// +build go1.8
-
package pq
import (
@@ -9,6 +7,7 @@ import (
"fmt"
"io"
"io/ioutil"
+ "time"
)
// Implement the "QueryerContext" interface
@@ -76,13 +75,32 @@ func (cn *conn) BeginTx(ctx context.Context, opts driver.TxOptions) (driver.Tx,
return tx, nil
}
+func (cn *conn) Ping(ctx context.Context) error {
+ if finish := cn.watchCancel(ctx); finish != nil {
+ defer finish()
+ }
+ rows, err := cn.simpleQuery("SELECT 'lib/pq ping test';")
+ if err != nil {
+ return driver.ErrBadConn // https://golang.org/pkg/database/sql/driver/#Pinger
+ }
+ rows.Close()
+ return nil
+}
+
func (cn *conn) watchCancel(ctx context.Context) func() {
if done := ctx.Done(); done != nil {
finished := make(chan struct{})
go func() {
select {
case <-done:
- _ = cn.cancel()
+ // At this point the function level context is canceled,
+ // so it must not be used for the additional network
+ // request to cancel the query.
+ // Create a new context to pass into the dial.
+ ctxCancel, cancel := context.WithTimeout(context.Background(), time.Second*10)
+ defer cancel()
+
+ _ = cn.cancel(ctxCancel)
finished <- struct{}{}
case <-finished:
}
@@ -97,8 +115,8 @@ func (cn *conn) watchCancel(ctx context.Context) func() {
return nil
}
-func (cn *conn) cancel() error {
- c, err := dial(cn.dialer, cn.opts)
+func (cn *conn) cancel(ctx context.Context) error {
+ c, err := dial(ctx, cn.dialer, cn.opts)
if err != nil {
return err
}