亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

MySql協議詳解-CRUD與Result篇

2019-11-10 16:54:58
字體:
來源:轉載
供稿:網友
https://my.oschina.net/alchemystar/blog/834150

MySQL協議詳解-CRUD與Result篇

Com_query報文

一般對DB的CRUD操作都由com_query報文封裝并發送給DB。com_query報文如下圖所示: querypacketPacketLength:3byte表示body長度,防"粘包"。sequenceId:1byte防串包。body部分:是一個以0x00結尾的字符串,這個字符串就是想要執行的SQL,實際操作中即是一直讀body直到讀到一個0x00皆為的字符串即停止。

insert,update和delete

如果SQL是insert、update或者是delete,則返回的是對應的okay或者error報文。okay報文的類表示:

public class OkPacket extends MySQLPacket { public static final byte FIELD_COUNT = 0x00; public static final byte[] OK = new byte[] { 7, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0 }; public static final byte[] AUTH_OK = new byte[] { 7, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0 }; public byte fieldCount = FIELD_COUNT; public long affectedRows; public long insertId; public int serverStatus; public int warningCount; public byte[] message;}

error報文的類表示:

public class ErrorPacket extends MySQLPacket { public static final byte FIELD_COUNT = (byte) 0xff; PRivate static final byte SQLSTATE_MARKER = (byte) '#'; private static final byte[] DEFAULT_SQLSTATE = "HY000".getBytes(); public byte fieldCount = FIELD_COUNT; public int errno; public byte mark = SQLSTATE_MARKER; public byte[] sqlState = DEFAULT_SQLSTATE; public byte[] message;}

Select和ResultSet報文

如果執行的SQL是select語句,則返回的報文比較復雜,不過筆者已經整理成圖的形式。

Row報文

首先ResultSet是由很多行(Row)組成,每一行(Row)就表示了一條記錄,Row格式如下所示:rowpacket每一行(row)又分好field_count個字段,這個field_count將會在比Row還高一層的Result格式中描述,下面有詳解。每一個字段都是一個length-value對,length長度是3byte,其讀取方法很特殊,現在直接用代碼表述:

public int readUB3() { final byte[] b = this.data; int i = b[position++] & 0xff; i |= (b[position++] & 0xff) << 8; i |= (b[position++] & 0xff) << 16; return i; }

獲取了length長度之后,則可以根據此讀出來后面的value。value的類型也會在后面的Resutl格式中描述。

ResultSet格式

嚴格來說ResultSet是由多個獨立的報文以協議的形式組織起來,現直接放出ResultSet的協議格式圖: resultset從上圖中可以看到,當客戶端發送一個select的com_query包后,DB會按照下列步驟返回:Step1:返回一個ResultSetHeader報文,其中包含了fieldCount,在此圖就不例出了,現只給出代碼定義。

public class ResultSetHeaderPacket extends MySQLPacket { public int fieldCount; public long extra;}

Step2:根據讀取到的fieldCount來在接下來的byte流里面讀取fieldCount個FiledPacket報文,FieldPacket報文的代碼定義:

public class FieldPacket extends MySQLPacket { private static final byte[] DEFAULT_CATALOG = "def".getBytes(); private static final byte[] FILLER = new byte[2]; public byte[] catalog = DEFAULT_CATALOG; public byte[] db; public byte[] table; public byte[] orgTable; public byte[] name; public byte[] orgName; public int charsetIndex; public long length; public int type; public int flags; public byte decimals; public byte[] definition;}

具體邏輯請參照githubStep3:再讀取一個eof包表示field包流的結束eof包的代碼定義:

