private void ExecuteCommand(DBCmd cmd, byte[] bytes, int length) { SequenceByte = 0; int len = 1; if (bytes != null) { len += length; } writer.StartPacket(len); writer.WriteByte((byte)cmd); if (bytes != null) { writer.Write(bytes, 0, length); } writer.Flush(); }
public override void Open() { base.Open(); // connect to one of our specified hosts Stream stream; try { if (Settings.Protocol == ConnectionProtocol.SharedMemory) { SharedMemoryStream str = new SharedMemoryStream(Settings.SharedMemoryName); str.Open(Settings.ConnectionTimeout); stream = str; } else { string pipeName = Settings.PipeName; if (Settings.Protocol != ConnectionProtocol.NamedPipe) { pipeName = null; } StreamCreator sc = new StreamCreator(Settings.Server, Settings.Port, pipeName); stream = sc.GetStream(Settings.ConnectionTimeout); } } catch (Exception ex) { throw new MySqlException("Unable to connect to any of the specified MySQL hosts", ex); } if (stream == null) { throw new MySqlException("Unable to connect to any of the specified MySQL hosts"); } reader = new PacketReader(new BufferedStream(stream), this); writer = new PacketWriter(new BufferedStream(stream), this); writer.Encoding = encoding; // read off the welcome packet and parse out it's values reader.OpenPacket(); protocol = reader.ReadByte(); string versionString = reader.ReadString(); version = DBVersion.Parse(versionString); threadId = (int)reader.ReadInteger(4); encryptionSeed = reader.ReadString(); // starting with 4.0.8, maxSinglePacket should be 0xffffff if (version.isAtLeast(4, 0, 8)) { MaxSinglePacket = (256 * 256 * 256) - 1; } // read in Server capabilities if they are provided serverCaps = 0; if (reader.HasMoreData) { serverCaps = (ClientFlags)reader.ReadInteger(2); } // based on our settings, set our connection flags SetConnectionFlags(); writer.StartPacket(0); writer.WriteInteger((int)connectionFlags, version.isAtLeast(4, 1, 0) ? 4 : 2); writer.WriteInteger(MaxSinglePacket, version.isAtLeast(4, 1, 0) ? 4 : 3); // 4.1.1 included some new server status info if (version.isAtLeast(4, 1, 1)) { /* New protocol with 16 bytes to describe server characteristics */ serverLanguage = reader.ReadInteger(1); serverStatus = (ServerStatusFlags)reader.ReadInteger(2); reader.Skip(13); string seedPart2 = reader.ReadString(); encryptionSeed += seedPart2; writer.WriteByte(8); writer.Write(new byte[23], 0, 23); } Authenticate(); // if we are using compression, then we use our CompressedStream class // to hide the ugliness of managing the compression if ((connectionFlags & ClientFlags.COMPRESS) != 0) { //stream = new CompressedStream( stream, MaxSinglePacket ); writer = new PacketWriter(new CompressedStream(new BufferedStream(stream)), this); writer.Encoding = encoding; reader = new PacketReader(new CompressedStream(new BufferedStream(stream)), this); } isOpen = true; }