public CommandResult Execute(MySqlParameterCollection parameters) { PacketWriter packetWriter = new PacketWriter(); packetWriter.Driver = (NativeDriver)this.driver; BitArray bitArray = new BitArray(parameters.Count); for (int i = 0; i < this.paramList.Length; i++) { MySqlParameter mySqlParameter = parameters[this.paramList[i].ColumnName]; if (mySqlParameter.Value == DBNull.Value || mySqlParameter.Value == null) { bitArray[i] = true; } } byte[] array = new byte[(parameters.Count + 7) / 8]; if (array.Length > 0) { bitArray.CopyTo(array, 0); } packetWriter.WriteInteger((long)this.StatementId, 4); packetWriter.WriteByte(0); packetWriter.WriteInteger(1L, 4); packetWriter.Write(array); packetWriter.WriteByte(1); MySqlField[] array2 = this.paramList; for (int j = 0; j < array2.Length; j++) { MySqlField mySqlField = array2[j]; MySqlParameter mySqlParameter2 = parameters[mySqlField.ColumnName]; packetWriter.WriteInteger((long)mySqlParameter2.GetPSType(), 2); } array2 = this.paramList; for (int j = 0; j < array2.Length; j++) { MySqlField mySqlField2 = array2[j]; int num = parameters.IndexOf(mySqlField2.ColumnName); if (num == -1) { throw new MySqlException("Parameter '" + mySqlField2.ColumnName + "' is not defined."); } MySqlParameter mySqlParameter3 = parameters[num]; if (mySqlParameter3.Value != DBNull.Value && mySqlParameter3.Value != null) { packetWriter.Encoding = mySqlField2.Encoding; mySqlParameter3.Serialize(packetWriter, true); } } this.executionCount++; return(this.driver.ExecuteStatement(((MemoryStream)packetWriter.Stream).ToArray())); }
/// <summary> /// Sends the specified file to the server. /// This supports the LOAD DATA LOCAL INFILE /// </summary> /// <param name="filename"></param> private void SendFileToServer(string filename) { byte[] buffer = new byte[4092]; FileStream fs = null; try { fs = new FileStream(filename, FileMode.Open); writer.StartPacket(fs.Length); long len = fs.Length; while (len > 0) { int count = fs.Read(buffer, 0, 4092); writer.Write(buffer, 0, count); len -= count; } writer.Flush(); writer.Buffering = false; // write the terminating packet writer.WriteInteger(0, 3); writer.WriteByte(this.SequenceByte++); writer.Flush(); } catch (Exception ex) { throw new MySqlException("Error during LOAD DATA LOCAL INFILE", ex); } finally { fs.Close(); } }
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; }
public CommandResult Execute(MySqlParameterCollection parameters) { PacketWriter packet = new PacketWriter(); packet.Driver = (NativeDriver)driver; //TODO: support long data here // create our null bitmap BitArray nullMap = new BitArray(parameters.Count); //metaData.Length ); for (int x = 0; x < parameters.Count; x++) { if (parameters[x].Value == DBNull.Value || parameters[x].Value == null) { nullMap[x] = true; } } byte[] nullMapBytes = new byte[(parameters.Count + 7) / 8]; nullMap.CopyTo(nullMapBytes, 0); // start constructing our packet packet.WriteInteger(StatementId, 4); packet.WriteByte(0); // flags; always 0 for 4.1 packet.WriteInteger(1, 4); // interation count; 1 for 4.1 packet.Write(nullMapBytes); //if (parameters != null && parameters.Count > 0) packet.WriteByte(1); // rebound flag //else // packet.WriteByte( 0 ); //TODO: only send rebound if parms change // write out the parameter types foreach (MySqlField param in paramList) { MySqlParameter parm = parameters[param.ColumnName]; packet.WriteInteger((long)parm.GetPSType(), 2); } // now write out all non-null values foreach (MySqlField param in paramList) { int index = parameters.IndexOf(param.ColumnName); if (index == -1) { throw new MySqlException("Parameter '" + param.ColumnName + "' is not defined."); } MySqlParameter parm = parameters[index]; if (parm.Value == DBNull.Value || parm.Value == null) { continue; } packet.Encoding = param.Encoding; parm.Serialize(packet, true); } executionCount++; // send the data packet and return the CommandResult return(driver.ExecuteStatement(((System.IO.MemoryStream)packet.Stream).ToArray())); }