Skip to content

Commit fb00464

Browse files
committed
fix error reading TTC code 28
1 parent 1a639b6 commit fb00464

File tree

1 file changed

+72
-40
lines changed

1 file changed

+72
-40
lines changed

v2/connection.go

Lines changed: 72 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -454,52 +454,14 @@ func (conn *Connection) OpenWithContext(ctx context.Context) error {
454454
}
455455
}
456456

457-
tracer.Print("TCP Negotiation")
458-
conn.tcpNego, err = newTCPNego(conn.session)
459-
if err != nil {
460-
return err
461-
}
462-
tracer.Print("Server Charset: ", conn.tcpNego.ServerCharset)
463-
tracer.Print("Server National Charset: ", conn.tcpNego.ServernCharset)
464-
// create string converter object
465-
conn.sStrConv = converters.NewStringConverter(conn.tcpNego.ServerCharset)
466-
if conn.sStrConv == nil {
467-
return fmt.Errorf("the server use charset with id: %d which is not supported by the driver", conn.tcpNego.ServerCharset)
468-
}
469-
conn.session.StrConv = conn.sStrConv
470-
conn.nStrConv = converters.NewStringConverter(conn.tcpNego.ServernCharset)
471-
if conn.nStrConv == nil {
472-
return fmt.Errorf("the server use ncharset with id: %d which is not supported by the driver", conn.tcpNego.ServernCharset)
473-
}
474-
conn.tcpNego.ServerFlags |= 2
475-
tracer.Print("Data Type Negotiation")
476-
conn.dataNego = buildTypeNego(conn.tcpNego, conn.session)
477-
err = conn.dataNego.write(conn.session)
457+
err = conn.protocolNegotiation()
478458
if err != nil {
479459
return err
480460
}
481-
err = conn.dataNego.read(conn.session)
461+
err = conn.dataTypeNegotiation()
482462
if err != nil {
483463
return err
484464
}
485-
conn.session.TTCVersion = conn.dataNego.CompileTimeCaps[7]
486-
conn.session.UseBigScn = conn.tcpNego.ServerCompileTimeCaps[7] >= 8
487-
if conn.tcpNego.ServerCompileTimeCaps[7] < conn.session.TTCVersion {
488-
conn.session.TTCVersion = conn.tcpNego.ServerCompileTimeCaps[7]
489-
}
490-
tracer.Print("TTC Version: ", conn.session.TTCVersion)
491-
if len(conn.tcpNego.ServerRuntimeCaps) > 6 && conn.tcpNego.ServerRuntimeCaps[6]&4 == 4 {
492-
conn.maxLen.varchar = 0x7FFF
493-
conn.maxLen.nvarchar = 0x7FFF
494-
conn.maxLen.raw = 0x7FFF
495-
} else {
496-
conn.maxLen.varchar = 0xFA0
497-
conn.maxLen.nvarchar = 0xFA0
498-
conn.maxLen.raw = 0xFA0
499-
}
500-
//this.m_b32kTypeSupported = this.m_dtyNeg.m_b32kTypeSupported;
501-
//this.m_bSupportSessionStateOps = this.m_dtyNeg.m_bSupportSessionStateOps;
502-
//this.m_marshallingEngine.m_bServerUsingBigSCN = this.m_serverCompileTimeCapabilities[7] >= (byte) 8;
503465
//if len(conn.connOption.UserID) > 0 && len(conn.conStr.password) > 0 {
504466
//
505467
//} else {
@@ -703,6 +665,19 @@ func (conn *Connection) doAuth() error {
703665
return err
704666
}
705667
}
668+
//case 27:
669+
// this.ProcessImplicitResultSet(ref implicitRSList);
670+
// continue;
671+
case 28:
672+
err = conn.protocolNegotiation()
673+
if err != nil {
674+
return err
675+
}
676+
err = conn.dataTypeNegotiation()
677+
if err != nil {
678+
679+
return err
680+
}
706681
default:
707682
return errors.New(fmt.Sprintf("message code error: received code %d", msg))
708683
}
@@ -713,6 +688,63 @@ func (conn *Connection) doAuth() error {
713688
return nil
714689
}
715690

691+
func (conn *Connection) dataTypeNegotiation() error {
692+
tracer := conn.connOption.Tracer
693+
var err error
694+
tracer.Print("Data Type Negotiation")
695+
conn.dataNego = buildTypeNego(conn.tcpNego, conn.session)
696+
err = conn.dataNego.write(conn.session)
697+
if err != nil {
698+
return err
699+
}
700+
err = conn.dataNego.read(conn.session)
701+
if err != nil {
702+
return err
703+
}
704+
conn.session.TTCVersion = conn.dataNego.CompileTimeCaps[7]
705+
conn.session.UseBigScn = conn.tcpNego.ServerCompileTimeCaps[7] >= 8
706+
if conn.tcpNego.ServerCompileTimeCaps[7] < conn.session.TTCVersion {
707+
conn.session.TTCVersion = conn.tcpNego.ServerCompileTimeCaps[7]
708+
}
709+
tracer.Print("TTC Version: ", conn.session.TTCVersion)
710+
if len(conn.tcpNego.ServerRuntimeCaps) > 6 && conn.tcpNego.ServerRuntimeCaps[6]&4 == 4 {
711+
conn.maxLen.varchar = 0x7FFF
712+
conn.maxLen.nvarchar = 0x7FFF
713+
conn.maxLen.raw = 0x7FFF
714+
} else {
715+
conn.maxLen.varchar = 0xFA0
716+
conn.maxLen.nvarchar = 0xFA0
717+
conn.maxLen.raw = 0xFA0
718+
}
719+
return nil
720+
//this.m_b32kTypeSupported = this.m_dtyNeg.m_b32kTypeSupported;
721+
//this.m_bSupportSessionStateOps = this.m_dtyNeg.m_bSupportSessionStateOps;
722+
//this.m_marshallingEngine.m_bServerUsingBigSCN = this.m_serverCompileTimeCapabilities[7] >= (byte) 8;
723+
}
724+
func (conn *Connection) protocolNegotiation() error {
725+
tracer := conn.connOption.Tracer
726+
var err error
727+
tracer.Print("TCP Negotiation")
728+
conn.tcpNego, err = newTCPNego(conn.session)
729+
if err != nil {
730+
return err
731+
}
732+
tracer.Print("Server Charset: ", conn.tcpNego.ServerCharset)
733+
tracer.Print("Server National Charset: ", conn.tcpNego.ServernCharset)
734+
// create string converter object
735+
conn.sStrConv = converters.NewStringConverter(conn.tcpNego.ServerCharset)
736+
if conn.sStrConv == nil {
737+
return fmt.Errorf("the server use charset with id: %d which is not supported by the driver", conn.tcpNego.ServerCharset)
738+
}
739+
conn.session.StrConv = conn.sStrConv
740+
conn.nStrConv = converters.NewStringConverter(conn.tcpNego.ServernCharset)
741+
if conn.nStrConv == nil {
742+
return fmt.Errorf("the server use ncharset with id: %d which is not supported by the driver", conn.tcpNego.ServernCharset)
743+
}
744+
conn.tcpNego.ServerFlags |= 2
745+
return nil
746+
}
747+
716748
// loadNLSData get nls data for v2
717749
func (conn *Connection) loadNLSData() error {
718750
_, err := conn.session.GetInt(2, true, true)

0 commit comments

Comments
 (0)