mirror of
https://github.com/zr-hebo/sniffer-agent.git
synced 2025-10-09 13:59:22 +08:00
76 lines
1.3 KiB
Go
76 lines
1.3 KiB
Go
package mysql
|
|
|
|
import (
|
|
"fmt"
|
|
)
|
|
|
|
const (
|
|
PACKET_OK = 0
|
|
PACKET_EOF = 254
|
|
PACKET_ERR = 255
|
|
)
|
|
|
|
func lenencInt(bytesVal []byte) (val int64) {
|
|
if bytesVal == nil || len(bytesVal) < 1 {
|
|
val = -1
|
|
return
|
|
}
|
|
|
|
fb := bytesVal[0]
|
|
var offset int64
|
|
switch {
|
|
case fb < 251:
|
|
val = int64(fb)
|
|
|
|
case fb == 252:
|
|
numLen := int64(2)
|
|
offset = 1+numLen
|
|
val = int64(bytesToInt(bytesVal[1:offset]))
|
|
|
|
case fb == 253:
|
|
numLen := int64(3)
|
|
offset = 1+numLen
|
|
val = int64(bytesToInt(bytesVal[1:offset]))
|
|
|
|
case fb == 254:
|
|
numLen := int64(8)
|
|
offset = 1+numLen
|
|
val = int64(bytesToInt(bytesVal[1:offset]))
|
|
|
|
default:
|
|
val = -1
|
|
}
|
|
return
|
|
}
|
|
|
|
func parseResponseHeader(payload []byte) (ok, val int64, err error) {
|
|
if payload == nil || len(payload) < 1 {
|
|
err = fmt.Errorf("no bytes to parse")
|
|
return
|
|
}
|
|
|
|
fmt.Printf("%#v\n", payload)
|
|
defer func() {
|
|
fmt.Printf("%#v\n", ok)
|
|
fmt.Printf("%#v\n", val)
|
|
}()
|
|
|
|
if payload[0] == PACKET_OK && len(payload)>=7 {
|
|
ok = 1
|
|
val = lenencInt(payload[1:])
|
|
|
|
} else if len(payload) > 4 {
|
|
payload = payload[4:]
|
|
if payload[0] == PACKET_ERR && len(payload)>3 {
|
|
// set not ok and mysql execute error-code
|
|
ok = 0
|
|
val = int64(bytesToIntSmallEndian(payload[1:3]))
|
|
}
|
|
|
|
} else {
|
|
err = fmt.Errorf("invalid response packet")
|
|
}
|
|
return
|
|
}
|
|
|