diff --git a/.golangci.yml b/.golangci.yml index 4a08e533b..e57b1c253 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -3,18 +3,19 @@ linters: enable: # All code is ready for: - errcheck - - staticcheck - - typecheck - - unused - - misspell - - nolintlint + - gofumpt - goimports - - nakedret - - unconvert - - whitespace - govet - gosimple - ineffassign + - misspell + - nakedret + - nolintlint + - staticcheck + - typecheck + - unconvert + - unused + - whitespace # ToDo: #- gocritic #- golint diff --git a/canal/canal.go b/canal/canal.go index 9f2c7877f..20c6194b6 100644 --- a/canal/canal.go +++ b/canal/canal.go @@ -58,8 +58,10 @@ type Canal struct { } // canal will retry fetching unknown table's meta after UnknownTableRetryPeriod -var UnknownTableRetryPeriod = time.Second * time.Duration(10) -var ErrExcludedTable = errors.New("excluded table meta") +var ( + UnknownTableRetryPeriod = time.Second * time.Duration(10) + ErrExcludedTable = errors.New("excluded table meta") +) func NewCanal(cfg *Config) (*Canal, error) { c := new(Canal) diff --git a/canal/canal_test.go b/canal/canal_test.go index 444256076..73c04d8da 100644 --- a/canal/canal_test.go +++ b/canal/canal_test.go @@ -230,6 +230,7 @@ func TestCreateTableExp(t *testing.T) { } } } + func TestAlterTableExp(t *testing.T) { cases := []string{ "ALTER TABLE /*generated by server*/ `mydb`.`mytable` ADD `field2` DATE NULL AFTER `field1`;", diff --git a/canal/handler.go b/canal/handler.go index d51560151..3ee2b44c2 100644 --- a/canal/handler.go +++ b/canal/handler.go @@ -24,15 +24,16 @@ type EventHandler interface { String() string } -type DummyEventHandler struct { -} +type DummyEventHandler struct{} func (h *DummyEventHandler) OnRotate(*replication.EventHeader, *replication.RotateEvent) error { return nil } + func (h *DummyEventHandler) OnTableChanged(*replication.EventHeader, string, string) error { return nil } + func (h *DummyEventHandler) OnDDL(*replication.EventHeader, mysql.Position, *replication.QueryEvent) error { return nil } @@ -41,9 +42,11 @@ func (h *DummyEventHandler) OnXID(*replication.EventHeader, mysql.Position) erro func (h *DummyEventHandler) OnGTID(*replication.EventHeader, mysql.BinlogGTIDEvent) error { return nil } + func (h *DummyEventHandler) OnPosSynced(*replication.EventHeader, mysql.Position, mysql.GTIDSet, bool) error { return nil } + func (h *DummyEventHandler) OnRowsQueryEvent(*replication.RowsQueryEvent) error { return nil } diff --git a/canal/rows_test.go b/canal/rows_test.go index dfbce0b39..174c46127 100644 --- a/canal/rows_test.go +++ b/canal/rows_test.go @@ -28,20 +28,24 @@ func TestRowsEvent_handleUnsigned(t *testing.T) { // column 10 is out of range and should be ignored, don't panic. UnsignedColumns: []int{1, 3, 5, 7, 9, 10}, }, - Rows: [][]interface{}{{ - int8(8), int8(8), - int16(16), int16(16), - int32(32), int32(32), - int64(64), int64(64), - int(128), int(128)}, + Rows: [][]interface{}{ + { + int8(8), int8(8), + int16(16), int16(16), + int32(32), int32(32), + int64(64), int64(64), + int(128), int(128), + }, }, }, - wantRows: [][]interface{}{{ - int8(8), uint8(8), - int16(16), uint16(16), - int32(32), uint32(32), - int64(64), uint64(64), - int(128), uint(128)}, + wantRows: [][]interface{}{ + { + int8(8), uint8(8), + int16(16), uint16(16), + int32(32), uint32(32), + int64(64), uint64(64), + int(128), uint(128), + }, }, }, } diff --git a/canal/sync.go b/canal/sync.go index 9635bc61a..6e4e538c3 100644 --- a/canal/sync.go +++ b/canal/sync.go @@ -252,6 +252,7 @@ func (c *Canal) updateTable(header *replication.EventHeader, db, table string) ( } return } + func (c *Canal) updateReplicationDelay(ev *replication.BinlogEvent) { var newDelay uint32 now := uint32(utils.Now().Unix()) diff --git a/client/common_test.go b/client/common_test.go index b36c1abf5..9fdf6addd 100644 --- a/client/common_test.go +++ b/client/common_test.go @@ -4,6 +4,8 @@ import ( "flag" ) -var testUser = flag.String("user", "root", "MySQL user") -var testPassword = flag.String("pass", "", "MySQL password") -var testDB = flag.String("db", "test", "MySQL test database") +var ( + testUser = flag.String("user", "root", "MySQL user") + testPassword = flag.String("pass", "", "MySQL password") + testDB = flag.String("db", "test", "MySQL test database") +) diff --git a/client/conn_test.go b/client/conn_test.go index b34270cd0..5cb8346eb 100644 --- a/client/conn_test.go +++ b/client/conn_test.go @@ -203,7 +203,7 @@ func (s *connTestSuite) TestSetQueryAttributes() { err := s.c.SetQueryAttributes(qa) require.NoError(s.T(), err) expected := []mysql.QueryAttribute{ - mysql.QueryAttribute{ + { Name: "qattr1", Value: "qattr1val", }, diff --git a/client/example_client_test.go b/client/example_client_test.go index 7e13063f6..e63f44f56 100644 --- a/client/example_client_test.go +++ b/client/example_client_test.go @@ -11,11 +11,10 @@ func Example() { // Connect MySQL at 127.0.0.1:3306, with user root, an empty password and database test conn, err := client.Connect("127.0.0.1:3306", "root", "", "test") // Or to use SSL/TLS connection if MySQL server supports TLS - //conn, err := client.Connect("127.0.0.1:3306", "root", "", "test", func(c *Conn) {c.UseSSL(true)}) - + // conn, err := client.Connect("127.0.0.1:3306", "root", "", "test", func(c *Conn) {c.UseSSL(true)}) // Or to set your own client-side certificates for identity verification for security - //tlsConfig := NewClientTLSConfig(caPem, certPem, keyPem, false, "your-server-name") - //conn, err := client.Connect("127.0.0.1:3306", "root", "", "test", func(c *Conn) {c.SetTLSConfig(tlsConfig)}) + // tlsConfig := NewClientTLSConfig(caPem, certPem, keyPem, false, "your-server-name") + // conn, err := client.Connect("127.0.0.1:3306", "root", "", "test", func(c *Conn) {c.SetTLSConfig(tlsConfig)}) if err != nil { msg := fmt.Sprintf(` This example needs a MySQL listening on 127.0.0.1:3006 with user "root" and diff --git a/client/pool.go b/client/pool.go index a3c306f7e..f6cb5dd39 100644 --- a/client/pool.go +++ b/client/pool.go @@ -569,9 +569,9 @@ func (pool *Pool) ping(conn *Conn) error { // So before call Close, Call PutConn to put all connections that in use back to connection pool first. func (pool *Pool) Close() { pool.cancel() - //wait newConnectionProducer exit. + // wait newConnectionProducer exit. pool.wg.Wait() - //close idle connections + // close idle connections pool.synchro.Lock() for _, connection := range pool.synchro.idleConnections { pool.synchro.stats.TotalCount-- diff --git a/client/req.go b/client/req.go index 225e6114d..28a7c10b1 100644 --- a/client/req.go +++ b/client/req.go @@ -8,10 +8,10 @@ func (c *Conn) writeCommand(command byte) error { c.ResetSequence() return c.WritePacket([]byte{ - 0x01, //1 bytes long + 0x01, // 1 bytes long 0x00, 0x00, - 0x00, //sequence + 0x00, // sequence command, }) } @@ -41,10 +41,10 @@ func (c *Conn) writeCommandUint32(command byte, arg uint32) error { buf := utils.ByteSliceGet(9) - buf.B[0] = 0x05 //5 bytes long + buf.B[0] = 0x05 // 5 bytes long buf.B[1] = 0x00 buf.B[2] = 0x00 - buf.B[3] = 0x00 //sequence + buf.B[3] = 0x00 // sequence buf.B[4] = command diff --git a/client/resp.go b/client/resp.go index 6cd7e9bcf..9aef7ab75 100644 --- a/client/resp.go +++ b/client/resp.go @@ -19,7 +19,6 @@ func (c *Conn) readUntilEOF() (err error) { for { data, err = c.ReadPacket() - if err != nil { return } @@ -37,7 +36,7 @@ func (c *Conn) isEOFPacket(data []byte) bool { func (c *Conn) handleOKPacket(data []byte) (*mysql.Result, error) { var n int - var pos = 1 + pos := 1 r := mysql.NewResultReserveResultset(0) @@ -69,7 +68,7 @@ func (c *Conn) handleOKPacket(data []byte) (*mysql.Result, error) { func (c *Conn) handleErrorPacket(data []byte) error { e := new(mysql.MyError) - var pos = 1 + pos := 1 e.Code = binary.LittleEndian.Uint16(data[pos:]) pos += 2 @@ -334,7 +333,7 @@ func (c *Conn) readResultsetStreaming(data []byte, binary bool, result *mysql.Re } func (c *Conn) readResultColumns(result *mysql.Result) (err error) { - var i = 0 + i := 0 var data []byte for { @@ -413,7 +412,6 @@ func (c *Conn) readResultRows(result *mysql.Result, isBinary bool) (err error) { for i := range result.Values { result.Values[i], err = result.RowDatas[i].Parse(result.Fields, isBinary, result.Values[i]) - if err != nil { return errors.Trace(err) } diff --git a/client/stmt.go b/client/stmt.go index b831050e6..30d878b55 100644 --- a/client/stmt.go +++ b/client/stmt.go @@ -83,7 +83,7 @@ func (s *Stmt) write(args ...interface{}) error { paramValues := make([][]byte, paramsNum+qaLen) paramNames := make([][]byte, paramsNum+qaLen) - //NULL-bitmap, length: (num-params+7) + // NULL-bitmap, length: (num-params+7) nullBitmap := make([]byte, (paramsNum+qaLen+7)>>3) length := 1 + 4 + 1 + 4 + ((paramsNum + 7) >> 3) + 1 + (paramsNum << 1) @@ -195,7 +195,7 @@ func (s *Stmt) write(args ...interface{}) error { } data.WriteByte(flags) - //iteration-count, always 1 + // iteration-count, always 1 data.Write([]byte{1, 0, 0, 0}) if paramsNum > 0 || (s.conn.capability&mysql.CLIENT_QUERY_ATTRIBUTES > 0 && (flags&mysql.PARAMETER_COUNT_AVAILABLE > 0)) { @@ -206,7 +206,7 @@ func (s *Stmt) write(args ...interface{}) error { if paramsNum > 0 { data.Write(nullBitmap) - //new-params-bound-flag + // new-params-bound-flag data.WriteByte(newParamBoundFlag) if newParamBoundFlag == 1 { @@ -219,7 +219,7 @@ func (s *Stmt) write(args ...interface{}) error { } } - //value of each parameter + // value of each parameter for _, v := range paramValues { data.Write(v) } @@ -253,19 +253,19 @@ func (c *Conn) Prepare(query string) (*Stmt, error) { pos := 1 - //for statement id + // for statement id s.id = binary.LittleEndian.Uint32(data[pos:]) pos += 4 - //number columns + // number columns s.columns = int(binary.LittleEndian.Uint16(data[pos:])) pos += 2 - //number params + // number params s.params = int(binary.LittleEndian.Uint16(data[pos:])) pos += 2 - //warnings + // warnings s.warnings = int(binary.LittleEndian.Uint16(data[pos:])) // pos += 2 diff --git a/cmd/go-binlogparser/main.go b/cmd/go-binlogparser/main.go index 22d009806..b4f71775f 100644 --- a/cmd/go-binlogparser/main.go +++ b/cmd/go-binlogparser/main.go @@ -23,7 +23,6 @@ func main() { } err := p.ParseFile(*name, *offset, f) - if err != nil { println(err.Error()) } diff --git a/cmd/go-mysqldump/main.go b/cmd/go-mysqldump/main.go index 144c7a31e..fe94266cb 100644 --- a/cmd/go-mysqldump/main.go +++ b/cmd/go-mysqldump/main.go @@ -53,10 +53,10 @@ func main() { d.AddDatabases(subs...) } - var f = os.Stdout + f := os.Stdout if len(*output) > 0 { - f, err = os.OpenFile(*output, os.O_CREATE|os.O_WRONLY, 0644) + f, err = os.OpenFile(*output, os.O_CREATE|os.O_WRONLY, 0o644) if err != nil { fmt.Printf("Open file error %v\n", errors.ErrorStack(err)) os.Exit(1) diff --git a/compress/zlib.go b/compress/zlib.go index 07e8186c7..a91e54370 100644 --- a/compress/zlib.go +++ b/compress/zlib.go @@ -27,8 +27,10 @@ var ( } ) -var _ io.WriteCloser = zlibWriter{} -var _ io.ReadCloser = zlibReader{} +var ( + _ io.WriteCloser = zlibWriter{} + _ io.ReadCloser = zlibReader{} +) type zlibWriter struct { w *zlib.Writer diff --git a/driver/driver.go b/driver/driver.go index 094ac0cbd..fc82c2572 100644 --- a/driver/driver.go +++ b/driver/driver.go @@ -39,8 +39,7 @@ var ( namedValueCheckers []CheckNamedValueFunc ) -type driver struct { -} +type driver struct{} type connInfo struct { standardDSN bool @@ -109,7 +108,6 @@ func (d driver) Open(dsn string) (sqldriver.Conn, error) { ) ci, err := parseDSN(dsn) - if err != nil { return nil, err } @@ -184,8 +182,10 @@ func (d driver) Open(dsn string) (sqldriver.Conn, error) { type CheckNamedValueFunc func(*sqldriver.NamedValue) error -var _ sqldriver.NamedValueChecker = &conn{} -var _ sqldriver.Validator = &conn{} +var ( + _ sqldriver.NamedValueChecker = &conn{} + _ sqldriver.Validator = &conn{} +) type state struct { valid bool diff --git a/driver/driver_options_test.go b/driver/driver_options_test.go index 3836e61d4..346b85e0f 100644 --- a/driver/driver_options_test.go +++ b/driver/driver_options_test.go @@ -333,7 +333,7 @@ func (h *mockHandler) handleQuery(query string, binary bool, args []interface{}) case "select": var r *mysql.Resultset var err error - //for handle go mysql driver select @@max_allowed_packet + // for handle go mysql driver select @@max_allowed_packet if strings.Contains(strings.ToLower(query), "max_allowed_packet") { r, err = mysql.BuildSimpleResultset([]string{"@@max_allowed_packet"}, [][]interface{}{ {mysql.MaxPayloadLen}, diff --git a/driver/driver_test.go b/driver/driver_test.go index bf4eef87b..cc0c6e32f 100644 --- a/driver/driver_test.go +++ b/driver/driver_test.go @@ -13,9 +13,11 @@ import ( "github.com/go-mysql-org/go-mysql/test_util" ) -var testUser = flag.String("user", "root", "MySQL user") -var testPassword = flag.String("pass", "", "MySQL password") -var testDB = flag.String("db", "test", "MySQL test database") +var ( + testUser = flag.String("user", "root", "MySQL user") + testPassword = flag.String("pass", "", "MySQL password") + testDB = flag.String("db", "test", "MySQL test database") +) func TestDriver(t *testing.T) { suite.Run(t, new(testDriverSuite)) diff --git a/dump/parser.go b/dump/parser.go index f3c699b7b..2ff66b6ce 100644 --- a/dump/parser.go +++ b/dump/parser.go @@ -12,9 +12,7 @@ import ( "github.com/pingcap/errors" ) -var ( - ErrSkip = errors.New("Handler error, but skipped") -) +var ErrSkip = errors.New("Handler error, but skipped") type ParseHandler interface { // Parse CHANGE MASTER TO MASTER_LOG_FILE=name, MASTER_LOG_POS=pos; diff --git a/dump/parser_test.go b/dump/parser_test.go index c3dc2ddcc..6e5884a1d 100644 --- a/dump/parser_test.go +++ b/dump/parser_test.go @@ -77,7 +77,7 @@ e7574090-b123-11e8-8bb4-005056a29643:1' for _, tt := range tbls { reader := strings.NewReader(tt.input) - var handler = new(testParseHandler) + handler := new(testParseHandler) err := Parse(reader, handler, true) require.NoError(t, err) @@ -157,10 +157,14 @@ func TestParseLine(t *testing.T) { line string expected string }{ - {line: "INSERT INTO `test` VALUES (1, 'first', 'hello mysql; 2', 'e1', 'a,b');", - expected: "1, 'first', 'hello mysql; 2', 'e1', 'a,b'"}, - {line: "INSERT INTO `test` VALUES (0x22270073646661736661736466, 'first', 'hello mysql; 2', 'e1', 'a,b');", - expected: "0x22270073646661736661736466, 'first', 'hello mysql; 2', 'e1', 'a,b'"}, + { + line: "INSERT INTO `test` VALUES (1, 'first', 'hello mysql; 2', 'e1', 'a,b');", + expected: "1, 'first', 'hello mysql; 2', 'e1', 'a,b'", + }, + { + line: "INSERT INTO `test` VALUES (0x22270073646661736661736466, 'first', 'hello mysql; 2', 'e1', 'a,b');", + expected: "0x22270073646661736661736466, 'first', 'hello mysql; 2', 'e1', 'a,b'", + }, } f := func(c rune) bool { diff --git a/mysql/field.go b/mysql/field.go index 23c32d2e4..bddc253b1 100644 --- a/mysql/field.go +++ b/mysql/field.go @@ -57,78 +57,78 @@ func (f *Field) Parse(p FieldData) (err error) { var n int pos := 0 - //skip catelog, always def + // skip catelog, always def n, err = SkipLengthEncodedString(p) if err != nil { return err } pos += n - //schema + // schema f.Schema, _, n, err = LengthEncodedString(p[pos:]) if err != nil { return err } pos += n - //table + // table f.Table, _, n, err = LengthEncodedString(p[pos:]) if err != nil { return err } pos += n - //org_table + // org_table f.OrgTable, _, n, err = LengthEncodedString(p[pos:]) if err != nil { return err } pos += n - //name + // name f.Name, _, n, err = LengthEncodedString(p[pos:]) if err != nil { return err } pos += n - //org_name + // org_name f.OrgName, _, n, err = LengthEncodedString(p[pos:]) if err != nil { return err } pos += n - //skip oc + // skip oc pos += 1 - //charset + // charset f.Charset = binary.LittleEndian.Uint16(p[pos:]) pos += 2 - //column length + // column length f.ColumnLength = binary.LittleEndian.Uint32(p[pos:]) pos += 4 - //type + // type f.Type = p[pos] pos++ - //flag + // flag f.Flag = binary.LittleEndian.Uint16(p[pos:]) pos += 2 - //decimals 1 + // decimals 1 f.Decimal = p[pos] pos++ - //filter [0x00][0x00] + // filter [0x00][0x00] pos += 2 f.DefaultValue = nil - //if more data, command was field list + // if more data, command was field list if len(p) > pos { - //length of default value lenenc-int + // length of default value lenenc-int f.DefaultValueLength, _, n = LengthEncodedInt(p[pos:]) pos += n @@ -137,7 +137,7 @@ func (f *Field) Parse(p FieldData) (err error) { return err } - //default value string[$len] + // default value string[$len] f.DefaultValue = p[pos:(pos + int(f.DefaultValueLength))] } diff --git a/mysql/mariadb_gtid.go b/mysql/mariadb_gtid.go index 6e472c657..c1fcc936c 100644 --- a/mysql/mariadb_gtid.go +++ b/mysql/mariadb_gtid.go @@ -50,7 +50,8 @@ func ParseMariadbGTID(str string) (*MariadbGTID, error) { return &MariadbGTID{ DomainID: uint32(domainID), ServerID: uint32(serverID), - SequenceNumber: sequenceID}, nil + SequenceNumber: sequenceID, + }, nil } func (gtid *MariadbGTID) String() string { @@ -145,7 +146,7 @@ func (s *MariadbGTIDSet) AddSet(gtid *MariadbGTID) error { // Update updates mariadb gtid set func (s *MariadbGTIDSet) Update(GTIDStr string) error { sp := strings.Split(GTIDStr, ",") - //todo, handle redundant same uuid + // todo, handle redundant same uuid for i := 0; i < len(sp); i++ { gtid, err := ParseMariadbGTID(sp[i]) if err != nil { diff --git a/mysql/mariadb_gtid_test.go b/mysql/mariadb_gtid_test.go index 5a2aeca23..bebdd6304 100644 --- a/mysql/mariadb_gtid_test.go +++ b/mysql/mariadb_gtid_test.go @@ -91,7 +91,7 @@ func TestMariaDBForward(t *testing.T) { func TestParseMariaDBGTIDSet(t *testing.T) { cases := []struct { gtidStr string - subGTIDs map[uint32]map[uint32]string //domain ID => gtid string + subGTIDs map[uint32]map[uint32]string // domain ID => gtid string expectedStr []string // test String() hasError bool }{ @@ -231,8 +231,11 @@ func TestMariaDBGTIDSetClone(t *testing.T) { } func TestMariaDBGTIDSetSortedString(t *testing.T) { - cases := [][]string{{"", ""}, {"1-1-1", "1-1-1"}, - {"2-2-2,1-1-1,3-2-1", "1-1-1,2-2-2,3-2-1"}} + cases := [][]string{ + {"", ""}, + {"1-1-1", "1-1-1"}, + {"2-2-2,1-1-1,3-2-1", "1-1-1,2-2-2,3-2-1"}, + } for _, strs := range cases { gtidSet, err := ParseMariadbGTIDSet(strs[0]) diff --git a/mysql/mysql_gtid.go b/mysql/mysql_gtid.go index ecf726c1e..522348f76 100644 --- a/mysql/mysql_gtid.go +++ b/mysql/mysql_gtid.go @@ -406,7 +406,7 @@ func ParseMysqlGTIDSet(str string) (GTIDSet, error) { sp := strings.Split(str, ",") - //todo, handle redundant same uuid + // todo, handle redundant same uuid for i := 0; i < len(sp); i++ { if set, err := ParseUUIDSet(sp[i]); err != nil { return nil, errors.Trace(err) diff --git a/mysql/parse_binary.go b/mysql/parse_binary.go index 03b35ca97..1f07932c8 100644 --- a/mysql/parse_binary.go +++ b/mysql/parse_binary.go @@ -8,6 +8,7 @@ import ( func ParseBinaryInt8(data []byte) int8 { return int8(data[0]) } + func ParseBinaryUint8(data []byte) uint8 { return data[0] } @@ -15,6 +16,7 @@ func ParseBinaryUint8(data []byte) uint8 { func ParseBinaryInt16(data []byte) int16 { return int16(binary.LittleEndian.Uint16(data)) } + func ParseBinaryUint16(data []byte) uint16 { return binary.LittleEndian.Uint16(data) } @@ -26,6 +28,7 @@ func ParseBinaryInt24(data []byte) int32 { } return int32(u32) } + func ParseBinaryUint24(data []byte) uint32 { return uint32(data[0]) | uint32(data[1])<<8 | uint32(data[2])<<16 } @@ -33,6 +36,7 @@ func ParseBinaryUint24(data []byte) uint32 { func ParseBinaryInt32(data []byte) int32 { return int32(binary.LittleEndian.Uint32(data)) } + func ParseBinaryUint32(data []byte) uint32 { return binary.LittleEndian.Uint32(data) } @@ -40,6 +44,7 @@ func ParseBinaryUint32(data []byte) uint32 { func ParseBinaryInt64(data []byte) int64 { return int64(binary.LittleEndian.Uint64(data)) } + func ParseBinaryUint64(data []byte) uint64 { return binary.LittleEndian.Uint64(data) } diff --git a/mysql/resultset.go b/mysql/resultset.go index 2982dfaed..d23abbf95 100644 --- a/mysql/resultset.go +++ b/mysql/resultset.go @@ -37,13 +37,11 @@ type Resultset struct { StreamingDone bool } -var ( - resultsetPool = sync.Pool{ - New: func() interface{} { - return &Resultset{} - }, - } -) +var resultsetPool = sync.Pool{ + New: func() interface{} { + return &Resultset{} + }, +} func NewResultset(fieldsCount int) *Resultset { r := resultsetPool.Get().(*Resultset) diff --git a/mysql/resultset_helper.go b/mysql/resultset_helper.go index cb94bcad6..c9fb814de 100644 --- a/mysql/resultset_helper.go +++ b/mysql/resultset_helper.go @@ -212,7 +212,6 @@ func BuildSimpleTextResultset(names []string, values [][]interface{}) (*Resultse } } b, err = FormatTextValue(value) - if err != nil { return nil, errors.Trace(err) } @@ -269,7 +268,6 @@ func BuildSimpleBinaryResultset(names []string, values [][]interface{}) (*Result } b, err = formatBinaryValue(value) - if err != nil { return nil, errors.Trace(err) } diff --git a/mysql/util.go b/mysql/util.go index 5bde1fdb8..87ee70882 100644 --- a/mysql/util.go +++ b/mysql/util.go @@ -204,8 +204,10 @@ func PutLengthEncodedInt(n uint64) []byte { // handles case n <= 0xffffffffffffffff // using 'default' instead of 'case' to avoid static analysis error // SA4003: every value of type uint64 is <= math.MaxUint64 - return []byte{0xfe, byte(n), byte(n >> 8), byte(n >> 16), byte(n >> 24), - byte(n >> 32), byte(n >> 40), byte(n >> 48), byte(n >> 56)} + return []byte{ + 0xfe, byte(n), byte(n >> 8), byte(n >> 16), byte(n >> 24), + byte(n >> 32), byte(n >> 40), byte(n >> 48), byte(n >> 56), + } } } diff --git a/packet/conn.go b/packet/conn.go index 964e145ae..27ead18cf 100644 --- a/packet/conn.go +++ b/packet/conn.go @@ -20,8 +20,10 @@ import ( "github.com/pingcap/errors" ) -const MinCompressionLength = 50 -const DefaultBufferSize = 16 * 1024 +const ( + MinCompressionLength = 50 + DefaultBufferSize = 16 * 1024 +) // Conn is the base class to handle MySQL protocol. type Conn struct { diff --git a/replication/backup.go b/replication/backup.go index 681c0e21f..d3398b5f7 100644 --- a/replication/backup.go +++ b/replication/backup.go @@ -14,13 +14,13 @@ import ( // StartBackup starts the backup process for the binary log and writes to the backup directory. func (b *BinlogSyncer) StartBackup(backupDir string, p mysql.Position, timeout time.Duration) error { - err := os.MkdirAll(backupDir, 0755) + err := os.MkdirAll(backupDir, 0o755) if err != nil { return errors.Trace(err) } if b.cfg.SynchronousEventHandler == nil { return b.StartBackupWithHandler(p, timeout, func(filename string) (io.WriteCloser, error) { - return os.OpenFile(path.Join(backupDir, filename), os.O_CREATE|os.O_WRONLY, 0644) + return os.OpenFile(path.Join(backupDir, filename), os.O_CREATE|os.O_WRONLY, 0o644) }) } else { return b.StartSynchronousBackup(p, timeout) @@ -37,7 +37,8 @@ func (b *BinlogSyncer) StartBackup(backupDir string, p mysql.Position, timeout t // If set to 0, a default very long timeout (30 days) is used instead. // - handler: A function that takes a binlog filename and returns an WriteCloser for writing raw events to. func (b *BinlogSyncer) StartBackupWithHandler(p mysql.Position, timeout time.Duration, - handler func(binlogFilename string) (io.WriteCloser, error)) (retErr error) { + handler func(binlogFilename string) (io.WriteCloser, error), +) (retErr error) { if timeout == 0 { // a very long timeout here timeout = 30 * 3600 * 24 * time.Second diff --git a/replication/backup_test.go b/replication/backup_test.go index 769f61e83..b3cf705a1 100644 --- a/replication/backup_test.go +++ b/replication/backup_test.go @@ -74,7 +74,7 @@ func testBackup(t *testSyncerSuite, isSynchronous bool) { // Set up a BackupEventHandler for synchronous mode backupHandler := NewBackupEventHandler( func(filename string) (io.WriteCloser, error) { - return os.OpenFile(path.Join(binlogDir, filename), os.O_CREATE|os.O_WRONLY, 0644) + return os.OpenFile(path.Join(binlogDir, filename), os.O_CREATE|os.O_WRONLY, 0o644) }, ) t.b.cfg.SynchronousEventHandler = backupHandler diff --git a/replication/binlogsyncer.go b/replication/binlogsyncer.go index 5105a3dfd..2785a8505 100644 --- a/replication/binlogsyncer.go +++ b/replication/binlogsyncer.go @@ -22,9 +22,7 @@ import ( "github.com/go-mysql-org/go-mysql/utils" ) -var ( - errSyncRunning = errors.New("Sync is running, must Close first") -) +var errSyncRunning = errors.New("Sync is running, must Close first") // BinlogSyncerConfig is the configuration for BinlogSyncer. type BinlogSyncerConfig struct { @@ -110,8 +108,8 @@ type BinlogSyncerConfig struct { // https://mariadb.com/kb/en/library/annotate_rows_event/ DumpCommandFlag uint16 - //Option function is used to set outside of BinlogSyncerConfig, between mysql connection and COM_REGISTER_SLAVE - //For MariaDB: slave_gtid_ignore_duplicates、skip_replication、slave_until_gtid + // Option function is used to set outside of BinlogSyncerConfig, between mysql connection and COM_REGISTER_SLAVE + // For MariaDB: slave_gtid_ignore_duplicates、skip_replication、slave_until_gtid Option func(*client.Conn) error // Set Logger @@ -287,7 +285,7 @@ func (b *BinlogSyncer) registerSlave() error { } } - //set read timeout + // set read timeout if b.cfg.ReadTimeout > 0 { _ = b.c.SetReadDeadline(utils.Now().Add(b.cfg.ReadTimeout)) } @@ -306,8 +304,8 @@ func (b *BinlogSyncer) registerSlave() error { // save last last connection id for kill b.lastConnectionID = b.c.GetConnectionID() - //for mysql 5.6+, binlog has a crc32 checksum - //before mysql 5.6, this will not work, don't matter.:-) + // for mysql 5.6+, binlog has a crc32 checksum + // before mysql 5.6, this will not work, don't matter.:-) if r, err := b.c.Execute("SHOW GLOBAL VARIABLES LIKE 'BINLOG_CHECKSUM'"); err != nil { return errors.Trace(err) } else { @@ -622,7 +620,7 @@ func (b *BinlogSyncer) writeRegisterSlaveCommand() error { binary.LittleEndian.PutUint16(data[pos:], b.cfg.Port) pos += 2 - //replication rank, not used + // replication rank, not used binary.LittleEndian.PutUint32(data[pos:], 0) pos += 4 @@ -788,7 +786,7 @@ func (b *BinlogSyncer) onStream(s *BinlogStreamer) { continue } - //set read timeout + // set read timeout if b.cfg.ReadTimeout > 0 { _ = b.c.SetReadDeadline(utils.Now().Add(b.cfg.ReadTimeout)) } diff --git a/replication/const.go b/replication/const.go index 555f96b8c..e4cfd2bd3 100644 --- a/replication/const.go +++ b/replication/const.go @@ -1,12 +1,12 @@ package replication const ( - //we only support MySQL 5.0.0+ binlog format, maybe??? + // we only support MySQL 5.0.0+ binlog format, maybe??? MinBinlogVersion = 4 ) var ( - //binlog header [ fe `bin` ] + // binlog header [ fe `bin` ] BinLogFileHeader = []byte{0xfe, 0x62, 0x69, 0x6e} SemiSyncIndicator byte = 0xef diff --git a/replication/event.go b/replication/event.go index d16aa574c..dacd49b02 100644 --- a/replication/event.go +++ b/replication/event.go @@ -39,7 +39,7 @@ func (e *BinlogEvent) Dump(w io.Writer) { } type Event interface { - //Dump Event, format like python-mysql-replication + // Dump Event, format like python-mysql-replication Dump(w io.Writer) Decode(data []byte) error @@ -48,10 +48,10 @@ type Event interface { type EventError struct { Header *EventHeader - //Error message + // Error message Err string - //Event data + // Event data Data []byte } @@ -200,9 +200,9 @@ func (e *FormatDescriptionEvent) Decode(data []byte) error { func (e *FormatDescriptionEvent) Dump(w io.Writer) { fmt.Fprintf(w, "Version: %d\n", e.Version) fmt.Fprintf(w, "Server version: %s\n", e.ServerVersion) - //fmt.Fprintf(w, "Create date: %s\n", time.Unix(int64(e.CreateTimestamp), 0).Format(TimeFormat)) + // fmt.Fprintf(w, "Create date: %s\n", time.Unix(int64(e.CreateTimestamp), 0).Format(TimeFormat)) fmt.Fprintf(w, "Checksum algorithm: %d\n", e.ChecksumAlgorithm) - //fmt.Fprintf(w, "Event header lengths: \n%s", hex.Dump(e.EventTypeHeaderLengths)) + // fmt.Fprintf(w, "Event header lengths: \n%s", hex.Dump(e.EventTypeHeaderLengths)) fmt.Fprintln(w) } @@ -389,7 +389,7 @@ func (e *QueryEvent) Decode(data []byte) error { e.Schema = data[pos : pos+int(schemaLength)] pos += int(schemaLength) - //skip 0x00 + // skip 0x00 pos++ if e.compressed { @@ -408,7 +408,7 @@ func (e *QueryEvent) Dump(w io.Writer) { fmt.Fprintf(w, "Slave proxy ID: %d\n", e.SlaveProxyID) fmt.Fprintf(w, "Execution time: %d\n", e.ExecutionTime) fmt.Fprintf(w, "Error code: %d\n", e.ErrorCode) - //fmt.Fprintf(w, "Status vars: \n%s", hex.Dump(e.StatusVars)) + // fmt.Fprintf(w, "Status vars: \n%s", hex.Dump(e.StatusVars)) fmt.Fprintf(w, "Schema: %s\n", e.Schema) fmt.Fprintf(w, "Query: %s\n", e.Query) if e.GSet != nil { diff --git a/replication/generic_event.go b/replication/generic_event.go index ac55703cc..ce13444a0 100644 --- a/replication/generic_event.go +++ b/replication/generic_event.go @@ -22,7 +22,7 @@ func (e *GenericEvent) Decode(data []byte) error { return nil } -//below events are generic events, maybe later I will consider handle some. +// below events are generic events, maybe later I will consider handle some. // type StartEventV3 struct { // Version uint16 diff --git a/replication/json_binary.go b/replication/json_binary.go index 7c70cb890..e4fb7e4e3 100644 --- a/replication/json_binary.go +++ b/replication/json_binary.go @@ -44,9 +44,7 @@ const ( jsonbValueEntrySizeLarge = 1 + jsonbLargeOffsetSize ) -var ( - ErrCorruptedJSONDiff = fmt.Errorf("corrupted JSON diff") // ER_CORRUPTED_JSON_DIFF -) +var ErrCorruptedJSONDiff = fmt.Errorf("corrupted JSON diff") // ER_CORRUPTED_JSON_DIFF type ( // JsonDiffOperation is an enum that describes what kind of operation a JsonDiff object represents. diff --git a/replication/parser.go b/replication/parser.go index 4caf496c2..2d5908e78 100644 --- a/replication/parser.go +++ b/replication/parser.go @@ -15,10 +15,8 @@ import ( "github.com/go-mysql-org/go-mysql/utils" ) -var ( - // ErrChecksumMismatch indicates binlog checksum mismatch. - ErrChecksumMismatch = errors.New("binlog checksum mismatch, data may be corrupted") -) +// ErrChecksumMismatch indicates binlog checksum mismatch. +var ErrChecksumMismatch = errors.New("binlog checksum mismatch, data may be corrupted") type BinlogParser struct { // "mysql" or "mariadb", if not set, use "mysql" by default @@ -355,7 +353,6 @@ func (p *BinlogParser) Parse(data []byte) (*BinlogEvent, error) { rawData := data h, err := p.parseHeader(data) - if err != nil { return nil, err } diff --git a/replication/row_event.go b/replication/row_event.go index b35d02cbd..d1fe9afa8 100644 --- a/replication/row_event.go +++ b/replication/row_event.go @@ -207,13 +207,13 @@ func (e *TableMapEvent) decodeMeta(data []byte) error { for i, t := range e.ColumnType { switch t { case mysql.MYSQL_TYPE_STRING: - var x = uint16(data[pos]) << 8 // real type - x += uint16(data[pos+1]) // pack or field length + x := uint16(data[pos]) << 8 // real type + x += uint16(data[pos+1]) // pack or field length e.ColumnMeta[i] = x pos += 2 case mysql.MYSQL_TYPE_NEWDECIMAL: - var x = uint16(data[pos]) << 8 // precision - x += uint16(data[pos+1]) // decimals + x := uint16(data[pos]) << 8 // precision + x += uint16(data[pos+1]) // decimals e.ColumnMeta[i] = x pos += 2 case mysql.MYSQL_TYPE_VAR_STRING, @@ -1187,7 +1187,6 @@ func (e *RowsEvent) decodeImage(data []byte, bitmap []byte, rowImageType EnumRow var n int var err error row[i], n, err = e.decodeValue(data[pos:], e.Table.ColumnType[i], e.Table.ColumnMeta[i], isPartial) - if err != nil { return 0, err } @@ -1216,7 +1215,7 @@ func (e *RowsEvent) parseFracTime(t interface{}) interface{} { // see mysql sql/log_event.cc log_event_print_value func (e *RowsEvent) decodeValue(data []byte, tp byte, meta uint16, isPartial bool) (v interface{}, n int, err error) { - var length = 0 + length := 0 if tp == mysql.MYSQL_TYPE_STRING { if meta >= 256 { @@ -1690,8 +1689,10 @@ func decodeDatetime2(data []byte, dec uint16) (interface{}, int, error) { }, n, nil } -const TIMEF_OFS int64 = 0x800000000000 -const TIMEF_INT_OFS int64 = 0x800000 +const ( + TIMEF_OFS int64 = 0x800000000000 + TIMEF_INT_OFS int64 = 0x800000 +) func decodeTime2(data []byte, dec uint16) (string, int, error) { // time binary length diff --git a/replication/row_event_test.go b/replication/row_event_test.go index 33d38d74d..ea3a5363e 100644 --- a/replication/row_event_test.go +++ b/replication/row_event_test.go @@ -400,6 +400,7 @@ func TestParseJson(t *testing.T) { require.Equal(t, "101", rows.Rows[0][1]) } } + func TestParseJsonDecimal(t *testing.T) { // Table format: // mysql> desc t10; @@ -587,8 +588,7 @@ func TestJsonNull(t *testing.T) { rows.tables[tableMapEvent.TableID] = tableMapEvent rows.Version = 2 - data := - []byte("r\x00\x00\x00\x00\x00\x01\x00\x02\x00\a\xff\x80\x01\x00\x00\x00B\ue4d06W\x00\x00A\x10@l\x9a\x85/\x00\x00\x00\x00\x00\x00{\xc36X\x00\x00\x00\x00") + data := []byte("r\x00\x00\x00\x00\x00\x01\x00\x02\x00\a\xff\x80\x01\x00\x00\x00B\ue4d06W\x00\x00A\x10@l\x9a\x85/\x00\x00\x00\x00\x00\x00{\xc36X\x00\x00\x00\x00") rows.Rows = nil err = rows.Decode(data) @@ -1364,7 +1364,8 @@ func TestInvalidEvent(t *testing.T) { ColumnCount: 0x2, ColumnType: []uint8{0x3, 0xc}, ColumnMeta: []uint16{0x0, 0x0}, - NullBitmap: []uint8{0x2}} + NullBitmap: []uint8{0x2}, + } e2 := &RowsEvent{ Version: 1, diff --git a/replication/time.go b/replication/time.go index 4134f8ac0..948235666 100644 --- a/replication/time.go +++ b/replication/time.go @@ -5,17 +5,15 @@ import ( "time" ) -var ( - fracTimeFormat = [7]string{ - "2006-01-02 15:04:05", - "2006-01-02 15:04:05.0", - "2006-01-02 15:04:05.00", - "2006-01-02 15:04:05.000", - "2006-01-02 15:04:05.0000", - "2006-01-02 15:04:05.00000", - "2006-01-02 15:04:05.000000", - } -) +var fracTimeFormat = [7]string{ + "2006-01-02 15:04:05", + "2006-01-02 15:04:05.0", + "2006-01-02 15:04:05.00", + "2006-01-02 15:04:05.000", + "2006-01-02 15:04:05.0000", + "2006-01-02 15:04:05.00000", + "2006-01-02 15:04:05.000000", +} // fracTime is a help structure wrapping Golang Time. type fracTime struct { diff --git a/replication/transaction_payload_event.go b/replication/transaction_payload_event.go index 64bc0dc3c..a9f8a9b78 100644 --- a/replication/transaction_payload_event.go +++ b/replication/transaction_payload_event.go @@ -103,7 +103,7 @@ func (e *TransactionPayloadEvent) decodePayload() error { e.CompressionType, e.compressionType()) } - var decoder, err = zstd.NewReader(nil, zstd.WithDecoderConcurrency(0)) + decoder, err := zstd.NewReader(nil, zstd.WithDecoderConcurrency(0)) if err != nil { return err } diff --git a/schema/schema.go b/schema/schema.go index 804583c7e..3adcde4d3 100644 --- a/schema/schema.go +++ b/schema/schema.go @@ -15,9 +15,11 @@ import ( "github.com/go-mysql-org/go-mysql/mysql" ) -var ErrTableNotExist = errors.New("table is not exist") -var ErrMissingTableMeta = errors.New("missing table meta") -var HAHealthCheckSchema = "mysql.ha_health_check" +var ( + ErrTableNotExist = errors.New("table is not exist") + ErrMissingTableMeta = errors.New("missing table meta") + HAHealthCheckSchema = "mysql.ha_health_check" +) // Different column type const ( diff --git a/schema/schema_test.go b/schema/schema_test.go index 47eef534d..70f642d96 100644 --- a/schema/schema_test.go +++ b/schema/schema_test.go @@ -13,8 +13,10 @@ import ( "github.com/stretchr/testify/suite" ) -var schema = flag.String("schema", "test", "MySQL Database") -var pwd = flag.String("pwd", "", "MySQL password") +var ( + schema = flag.String("schema", "test", "MySQL Database") + pwd = flag.String("pwd", "", "MySQL password") +) type schemaTestSuite struct { suite.Suite diff --git a/server/caching_sha2_cache_test.go b/server/caching_sha2_cache_test.go index 5b99efc84..e15f1e4a2 100644 --- a/server/caching_sha2_cache_test.go +++ b/server/caching_sha2_cache_test.go @@ -109,7 +109,7 @@ func (s *cacheTestSuite) onAccept() { } func (s *cacheTestSuite) onConn(conn net.Conn) { - //co, err := NewConn(conn, *testUser, *testPassword, &testHandler{s}) + // co, err := NewConn(conn, *testUser, *testPassword, &testHandler{s}) co, err := NewCustomizedConn(conn, s.server, s.credProvider, &testCacheHandler{s}) require.NoError(s.T(), err) for { @@ -141,7 +141,7 @@ func (s *cacheTestSuite) TestCache() { t2 := utils.Now() d1 := int(t2.Sub(t1).Nanoseconds() / 1e6) - //log.Debugf("first connection took %d milliseconds", d1) + // log.Debugf("first connection took %d milliseconds", d1) require.GreaterOrEqual(s.T(), d1, delay) @@ -158,7 +158,7 @@ func (s *cacheTestSuite) TestCache() { t4 := utils.Now() d2 := int(t4.Sub(t3).Nanoseconds() / 1e6) - //log.Debugf("second connection took %d milliseconds", d2) + // log.Debugf("second connection took %d milliseconds", d2) require.Less(s.T(), d2, delay) if s.db != nil { @@ -182,7 +182,7 @@ func (h *testCacheHandler) handleQuery(query string, binary bool) (*mysql.Result case "select": var r *mysql.Resultset var err error - //for handle go mysql driver select @@max_allowed_packet + // for handle go mysql driver select @@max_allowed_packet if strings.Contains(strings.ToLower(query), "max_allowed_packet") { r, err = mysql.BuildSimpleResultset([]string{"@@max_allowed_packet"}, [][]interface{}{ {mysql.MaxPayloadLen}, @@ -232,6 +232,7 @@ func (h *testCacheHandler) HandleQuery(query string) (*mysql.Result, error) { func (h *testCacheHandler) HandleFieldList(table string, fieldWildcard string) ([]*mysql.Field, error) { return nil, nil } + func (h *testCacheHandler) HandleStmtPrepare(sql string) (params int, columns int, ctx interface{}, err error) { return 0, 0, nil, nil } diff --git a/server/command.go b/server/command.go index 27aa6bf9b..e23244bbd 100644 --- a/server/command.go +++ b/server/command.go @@ -12,24 +12,24 @@ import ( // Handler is what a server needs to implement the client-server protocol type Handler interface { - //handle COM_INIT_DB command, you can check whether the dbName is valid, or other. + // handle COM_INIT_DB command, you can check whether the dbName is valid, or other. UseDB(dbName string) error - //handle COM_QUERY command, like SELECT, INSERT, UPDATE, etc... - //If Result has a Resultset (SELECT, SHOW, etc...), we will send this as the response, otherwise, we will send Result + // handle COM_QUERY command, like SELECT, INSERT, UPDATE, etc... + // If Result has a Resultset (SELECT, SHOW, etc...), we will send this as the response, otherwise, we will send Result HandleQuery(query string) (*mysql.Result, error) - //handle COM_FILED_LIST command + // handle COM_FILED_LIST command HandleFieldList(table string, fieldWildcard string) ([]*mysql.Field, error) - //handle COM_STMT_PREPARE, params is the param number for this statement, columns is the column number - //context will be used later for statement execute + // handle COM_STMT_PREPARE, params is the param number for this statement, columns is the column number + // context will be used later for statement execute HandleStmtPrepare(query string) (params int, columns int, context interface{}, err error) - //handle COM_STMT_EXECUTE, context is the previous one set in prepare - //query is the statement prepare query, and args is the params for this statement + // handle COM_STMT_EXECUTE, context is the previous one set in prepare + // query is the statement prepare query, and args is the params for this statement HandleStmtExecute(context interface{}, query string, args []interface{}) (*mysql.Result, error) - //handle COM_STMT_CLOSE, context is the previous one set in prepare - //this handler has no response + // handle COM_STMT_CLOSE, context is the previous one set in prepare + // this handler has no response HandleStmtClose(context interface{}) error - //handle any other command that is not currently handled by the library, - //default implementation for this method will return an ER_UNKNOWN_ERROR + // handle any other command that is not currently handled by the library, + // default implementation for this method will return an ER_UNKNOWN_ERROR HandleOtherCommand(cmd byte, data []byte) error } @@ -184,8 +184,7 @@ func (c *Conn) dispatch(data []byte) interface{} { } // EmptyHandler is a mostly empty implementation for demonstration purposes -type EmptyHandler struct { -} +type EmptyHandler struct{} // EmptyReplicationHandler is a empty handler that implements the replication protocol type EmptyReplicationHandler struct { diff --git a/server/command_test.go b/server/command_test.go index 5fe0476e8..415fc7f4f 100644 --- a/server/command_test.go +++ b/server/command_test.go @@ -1,5 +1,7 @@ package server // Ensure EmptyHandler implements Handler interface or cause compile time error -var _ Handler = EmptyHandler{} -var _ ReplicationHandler = EmptyReplicationHandler{} +var ( + _ Handler = EmptyHandler{} + _ ReplicationHandler = EmptyReplicationHandler{} +) diff --git a/server/handshake_resp.go b/server/handshake_resp.go index ab904cf9e..68cade122 100644 --- a/server/handshake_resp.go +++ b/server/handshake_resp.go @@ -73,21 +73,21 @@ func (c *Conn) decodeFirstPart(data []byte) (newData []byte, pos int, err error) return nil, 0, errors.New("CLIENT_PROTOCOL_41 compatible client is required") } - //capability + // capability c.capability = binary.LittleEndian.Uint32(data[:4]) if c.capability&mysql.CLIENT_SECURE_CONNECTION == 0 { return nil, 0, errors.New("CLIENT_SECURE_CONNECTION compatible client is required") } pos += 4 - //skip max packet size + // skip max packet size pos += 4 // connection's default character set as defined c.charset = data[pos] pos++ - //skip reserved 23[00] + // skip reserved 23[00] pos += 23 // is this a SSLRequest packet? @@ -109,7 +109,7 @@ func (c *Conn) decodeFirstPart(data []byte) (newData []byte, pos int, err error) } func (c *Conn) readUserName(data []byte, pos int) (int, error) { - //user name + // user name user := string(data[pos : pos+bytes.IndexByte(data[pos:], 0x00)]) pos += len(user) + 1 c.user = user diff --git a/server/initial_handshake.go b/server/initial_handshake.go index 312ac2b68..c8d68adbb 100644 --- a/server/initial_handshake.go +++ b/server/initial_handshake.go @@ -4,42 +4,42 @@ package server func (c *Conn) writeInitialHandshake() error { data := make([]byte, 4) - //min version 10 + // min version 10 data = append(data, 10) - //server version[00] + // server version[00] data = append(data, c.serverConf.serverVersion...) data = append(data, 0x00) - //connection id + // connection id data = append(data, byte(c.connectionID), byte(c.connectionID>>8), byte(c.connectionID>>16), byte(c.connectionID>>24)) - //auth-plugin-data-part-1 + // auth-plugin-data-part-1 data = append(data, c.salt[0:8]...) - //filter 0x00 byte, terminating the first part of a scramble + // filter 0x00 byte, terminating the first part of a scramble data = append(data, 0x00) defaultFlag := c.serverConf.capability - //capability flag lower 2 bytes, using default capability here + // capability flag lower 2 bytes, using default capability here data = append(data, byte(defaultFlag), byte(defaultFlag>>8)) - //charset + // charset data = append(data, c.serverConf.collationId) - //status + // status data = append(data, byte(c.status), byte(c.status>>8)) - //capability flag upper 2 bytes, using default capability here + // capability flag upper 2 bytes, using default capability here data = append(data, byte(defaultFlag>>16), byte(defaultFlag>>24)) // server supports CLIENT_PLUGIN_AUTH and CLIENT_SECURE_CONNECTION data = append(data, byte(8+12+1)) - //reserved 10 [00] + // reserved 10 [00] data = append(data, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) - //auth-plugin-data-part-2 + // auth-plugin-data-part-2 data = append(data, c.salt[8:]...) // second part of the password cipher [mininum 13 bytes], // where len=MAX(13, length of auth-plugin-data - 8) diff --git a/server/resp.go b/server/resp.go index a1147de59..c6f13fe9e 100644 --- a/server/resp.go +++ b/server/resp.go @@ -216,8 +216,10 @@ func (c *Conn) writeBinlogEvents(s *replication.BinlogStreamer) error { } } -type noResponse struct{} -type eofResponse struct{} +type ( + noResponse struct{} + eofResponse struct{} +) func (c *Conn) WriteValue(value interface{}) error { switch v := value.(type) { diff --git a/server/server_conf.go b/server/server_conf.go index 87a74f370..b01b42057 100644 --- a/server/server_conf.go +++ b/server/server_conf.go @@ -78,7 +78,7 @@ func NewServer(serverVersion string, collationId uint8, defaultAuthMethod string //if !isAuthMethodAllowedByServer(defaultAuthMethod, allowedAuthMethods) { // panic(fmt.Sprintf("default auth method is not one of the allowed auth methods")) //} - var capFlag = mysql.CLIENT_LONG_PASSWORD | mysql.CLIENT_LONG_FLAG | mysql.CLIENT_CONNECT_WITH_DB | mysql.CLIENT_PROTOCOL_41 | + capFlag := mysql.CLIENT_LONG_PASSWORD | mysql.CLIENT_LONG_FLAG | mysql.CLIENT_CONNECT_WITH_DB | mysql.CLIENT_PROTOCOL_41 | mysql.CLIENT_TRANSACTIONS | mysql.CLIENT_SECURE_CONNECTION | mysql.CLIENT_PLUGIN_AUTH | mysql.CLIENT_CONNECT_ATTRS | mysql.CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA if tlsConfig != nil { diff --git a/server/server_test.go b/server/server_test.go index 1756f4c55..0311448f9 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -21,15 +21,17 @@ import ( "github.com/go-mysql-org/go-mysql/test_util/test_keys" ) -var testUser = flag.String("user", "root", "MySQL user") -var testPassword = flag.String("pass", "123456", "MySQL password") -var testDB = flag.String("db", "test", "MySQL test database") +var ( + testUser = flag.String("user", "root", "MySQL user") + testPassword = flag.String("pass", "123456", "MySQL password") + testDB = flag.String("db", "test", "MySQL test database") +) var tlsConf = NewServerTLSConfig(test_keys.CaPem, test_keys.CertPem, test_keys.KeyPem, tls.VerifyClientCertIfGiven) func prepareServerConf() []*Server { // add default server without TLS - var servers = []*Server{ + servers := []*Server{ // with default TLS NewDefaultServer(), // for key exchange, CLIENT_SSL must be enabled for the server and if the connection is not secured with TLS @@ -65,7 +67,7 @@ func Test(t *testing.T) { inMemProvider.AddUser(*testUser, *testPassword) servers := prepareServerConf() - //no TLS + // no TLS for _, svr := range servers { suite.Run(t, &serverTestSuite{ server: svr, @@ -138,7 +140,7 @@ func (s *serverTestSuite) onAccept() { } func (s *serverTestSuite) onConn(conn net.Conn) { - //co, err := NewConn(conn, *testUser, *testPassword, &testHandler{s}) + // co, err := NewConn(conn, *testUser, *testPassword, &testHandler{s}) co, err := NewCustomizedConn(conn, s.server, s.credProvider, &testHandler{s}) require.NoError(s.T(), err) // set SSL if defined @@ -228,7 +230,7 @@ func (h *testHandler) handleQuery(query string, binary bool) (*mysql.Result, err case "select": var r *mysql.Resultset var err error - //for handle go mysql driver select @@max_allowed_packet + // for handle go mysql driver select @@max_allowed_packet if strings.Contains(strings.ToLower(query), "max_allowed_packet") { r, err = mysql.BuildSimpleResultset([]string{"@@max_allowed_packet"}, [][]interface{}{ {mysql.MaxPayloadLen}, @@ -278,6 +280,7 @@ func (h *testHandler) HandleQuery(query string) (*mysql.Result, error) { func (h *testHandler) HandleFieldList(table string, fieldWildcard string) ([]*mysql.Field, error) { return nil, nil } + func (h *testHandler) HandleStmtPrepare(sql string) (params int, columns int, ctx interface{}, err error) { ss := strings.Split(sql, " ") switch strings.ToLower(ss[0]) { diff --git a/server/stmt.go b/server/stmt.go index cc99b40ba..40486678b 100644 --- a/server/stmt.go +++ b/server/stmt.go @@ -41,17 +41,17 @@ func (s *Stmt) ResetParams() { func (c *Conn) writePrepare(s *Stmt) error { data := make([]byte, 4, 128) - //status ok + // status ok data = append(data, 0) - //stmt id + // stmt id data = append(data, mysql.Uint32ToBytes(s.ID)...) - //number columns + // number columns data = append(data, mysql.Uint16ToBytes(uint16(s.Columns))...) - //number params + // number params data = append(data, mysql.Uint16ToBytes(uint16(s.Params))...) - //filter [00] + // filter [00] data = append(data, 0) - //warning count + // warning count data = append(data, 0, 0) if err := c.WritePacket(data); err != nil { @@ -127,7 +127,7 @@ func (c *Conn) handleStmtExecute(data []byte) (*mysql.Result, error) { return nil, mysql.NewError(mysql.ER_UNKNOWN_ERROR, "unsupported flag CURSOR_TYPE_SCROLLABLE") } - //skip iteration-count, always 1 + // skip iteration-count, always 1 pos += 4 var nullBitmaps []byte @@ -144,7 +144,7 @@ func (c *Conn) handleStmtExecute(data []byte) (*mysql.Result, error) { nullBitmaps = data[pos : pos+nullBitmapLen] pos += nullBitmapLen - //new param bound flag + // new param bound flag if data[pos] == 1 { pos++ if len(data) < (pos + (paramNum << 1)) { diff --git a/server/stmt_test.go b/server/stmt_test.go index 7141c2f15..bf9142f54 100644 --- a/server/stmt_test.go +++ b/server/stmt_test.go @@ -9,7 +9,7 @@ import ( func TestHandleStmtExecute(t *testing.T) { c := Conn{} c.stmts = map[uint32]*Stmt{ - 1: &Stmt{}, + 1: {}, } testcases := []struct { data []byte diff --git a/utils/byte_slice_pool.go b/utils/byte_slice_pool.go index 8dace1491..650b7d0f8 100644 --- a/utils/byte_slice_pool.go +++ b/utils/byte_slice_pool.go @@ -6,13 +6,11 @@ type ByteSlice struct { B []byte } -var ( - byteSlicePool = sync.Pool{ - New: func() interface{} { - return new(ByteSlice) - }, - } -) +var byteSlicePool = sync.Pool{ + New: func() interface{} { + return new(ByteSlice) + }, +} func ByteSliceGet(length int) *ByteSlice { data := byteSlicePool.Get().(*ByteSlice) diff --git a/utils/bytes_buffer_pool.go b/utils/bytes_buffer_pool.go index 60b820f39..c0b1d0eef 100644 --- a/utils/bytes_buffer_pool.go +++ b/utils/bytes_buffer_pool.go @@ -9,13 +9,11 @@ const ( TooBigBlockSize = 1024 * 1024 * 4 ) -var ( - bytesBufferPool = sync.Pool{ - New: func() interface{} { - return &bytes.Buffer{} - }, - } -) +var bytesBufferPool = sync.Pool{ + New: func() interface{} { + return &bytes.Buffer{} + }, +} func BytesBufferGet() (data *bytes.Buffer) { data = bytesBufferPool.Get().(*bytes.Buffer)