public static T Deserialize <T>(Stream stream, IFormatterResolver resolver, bool readStrict) { if (resolver == null) { resolver = DefaultResolver; } var formatter = resolver.GetFormatterWithVerify <T>(); if (!readStrict) { #if NETSTANDARD && !NET45 var ms = stream as MemoryStream; if (ms != null) { // optimize for MemoryStream ArraySegment <byte> buffer; if (ms.TryGetBuffer(out buffer)) { int readSize; return(formatter.Deserialize(buffer.Array, buffer.Offset, resolver, out readSize)); } } #endif // no else. { var buffer = InternalMemoryPool.GetBuffer(); FillFromStream(stream, ref buffer); int readSize; return(formatter.Deserialize(buffer, 0, resolver, out readSize)); } } { int _; var bytes = MessagePackBinary.ReadMessageBlockFromStreamUnsafe(stream, false, out _); int readSize; return(formatter.Deserialize(bytes, 0, resolver, out readSize)); } }
public BinaryResultSet Execute(int statementId, params object[] parameters) // how to avoid boxing? { var stream = client.GetStream(); var readWriteBuffer = InternalMemoryPool.GetBuffer(); var writer = PacketWriter.Create(readWriteBuffer); ProtocolWriter.WriteExecuteStatement(ref writer, statementId, parameters); var reader = SyncWriteAndRead(ref writer, 0, stream); // COM_STMT_PREPARE_OK on success, ERR_Packet otherwise if (reader.IsErrorPacket()) { throw ErrorPacket.Parse(ref reader).ToMySqlException(); } // TODO: Ok or ResultSet? var set = ProtocolReader.ReadBinaryResultSet(ref reader); return(set); }
public TextResultSet Query(FormattableString query) { if (query.ArgumentCount == 0) { return(Query(query.Format)); } var stream = client.GetStream(); var readWriteBuffer = InternalMemoryPool.GetBuffer(); var writer = PacketWriter.Create(readWriteBuffer); var charBuffer = InternalMemoryPool.GetCharBuffer(); var stringCount = FastQueryParser.Parse(ref charBuffer, query); ProtocolWriter.WriteQuery(ref writer, charBuffer, stringCount); var reader = SyncWriteAndRead(ref writer, 0, stream); // TODO: Ok or ResultSet? var set = ProtocolReader.ReadTextResultSet(ref reader); return(set); }