예제 #1
0
        private SednaSession(string dbname, string host, int port, string userName, string password)
        {
            currentDatabase = dbname;
            try
            {
                socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                socket.Connect(new IPEndPoint(Dns.GetHostEntry(host).AddressList[0], port));
            }
            catch (IOException ex)
            {
                throw new SednaException("No connection could be made to that host: " + ex.Message);
            }

            outputStream = new NetworkStream(socket, FileAccess.Write);
            inputStream  = new NetworkStream(socket, FileAccess.Read);
            // send startup message.
            NetworkOperations.WriteMessage(InstructionCode.StartUp, outputStream, inputStream, InstructionCode.SendSessionParameters);
            // send parameters.
            NetworkOperations.Message msg = CreateParametersMessage(dbname, userName, password);
            NetworkOperations.WriteMessage(msg, outputStream);

            // get the response...
            NetworkOperations.ReadMessage(msg, inputStream);
            // need to send the password
            if (msg.Instruction == InstructionCode.SendAuthenticationParameters)
            {
                NetworkOperations.WriteMessage(InstructionCode.AuthenticationResponse, outputStream, inputStream, new string[] { password }, InstructionCode.AuthenticationOK);
            }
            else if (msg.Instruction == InstructionCode.AuthenticationFailed || msg.Instruction == InstructionCode.GeneralError)
            {
                throw new SednaException("Authentication failed");
            }
        }
예제 #2
0
        private NetworkOperations.Message CreateParametersMessage(string dbname, string userName, string password)
        {
            NetworkOperations.Message msg = new NetworkOperations.Message();
            MemoryStream stream           = new MemoryStream();
            BinaryWriter writer           = new BinaryWriter(stream);

            msg.Instruction = InstructionCode.Login;
            writer.Write((byte)1);             // protocol version... 1.0
            writer.Write((byte)0);
            NetworkOperations.WriteString(writer, userName, dbname);
            writer.Close();
            msg.Body = stream.ToArray();
            return(msg);
        }
예제 #3
0
파일: SednaAPI.cs 프로젝트: skitsanos/WDK9
        /// <summary>
        /// Retrieves the next part of the result.
        /// </summary>
        /// <returns></returns>
        public string Next()
        {
            if (!hasNextItem) return null;

            NetworkOperations.Message msg = new NetworkOperations.Message();
            msg.Instruction = InstructionCode.GetNextItem;
            NetworkOperations.WriteMessage(msg, outputStream);

            NetworkOperations.StringItem item = NetworkOperations.ReadStringItem(inputStream);
            if (item.Item==null)
            {
                hasNextItem = false;
                return null;
            }
            else
            {
                text += item.Item;
                return item.Item;
            }
        }
예제 #4
0
        /// <summary>
        /// Retrieves the next part of the result.
        /// </summary>
        /// <returns></returns>
        public string Next()
        {
            if (!hasNextItem)
            {
                return(null);
            }

            NetworkOperations.Message msg = new NetworkOperations.Message();
            msg.Instruction = InstructionCode.GetNextItem;
            NetworkOperations.WriteMessage(msg, outputStream);

            NetworkOperations.StringItem item = NetworkOperations.ReadStringItem(inputStream);
            if (item.Item == null)
            {
                hasNextItem = false;
                return(null);
            }
            else
            {
                text += item.Item;
                return(item.Item);
            }
        }
예제 #5
0
        /// <summary>
        /// Executes a query that is read from a stream.
        /// </summary>
        public QueryResult Execute(TextReader queryReader)
        {
            try
            {
                if (!inTransaction)
                {
                    BeginTransaction();
                }

                string query = queryReader.ReadToEnd();
                NetworkOperations.Message msg = new NetworkOperations.Message();
                msg.Instruction = InstructionCode.Execute;

                MemoryStream stream = new MemoryStream();
                BinaryWriter writer = new BinaryWriter(stream);
                writer.Write((byte)0);                 // xml is 0, scheme xml is 1
                NetworkOperations.WriteString(writer, query);
                writer.Close();

                msg.Body = stream.ToArray();

                NetworkOperations.WriteMessage(msg, outputStream);

                NetworkOperations.ReadMessage(msg, inputStream);

                if (msg.Instruction == InstructionCode.QuerySucceeded)
                {
                    return(new QueryResult(NetworkOperations.ReadStringItem(inputStream), inputStream, outputStream));
                }

                else if (msg.Instruction == InstructionCode.QueryFailed || msg.Instruction == InstructionCode.UpdateFailed || msg.Instruction == InstructionCode.GeneralError)
                {
                    throw NetworkOperations.GetErrorInfo(msg.Instruction, msg.Body);
                }

                else if (msg.Instruction == InstructionCode.UpdateSucceeded)
                {
                    haveUpdated = true;
                    return(null);
                }

                else if (msg.Instruction == InstructionCode.BulkLoadFileRequest)
                {
                    try
                    {
                        haveUpdated = true;
                        string filename   = NetworkOperations.ReadString(msg, 0);
                        Stream fileStream = File.OpenRead(filename);
                        if (!NetworkOperations.BulkLoad(fileStream, inputStream, outputStream))
                        {
                            throw new SednaException(InstructionCode.BulkLoadFailed, "Bulk load failed");
                        }
                        return(null);
                    }
                    finally
                    {
                        stream.Close();
                    }
                }
                else if (msg.Instruction == InstructionCode.BulkLoadStreamRequest)
                {
                    if (!NetworkOperations.BulkLoad(Console.OpenStandardInput(), inputStream, outputStream))
                    {
                        throw new SednaException("Bulk load failed");
                    }
                    return(null);
                }
                else
                {
                    throw new SednaException("Unexpected error");
                }
            }
            catch (Exception ex)
            {
                inTransaction = false;
                haveUpdated   = false;
                throw ex;
            }
        }
예제 #6
0
파일: SednaAPI.cs 프로젝트: skitsanos/WDK9
 private NetworkOperations.Message CreateParametersMessage(string dbname, string userName, string password)
 {
     NetworkOperations.Message msg = new NetworkOperations.Message();
     MemoryStream stream = new MemoryStream();
     BinaryWriter writer = new BinaryWriter(stream);
     msg.Instruction = InstructionCode.Login;
     writer.Write((byte)1); // protocol version... 1.0
     writer.Write((byte)0);
     NetworkOperations.WriteString(writer, userName, dbname);
     writer.Close();
     msg.Body = stream.ToArray();
     return msg;
 }
예제 #7
0
파일: SednaAPI.cs 프로젝트: skitsanos/WDK9
        /// <summary>
        /// Executes a query that is read from a stream.
        /// </summary>
        public QueryResult Execute(TextReader queryReader)
        {
            try
            {
                if (!inTransaction) BeginTransaction();

                string query = queryReader.ReadToEnd();
                NetworkOperations.Message msg = new NetworkOperations.Message();
                msg.Instruction = InstructionCode.Execute;

                MemoryStream stream = new MemoryStream();
                BinaryWriter writer = new BinaryWriter(stream);
                writer.Write((byte)0); // xml is 0, scheme xml is 1
                NetworkOperations.WriteString(writer, query);
                writer.Close();

                msg.Body = stream.ToArray();

                NetworkOperations.WriteMessage(msg, outputStream);

                NetworkOperations.ReadMessage(msg, inputStream);

                if (msg.Instruction==InstructionCode.QuerySucceeded)
                    return new QueryResult(NetworkOperations.ReadStringItem(inputStream), inputStream, outputStream);

                else if (msg.Instruction==InstructionCode.QueryFailed || msg.Instruction==InstructionCode.UpdateFailed || msg.Instruction==InstructionCode.GeneralError)
                    throw NetworkOperations.GetErrorInfo(msg.Instruction, msg.Body);

                else if (msg.Instruction==InstructionCode.UpdateSucceeded)
                {
                    haveUpdated = true;
                    return null;
                }

                else if (msg.Instruction==InstructionCode.BulkLoadFileRequest)
                {
                    try
                    {
                        haveUpdated = true;
                        string filename = NetworkOperations.ReadString(msg, 0);
                        Stream fileStream = File.OpenRead(filename);
                        if (!NetworkOperations.BulkLoad(fileStream, inputStream, outputStream))
                            throw new SednaException(InstructionCode.BulkLoadFailed, "Bulk load failed");
                        return null;
                    }
                    finally
                    {
                        stream.Close();
                    }
                }
                else if (msg.Instruction==InstructionCode.BulkLoadStreamRequest)
                {
                    if (!NetworkOperations.BulkLoad(Console.OpenStandardInput(), inputStream, outputStream))
                        throw new SednaException("Bulk load failed");
                    return null;
                }
                else
                    throw new SednaException("Unexpected error");
            }
            catch (Exception ex)
            {
                inTransaction = false;
                haveUpdated = false;
                throw ex;
            }
        }