Skip to content

Commit 35e8326

Browse files
authored
Merge branch 'master' into master
2 parents 487451c + 83dff98 commit 35e8326

13 files changed

+183
-355
lines changed

tcp_protocol_nego.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,10 @@ func newTCPNego(session *network.Session) (*TCPNego, error) {
9999
if err != nil {
100100
return nil, err
101101
}
102-
if result.ServerCompileTimeCaps[15]&1 != 0 {
102+
if len(result.ServerCompileTimeCaps) > 15 && result.ServerCompileTimeCaps[15]&1 != 0 {
103103
session.HasEOSCapability = true
104104
}
105-
if result.ServerCompileTimeCaps[16]&1 != 0 {
105+
if len(result.ServerCompileTimeCaps) > 16 && result.ServerCompileTimeCaps[16]&1 != 0 {
106106
session.HasFSAPCapability = true
107107
}
108108
return &result, nil

v2/command.go

+4-238
Original file line numberDiff line numberDiff line change
@@ -1276,8 +1276,8 @@ func (stmt *Stmt) ExecContext(ctx context.Context, args []driver.NamedValue) (dr
12761276
}
12771277
tracer := stmt.connection.tracer
12781278
tracer.Printf("Exec With Context:")
1279-
stmt.connection.session.StartContext(ctx)
1280-
defer stmt.connection.session.EndContext()
1279+
done := stmt.connection.session.StartContext(ctx)
1280+
defer stmt.connection.session.EndContext(done)
12811281
tracer.Printf("Exec:\n%s", stmt.text)
12821282
stmt.arrayBindCount = 0
12831283
result, err := stmt._exec(args)
@@ -1392,46 +1392,6 @@ func (stmt *Stmt) fillStructPar(parValue driver.Value) error {
13921392
if err != nil {
13931393
return err
13941394
}
1395-
1396-
//var pFieldValue reflect.Value
1397-
//if fieldValue.Kind() != reflect.Ptr && fieldValue.CanAddr() {
1398-
// pFieldValue = fieldValue.Addr()
1399-
//} else {
1400-
// pFieldValue = fieldValue
1401-
//}
1402-
//if _, ok := pFieldValue.Interface().(sql.Scanner); ok {
1403-
//err := scanner.Scan(par.Value)
1404-
//if err != nil {
1405-
// return err
1406-
//}
1407-
//continue
1408-
//}
1409-
//if valuer, ok := par.Value.(driver.Valuer); ok {
1410-
// tempVal, err := valuer.Value()
1411-
// if err != nil {
1412-
// return err
1413-
// }
1414-
// if tempVal == nil {
1415-
// fieldValue.Set(reflect.Zero(fieldType))
1416-
// } else {
1417-
// if fieldType.Kind() == reflect.Ptr {
1418-
// if fieldValue.IsNil() {
1419-
// temp := reflect.New(fieldType.Elem())
1420-
// fieldValue.Set(temp)
1421-
// }
1422-
// fieldValue = fieldValue.Elem()
1423-
// }
1424-
// if scanner, ok := fieldValue.Interface().(sql.Scanner); ok {
1425-
// err = scanner.Scan(par.Value)
1426-
// if err != nil {
1427-
// return err
1428-
// }
1429-
// continue
1430-
// }
1431-
// }
1432-
//} else {
1433-
//
1434-
//}
14351395
}
14361396
}
14371397
}
@@ -1565,181 +1525,7 @@ func (stmt *Stmt) structPar(parValue driver.Value, parIndex int) (processedPars
15651525
err = fmt.Errorf("unknown type: %s for parameter: %s", _type, name)
15661526
}
15671527
return
1568-
//if _, ok := fieldValue.(driver.Valuer); ok {
1569-
// if _, ok = structValue.Field(fieldIndex).Addr().Interface().(sql.Scanner); ok {
1570-
// tempPar, err = stmt.NewParam(name, structValue.Field(fieldIndex).Addr().Interface(), size, dir)
1571-
// return
1572-
// }
1573-
//}
1574-
//if len(_type) > 0 {
1575-
//} else {
1576-
// //fieldType := reflect.TypeOf(fieldValue)
1577-
// if tNumber(fieldType) {
1578-
// var fieldVal = &sql.NullFloat64{}
1579-
// if !hasNullValue {
1580-
// fieldVal.Float64, err = getFloat(fieldValue)
1581-
// if err != nil {
1582-
// err = typeErr
1583-
// return
1584-
// }
1585-
// fieldVal.Valid = true
1586-
// }
1587-
// tempPar, err = stmt.NewParam(name, fieldVal, size, dir)
1588-
// }
1589-
// switch fieldType.Kind() {
1590-
// case reflect.Bool:
1591-
// var fieldVal = &sql.NullFloat64{}
1592-
// if !hasNullValue {
1593-
// fieldVal.Float64, err = getFloat(fieldValue)
1594-
// if err != nil {
1595-
// err = typeErr
1596-
// return
1597-
// }
1598-
// fieldVal.Valid = true
1599-
// }
1600-
// tempPar, err = stmt.NewParam(name, fieldVal, size, dir)
1601-
// case reflect.String:
1602-
// fieldVal := &sql.NullString{}
1603-
// if !hasNullValue {
1604-
// fieldVal.String, fieldVal.Valid = getString(fieldValue), true
1605-
// }
1606-
// tempPar, err = stmt.NewParam(name, fieldVal, size, dir)
1607-
// default:
1608-
// switch aval := fieldValue.(type) {
1609-
// case NVarChar:
1610-
// fieldVal := &NullNVarChar{}
1611-
// if !hasNullValue {
1612-
// fieldVal.NVarChar, fieldVal.Valid = aval, true
1613-
// }
1614-
// tempPar, err = stmt.NewParam(name, fieldVal, size, dir)
1615-
// case []byte:
1616-
// var fieldVal []byte
1617-
// if !hasNullValue {
1618-
// fieldVal = aval
1619-
// }
1620-
// tempPar, err = stmt.NewParam(name, &fieldVal, size, dir)
1621-
// case time.Time:
1622-
// fieldVal := &sql.NullTime{}
1623-
// if !hasNullValue {
1624-
// fieldVal.Time, fieldVal.Valid = aval, true
1625-
// }
1626-
// tempPar, err = stmt.NewParam(name, fieldVal, size, dir)
1627-
// case TimeStamp:
1628-
// fieldVal := &NullTimeStamp{}
1629-
// if !hasNullValue {
1630-
// fieldVal.TimeStamp, fieldVal.Valid = aval, true
1631-
// }
1632-
// tempPar, err = stmt.NewParam(name, fieldVal, size, dir)
1633-
// case TimeStampTZ:
1634-
// fieldVal := &NullTimeStampTZ{}
1635-
// if !hasNullValue {
1636-
// fieldVal.TimeStampTZ, fieldVal.Valid = aval, true
1637-
// }
1638-
// tempPar, err = stmt.NewParam(name, fieldVal, size, dir)
1639-
// case Clob:
1640-
// tempPar, err = stmt.NewParam(name, &aval, size, dir)
1641-
// case NClob:
1642-
// tempPar, err = stmt.NewParam(name, &aval, size, dir)
1643-
// case Blob:
1644-
// tempPar, err = stmt.NewParam(name, &aval, size, dir)
1645-
// }
1646-
// }
1647-
//}
1648-
//return
16491528
}
1650-
//addInputField := func(name, _type string, fieldIndex int) (tempPar *ParameterInfo, err error) {
1651-
// var fieldValue = structValue.Field(fieldIndex).Interface()
1652-
// if fieldValue == nil {
1653-
// tempPar, err = stmt.NewParam(name, fieldValue, 0, Input)
1654-
// return
1655-
// }
1656-
// // value is pointer
1657-
// if tempType.Field(fieldIndex).Type.Kind() == reflect.Ptr {
1658-
// if structValue.Field(fieldIndex).IsNil() {
1659-
// tempPar, err = stmt.NewParam(name, nil, 0, Input)
1660-
// return
1661-
// } else {
1662-
// fieldValue = structValue.Field(fieldIndex).Elem().Interface()
1663-
// }
1664-
// }
1665-
// typeErr := fmt.Errorf("error passing field %s as type %s", tempType.Field(fieldIndex).Name, _type)
1666-
// switch _type {
1667-
// case "number":
1668-
// var fieldVal float64
1669-
// fieldVal, err = getFloat(fieldValue)
1670-
// if err != nil {
1671-
// err = typeErr
1672-
// return
1673-
// }
1674-
// tempPar, err = stmt.NewParam(name, fieldVal, 0, Input)
1675-
// case "varchar":
1676-
// fieldVal := getString(fieldValue)
1677-
// tempPar, err = stmt.NewParam(name, fieldVal, 0, Input)
1678-
// case "nvarchar":
1679-
// fieldVal := getString(fieldValue)
1680-
// tempPar, err = stmt.NewParam(name, NVarChar(fieldVal), 0, Input)
1681-
// case "date":
1682-
// var fieldVal time.Time
1683-
// fieldVal, err = getDate(fieldValue)
1684-
// if err != nil {
1685-
// err = typeErr
1686-
// return
1687-
// }
1688-
// tempPar, err = stmt.NewParam(name, fieldVal, 0, Input)
1689-
// case "timestamp":
1690-
// var fieldVal time.Time
1691-
// fieldVal, err = getDate(fieldValue)
1692-
// if err != nil {
1693-
// err = typeErr
1694-
// return
1695-
// }
1696-
// tempPar, err = stmt.NewParam(name, TimeStamp(fieldVal), 0, Input)
1697-
// case "timestamptz":
1698-
// var fieldVal time.Time
1699-
// fieldVal, err = getDate(fieldValue)
1700-
// if err != nil {
1701-
// err = typeErr
1702-
// return
1703-
// }
1704-
// tempPar, err = stmt.NewParam(name, TimeStampTZ(fieldVal), 0, Input)
1705-
// case "raw":
1706-
// var fieldVal []byte
1707-
// fieldVal, err = getBytes(fieldValue)
1708-
// if err != nil {
1709-
// err = typeErr
1710-
// return
1711-
// }
1712-
// tempPar = &ParameterInfo{
1713-
// Name: name,
1714-
// Direction: Input,
1715-
// Value: fieldVal,
1716-
// }
1717-
// case "clob":
1718-
// fieldVal := getString(fieldValue)
1719-
// tempPar = &ParameterInfo{
1720-
// Name: name,
1721-
// Direction: Input,
1722-
// Value: Clob{String: fieldVal, Valid: true},
1723-
// }
1724-
// case "nclob":
1725-
// fieldVal := getString(fieldValue)
1726-
// tempPar, err = stmt.NewParam(name, NClob{String: fieldVal, Valid: true}, 0, Input)
1727-
// case "blob":
1728-
// var fieldVal []byte
1729-
// fieldVal, err = getBytes(fieldValue)
1730-
// if err != nil {
1731-
// err = typeErr
1732-
// return
1733-
// }
1734-
// tempPar, err = stmt.NewParam(name, Blob{Data: fieldVal}, 0, Input)
1735-
// case "":
1736-
// tempPar, err = stmt.NewParam(name, structValue.Field(fieldIndex).Interface(), 0, Input)
1737-
// default:
1738-
// err = typeErr
1739-
// }
1740-
// return
1741-
//}
1742-
// deal with struct types
17431529
if parValue != nil && tempType.Kind() == reflect.Struct {
17441530
structFieldCount := tempType.NumField()
17451531

@@ -1930,19 +1716,6 @@ func (stmt *Stmt) _exec(args []driver.NamedValue) (*QueryResult, error) {
19301716
return nil, err
19311717
}
19321718
stmt.temporaryLobs = append(stmt.temporaryLobs, par.collectLocators()...)
1933-
//switch value := par.iPrimValue.(type) {
1934-
//case *Lob:
1935-
// if value != nil && value.sourceLocator != nil {
1936-
// stmt.temporaryLobs = append(stmt.temporaryLobs, value.sourceLocator)
1937-
// }
1938-
//case *BFile:
1939-
// if value != nil && value.lob.sourceLocator != nil {
1940-
// stmt.temporaryLobs = append(stmt.temporaryLobs, value.lob.sourceLocator)
1941-
// }
1942-
//case []ParameterInfo:
1943-
// temp := collectLocators(value)
1944-
// stmt.temporaryLobs = append(stmt.temporaryLobs, temp...)
1945-
//}
19461719
if maxLen < par.MaxLen {
19471720
maxLen = par.MaxLen
19481721
}
@@ -1955,13 +1728,6 @@ func (stmt *Stmt) _exec(args []driver.NamedValue) (*QueryResult, error) {
19551728
continue
19561729
}
19571730
dataType = par.DataType
1958-
//if y == 0 {
1959-
// dataType = par.DataType
1960-
//} else {
1961-
// if par.DataType != dataType && par.DataType != NCHAR {
1962-
//
1963-
// }
1964-
//}
19651731
}
19661732
// save arrayValues into primitive
19671733
par.iPrimValue = arrayValues
@@ -2250,8 +2016,8 @@ func (stmt *Stmt) QueryContext(ctx context.Context, namedArgs []driver.NamedValu
22502016
tracer := stmt.connection.tracer
22512017
tracer.Print("Query With Context:", stmt.text)
22522018

2253-
stmt.connection.session.StartContext(ctx)
2254-
defer stmt.connection.session.EndContext()
2019+
done := stmt.connection.session.StartContext(ctx)
2020+
defer stmt.connection.session.EndContext(done)
22552021
return stmt.Query_(namedArgs)
22562022
}
22572023

