private void DatabaseInfo(byte[] items, byte[] buffer, int bufferLength) { lock (this) { int[] statusVector = FesConnection.GetNewStatusVector(); int dbHandle = this.Handle; FbClient.isc_database_info( statusVector, ref dbHandle, (short)items.Length, items, (short)bufferLength, buffer); this.ParseStatusVector(statusVector); } }
public void Attach(ServiceParameterBuffer spb, string dataSource, int port, string service) { int[] statusVector = FesConnection.GetNewStatusVector(); int svcHandle = this.Handle; FbClient.isc_service_attach( statusVector, (short)service.Length, service, ref svcHandle, (short)spb.Length, spb.ToArray()); // Parse status vector this.ParseStatusVector(statusVector); // Update status vector this.handle = svcHandle; }
public void Detach() { lock (this) { if (this.TransactionCount > 0) { throw new IscException(IscCodes.isc_open_trans, this.TransactionCount); } int[] statusVector = FesConnection.GetNewStatusVector(); int dbHandle = this.Handle; FbClient.isc_detach_database(statusVector, ref dbHandle); this.handle = dbHandle; FesConnection.ParseStatusVector(statusVector); } }
protected override void Open() { lock (this.db) { int[] statusVector = FesConnection.GetNewStatusVector(); int dbHandle = this.db.Handle; int trHandle = this.transaction.Handle; FbClient.isc_open_blob2( statusVector, ref dbHandle, ref trHandle, ref this.blobHandle, ref this.blobId, 0, new byte[0]); FesConnection.ParseStatusVector(statusVector); } }
private void Allocate() { lock (this.db) { int[] statusVector = FesConnection.GetNewStatusVector(); int dbHandle = this.db.Handle; int stmtHandle = this.handle; FbClient.isc_dsql_allocate_statement( statusVector, ref dbHandle, ref stmtHandle); this.db.ParseStatusVector(statusVector); this.handle = stmtHandle; this.allRowsFetched = false; this.state = StatementState.Allocated; this.statementType = DbStatementType.None; } }
public override byte[] GetSqlInfo(byte[] items, int bufferLength) { lock (this.db) { byte[] buffer = new byte[bufferLength]; int[] statusVector = FesConnection.GetNewStatusVector(); int stmtHandle = this.handle; FbClient.isc_dsql_sql_info( statusVector, ref stmtHandle, (short)items.Length, items, (short)bufferLength, buffer); this.db.ParseStatusVector(statusVector); return(buffer); } }
public override void PutSlice(System.Array sourceArray, int sliceLength) { int[] statusVector = FesConnection.GetNewStatusVector(); int dbHandle = this.db.Handle; int trHandle = this.transaction.Handle; ArrayDescMarshaler marshaler = ArrayDescMarshaler.GetInstance(); IntPtr arrayDesc = marshaler.MarshalManagedToNative(this.Descriptor); // Obtain the System of type of Array elements and // Fill buffer Type systemType = this.GetSystemType(); byte[] buffer = new byte[sliceLength]; if (systemType.IsPrimitive) { Buffer.BlockCopy(sourceArray, 0, buffer, 0, buffer.Length); } else { buffer = this.EncodeSlice(this.Descriptor, sourceArray, sliceLength); } FbClient.isc_array_put_slice( statusVector, ref dbHandle, ref trHandle, ref this.handle, arrayDesc, buffer, ref sliceLength); // Free memory marshaler.CleanUpNativeData(ref arrayDesc); FesConnection.ParseStatusVector(statusVector); }
protected override void Create() { lock (this.db) { int[] statusVector = FesConnection.GetNewStatusVector(); int dbHandle = this.db.Handle; int trHandle = this.transaction.Handle; FbClient.isc_create_blob2( statusVector, ref dbHandle, ref trHandle, ref this.blobHandle, ref this.blobId, 0, new byte[0]); FesConnection.ParseStatusVector(statusVector); this.RblAddValue(IscCodes.RBL_create); } }
public void Attach(DatabaseParameterBuffer dpb, string dataSource, int port, string database) { lock (this) { int[] statusVector = FesConnection.GetNewStatusVector(); int dbHandle = 0; FbClient.isc_attach_database( statusVector, (short)database.Length, database, ref dbHandle, (short)dpb.Length, dpb.ToArray()); this.handle = dbHandle; this.ParseStatusVector(statusVector); // Get server version this.serverVersion = this.GetServerVersion(); } }
public void CreateDatabase(DatabaseParameterBuffer dpb, string dataSource, int port, string database) { lock (this) { int[] statusVector = FesConnection.GetNewStatusVector(); int dbHandle = this.Handle; FbClient.isc_create_database( statusVector, (short)database.Length, database, ref dbHandle, (short)dpb.Length, dpb.ToArray(), 0); this.ParseStatusVector(statusVector); this.handle = dbHandle; this.Detach(); } }
public void BeginTransaction(TransactionParameterBuffer tpb) { lock (this.db) { if (this.state != TransactionState.NoTransaction) { throw new IscException( IscCodes.isc_arg_gds, IscCodes.isc_tra_state, this.handle, "no valid"); } IscTeb teb = new IscTeb(); IntPtr tebData = IntPtr.Zero; try { this.state = TransactionState.TrasactionStarting; // Set db handle teb.dbb_ptr = Marshal.AllocHGlobal(4); Marshal.WriteInt32(teb.dbb_ptr, this.db.Handle); // Set tpb length teb.tpb_len = tpb.Length; // Set TPB data teb.tpb_ptr = Marshal.AllocHGlobal(tpb.Length); Marshal.Copy(tpb.ToArray(), 0, teb.tpb_ptr, tpb.Length); // Alloc memory for the IscTeb structure int size = Marshal.SizeOf(typeof(IscTeb)); tebData = Marshal.AllocHGlobal(size); Marshal.StructureToPtr(teb, tebData, true); int[] statusVector = FesConnection.GetNewStatusVector(); int trHandle = this.handle; FbClient.isc_start_multiple( statusVector, ref trHandle, 1, tebData); this.handle = trHandle; // Parse status vector this.db.ParseStatusVector(statusVector); // Update transaction state this.state = TransactionState.TransactionStarted; // Update transaction count this.db.TransactionCount++; } catch (Exception) { throw; } finally { // Free memory if (teb.dbb_ptr != IntPtr.Zero) { Marshal.FreeHGlobal(teb.dbb_ptr); } if (teb.tpb_ptr != IntPtr.Zero) { Marshal.FreeHGlobal(teb.tpb_ptr); } if (tebData != IntPtr.Zero) { Marshal.DestroyStructure(tebData, typeof(IscTeb)); Marshal.FreeHGlobal(tebData); } } } }
public override void DescribeParameters() { lock (this.db) { // Marshal structures to pointer XsqldaMarshaler marshaler = XsqldaMarshaler.GetInstance(); this.parameters = new Descriptor(1); IntPtr sqlda = marshaler.MarshalManagedToNative(this.db.Charset, parameters); int[] statusVector = FesConnection.GetNewStatusVector(); int stmtHandle = this.handle; FbClient.isc_dsql_describe_bind( statusVector, ref stmtHandle, IscCodes.SQLDA_VERSION1, sqlda); Descriptor descriptor = marshaler.MarshalNativeToManaged(this.db.Charset, sqlda); // Parse status vector this.db.ParseStatusVector(statusVector); if (descriptor.ActualCount != 0 && descriptor.Count != descriptor.ActualCount) { short n = descriptor.ActualCount; descriptor = new Descriptor(n); // Fre memory marshaler.CleanUpNativeData(ref sqlda); // Marshal new structure sqlda = marshaler.MarshalManagedToNative(this.db.Charset, descriptor); FbClient.isc_dsql_describe_bind( statusVector, ref stmtHandle, IscCodes.SQLDA_VERSION1, sqlda); descriptor = marshaler.MarshalNativeToManaged(this.db.Charset, sqlda); // Free memory marshaler.CleanUpNativeData(ref sqlda); // Parse status vector this.db.ParseStatusVector(statusVector); } else { if (descriptor.ActualCount == 0) { descriptor = new Descriptor(0); } } // Free memory if (sqlda != IntPtr.Zero) { marshaler.CleanUpNativeData(ref sqlda); } // Update parameter descriptor this.parameters = descriptor; } }
public override DbValue[] Fetch() { DbValue[] row = null; if (this.state == StatementState.Deallocated) { throw new InvalidOperationException("Statment is not correctly created."); } if (this.statementType != DbStatementType.Select && this.statementType != DbStatementType.SelectForUpdate) { return(null); } lock (this.db) { if (!this.allRowsFetched) { // Marshal structures to pointer XsqldaMarshaler marshaler = XsqldaMarshaler.GetInstance(); // Reset actual field values this.fields.ResetValues(); IntPtr sqlda = marshaler.MarshalManagedToNative(this.db.Charset, fields); int[] statusVector = FesConnection.GetNewStatusVector(); int stmtHandle = this.handle; int status = FbClient.isc_dsql_fetch( statusVector, ref stmtHandle, IscCodes.SQLDA_VERSION1, sqlda); // Obtain values Descriptor rowDesc = marshaler.MarshalNativeToManaged(this.db.Charset, sqlda); if (this.fields.Count == rowDesc.Count) { // Try to preserve Array Handle information for (int i = 0; i < this.fields.Count; i++) { if (this.fields[i].IsArray() && this.fields[i].ArrayHandle != null) { rowDesc[i].ArrayHandle = this.fields[i].ArrayHandle; } } } this.fields = rowDesc; // Free memory marshaler.CleanUpNativeData(ref sqlda); // Parse status vector this.db.ParseStatusVector(statusVector); if (status == 100) { this.allRowsFetched = true; } else { // Set row values row = new DbValue[this.fields.ActualCount]; for (int i = 0; i < row.Length; i++) { row[i] = new DbValue(this, this.fields[i]); } } } } return(row); }
public override void Execute() { if (this.state == StatementState.Deallocated) { throw new InvalidOperationException("Statment is not correctly created."); } lock (this.db) { // Marshal structures to pointer XsqldaMarshaler marshaler = XsqldaMarshaler.GetInstance(); IntPtr inSqlda = IntPtr.Zero; IntPtr outSqlda = IntPtr.Zero; if (this.parameters != null) { inSqlda = marshaler.MarshalManagedToNative(this.db.Charset, this.parameters); } if (this.statementType == DbStatementType.StoredProcedure) { this.Fields.ResetValues(); outSqlda = marshaler.MarshalManagedToNative(this.db.Charset, this.fields); } int[] statusVector = FesConnection.GetNewStatusVector(); int trHandle = this.transaction.Handle; int stmtHandle = this.handle; FbClient.isc_dsql_execute2( statusVector, ref trHandle, ref stmtHandle, IscCodes.SQLDA_VERSION1, inSqlda, outSqlda); if (outSqlda != IntPtr.Zero) { Descriptor descriptor = marshaler.MarshalNativeToManaged(this.db.Charset, outSqlda); // This would be an Execute procedure DbValue[] values = new DbValue[descriptor.Count]; for (int i = 0; i < values.Length; i++) { values[i] = new DbValue(this, descriptor[i]); } this.outputParams.Enqueue(values); } // Free memory marshaler.CleanUpNativeData(ref inSqlda); marshaler.CleanUpNativeData(ref outSqlda); this.db.ParseStatusVector(statusVector); this.UpdateRecordsAffected(); this.state = StatementState.Executed; } }
public override void Prepare(string commandText) { // Clear data this.Clear(); this.parameters = null; this.fields = null; lock (this.db) { if (this.state == StatementState.Deallocated) { // Allocate statement this.Allocate(); } // Marshal structures to pointer XsqldaMarshaler marshaler = XsqldaMarshaler.GetInstance(); // Setup fields structure this.fields = new Descriptor(1); IntPtr sqlda = marshaler.MarshalManagedToNative(this.db.Charset, this.fields); int[] statusVector = FesConnection.GetNewStatusVector(); int trHandle = this.transaction.Handle; int stmtHandle = this.handle; byte[] buffer = this.db.Charset.GetBytes(commandText); FbClient.isc_dsql_prepare( statusVector, ref trHandle, ref stmtHandle, (short)buffer.Length, buffer, this.db.Dialect, sqlda); // Marshal Pointer Descriptor descriptor = marshaler.MarshalNativeToManaged(this.db.Charset, sqlda); // Free memory marshaler.CleanUpNativeData(ref sqlda); // Parse status vector this.db.ParseStatusVector(statusVector); // Describe fields this.fields = descriptor; if (this.fields.ActualCount > 0 && this.fields.ActualCount != this.fields.Count) { this.Describe(); } else { if (this.fields.ActualCount == 0) { this.fields = new Descriptor(0); } } // Reset actual field values this.fields.ResetValues(); // Get Statement type this.statementType = this.GetStatementType(); // Update state this.state = StatementState.Prepared; } }