示例#1
0
        public void Disconnect()
        {
            try
            {
                if (this.receive != null)
                {
                    this.receive.Close();
                }
                if (this.send != null)
                {
                    this.send.Close();
                }
                if (this.networkStream != null)
                {
                    this.networkStream.Close();
                }
                if (this.socket != null)
                {
                    this.socket.Close();
                }

                this.receive       = null;
                this.send          = null;
                this.socket        = null;
                this.networkStream = null;
            }
            catch (IOException)
            {
                throw;
            }
        }
示例#2
0
        public void Connect(string dataSource, int port, int packetSize, Charset charset)
        {
            try
            {
                IPAddress  hostadd = Dns.Resolve(dataSource).AddressList[0];
                IPEndPoint EPhost  = new IPEndPoint(hostadd, port);

                this.socket = new Socket(
                    AddressFamily.InterNetwork,
                    SocketType.Stream,
                    ProtocolType.Tcp);

#if (!NETCF)
                // Set Receive Buffer size.
                this.socket.SetSocketOption(
                    SocketOptionLevel.Socket,
                    SocketOptionName.ReceiveBuffer,
                    packetSize);

                // Set Send	Buffer size.
                this.socket.SetSocketOption(
                    SocketOptionLevel.Socket,
                    SocketOptionName.SendBuffer,
                    packetSize);
#endif

                // Disables	the	Nagle algorithm	for	send coalescing.
                this.socket.SetSocketOption(
                    SocketOptionLevel.Tcp,
                    SocketOptionName.NoDelay,
                    1);

                // Make	the	socket to connect to the Server
                this.socket.Connect(EPhost);
                this.networkStream = new NetworkStream(this.socket, true);

#if     (NETCF)
                this.send    = new XdrStream(this.networkStream, charset);
                this.receive = new XdrStream(this.networkStream, charset);
#else
                this.send    = new XdrStream(new BufferedStream(this.networkStream), charset);
                this.receive = new XdrStream(new BufferedStream(this.networkStream), charset);
#endif

                GC.SuppressFinalize(this.socket);
                GC.SuppressFinalize(this.networkStream);
                GC.SuppressFinalize(this.send);
                GC.SuppressFinalize(this.receive);
            }
            catch (SocketException)
            {
                throw new IscException(IscCodes.isc_arg_gds, IscCodes.isc_network_error, dataSource);
            }
        }
示例#3
0
        private byte[] EncodeSliceArray(Array sourceArray)
        {
            IEnumerator i       = sourceArray.GetEnumerator();
            DbDataType  dbType  = DbDataType.Array;
            Charset     charset = this.db.Charset;
            XdrStream   xdr     = new XdrStream(this.db.Charset);
            int         type    = 0;
            int         subtype = (this.Descriptor.Scale < 0) ? 2 : 0;

            type   = TypeHelper.GetFbType(this.Descriptor.DataType);
            dbType = TypeHelper.GetDbDataType(this.Descriptor.DataType, subtype, this.Descriptor.Scale);

            while (i.MoveNext())
            {
                switch (dbType)
                {
                case DbDataType.Char:
                    byte[] buffer = charset.GetBytes(i.Current.ToString());
                    xdr.WriteOpaque(buffer, this.Descriptor.Length);
                    break;

                case DbDataType.VarChar:
                    xdr.Write((string)i.Current);
                    break;

                case DbDataType.SmallInt:
                    xdr.Write((short)i.Current);
                    break;

                case DbDataType.Integer:
                    xdr.Write((int)i.Current);
                    break;

                case DbDataType.BigInt:
                    xdr.Write((long)i.Current);
                    break;

                case DbDataType.Decimal:
                case DbDataType.Numeric:
                    xdr.Write((decimal)i.Current, type, this.Descriptor.Scale);
                    break;

                case DbDataType.Float:
                    xdr.Write((float)i.Current);
                    break;

                case DbDataType.Double:
                    xdr.Write((double)i.Current);
                    break;

                case DbDataType.Date:
                    xdr.WriteDate(Convert.ToDateTime(i.Current, CultureInfo.CurrentCulture.DateTimeFormat));
                    break;

                case DbDataType.Time:
                    xdr.WriteTime(Convert.ToDateTime(i.Current, CultureInfo.CurrentCulture.DateTimeFormat));
                    break;

                case DbDataType.TimeStamp:
                    xdr.Write(Convert.ToDateTime(i.Current, CultureInfo.CurrentCulture.DateTimeFormat));
                    break;

                default:
                    throw new NotSupportedException("Unknown data type");
                }
            }

            return(xdr.ToArray());
        }
