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; } }
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); } }
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); } }
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 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); } }
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; }