diff --git a/cmd/go-mysqlserver/main.go b/cmd/go-mysqlserver/main.go index bf663976f..23e030632 100644 --- a/cmd/go-mysqlserver/main.go +++ b/cmd/go-mysqlserver/main.go @@ -26,7 +26,8 @@ func main() { // Create a connection with user root and an empty password. // You can use your own handler to handle command here. - conn, err := server.NewConn(c, "root", "", server.EmptyHandler{}) + srv := server.NewDefaultServer() + conn, err := srv.NewConn(c, "root", "", server.EmptyHandler{}) if err != nil { log.Fatal(err) } diff --git a/driver/driver_options_test.go b/driver/driver_options_test.go index ce96b369f..77af051a0 100644 --- a/driver/driver_options_test.go +++ b/driver/driver_options_test.go @@ -275,6 +275,8 @@ func CreateMockServer(t *testing.T) *testServer { handler := &mockHandler{} + s := server.NewDefaultServer() + go func() { for { conn, err := l.Accept() @@ -283,7 +285,7 @@ func CreateMockServer(t *testing.T) *testServer { } go func() { - co, err := server.NewCustomizedConn(conn, defaultServer, inMemProvider, handler) + co, err := s.NewCustomizedConn(conn, inMemProvider, handler) if err != nil { return } diff --git a/server/conn.go b/server/conn.go index 38769b71d..ad3509aea 100644 --- a/server/conn.go +++ b/server/conn.go @@ -3,6 +3,7 @@ package server import ( "errors" "net" + "sync" "sync/atomic" "github.com/go-mysql-org/go-mysql/mysql" @@ -36,43 +37,39 @@ type Conn struct { closed atomic.Bool } -var baseConnID uint32 = 10000 +var ( + baseConnID uint32 = 10000 + defaultServer = sync.OnceValue(func() *Server { + return NewDefaultServer() + }) +) // NewConn: create connection with default server settings +// +// Deprecated: Use [Server.NewConn] instead. func NewConn(conn net.Conn, user string, password string, h Handler) (*Conn, error) { - p := NewInMemoryProvider() - p.AddUser(user, password) - - var packetConn *packet.Conn - if defaultServer.tlsConfig != nil { - packetConn = packet.NewTLSConn(conn) - } else { - packetConn = packet.NewConn(conn) - } + return defaultServer().NewConn(conn, user, password, h) +} - c := &Conn{ - Conn: packetConn, - serverConf: defaultServer, - credentialProvider: p, - h: h, - connectionID: atomic.AddUint32(&baseConnID, 1), - stmts: make(map[uint32]*Stmt), - salt: mysql.RandomBuf(20), - } - c.closed.Store(false) +// NewCustomizedConn: create connection with customized server settings +// +// Deprecated: Use [Server.NewCustomizedConn] instead. +func NewCustomizedConn(conn net.Conn, serverConf *Server, p CredentialProvider, h Handler) (*Conn, error) { + return serverConf.NewCustomizedConn(conn, p, h) +} - if err := c.handshake(); err != nil { - c.Close() - return nil, err - } +// NewConn: create connection with default server settings +func (s *Server) NewConn(conn net.Conn, user string, password string, h Handler) (*Conn, error) { + p := NewInMemoryProvider() + p.AddUser(user, password) - return c, nil + return s.NewCustomizedConn(conn, p, h) } // NewCustomizedConn: create connection with customized server settings -func NewCustomizedConn(conn net.Conn, serverConf *Server, p CredentialProvider, h Handler) (*Conn, error) { +func (s *Server) NewCustomizedConn(conn net.Conn, p CredentialProvider, h Handler) (*Conn, error) { var packetConn *packet.Conn - if serverConf.tlsConfig != nil { + if s.tlsConfig != nil { packetConn = packet.NewTLSConn(conn) } else { packetConn = packet.NewConn(conn) @@ -80,7 +77,7 @@ func NewCustomizedConn(conn net.Conn, serverConf *Server, p CredentialProvider, c := &Conn{ Conn: packetConn, - serverConf: serverConf, + serverConf: s, credentialProvider: p, h: h, connectionID: atomic.AddUint32(&baseConnID, 1), diff --git a/server/server_conf.go b/server/server_conf.go index b01b42057..de049f000 100644 --- a/server/server_conf.go +++ b/server/server_conf.go @@ -8,8 +8,6 @@ import ( "github.com/go-mysql-org/go-mysql/mysql" ) -var defaultServer = NewDefaultServer() - // Defines a basic MySQL server with configs. // // We do not aim at implementing the whole MySQL connection suite to have the best compatibilities for the clients.