首頁  >  文章  >  資料庫  >  mysql 協定的ColumnDefinition套件及解析程式碼詳情

mysql 協定的ColumnDefinition套件及解析程式碼詳情

黄舟
黄舟原創
2017-03-07 13:24:271312瀏覽


git

#https://github.com/sea-boat/mysql-protocol


概況ColumnDefinition包屬於服務端傳回ResultSet時的其中一部分包,用於描述結果集的欄位資訊。

mysql通訊封包結構

類型

名字


描述

####### #########int5bdf4c78156c7953567bb5a0aef2fc53######payload長度#######按照the least significant byte first存儲,3個字節的payload和1個字節的序號組合成報文頭############intf35d6e602fd7d0f0edfa6f7d103c1b57#######序號####################string ######payload######報文體,長度即為前面指定的payload長度###############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 set4              
column length1              
type2              
flags1              
decimals2              
filler [00] [00]  if command was COM_FIELD_LIST {
lenenc_int     
length of default-valuesstring[$len]   
default values
  }
###更多詳情: http://dev.mysql.com/doc/internals/en/com-query-response.html#column-definition## ####ColumnCount套件類別###
/**
 * 
 * <pre class="brush:php;toolbar:false"><b>column definition command packet.</b>
* @author *
seaboat
*
<b>email: </b>849586227@qq.com
*
<b>blog: </b>http://www.php.cn/;/pre>
 * @version 1.0
 * @see http://www.php.cn/
 */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";
    }

}
### 以上就是mysql 協定的ColumnDefinition套件及解析程式碼詳情的內容,更多相關內容請關注PHP中文網(www.php.cn)! ################
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn