Skip to content

Commit 6bb9e67

Browse files
authored
zeroalloc: don't use unsafe.Pointer (#959)
* zeroalloc: don't use unsafe.Pointer * replace siddontang/go/hack with zeroalloc * remove rest of siddontang/go dependencies
1 parent c6114ee commit 6bb9e67

14 files changed

+49
-51
lines changed

client/resp.go

+3-4
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import (
99
"fmt"
1010

1111
"github.com/pingcap/errors"
12-
"github.com/siddontang/go/hack"
1312

1413
. "github.com/go-mysql-org/go-mysql/mysql"
1514
"github.com/go-mysql-org/go-mysql/utils"
@@ -78,11 +77,11 @@ func (c *Conn) handleErrorPacket(data []byte) error {
7877
if c.capability&CLIENT_PROTOCOL_41 > 0 {
7978
// skip '#'
8079
pos++
81-
e.State = hack.String(data[pos : pos+5])
80+
e.State = utils.ByteSliceToString(data[pos : pos+5])
8281
pos += 5
8382
}
8483

85-
e.Message = hack.String(data[pos:])
84+
e.Message = utils.ByteSliceToString(data[pos:])
8685

8786
return e
8887
}
@@ -372,7 +371,7 @@ func (c *Conn) readResultColumns(result *Result) (err error) {
372371
return err
373372
}
374373

375-
result.FieldNames[hack.String(result.Fields[i].Name)] = i
374+
result.FieldNames[utils.ByteSliceToString(result.Fields[i].Name)] = i
376375

377376
i++
378377
}

driver/driver.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ import (
1717

1818
"github.com/go-mysql-org/go-mysql/client"
1919
"github.com/go-mysql-org/go-mysql/mysql"
20+
"github.com/go-mysql-org/go-mysql/utils"
2021
"github.com/pingcap/errors"
21-
"github.com/siddontang/go/hack"
2222
)
2323

