// Reads off from the network buffer and caches bytes. Only reads one column value in the current row. internal static bool TryCreate(SqlMetaDataPriv metadata, TdsParser parser, TdsParserStateObject stateObj, out SqlCachedBuffer buffer) { int cb = 0; ulong plplength; byte[] byteArr; List <byte[]> cachedBytes = new List <byte[]>(); buffer = null; // the very first length is already read. if (!parser.TryPlpBytesLeft(stateObj, out plplength)) { return(false); } // For now we only handle Plp data from the parser directly. Debug.Assert(metadata.metaType.IsPlp, "SqlCachedBuffer call on a non-plp data"); do { if (plplength == 0) { break; } do { cb = (plplength > (ulong)_maxChunkSize) ? _maxChunkSize : (int)plplength; byteArr = new byte[cb]; if (!stateObj.TryReadPlpBytes(ref byteArr, 0, cb, out cb)) { return(false); } Debug.Assert(cb == byteArr.Length); if (cachedBytes.Count == 0) { // Add the Byte order mark if needed if we read the first array AddByteOrderMark(byteArr, cachedBytes); } cachedBytes.Add(byteArr); plplength -= (ulong)cb; } while (plplength > 0); if (!parser.TryPlpBytesLeft(stateObj, out plplength)) { return(false); } } while (plplength > 0); Debug.Assert(stateObj._longlen == 0 && stateObj._longlenleft == 0); buffer = new SqlCachedBuffer(cachedBytes); return(true); }
// Reads off from the network buffer and caches bytes. Only reads one column value in the current row. static internal bool TryCreate(SqlMetaDataPriv metadata, TdsParser parser, TdsParserStateObject stateObj, out SqlCachedBuffer buffer) { int cb = 0; ulong plplength; byte[] byteArr; List<byte[]> cachedBytes = new List<byte[]>(); buffer = null; // the very first length is already read. if (!parser.TryPlpBytesLeft(stateObj, out plplength)) { return false; } // For now we only handle Plp data from the parser directly. Debug.Assert(metadata.metaType.IsPlp, "SqlCachedBuffer call on a non-plp data"); do { if (plplength == 0) break; do { cb = (plplength > (ulong)_maxChunkSize) ? _maxChunkSize : (int)plplength; byteArr = new byte[cb]; if (!stateObj.TryReadPlpBytes(ref byteArr, 0, cb, out cb)) { return false; } Debug.Assert(cb == byteArr.Length); if (cachedBytes.Count == 0) { // Add the Byte order mark if needed if we read the first array AddByteOrderMark(byteArr, cachedBytes); } cachedBytes.Add(byteArr); plplength -= (ulong)cb; } while (plplength > 0); if (!parser.TryPlpBytesLeft(stateObj, out plplength)) { return false; } } while (plplength > 0); Debug.Assert(stateObj._longlen == 0 && stateObj._longlenleft == 0); buffer = new SqlCachedBuffer(cachedBytes); return true; }
// Reads off from the network buffer and caches bytes. Only reads one column value in the current row. internal SqlCachedStream(SqlCachedBuffer sqlBuf) { _cachedBytes = sqlBuf.CachedBytes; }
internal void ReadSqlValue(SqlBuffer value, SqlMetaDataPriv md, int length, TdsParserStateObject stateObj) { if (md.metaType.IsPlp) { length = 0x7fffffff; } switch (md.tdsType) { case 0x22: case 0x25: case 0x2d: case 240: case 0xa5: case 0xad: { byte[] buff = null; if (md.metaType.IsPlp) { stateObj.ReadPlpBytes(ref buff, 0, length); } else { buff = new byte[length]; stateObj.ReadByteArray(buff, 0, length); } value.SqlBinary = new SqlBinary(buff, true); return; } case 0x23: case 0x27: case 0x2f: case 0x63: case 0xef: case 0xe7: case 0xa7: case 0xaf: this.ReadSqlStringValue(value, md.tdsType, length, md.encoding, md.metaType.IsPlp, stateObj); return; case 40: case 0x29: case 0x2a: case 0x2b: this.ReadSqlDateTime(value, md.tdsType, length, md.scale, stateObj); return; case 0x6a: case 0x6c: this.ReadSqlDecimal(value, length, md.precision, md.scale, stateObj); return; case 0xf1: { SqlCachedBuffer buffer2 = new SqlCachedBuffer(md, this, stateObj); value.SqlCachedBuffer = buffer2; return; } } this.ReadSqlValueInternal(value, md.tdsType, md.metaType.TypeId, length, stateObj); }