public override void Parse(MySqlStreamReader reader) { //reset final result _parseResult = null; while (!StepParse(reader)) { ; } //StepParse() return true if //1. need more data or //2. finish reader.ClearReadBuffer(); if (_needMoreData) { //at any state if need more buffer //then stop parsing and return if (_supportPartialRelease) { if (_rows != null && _rows.Count > 0) { _parseResult = new MySqlTableResult(_tableHeader, _rows.ToArray()) { HasFollower = true }; } if (_generateResultMode) { //generate new result #if DEBUG if (_rows != null) { } #endif _rows.Clear(); } } } else if (_parsingState == ResultPacketState.ShouldEnd) { //reset reader.Reset(); _parsingState = ResultPacketState.Header_Header; } }
bool Parse_Row_Content(MySqlStreamReader reader) { if (!reader.Ensure(_currentHeader.ContentLength)) { return(_needMoreData = true); } if (_currentHeader.ContentLength > Packet.MAX_PACKET_LENGTH) { throw new NotSupportedException("???"); } else if (_currentHeader.ContentLength == Packet.MAX_PACKET_LENGTH) { //can't complete in this round //so store data into temp extra large buffer //and set isLargeData= true StoreBuffer(reader, (int)_currentHeader.ContentLength); _isLargeData = true; //we still in the row content state _parsingState = ResultPacketState.Row_Header; return(false); } //-------------------------------- if (_generateResultMode) { //this is normal mode (opposite to JustFlushOutMode) //in this mode we parse packet content //and add it to the output rows //---------------------------------- //in this version row buffer len must < int.MaxLength if (_currentHeader.ContentLength > int.MaxValue) { throw new NotSupportedException("not support this length"); } //------------------------------------ if (_isLargeData) { if (_ms == null) { //it should not be null here throw new NotSupportedException(); //? } _ms.Write(reader.ReadBuffer((int)_currentHeader.ContentLength), 0, (int)_currentHeader.ContentLength); _rows.Add(new DataRowPacket(_currentHeader, _ms.ToArray())); #if NET20 _ms.Close(); #endif _ms.Dispose(); _ms = null; _isLargeData = false; //reset } else { _rows.Add(new DataRowPacket(_currentHeader, reader.ReadBuffer((int)_currentHeader.ContentLength))); reader.ClearReadBuffer(); } } else { //just flush data*** //not create data row if (_currentHeader.ContentLength > int.MaxValue) { throw new Exception("not support content length> int.MaxValue"); } reader.SkipForward((int)_currentHeader.ContentLength); } //----------------------------------------------------------------------- //after this row, next state = next row header _parsingState = ResultPacketState.Row_Header; return(false); }