? ?mysql通信報文結構
類型 | 名字 | 描述 |
---|---|---|
int | payload長度 | 按照the least significant byte first存儲,3個字節的payload和1個字節的序列號組合成報文頭 |
int | 序列號 | |
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?<p style="margin: 0.8em 0px; padding: 0px; box-sizing: border-box; font-weight: 100; color: rgb(85, 85, 85); font-family: " microsoft yahei line-height: white-space: normal widows: background-color: rgb>ColumnDefinition包</p> <p>Payload</p> <pre class="brush:php;toolbar:false">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"; ????} }
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END