2424
var customTLSMutex sync.Mutex
@@ -352,7 +352,7 @@ func newRows(r *mysql.Resultset) (*rows, error) {
352352
rs.columns = make([]string, len(r.Fields))
353353

354354
for i, f := range r.Fields {
355-
rs.columns[i] = hack.String(f.Name)
355+
rs.columns[i] = utils.ByteSliceToString(f.Name)
356356
}
357357
rs.step = 0
358358

driver/driver_options_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import (
1616
"time"
1717

1818
"github.com/pingcap/errors"
19-
"github.com/siddontang/go/log"
19+
"github.com/siddontang/go-log/log"
2020
"github.com/stretchr/testify/require"
2121

2222
"github.com/go-mysql-org/go-mysql/client"

go.mod

-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ require (
1515
github.com/pingcap/errors v0.11.5-0.20240311024730-e056997136bb
1616
github.com/pingcap/tidb/pkg/parser v0.0.0-20241118164214-4f047be191be
1717
github.com/shopspring/decimal v1.2.0
18-
github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726
1918
github.com/siddontang/go-log v0.0.0-20180807004314-8d05993dda07
2019
github.com/stretchr/testify v1.8.4
2120
)

go.sum

-2
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,6 @@ github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjR
4848
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
4949
github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ=
5050
github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
51-
github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726 h1:xT+JlYxNGqyT+XcU8iUrN18JYed2TvG9yN5ULG2jATM=
52-
github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw=
5351
github.com/siddontang/go-log v0.0.0-20180807004314-8d05993dda07 h1:oI+RNwuC9jF2g2lP0u0cVEEZrc/AYBCuFdvwrLWM/6Q=
5452
github.com/siddontang/go-log v0.0.0-20180807004314-8d05993dda07/go.mod h1:yFdBgwXP24JziuRl2NMUahT7nGLNOKi1SIiFxMttVD4=
5553
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=

mysql/mysql_gtid.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ import (
1010
"strconv"
1111
"strings"
1212

13+
"github.com/go-mysql-org/go-mysql/utils"
1314
"github.com/google/uuid"
1415
"github.com/pingcap/errors"
15-
"github.com/siddontang/go/hack"
1616
)
1717

1818
// Like MySQL GTID Interval struct, [start, stop), left closed and right open
@@ -318,7 +318,7 @@ func (s *UUIDSet) MinusInterval(in IntervalSlice) {
318318
}
319319

320320
func (s *UUIDSet) String() string {
321-
return hack.String(s.Bytes())
321+
return utils.ByteSliceToString(s.Bytes())
322322
}
323323

324324
func (s *UUIDSet) encode(w io.Writer) {
@@ -571,7 +571,7 @@ func (s *MysqlGTIDSet) String() string {
571571
sep = ","
572572
}
573573

574-
return hack.String(buf.Bytes())
574+
return utils.ByteSliceToString(buf.Bytes())
575575
}
576576

577577
func (s *MysqlGTIDSet) Encode() []byte {

mysql/resultset.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import (
55
"strconv"
66
"sync"
77

8+
"github.com/go-mysql-org/go-mysql/utils"
89
"github.com/pingcap/errors"
9-
"github.com/siddontang/go/hack"
1010
)
1111

1212
type StreamingType int
@@ -263,7 +263,7 @@ func (r *Resultset) GetString(row, column int) (string, error) {
263263
case string:
264264
return v, nil
265265
case []byte:
266-
return hack.String(v), nil
266+
return utils.ByteSliceToString(v), nil
267267
case int, int8, int16, int32, int64,
268268
uint, uint8, uint16, uint32, uint64:
269269
return fmt.Sprintf("%d", v), nil

mysql/resultset_helper.go

+7-6
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ import (
55
"strconv"
66

77
"github.com/pingcap/errors"
8-
"github.com/siddontang/go/hack"
8+
9+
"github.com/go-mysql-org/go-mysql/utils"
910
)
1011

1112
func FormatTextValue(value interface{}) ([]byte, error) {
@@ -37,7 +38,7 @@ func FormatTextValue(value interface{}) ([]byte, error) {
3738
case []byte:
3839
return v, nil
3940
case string:
40-
return hack.Slice(v), nil
41+
return utils.StringToByteSlice(v), nil
4142
case nil:
4243
return nil, nil
4344
default:
@@ -74,7 +75,7 @@ func formatBinaryValue(value interface{}) ([]byte, error) {
7475
case []byte:
7576
return v, nil
7677
case string:
77-
return hack.Slice(v), nil
78+
return utils.StringToByteSlice(v), nil
7879
default:
7980
return nil, errors.Errorf("invalid type %T", value)
8081
}
@@ -128,7 +129,7 @@ func BuildSimpleTextResultset(names []string, values [][]interface{}) (*Resultse
128129

129130
if len(values) == 0 {
130131
for i, name := range names {
131-
r.Fields[i] = &Field{Name: hack.Slice(name), Charset: 33, Type: MYSQL_TYPE_NULL}
132+
r.Fields[i] = &Field{Name: utils.StringToByteSlice(name), Charset: 33, Type: MYSQL_TYPE_NULL}
132133
}
133134
return r, nil
134135
}
@@ -145,7 +146,7 @@ func BuildSimpleTextResultset(names []string, values [][]interface{}) (*Resultse
145146
return nil, errors.Trace(err)
146147
}
147148
if r.Fields[j] == nil {
148-
r.Fields[j] = &Field{Name: hack.Slice(names[j]), Type: typ}
149+
r.Fields[j] = &Field{Name: utils.StringToByteSlice(names[j]), Type: typ}
149150
err = formatField(r.Fields[j], value)
150151
if err != nil {
151152
return nil, errors.Trace(err)
@@ -213,7 +214,7 @@ func BuildSimpleBinaryResultset(names []string, values [][]interface{}) (*Result
213214
if i == 0 {
214215
field := &Field{Type: typ}
215216
r.Fields[j] = field
216-
field.Name = hack.Slice(names[j])
217+
field.Name = utils.StringToByteSlice(names[j])
217218

218219
if err = formatField(field, value); err != nil {
219220
return nil, errors.Trace(err)

mysql/util.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ import (
1616
"time"
1717

1818
"github.com/Masterminds/semver"
19+
"github.com/go-mysql-org/go-mysql/utils"
1920
"github.com/pingcap/errors"
20-
"github.com/siddontang/go/hack"
2121
)
2222

2323
func Pstack() string {
@@ -375,7 +375,7 @@ var (
375375
func Escape(sql string) string {
376376
dest := make([]byte, 0, 2*len(sql))
377377

378-
for _, w := range hack.Slice(sql) {
378+
for _, w := range utils.StringToByteSlice(sql) {
379379
if c := EncodeMap[w]; c == DONTESCAPE {
380380
dest = append(dest, w)
381381
} else {

replication/json_binary.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ import (
44
"fmt"
55
"math"
66

7+
"github.com/go-mysql-org/go-mysql/utils"
78
"github.com/goccy/go-json"
89
"github.com/pingcap/errors"
9-
"github.com/siddontang/go/hack"
1010

1111
. "github.com/go-mysql-org/go-mysql/mysql"
1212
)
@@ -243,7 +243,7 @@ func (d *jsonBinaryDecoder) decodeObjectOrArray(data []byte, isSmall bool, isObj
243243
return nil
244244
}
245245

246-
keys[i] = hack.String(data[keyOffset : keyOffset+keyLength])
246+
keys[i] = utils.ByteSliceToString(data[keyOffset : keyOffset+keyLength])
247247
}
248248
}
249249

@@ -411,7 +411,7 @@ func (d *jsonBinaryDecoder) decodeString(data []byte) string {
411411

412412
data = data[n:]
413413

414-
v := hack.String(data[0:l])
414+
v := utils.ByteSliceToString(data[0:l])
415415
return v
416416
}
417417

@@ -439,7 +439,7 @@ func (d *jsonBinaryDecoder) decodeOpaque(data []byte) interface{} {
439439
case MYSQL_TYPE_DATE, MYSQL_TYPE_DATETIME, MYSQL_TYPE_TIMESTAMP:
440440
return d.decodeDateTime(data)
441441
default:
442-
return hack.String(data)
442+
return utils.ByteSliceToString(data)
443443
}
444444
}
445445

replication/row_event.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ import (
1111

1212
"github.com/pingcap/errors"
1313
"github.com/shopspring/decimal"
14-
"github.com/siddontang/go/hack"
1514

1615
. "github.com/go-mysql-org/go-mysql/mysql"
16+
"github.com/go-mysql-org/go-mysql/utils"
1717
)
1818

1919
var errMissingTableMapEvent = errors.New("invalid table id, no corresponding table map event")
@@ -1393,7 +1393,7 @@ func (e *RowsEvent) decodeValue(data []byte, tp byte, meta uint16, isPartial boo
13931393
var d []byte
13941394
d, err = e.decodeJsonBinary(data[meta:n])
13951395
if err == nil {
1396-
v = hack.String(d)
1396+
v = utils.ByteSliceToString(d)
13971397
}
13981398
}
13991399
}
@@ -1417,11 +1417,11 @@ func decodeString(data []byte, length int) (v string, n int) {
14171417
length = int(data[0])
14181418

14191419
n = length + 1
1420-
v = hack.String(data[1:n])
1420+
v = utils.ByteSliceToString(data[1:n])
14211421
} else {
14221422
length = int(binary.LittleEndian.Uint16(data[0:]))
14231423
n = length + 2
1424-
v = hack.String(data[2:n])
1424+
v = utils.ByteSliceToString(data[2:n])
14251425
}
14261426

14271427
return

server/command.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88
"github.com/go-mysql-org/go-mysql/mysql"
99
. "github.com/go-mysql-org/go-mysql/mysql"
1010
"github.com/go-mysql-org/go-mysql/replication"
11-
"github.com/siddontang/go/hack"
11+
"github.com/go-mysql-org/go-mysql/utils"
1212
)
1313

1414
// Handler is what a server needs to implement the client-server protocol
@@ -81,23 +81,23 @@ func (c *Conn) dispatch(data []byte) interface{} {
8181
c.Conn = nil
8282
return noResponse{}
8383
case COM_QUERY:
84-
if r, err := c.h.HandleQuery(hack.String(data)); err != nil {
84+
if r, err := c.h.HandleQuery(utils.ByteSliceToString(data)); err != nil {
8585
return err
8686
} else {
8787
return r
8888
}
8989
case COM_PING:
9090
return nil
9191
case COM_INIT_DB:
92-
if err := c.h.UseDB(hack.String(data)); err != nil {
92+
if err := c.h.UseDB(utils.ByteSliceToString(data)); err != nil {
9393
return err
9494
} else {
9595
return nil
9696
}
9797
case COM_FIELD_LIST:
9898
index := bytes.IndexByte(data, 0x00)
99-
table := hack.String(data[0:index])
100-
wildcard := hack.String(data[index+1:])
99+
table := utils.ByteSliceToString(data[0:index])
100+
wildcard := utils.ByteSliceToString(data[index+1:])
101101

102102
if fs, err := c.h.HandleFieldList(table, wildcard); err != nil {
103103
return err
@@ -108,7 +108,7 @@ func (c *Conn) dispatch(data []byte) interface{} {
108108
c.stmtID++
109109
st := new(Stmt)
110110
st.ID = c.stmtID
111-
st.Query = hack.String(data)
111+
st.Query = utils.ByteSliceToString(data)
112112
var err error
113113
if st.Params, st.Columns, st.Context, err = c.h.HandleStmtPrepare(st.Query); err != nil {
114114
return err

server/conn.go

+5-7
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ import (
55
"net"
66
"sync/atomic"
77

8-
"github.com/siddontang/go/sync2"
9-
108
. "github.com/go-mysql-org/go-mysql/mysql"
119
"github.com/go-mysql-org/go-mysql/packet"
1210
)
@@ -35,7 +33,7 @@ type Conn struct {
3533
stmts map[uint32]*Stmt
3634
stmtID uint32
3735

38-
closed sync2.AtomicBool
36+
closed atomic.Bool
3937
}
4038

4139
var baseConnID uint32 = 10000
@@ -61,7 +59,7 @@ func NewConn(conn net.Conn, user string, password string, h Handler) (*Conn, err
6159
stmts: make(map[uint32]*Stmt),
6260
salt: RandomBuf(20),
6361
}
64-
c.closed.Set(false)
62+
c.closed.Store(false)
6563

6664
if err := c.handshake(); err != nil {
6765
c.Close()
@@ -89,7 +87,7 @@ func NewCustomizedConn(conn net.Conn, serverConf *Server, p CredentialProvider,
8987
stmts: make(map[uint32]*Stmt),
9088
salt: RandomBuf(20),
9189
}
92-
c.closed.Set(false)
90+
c.closed.Store(false)
9391

9492
if err := c.handshake(); err != nil {
9593
c.Close()
@@ -126,12 +124,12 @@ func (c *Conn) handshake() error {
126124
}
127125

128126
func (c *Conn) Close() {
129-
c.closed.Set(true)
127+
c.closed.Store(true)
130128
c.Conn.Close()
131129
}
132130

133131
func (c *Conn) Closed() bool {
134-
return c.closed.Get()
132+
return c.closed.Load()
135133
}
136134

137135
func (c *Conn) GetUser() string {

0 commit comments

Comments
 (0)