示例#4
0
        private byte[] ReceiveSliceResponse(ArrayDesc desc)
        {
            try
            {
                int operation = this.db.ReadOperation();

                if (operation == IscCodes.op_slice)
                {
                    // Read	slice length
                    bool isVariying = false;
                    int  elements   = 0;
                    int  length     = this.db.Receive.ReadInt32();

                    length = this.db.Receive.ReadInt32();

                    switch (desc.DataType)
                    {
                    case IscCodes.blr_text:
                    case IscCodes.blr_text2:
                    case IscCodes.blr_cstring:
                    case IscCodes.blr_cstring2:
                        elements = length / desc.Length;
                        length  += elements * ((4 - desc.Length) & 3);
                        break;

                    case IscCodes.blr_varying:
                    case IscCodes.blr_varying2:
                        elements   = length / desc.Length;
                        isVariying = true;
                        break;

                    case IscCodes.blr_short:
                        length = length * desc.Length;
                        break;
                    }

                    if (isVariying)
                    {
                        XdrStream xdr = new XdrStream();

                        for (int i = 0; i < elements; i++)
                        {
                            byte[] buffer = this.db.Receive.ReadOpaque(
                                this.db.Receive.ReadInt32());

                            xdr.WriteBuffer(buffer, buffer.Length);
                        }

                        return(xdr.ToArray());
                    }
                    else
                    {
                        return(this.db.Receive.ReadOpaque(length));
                    }
                }
                else
                {
                    this.db.SetOperation(operation);
                    this.db.ReadGenericResponse();

                    return(null);
                }
            }
            catch (IOException)
            {
                throw new IscException(IscCodes.isc_net_read_err);
            }
        }
