public static PacketHeader Write(MySqlStreamWriter writer) { //for those who don't want to alloc an new packet //just write it into a stream writer.ReserveHeader(); writer.WriteUnsigned1((byte)Command.QUIT); var h = new PacketHeader(writer.OnlyPacketContentLength, writer.IncrementPacketNumber()); writer.WriteHeader(h); return h; }
public static void Write(MySqlStreamWriter writer, uint stmtId, MyStructData[] _prepareValues) { //for those who don't want to alloc an new packet //just write it into a stream writer.ReserveHeader(); writer.WriteByte((byte)Command.STMT_EXECUTE); writer.WriteUnsignedNumber(4, stmtId); writer.WriteByte((byte)CursorFlags.CURSOR_TYPE_NO_CURSOR); writer.WriteUnsignedNumber(4, 1);//iteration-count, always 1 //write NULL-bitmap, length: (num-params+7)/8 MyStructData[] fillValues = _prepareValues; int paramNum = _prepareValues.Length; if (paramNum > 0) { uint bitmap = 0; uint bitValue = 1; for (int i = 0; i < paramNum; i++) { MySqlDataType dataType = _prepareValues[i].type; if (dataType == MySqlDataType.NULL) { bitmap += bitValue; } bitValue <<= 1; //shift to left 1 bit if (bitValue == 256) { //end of 8 bits //just store data writer.WriteUnsigned1(bitmap); bitmap = 0; bitValue = 1; } } if (bitValue != 1) { writer.WriteUnsigned1(bitmap); } } //new-params-bound - flag writer.WriteByte(1); //------------------------------------------------------- //data types for (int i = 0; i < paramNum; i++) { writer.WriteUnsignedNumber(2, (byte)_prepareValues[i].type); } //-------------------------------------- //actual data //-------------------------------------- //stream of data may large than 1 packet var tempSingleValueHolder = new TempSingleValueHolder(); tempSingleValueHolder.headerLenBuffer = new byte[9]; tempSingleValueHolder.generalContent = new byte[16]; for (int i = 0; i < paramNum; i++) { bool isComplete = WriteValueByType(writer, ref _prepareValues[i], ref tempSingleValueHolder); var header = new PacketHeader(writer.OnlyPacketContentLength, writer.IncrementPacketNumber()); writer.WriteHeader(header); //-------------------------------------------------------------------------------------------------- while (!isComplete) { //write until complete tempSingleValueHolder.round++; writer.ReserveHeader(); isComplete = WriteValueByType(writer, ref _prepareValues[i], ref tempSingleValueHolder); header = new PacketHeader(writer.OnlyPacketContentLength, writer.IncrementPacketNumber()); writer.WriteHeader(header); } //reset tempSingleValueHolder.Reset(); } //-------------------------------------- }
public override void WritePacket(MySqlStreamWriter writer) { writer.ReserveHeader();//allocate header if (protocol41) { writer.WriteUnsigned4(clientFlags); writer.WriteUnsigned4(maxPacketSize); writer.WriteUnsigned1(charsetNumber); writer.WriteFiller(23); writer.WriteNullTerminatedString(user); writer.WriteLengthCodedBuffer(scrambleBuff); writer.WriteNullTerminatedString(database); } else { writer.WriteUnsigned2(clientFlags); writer.WriteUnsigned3(maxPacketSize); writer.WriteNullTerminatedString(user); writer.WriteBuffer(scrambleBuff); if (database != null && database.Length > 0) { writer.WriteFiller(1); writer.WriteBuffer(Encoding.ASCII.GetBytes(database)); } } _header = new PacketHeader(writer.OnlyPacketContentLength, writer.IncrementPacketNumber()); writer.WriteHeader(_header); }