Skip to content

Commit e30d803

Browse files
authored
Merge pull request #456 from DrHayt/master
Augment bad connection management
2 parents 39b83f9 + bb94203 commit e30d803

File tree

6 files changed

+45
-10
lines changed

6 files changed

+45
-10
lines changed

v2/command.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@ import (
88
"encoding/binary"
99
"errors"
1010
"fmt"
11-
"github.com/sijms/go-ora/v2/network"
1211
"reflect"
1312
"regexp"
1413
"strings"
1514
"time"
15+
16+
"github.com/sijms/go-ora/v2/network"
1617
)
1718

1819
type StmtType int
@@ -568,6 +569,7 @@ func (stmt *defaultStmt) fetch(dataSet *DataSet) error {
568569
var err = stmt._fetch(dataSet)
569570
if err != nil {
570571
if isBadConn(err) {
572+
stmt.connection.setBad()
571573
tracer.Print("Error: ", err)
572574
return driver.ErrBadConn
573575
}
@@ -2213,6 +2215,7 @@ func (stmt *Stmt) Exec(args []driver.Value) (driver.Result, error) {
22132215
}
22142216
if err != nil {
22152217
if isBadConn(err) {
2218+
stmt.connection.setBad()
22162219
tracer.Print("Error: ", err)
22172220
return nil, driver.ErrBadConn
22182221
}
@@ -2326,6 +2329,7 @@ func (stmt *Stmt) Query_(namedArgs []driver.NamedValue) (*DataSet, error) {
23262329
dataSet, err := stmt._query()
23272330
if err != nil {
23282331
if isBadConn(err) {
2332+
stmt.connection.setBad()
23292333
tracer.Print("Error: ", err)
23302334
return nil, driver.ErrBadConn
23312335
}

v2/connection.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,17 @@ import (
77
"encoding/binary"
88
"errors"
99
"fmt"
10-
"github.com/sijms/go-ora/v2/advanced_nego"
11-
"github.com/sijms/go-ora/v2/converters"
12-
"github.com/sijms/go-ora/v2/network"
1310
"reflect"
1411
"regexp"
1512
"strconv"
1613
"strings"
1714
"sync"
15+
"sync/atomic"
1816
"time"
17+
18+
"github.com/sijms/go-ora/v2/advanced_nego"
19+
"github.com/sijms/go-ora/v2/converters"
20+
"github.com/sijms/go-ora/v2/network"
1921
)
2022

2123
type ConnectionState int
@@ -102,7 +104,7 @@ type Connection struct {
102104
date int
103105
timestamp int
104106
}
105-
bad bool
107+
bad atomic.Bool
106108
dbTimeLoc *time.Location
107109
}
108110

@@ -1289,11 +1291,12 @@ func (conn *Connection) readResponse(msgCode uint8) error {
12891291
}
12901292

12911293
func (conn *Connection) setBad() {
1292-
conn.bad = true
1294+
conn.bad.Swap(true)
1295+
//conn.bad = true
12931296
}
12941297

12951298
func (conn *Connection) ResetSession(ctx context.Context) error {
1296-
if conn.bad {
1299+
if conn.bad.Load() {
12971300
return driver.ErrBadConn
12981301
}
12991302
return nil

v2/network/oracle_error.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,12 @@ func (err *OracleError) translate() {
5050
err.ErrMsg = "ORA-" + strconv.Itoa(err.ErrCode)
5151
}
5252
}
53+
54+
func (err *OracleError) Bad() bool {
55+
switch err.ErrCode {
56+
case 28, 1012, 1033, 1034, 1089, 3113, 3114, 3135, 12528, 12537:
57+
return true
58+
default:
59+
return false
60+
}
61+
}

v2/ref_cursor.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package go_ora
22

33
import (
44
"database/sql/driver"
5+
56
"github.com/sijms/go-ora/v2/network"
67
)
78

@@ -142,6 +143,7 @@ func (cursor *RefCursor) Query() (*DataSet, error) {
142143
dataSet, err := cursor._query()
143144
if err != nil {
144145
if isBadConn(err) {
146+
cursor.connection.setBad()
145147
tracer.Print("Error: ", err)
146148
return nil, driver.ErrBadConn
147149
}

v2/simple_object.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ func (obj *simpleObject) exec() error {
5757
var err = obj.write().read()
5858
if err != nil {
5959
if isBadConn(err) {
60+
obj.connection.setBad()
6061
tracer.Print("Error: ", err)
6162
return driver.ErrBadConn
6263
}

v2/utils.go

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,17 @@ import (
66
"database/sql/driver"
77
"errors"
88
"fmt"
9-
"github.com/sijms/go-ora/v2/converters"
10-
"github.com/sijms/go-ora/v2/network"
119
"io"
10+
"net"
1211
"reflect"
1312
"regexp"
1413
"strconv"
1514
"strings"
1615
"syscall"
1716
"time"
17+
18+
"github.com/sijms/go-ora/v2/converters"
19+
"github.com/sijms/go-ora/v2/network"
1820
)
1921

2022
var (
@@ -944,7 +946,21 @@ func setNumber(value reflect.Value, input float64) error {
944946
}
945947

946948
func isBadConn(err error) bool {
947-
return errors.Is(err, io.EOF) || errors.Is(err, syscall.EPIPE)
949+
var opError *net.OpError
950+
var oraError *network.OracleError
951+
switch {
952+
case errors.Is(err, io.EOF):
953+
return true
954+
case errors.Is(err, syscall.EPIPE):
955+
return true
956+
case errors.As(err, &opError):
957+
if opError.Net == "tcp" && opError.Op == "write" {
958+
return true
959+
}
960+
case errors.As(err, &oraError):
961+
return oraError.Bad()
962+
}
963+
return false
948964
}
949965

950966
func collectLocators(pars []ParameterInfo) [][]byte {

0 commit comments

Comments
 (0)