Exemplo n.º 1
0
        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()));
        }
Exemplo n.º 2
0
        /// <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();
            }
        }
Exemplo n.º 3
0
        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;
        }
Exemplo n.º 4
0
        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()));
        }