v2/configurations/database_info.go

+41
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,47 @@ func (info *DatabaseInfo) UpdateDatabaseInfo(connStr string) (err error) {
139139
return nil
140140
}
141141

142+
func (info *DatabaseInfo) UpdateDatabaseInfoForRedirect(redirectAddr string, reconnectData string) error {
143+
redirectAddr = strings.ReplaceAll(redirectAddr, "\r", "")
144+
redirectAddr = strings.ReplaceAll(redirectAddr, "\n", "")
145+
reconnectData = strings.ReplaceAll(reconnectData, "\r", "")
146+
reconnectData = strings.ReplaceAll(reconnectData, "\n", "")
147+
var err error
148+
info.Servers, err = ExtractServers(redirectAddr)
149+
if err != nil {
150+
return err
151+
}
152+
if len(info.Servers) == 0 {
153+
return errors.New("no address passed in connection string")
154+
}
155+
r, err := regexp.Compile(`(?i)\(\s*SERVICE_NAME\s*=\s*([\w.-]+)\s*\)`)
156+
if err != nil {
157+
return err
158+
}
159+
match := r.FindStringSubmatch(reconnectData)
160+
if len(match) > 1 {
161+
info.ServiceName = match[1]
162+
}
163+
r, err = regexp.Compile(`(?i)\(\s*SID\s*=\s*([\w.-]+)\s*\)`)
164+
if err != nil {
165+
return err
166+
}
167+
match = r.FindStringSubmatch(reconnectData)
168+
if len(match) > 1 {
169+
info.SID = match[1]
170+
}
171+
r, err = regexp.Compile(`(?i)\(\s*INSTANCE_NAME\s*=\s*([\w.-]+)\s*\)`)
172+
if err != nil {
173+
return err
174+
}
175+
match = r.FindStringSubmatch(reconnectData)
176+
if len(match) > 1 {
177+
info.InstanceName = match[1]
178+
}
179+
info.connStr = ""
180+
return nil
181+
}
182+
142183
func (info *DatabaseInfo) AddServer(server ServerAddr) {
143184
for i := 0; i < len(info.Servers); i++ {
144185
if server.IsEqual(&info.Servers[i]) {

v2/configurations/session_info.go

+6-2
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,12 @@ type SessionInfo struct {
2626
}
2727

2828
func (si *SessionInfo) RegisterDial(dialer func(ctx context.Context, network, address string) (net.Conn, error)) {
29-
temp := &customDial{DialCtx: dialer}
30-
si.Dialer = temp
29+
if dialer != nil {
30+
var temp = &customDial{DialCtx: dialer}
31+
si.Dialer = temp
32+
} else {
33+
si.Dialer = nil
34+
}
3135
}
3236

3337
type customDial struct {

0 commit comments

Comments
 (0)