Skip to content

Commit

Permalink
context: simplify cancel logic
Browse files Browse the repository at this point in the history
  • Loading branch information
tgulacsi committed May 19, 2017
1 parent c689291 commit 0df5121
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 48 deletions.
78 changes: 32 additions & 46 deletions drvStmt_go1_8.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,32 +25,27 @@ func (ds *DrvStmt) ExecContext(ctx context.Context, values []driver.NamedValue)
if err := ctx.Err(); err != nil {
return nil, err
}
var res DrvExecResult
done := make(chan error)

done := make(chan struct{}, 1)
go func() {
defer close(done)
var err error
res.rowsAffected, res.lastInsertId, err = ds.stmt.exeC(ctx, params, false)
if err != nil {
done <- errE(err)
select {
case <-done:
return
case <-ctx.Done():
if isCanceled(ctx.Err()) {
ds.stmt.RLock()
ses := ds.stmt.ses
ds.stmt.RUnlock()
ses.Break()
}
}
done <- nil
}()

var err error
select {
case err = <-done:
case <-ctx.Done():
err = ctx.Err()
if isCanceled(err) {
ds.stmt.RLock()
ses := ds.stmt.ses
ds.stmt.RUnlock()
ses.Break()
// Now wait for the interrupt to bubble through
<-done
}
}
var res DrvExecResult
res.rowsAffected, res.lastInsertId, err = ds.stmt.exeC(ctx, params, false)
done <- struct{}{}

if err != nil {
return nil, err
}
Expand All @@ -74,37 +69,28 @@ func (ds *DrvStmt) QueryContext(ctx context.Context, values []driver.NamedValue)
if err := ctx.Err(); err != nil {
return nil, err
}
var rset *Rset
done := make(chan error)
done := make(chan struct{}, 1)
go func() {
defer close(done)
var err error
rset, err = ds.stmt.qryC(ctx, params)
if err != nil {
done <- errE(err)
return
}
select {
case done <- nil:
default:
case <-done:
return
case <-ctx.Done():
if isCanceled(ctx.Err()) {
ds.stmt.RLock()
ses := ds.stmt.ses
ds.stmt.RUnlock()
ses.Break()
}
}

}()
select {
case err := <-done:
return &DrvQueryResult{rset: rset}, err
case <-ctx.Done():
err := ctx.Err()
if isCanceled(err) {
ds.stmt.RLock()
ses := ds.stmt.ses
ds.stmt.RUnlock()
ses.Break()
// Now wait for the interrupt to bubble through
<-done
}

rset, err := ds.stmt.qryC(ctx, params)
done <- struct{}{}

if err != nil {
return nil, err
}
return &DrvQueryResult{rset: rset}, nil
}

// vim: set fileencoding=utf-8 noet:
3 changes: 1 addition & 2 deletions z_db_go1_8_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ package ora_test
import (
"context"
"database/sql"
"fmt"
"strings"
"sync/atomic"
"testing"
Expand Down Expand Up @@ -48,7 +47,7 @@ func TestRapidCancelIssue192(t *testing.T) {
rows, err := db.QueryContext(ctx, "select table_name from all_tables")
w = atomic.LoadUint64(&wait)
if err != nil {
fmt.Println(w, err)
t.Log(w, err)
if err == context.DeadlineExceeded && !strings.Contains(err.Error(), "ORA-01013") {
atomic.StoreUint64(&wait, w+1)
}
Expand Down

0 comments on commit 0df5121

Please sign in to comment.