mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
database/sql: add Conn.Raw to expose the driver Conn safely
Exposing the underlying driver conn will allow the use of the standard connection pool while still able to run special function directly on the driver. Fixes #29835 Change-Id: Ib6d3b9535e730f008916805ae3bf76e4494c88f9 Reviewed-on: https://go-review.googlesource.com/c/go/+/174182 Run-TryBot: Daniel Theophanes <kardianos@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
parent
25a2b98f7a
commit
dc63b59630
2 changed files with 83 additions and 0 deletions
|
|
@ -1339,6 +1339,54 @@ func TestConnQuery(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestConnRaw(t *testing.T) {
|
||||
db := newTestDB(t, "people")
|
||||
defer closeDB(t, db)
|
||||
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
conn, err := db.Conn(ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
conn.dc.ci.(*fakeConn).skipDirtySession = true
|
||||
defer conn.Close()
|
||||
|
||||
sawFunc := false
|
||||
err = conn.Raw(func(dc interface{}) error {
|
||||
sawFunc = true
|
||||
if _, ok := dc.(*fakeConn); !ok {
|
||||
return fmt.Errorf("got %T want *fakeConn", dc)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if !sawFunc {
|
||||
t.Fatal("Raw func not called")
|
||||
}
|
||||
|
||||
func() {
|
||||
defer func() {
|
||||
x := recover()
|
||||
if x == nil {
|
||||
t.Fatal("expected panic")
|
||||
}
|
||||
conn.closemu.Lock()
|
||||
closed := conn.dc == nil
|
||||
conn.closemu.Unlock()
|
||||
if !closed {
|
||||
t.Fatal("expected connection to be closed after panic")
|
||||
}
|
||||
}()
|
||||
err = conn.Raw(func(dc interface{}) error {
|
||||
panic("Conn.Raw panic should return an error")
|
||||
})
|
||||
t.Fatal("expected panic from Raw func")
|
||||
}()
|
||||
}
|
||||
|
||||
func TestCursorFake(t *testing.T) {
|
||||
db := newTestDB(t, "people")
|
||||
defer closeDB(t, db)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue