mysql通信报文结构
类型名字描述
int5bdf4c78156c7953567bb5a0aef2fc53 payload长度 按照the least significant byte first存储,3个字节的payload和1个字节的序列号组合成报文头
intf35d6e602fd7d0f0edfa6f7d103c1b57 序列号
string payload 报文体,长度即为前面指定的payload长度
resultsetrow包
payload
if(null){
0xfb
}else{
protocol::lengthencodedstring
}
resultsetrow包类
public class resultsetrowpacket extends mysqlpacket {
private static final byte null_mark = (byte) 251;
public int columncount;
public list<byte[]> columnvalues;
public resultsetrowpacket() {
}
public resultsetrowpacket(int columncount) {
this.columncount = columncount;
}
@override
public void read(byte[] data) {
mysqlmessage mm = new mysqlmessage(data);
packetlength = mm.readub3();
packetid = mm.read();
for (int i = 0; i < columncount; i++) {
columnvalues.add(mm.readbyteswithlength());
}
}
@override
public void write(bytebuffer buffer) {
bufferutil.writeub3(buffer, calcpacketsize());
buffer.put(packetid);
for (int i = 0; i < columncount; i++) {
byte[] fv = columnvalues.get(i);
if (fv == null) {
buffer.put(null_mark);
} else {
bufferutil.writelength(buffer, fv.length);
buffer.put(fv);
}
}
}
@override
public int calcpacketsize() {
int size = 0;
for (int i = 0; i < columncount; i++) {
byte[] v = columnvalues.get(i);
size += (v == null || v.length == 0) ? 1 : bufferutil.getlength(v);
}
return size;
}
@override
protected string getpacketinfo() {
return "mysql resultset row packet";
}
}
columndefinition包
payload
lenenc_str catalog
lenenc_str schema
lenenc_str table
lenenc_str org_table
lenenc_str name
lenenc_str org_name
lenenc_int length of fixed-length fields [0c]
2 character set
4 column length
1 type
2 flags
1 decimals
2 filler [00] [00]
if command was com_field_list {
lenenc_int length of default-values
string[$len] default values
}
columncount包类
public class columndefinitionpacket extends mysqlpacket {
private static final byte[] default_catalog = "def".getbytes();
private static final byte next_length = 0x0c;
private static final byte[] filler = { 00, 00 };
public byte[] catalog = default_catalog;// always "def"
public byte[] schema;
public byte[] table;
public byte[] orgtable;
public byte[] name;
public byte[] orgname;
public byte nextlength = next_length;// always 0x0c
public int charsetset;
public long length;
public int type;
public int flags;
public byte decimals;
public byte[] filler = filler;
public byte[] defaultvalues;
public void read(byte[] data) {
mysqlmessage mm = new mysqlmessage(data);
this.packetlength = mm.readub3();
this.packetid = mm.read();
this.catalog = mm.readbyteswithlength();
this.schema = mm.readbyteswithlength();
this.table = mm.readbyteswithlength();
this.orgtable = mm.readbyteswithlength();
this.name = mm.readbyteswithlength();
this.orgname = mm.readbyteswithlength();
this.nextlength = mm.read();
this.charsetset = mm.readub2();
this.length = mm.readub4();
this.type = mm.read() & 0xff;
this.flags = mm.readub2();
this.decimals = mm.read();
this.filler = mm.readbytes(2);
if (mm.hasremaining()) {
this.defaultvalues = mm.readbyteswithlength();
}
}
@override
public void write(bytebuffer buffer) {
int size = calcpacketsize();
bufferutil.writeub3(buffer, size);
buffer.put(packetid);
bufferutil.writewithlength(buffer, catalog, (byte) 0);
bufferutil.writewithlength(buffer, schema, (byte) 0);
bufferutil.writewithlength(buffer, table, (byte) 0);
bufferutil.writewithlength(buffer, orgtable, (byte) 0);
bufferutil.writewithlength(buffer, name, (byte) 0);
bufferutil.writewithlength(buffer, orgname, (byte) 0);
buffer.put(next_length);
bufferutil.writeub2(buffer, charsetset);
bufferutil.writeub4(buffer, length);
buffer.put((byte) (type & 0xff));
bufferutil.writeub2(buffer, flags);
buffer.put(decimals);
buffer.put(filler);
if (defaultvalues != null) {
//only use for show columns
bufferutil.writewithlength(buffer, defaultvalues);
}
}
@override
public int calcpacketsize() {
int size = (catalog == null ? 1 : bufferutil.getlength(catalog));
size += (schema == null ? 1 : bufferutil.getlength(schema));
size += (table == null ? 1 : bufferutil.getlength(table));
size += (orgtable == null ? 1 : bufferutil.getlength(orgtable));
size += (name == null ? 1 : bufferutil.getlength(name));
size += (orgname == null ? 1 : bufferutil.getlength(orgname));
size += 13;
if (defaultvalues != null) {
size += bufferutil.getlength(defaultvalues);
}
return size;
}
@override
protected string getpacketinfo() {
return "mysql column definition packet";
}
}
columncount包
payload
protocol::lengthencodedinteger
columncount包类
public class columncountpacket extends mysqlpacket {
public int columncount;
public void read(byte[] data) {
mysqlmessage mm = new mysqlmessage(data);
this.packetlength = mm.readub3();
this.packetid = mm.read();
this.columncount = (int) mm.readlength();
}
@override
public void write(bytebuffer buffer) {
int size = calcpacketsize();
bufferutil.writeub3(buffer, size);
buffer.put(packetid);
bufferutil.writelength(buffer, columncount);
}
@override
public int calcpacketsize() {
int size = bufferutil.getlength(columncount);
return size;
}
@override
protected string getpacketinfo() {
return "mysql column count packet";
}
}