public class EOFPacket extends MySQLPacket { public static final byte FIELD_COUNT = (byte) 0xfe; public byte fieldCount = FIELD_COUNT; public int warningCount; public int status = 2;

Step4:一直讀Row,直到讀到last eof位置,Row格式已經在上面給過。Step5:如果讀到任何一個error包后,此此讀取結束,拋出錯誤。Step6:值得注意的是,如果eof中的status & SERVER_MORE_RESULT_EXISTS不為0,表明還有ResultSet。則繼續返回到fieldCount階段進行下一步的讀取。Step7:至此,整個ResultSet讀取完畢。下面給出上述過程的java代碼(基于Netty):

private boolean handleResultSet(BinaryPacket bin, CmdType cmdType) { boolean result = false; int type = bin.data[0]; switch (type) { case ErrorPacket.FIELD_COUNT: // 重置狀態,且告訴上層當前select已經處理完畢 resetSelect(); result = true; ErrorPacket err = new ErrorPacket(); err.read(bin); // write(bin,cmdType); getResponseHandler().errorResponse(bin); logger.error("handleResultSet errorMessage:" + new String(err.message)); break; case EOFPacket.FIELD_COUNT: EOFPacket eof = new EOFPacket(); eof.read(bin); if (selectState == BackendConnState.RESULT_SET_FIELDS) { // logger.info("eof"); // 推進狀態 需要步進兩次狀態,先到field_eof,再到row selectStateStep(); selectStateStep(); // 給FieldList增加eof addToFieldList(bin); getResponseHandler().fieldListResponse(fieldList); } else { if (eof.hasStatusFlag(MySQLPacket.SERVER_MORE_RESULTS_EXISTS)) { // 重置為select的初始狀態,但是還是處在select mode下 selectState = BackendConnState.RESULT_SET_FIELD_COUNT; } else { // 重置,且告訴上層當前select已經處理完畢 resetSelect(); result = true; } getResponseHandler().lastEofResponse(bin); } break; default: switch (selectState) { case BackendConnState.RESULT_SET_FIELD_COUNT: selectStateStep(); addToFieldList(bin); break; case BackendConnState.RESULT_SET_FIELDS: addToFieldList(bin); break; case BackendConnState.RESULT_SET_ROW: getResponseHandler().rowResponse(bin); break; } } return result; }

GitHub鏈接

https://github.com/alchemystar/Lancelot.git


上一篇:單向鏈表例題

下一篇:藍橋杯 楊輝三角

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
性色av一区二区三区| 亚洲国产精品久久久久久| 国产偷国产偷亚洲清高网站| 91美女片黄在线观看游戏| 中文字幕在线国产精品| 国产男女猛烈无遮挡91| 亚洲久久久久久久久久久| www.日韩免费| 欧美华人在线视频| 亚洲aaa激情| 欧美大片在线影院| 国产成人久久久精品一区| 91精品免费视频| 成人性生交大片免费观看嘿嘿视频| 欧美精品精品精品精品免费| 日韩精品亚洲精品| 成人淫片在线看| 国产97色在线|日韩| 性色av一区二区咪爱| 国产亚洲视频中文字幕视频| 久久综合五月天| 亚洲欧美日韩成人| 国产女人精品视频| 亚洲一区av在线播放| 国产精品av在线播放| 精品久久久中文| 欧美第一黄色网| 久久久久久成人| 成人黄色免费看| 青草成人免费视频| 亚洲综合精品伊人久久| 中文字幕亚洲欧美日韩在线不卡| 亚洲国产中文字幕久久网| 国产成人精品最新| 日韩高清电影好看的电视剧电影| 国产精品视频永久免费播放| 91亚洲一区精品| 一区二区三区美女xx视频| 国产欧美日韩亚洲精品| 美女啪啪无遮挡免费久久网站| 亚洲品质视频自拍网| 欧美日本中文字幕| 96国产粉嫩美女| 亚洲精品一区二区三区不| 日韩免费中文字幕| 日本久久久久亚洲中字幕| 中文在线资源观看视频网站免费不卡| 国产九九精品视频| 91产国在线观看动作片喷水| 欧美成人中文字幕在线| 欧美亚洲在线视频| 日韩激情视频在线| 日韩成人小视频| 欧美激情一区二区三区成人| 中文字幕在线视频日韩| 欧美日韩国内自拍| 亚洲精品videossex少妇| 丝袜一区二区三区| 久久久久久久久久久亚洲| 亚洲专区中文字幕| 性欧美办公室18xxxxhd| 国产视频自拍一区| 成人久久18免费网站图片| 亚洲精品网站在线播放gif| 久久成人综合视频| 亚洲国产精品成人av| 亚洲第一区第一页| 亚洲自拍另类欧美丝袜| 午夜精品久久久99热福利| 一区二区三区美女xx视频| 欧美综合第一页| 久久久久久久av| 久久全球大尺度高清视频| 亚洲国产日韩一区| 国产精品私拍pans大尺度在线| 精品视频久久久久久久| 中文字幕精品av| 一本色道久久88综合亚洲精品ⅰ| 538国产精品一区二区免费视频| 久久久亚洲福利精品午夜| 亚洲国产古装精品网站| 国产综合视频在线观看| 亚洲aa中文字幕| 亚洲人免费视频| 久久精品2019中文字幕| 亚洲精品网址在线观看| 性欧美视频videos6一9| 国产精品永久免费视频| 亚洲女人被黑人巨大进入| 久久国内精品一国内精品| 日韩成人在线网站| 欧美亚洲国产另类| 亚洲男女自偷自拍图片另类| 亚洲国产天堂久久综合| 91色视频在线观看| 97在线观看视频| 欧美香蕉大胸在线视频观看| 欧美一级大胆视频| 日韩欧美亚洲成人| 日韩电影免费在线观看| 精品亚洲一区二区| 国产精品一区二区三区成人| 欧美激情一区二区三区成人| 日韩中文av在线| 欧美日韩电影在线观看| 欧美成人免费一级人片100| 亚洲一区二区免费在线| 久久午夜a级毛片| 色综合久综合久久综合久鬼88| 91免费的视频在线播放| 欧美老肥婆性猛交视频| 精品美女久久久久久免费| 欧美激情视频在线免费观看 欧美视频免费一| 亚洲国产精品电影| 美日韩精品视频免费看| 亚洲国产毛片完整版| 日韩在线免费av| 欧美一级大片视频| 国产精品中文字幕在线| 日韩av电影中文字幕| 国产精品视频一区二区三区四| 亚洲精品videossex少妇| 欧美性极品xxxx娇小| 夜夜嗨av一区二区三区四区| 国产成人在线亚洲欧美| 国产精品色视频| 中文字幕日韩欧美在线视频| 日韩a**站在线观看| 国产精品久久久久久久久久东京| 午夜精品一区二区三区在线视频| www.欧美精品一二三区| 国产精品中文字幕在线| 国产91|九色| 欧美大片欧美激情性色a∨久久| 色小说视频一区| 欧美巨猛xxxx猛交黑人97人| 亚洲精品日韩激情在线电影| 亚洲偷熟乱区亚洲香蕉av| 2025国产精品视频| 日韩久久免费电影| 国产成人avxxxxx在线看| 亚洲日韩欧美视频一区| 91精品国产99久久久久久| 久久理论片午夜琪琪电影网| 6080yy精品一区二区三区| www.日韩av.com| 欧美日韩午夜视频在线观看| 亚洲a中文字幕| 亚洲精品少妇网址| 亚洲自拍偷拍在线| 日韩精品在线观看视频| 亚洲欧美国产一区二区三区| 69影院欧美专区视频| 欧美日韩国产综合视频在线观看中文| 免费91麻豆精品国产自产在线观看| 青草成人免费视频| 国产成人午夜视频网址| 日韩在线视频网站| 在线观看欧美日韩| 国产精品一区二区三区免费视频| 91沈先生在线观看| 国模视频一区二区| 欧美成人全部免费| 激情懂色av一区av二区av|