Exemple #1
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;
        }
        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()));
        }