示例#5
0
        protected override System.Array DecodeSlice(byte[] slice)
        {
            DbDataType dbType     = DbDataType.Array;
            Array      sliceData  = null;
            Array      tempData   = null;
            Type       systemType = this.GetSystemType();

            int[] lengths     = new int[this.Descriptor.Dimensions];
            int[] lowerBounds = new int[this.Descriptor.Dimensions];
            int   type        = 0;
            int   index       = 0;

            // Get upper and lower bounds of each dimension
            for (int i = 0; i < this.Descriptor.Dimensions; i++)
            {
                lowerBounds[i] = this.Descriptor.Bounds[i].LowerBound;
                lengths[i]     = this.Descriptor.Bounds[i].UpperBound;

                if (lowerBounds[i] == 0)
                {
                    lengths[i]++;
                }
            }

            // Create arrays
#if     (NETCF)
            sliceData = Array.CreateInstance(systemType, lengths);
#else
            sliceData = Array.CreateInstance(systemType, lengths, lowerBounds);
#endif
            tempData = Array.CreateInstance(systemType, sliceData.Length);

            // Infer Firebird and Db datatypes
            type   = TypeHelper.GetFbType(this.Descriptor.DataType);
            dbType = TypeHelper.GetDbDataType(this.Descriptor.DataType, 0, this.Descriptor.Scale);

            // Decode slice	data
            XdrStream xdr = new XdrStream(slice, this.db.Charset);

            while (xdr.Position < xdr.Length)
            {
                switch (dbType)
                {
                case DbDataType.Char:
                    tempData.SetValue(xdr.ReadString(this.Descriptor.Length), index);
                    break;

                case DbDataType.VarChar:
                    tempData.SetValue(xdr.ReadString(), index);
                    break;

                case DbDataType.SmallInt:
                    tempData.SetValue(xdr.ReadInt16(), index);
                    break;

                case DbDataType.Integer:
                    tempData.SetValue(xdr.ReadInt32(), index);
                    break;

                case DbDataType.BigInt:
                    tempData.SetValue(xdr.ReadInt64(), index);
                    break;

                case DbDataType.Numeric:
                case DbDataType.Decimal:
                    tempData.SetValue(xdr.ReadDecimal(type, this.Descriptor.Scale), index);
                    break;

                case DbDataType.Float:
                    tempData.SetValue(xdr.ReadSingle(), index);
                    break;

                case DbDataType.Double:
                    tempData.SetValue(xdr.ReadDouble(), index);
                    break;

                case DbDataType.Date:
                    tempData.SetValue(xdr.ReadDate(), index);
                    break;

                case DbDataType.Time:
                    tempData.SetValue(xdr.ReadTime(), index);
                    break;

                case DbDataType.TimeStamp:
                    tempData.SetValue(xdr.ReadDateTime(), index);
                    break;
                }

                index++;
            }

            if (systemType.IsPrimitive)
            {
                // For primitive types we can use System.Buffer	to copy	generated data to destination array
                Buffer.BlockCopy(tempData, 0, sliceData, 0, Buffer.ByteLength(tempData));
            }
            else
            {
                sliceData = tempData;
            }

            // Close XDR stream
            xdr.Close();

            return(sliceData);
        }
示例#6
0
        public override void Execute()
        {
            if (this.state == StatementState.Deallocated)
            {
                throw new InvalidOperationException("Statment is not correctly created.");
            }

            // Clear data
            this.Clear();

            lock (this.db)
            {
                try
                {
                    byte[] descriptor = null;
                    if (this.parameters != null)
                    {
                        XdrStream xdr = new XdrStream(this.db.Charset);
                        xdr.Write(this.parameters);

                        descriptor = xdr.ToArray();

                        xdr.Close();
                    }

                    if (this.statementType == DbStatementType.StoredProcedure)
                    {
                        this.db.Send.Write(IscCodes.op_execute2);
                    }
                    else
                    {
                        this.db.Send.Write(IscCodes.op_execute);
                    }

                    this.db.Send.Write(this.handle);
                    this.db.Send.Write(this.transaction.Handle);

                    if (this.parameters != null)
                    {
                        this.db.Send.WriteBuffer(this.parameters.ToBlrArray());
                        this.db.Send.Write(0);                          // Message number
                        this.db.Send.Write(1);                          // Number of messages
                        this.db.Send.Write(descriptor, 0, descriptor.Length);
                    }
                    else
                    {
                        this.db.Send.WriteBuffer(null);
                        this.db.Send.Write(0);
                        this.db.Send.Write(0);
                    }

                    if (this.statementType == DbStatementType.StoredProcedure)
                    {
                        this.db.Send.WriteBuffer(
                            (this.fields == null) ? null : this.fields.ToBlrArray());
                        this.db.Send.Write(0);                          // Output message number
                    }

                    this.db.Send.Flush();

                    if (this.db.NextOperation() == IscCodes.op_sql_response)
                    {
                        // This	would be an	Execute	procedure
                        this.outputParams.Enqueue(this.ReceiveSqlResponse());
                    }

                    this.db.ReadGenericResponse();

                    // Updated number of records affected by the statement execution
                    if (this.StatementType == DbStatementType.Insert ||
                        this.StatementType == DbStatementType.Delete ||
                        this.StatementType == DbStatementType.Update ||
                        this.StatementType == DbStatementType.StoredProcedure)
                    {
                        this.recordsAffected = this.GetRecordsAffected();
                    }
                    else
                    {
                        this.recordsAffected = -1;
                    }

                    this.state = StatementState.Executed;
                }
                catch (IOException)
                {
                    this.state = StatementState.Error;
                    throw new IscException(IscCodes.isc_net_read_err);
                }
            }
        }
		public override void Execute()
		{
			if (this.state == StatementState.Deallocated)
			{
				throw new InvalidOperationException("Statment is not correctly created.");
			}

			// Clear data
			this.Clear();

			lock (this.db)
			{
				try
				{
					byte[] descriptor = null;
					if (this.parameters != null)
					{
						XdrStream xdr = new XdrStream(this.db.Charset);
						xdr.Write(this.parameters);

						descriptor = xdr.ToArray();

						xdr.Close();
					}

					if (this.statementType == DbStatementType.StoredProcedure)
					{
						this.db.Send.Write(IscCodes.op_execute2);
					}
					else
					{
						this.db.Send.Write(IscCodes.op_execute);
					}

					this.db.Send.Write(this.handle);
					this.db.Send.Write(this.transaction.Handle);

					if (this.parameters != null)
					{
						this.db.Send.WriteBuffer(this.parameters.ToBlrArray());
						this.db.Send.Write(0);	// Message number
						this.db.Send.Write(1);	// Number of messages
						this.db.Send.Write(descriptor, 0, descriptor.Length);
					}
					else
					{
						this.db.Send.WriteBuffer(null);
						this.db.Send.Write(0);
						this.db.Send.Write(0);
					}

					if (this.statementType == DbStatementType.StoredProcedure)
					{
						this.db.Send.WriteBuffer(
							(this.fields == null) ? null : this.fields.ToBlrArray());
						this.db.Send.Write(0);	// Output message number
					}

					this.db.Send.Flush();

					if (this.db.NextOperation() == IscCodes.op_sql_response)
					{
						// This	would be an	Execute	procedure
						this.outputParams.Enqueue(this.ReceiveSqlResponse());
					}

					this.db.ReadGenericResponse();

					// Updated number of records affected by the statement execution			
					if (this.StatementType == DbStatementType.Insert ||
						this.StatementType == DbStatementType.Delete ||
						this.StatementType == DbStatementType.Update ||
                        this.StatementType == DbStatementType.StoredProcedure)
					{
						this.recordsAffected = this.GetRecordsAffected();
					}
					else
					{
						this.recordsAffected = -1;
					}

					this.state = StatementState.Executed;
				}
				catch (IOException)
				{
					this.state = StatementState.Error;
					throw new IscException(IscCodes.isc_net_read_err);
				}
			}
		}
		private byte[] EncodeSliceArray(Array sourceArray)
		{
			IEnumerator i		= sourceArray.GetEnumerator();
			DbDataType	dbType	= DbDataType.Array;
			Charset		charset = this.db.Charset;
			XdrStream	xdr		= new XdrStream(this.db.Charset);
			int			type	= 0;
			int			subtype = (this.Descriptor.Scale < 0) ? 2 : 0;

			type = TypeHelper.GetFbType(this.Descriptor.DataType);
			dbType = TypeHelper.GetDbDataType(this.Descriptor.DataType, subtype, this.Descriptor.Scale);

			while (i.MoveNext())
			{
				switch (dbType)
				{
					case DbDataType.Char:
						byte[] buffer = charset.GetBytes(i.Current.ToString());
						xdr.WriteOpaque(buffer, this.Descriptor.Length);
						break;

					case DbDataType.VarChar:
						xdr.Write((string)i.Current);
						break;

					case DbDataType.SmallInt:
						xdr.Write((short)i.Current);
						break;

					case DbDataType.Integer:
						xdr.Write((int)i.Current);
						break;

					case DbDataType.BigInt:
						xdr.Write((long)i.Current);
						break;

					case DbDataType.Decimal:
					case DbDataType.Numeric:
						xdr.Write((decimal)i.Current, type, this.Descriptor.Scale);
						break;

					case DbDataType.Float:
						xdr.Write((float)i.Current);
						break;

					case DbDataType.Double:
						xdr.Write((double)i.Current);
						break;

					case DbDataType.Date:
						xdr.WriteDate(Convert.ToDateTime(i.Current, CultureInfo.CurrentCulture.DateTimeFormat));
						break;

					case DbDataType.Time:
						xdr.WriteTime(Convert.ToDateTime(i.Current, CultureInfo.CurrentCulture.DateTimeFormat));
						break;

					case DbDataType.TimeStamp:
						xdr.Write(Convert.ToDateTime(i.Current, CultureInfo.CurrentCulture.DateTimeFormat));
						break;

					default:
						throw new NotSupportedException("Unknown data type");
				}
			}

			return xdr.ToArray();
		}
		private byte[] ReceiveSliceResponse(ArrayDesc desc)
		{
			try
			{
				int operation = this.db.ReadOperation();

				if (operation == IscCodes.op_slice)
				{
					// Read	slice length
					bool	isVariying = false;
					int		elements = 0;
					int		length = this.db.Receive.ReadInt32();

					length = this.db.Receive.ReadInt32();

					switch (desc.DataType)
					{
						case IscCodes.blr_text:
						case IscCodes.blr_text2:
						case IscCodes.blr_cstring:
						case IscCodes.blr_cstring2:
							elements = length / desc.Length;
							length += elements * ((4 - desc.Length) & 3);
							break;

						case IscCodes.blr_varying:
						case IscCodes.blr_varying2:
							elements = length / desc.Length;
							isVariying = true;
							break;

						case IscCodes.blr_short:
							length = length * desc.Length;
							break;
					}

					if (isVariying)
					{
						XdrStream xdr = new XdrStream();

						for (int i = 0; i < elements; i++)
						{
							byte[] buffer = this.db.Receive.ReadOpaque(
								this.db.Receive.ReadInt32());

							xdr.WriteBuffer(buffer, buffer.Length);
						}

						return xdr.ToArray();
					}
					else
					{
						return this.db.Receive.ReadOpaque(length);
					}
				}
				else
				{
					this.db.SetOperation(operation);
					this.db.ReadGenericResponse();

					return null;
				}
			}
			catch (IOException)
			{
				throw new IscException(IscCodes.isc_net_read_err);
			}
		}
示例#10
0
		protected override System.Array DecodeSlice(byte[] slice)
		{
			DbDataType	dbType		= DbDataType.Array;
			Array		sliceData	= null;
			Array		tempData	= null;
			Type		systemType	= this.GetSystemType();
			int[]		lengths		= new int[this.Descriptor.Dimensions];
			int[]		lowerBounds = new int[this.Descriptor.Dimensions];
			int			type		= 0;
			int			index		= 0;

			// Get upper and lower bounds of each dimension
			for (int i = 0; i < this.Descriptor.Dimensions; i++)
			{
				lowerBounds[i]	= this.Descriptor.Bounds[i].LowerBound;
				lengths[i]		= this.Descriptor.Bounds[i].UpperBound;

				if (lowerBounds[i] == 0)
				{
					lengths[i]++;
				}
			}

			// Create arrays
#if	(NETCF)
			sliceData = Array.CreateInstance(systemType, lengths);
#else
			sliceData = Array.CreateInstance(systemType, lengths, lowerBounds);
#endif
			tempData = Array.CreateInstance(systemType, sliceData.Length);

			// Infer Firebird and Db datatypes
			type	= TypeHelper.GetFbType(this.Descriptor.DataType);
			dbType	= TypeHelper.GetDbDataType(this.Descriptor.DataType, 0, this.Descriptor.Scale);

			// Decode slice	data
			XdrStream xdr = new XdrStream(slice, this.db.Charset);

			while (xdr.Position < xdr.Length)
			{
				switch (dbType)
				{
					case DbDataType.Char:
						tempData.SetValue(xdr.ReadString(this.Descriptor.Length), index);
						break;

					case DbDataType.VarChar:
						tempData.SetValue(xdr.ReadString(), index);
						break;

					case DbDataType.SmallInt:
						tempData.SetValue(xdr.ReadInt16(), index);
						break;

					case DbDataType.Integer:
						tempData.SetValue(xdr.ReadInt32(), index);
						break;

					case DbDataType.BigInt:
						tempData.SetValue(xdr.ReadInt64(), index);
						break;

					case DbDataType.Numeric:
					case DbDataType.Decimal:
						tempData.SetValue(xdr.ReadDecimal(type, this.Descriptor.Scale), index);
						break;

					case DbDataType.Float:
						tempData.SetValue(xdr.ReadSingle(), index);
						break;

					case DbDataType.Double:
						tempData.SetValue(xdr.ReadDouble(), index);
						break;

					case DbDataType.Date:
						tempData.SetValue(xdr.ReadDate(), index);
						break;

					case DbDataType.Time:
						tempData.SetValue(xdr.ReadTime(), index);
						break;

					case DbDataType.TimeStamp:
						tempData.SetValue(xdr.ReadDateTime(), index);
						break;
				}

				index++;
			}

			if (systemType.IsPrimitive)
			{
				// For primitive types we can use System.Buffer	to copy	generated data to destination array
				Buffer.BlockCopy(tempData, 0, sliceData, 0, Buffer.ByteLength(tempData));
			}
			else
			{
				sliceData = tempData;
			}

			// Close XDR stream
			xdr.Close();

			return sliceData;
		}
		public void Connect(string dataSource, int port, int packetSize, Charset charset)
		{
			try
			{
				IPAddress hostadd = Dns.Resolve(dataSource).AddressList[0];
				IPEndPoint EPhost = new IPEndPoint(hostadd, port);

				this.socket = new Socket(
					AddressFamily.InterNetwork,
					SocketType.Stream,
					ProtocolType.Tcp);

#if (!NETCF)

				// Set Receive Buffer size.
				this.socket.SetSocketOption(
					SocketOptionLevel.Socket,
					SocketOptionName.ReceiveBuffer,
					packetSize);

				// Set Send	Buffer size.
				this.socket.SetSocketOption(
					SocketOptionLevel.Socket,
					SocketOptionName.SendBuffer,
					packetSize);
#endif

				// Disables	the	Nagle algorithm	for	send coalescing.
				this.socket.SetSocketOption(
					SocketOptionLevel.Tcp,
					SocketOptionName.NoDelay,
					1);

				// Make	the	socket to connect to the Server
				this.socket.Connect(EPhost);
				this.networkStream = new NetworkStream(this.socket, true);

#if	(NETCF)
				this.send	 = new XdrStream(this.networkStream, charset);
				this.receive = new XdrStream(this.networkStream, charset);
#else
				this.send = new XdrStream(new BufferedStream(this.networkStream), charset);
				this.receive = new XdrStream(new BufferedStream(this.networkStream), charset);
#endif

				GC.SuppressFinalize(this.socket);
				GC.SuppressFinalize(this.networkStream);
				GC.SuppressFinalize(this.send);
				GC.SuppressFinalize(this.receive);
			}
			catch (SocketException)
			{
				throw new IscException(IscCodes.isc_arg_gds, IscCodes.isc_network_error, dataSource);
			}
		}
		public void Disconnect()
		{
			try
			{
				if (this.receive != null)
				{
					this.receive.Close();
				}
				if (this.send != null)
				{
					this.send.Close();
				}
				if (this.networkStream != null)
				{
					this.networkStream.Close();
				}
				if (this.socket != null)
				{
					this.socket.Close();
				}

				this.receive		= null;
				this.send			= null;
				this.socket			= null;
				this.networkStream	= null;
			}
			catch (IOException)
			{
				throw;
			}
		}