Browse Source

* add mode objfpc

peter 24 years ago
parent
commit
a400014d54
1 changed files with 85 additions and 84 deletions
  1. 85 84
      fcl/db/interbase/interbase.pp

+ 85 - 84
fcl/db/interbase/interbase.pp

@@ -1,10 +1,10 @@
-{   $Id$     
-    
+{   $Id$
+
     Copyright (c) 2000 by Pavel Stingl
 
 
     Interbase database & dataset
-    
+
     See the file COPYING.FPC, included in this distribution,
     for details about the copyright.
 
@@ -16,6 +16,7 @@
 
 unit Interbase;
 
+{$mode objfpc}
 {$H+}
 
 interface
@@ -26,14 +27,14 @@ type
 
   PInteger = ^integer;
   PSmallInt= ^smallint;
-  
+
   TIBDatabase = class;
   TIBTransaction = class;
   TIBQuery = class;
   TIBStoredProc = class;
-    
+
 { TIBDatabase }
-  
+
   TIBDatabase = class (TDatabase)
   private
     FIBDatabaseHandle    : pointer;
@@ -42,20 +43,20 @@ type
     FTransaction         : TIBTransaction;
     FUserName            : string;
     FDialect             : integer;
-    
+
     procedure SetDBDialect;
     procedure SetTransaction(Value : TIBTransaction);
   protected
     function GetHandle : pointer; virtual;
       { This procedure makes connection to Interbase server internally.
         Is visible only by descendants, in application programming
-        will be invisible. Connection you must establish by setting 
+        will be invisible. Connection you must establish by setting
         @link(Connected) property to true, or by call of Open method.
       }
     procedure DoInternalConnect; override;
       { This procedure disconnects object from IB server internally.
         Is visible only by descendants, in application programming
-        will be invisible. Disconnection you must make by setting 
+        will be invisible. Disconnection you must make by setting
         @link(Connected) property to false, or by call of Close method.
       }
     procedure DoInternalDisconnect; override;
@@ -105,32 +106,32 @@ type
     If you, on other side, need only commit or rollback data
     without transaction closing, execute with CommitRetaining or
     RollbackRetaining. Transaction handle, environment etc. will be
-    as same as before action. Possible values are : caNone, caCommit, caCommitRetaining, caRollback, 
+    as same as before action. Possible values are : caNone, caCommit, caCommitRetaining, caRollback,
     caRollbackRetaining
   }
-  
-  TCommitRollbackAction = (caNone, caCommit, caCommitRetaining, caRollback, 
+
+  TCommitRollbackAction = (caNone, caCommit, caCommitRetaining, caRollback,
     caRollbackRetaining);
   TAccessMode = (amReadWrite, amReadOnly);
   TIsolationLevel = (ilConcurrent, ilConsistent, ilReadCommittedRecV,
     ilReadCommitted);
   TLockResolution = (lrWait, lrNoWait);
-  TTableReservation = (trNone, trSharedLockRead, trSharedLockWrite, 
+  TTableReservation = (trNone, trSharedLockRead, trSharedLockWrite,
     trProtectedLockRead, trProtectedLockWrite);
-  
+
   TIBTransaction = class (TComponent)
   private
     FTransactionHandle   : pointer;               // Transaction handle
-    FAction              : TCommitRollbackAction; 
+    FAction              : TCommitRollbackAction;
     FActive              : boolean;
     FTPB                 : string;                // Transaction parameter buffer
     FDatabase            : TIBDatabase;
     FAccessMode          : TAccessMode;
     FIsolationLevel      : TIsolationLevel;
     FLockResolution      : TLockResolution;
-    FTableReservation    : TTableReservation; 
+    FTableReservation    : TTableReservation;
     FStatus              : array [0..19] of ISC_STATUS;
-    
+
     procedure SetActive(Value : boolean);
     procedure SetTPB;
   protected
@@ -150,11 +151,11 @@ type
     constructor Create(AOwner : TComponent); override;
     destructor Destroy; override;
   published
-    { Default action while closing transaction by setting 
+    { Default action while closing transaction by setting
      @link(Active) property. For details see @link(TCommitRollbackAction)}
     property Action : TCommitRollbackAction read FAction write FAction;
     { Is set to true while transaction is active, false if not.
-      If you set it manually to true, object executes 
+      If you set it manually to true, object executes
       @link(StartTransaction) method, if transaction is
       active, and you set Active to false, object executes
       one of @link(Commit), @link(CommitRetaining), @link(Rollback),
@@ -166,7 +167,7 @@ type
       you must use this property}
     property Database : TIBDatabase read FDatabase write FDatabase;
   end;
-  
+
 { TIBQuery }
 
   PIBBookmark = ^TIBBookmark;
@@ -174,11 +175,11 @@ type
     BookmarkData : integer;
     BookmarkFlag : TBookmarkFlag;
   end;
-  
+
   TStatementType = (stNone, stSelect, stInsert, stUpdate, stDelete,
     stDDL, stGetSegment, stPutSegment, stExecProcedure,
     stStartTrans, stCommit, stRollback, stSelectForUpd);
-  
+
   TIBQuery = class (TDBDataset)
   private
     FTransaction         : TIBTransaction;
@@ -197,7 +198,7 @@ type
     FIsEOF               : boolean;
     FStatementType       : TStatementType;
     FLoadingFieldDefs    : boolean;
-        
+
     procedure SetDatabase(Value : TIBDatabase);
     procedure SetTransaction(Value : TIBTransaction);
     procedure AllocSQLDA(Count : integer);
@@ -218,13 +219,13 @@ type
     procedure ExecuteImmediate;
     procedure ExecuteParams;
     procedure Execute;
-    
+
     // conversion methods
     procedure GetDateTime(CurrBuff, Buffer : pointer; AType : integer);
     procedure GetFloat(CurrBuff, Buffer : pointer; Field : TField);
 
   protected
-  
+
     // abstract & virual methods of TDataset
     function AllocRecordBuffer: PChar; override;
     procedure FreeRecordBuffer(var Buffer: PChar); override;
@@ -265,9 +266,9 @@ type
     { This property holds SQL command, which you want to execute }
     property SQL         : TStrings read FSQL write FSQL;
   end;
-  
+
 { TIBStoredProc - not implemented - yet :-/}
-  
+
   TIBStoredProc = class (TDataset)
   private
   protected
@@ -324,16 +325,16 @@ begin
   x := 0;
   while x < 40 do
     case ResBuf[x] of
-      isc_info_db_sql_dialect : 
+      isc_info_db_sql_dialect :
         begin
           Inc(x);
           Len := isc_vax_integer(@ResBuf[x], 2);
           Inc(x, 2);
           FDialect := isc_vax_integer(@ResBuf[x], Len);
-          Inc(x, Len);  
+          Inc(x, Len);
         end;
       isc_info_end : Break;
-    end;  
+    end;
 end;
 
 procedure TIBDatabase.SetTransaction(Value : TIBTransaction);
@@ -344,14 +345,14 @@ begin
     FTransaction.Database := Self;
     Exit;
   end;
-  
+
   if (Value <> FTransaction) and (Value <> nil) then
     if (not FTransaction.Active) then
     begin
       FTransaction := Value;
       FTransaction.Database := Self;
     end
-    else Exception.Create('Cannot assign transaction while old transaction active!'); 
+    else Exception.Create('Cannot assign transaction while old transaction active!');
 end;
 
 function TIBDatabase.GetHandle: pointer;
@@ -364,7 +365,7 @@ var
   DPB : string;
 begin
   if Connected then
-    Close;    
+    Close;
   DPB := chr(isc_dpb_version1);
   if (FUserName <> '') then
   begin
@@ -375,7 +376,7 @@ begin
   if (DatabaseName = '') then
     raise Exception.Create('TIBDatabase.Open: Database connect string not filled in!');
   FIBDatabaseHandle := nil;
-  if isc_attach_database(@FStatus, Length(DatabaseName), @DatabaseName[1], @FIBDatabaseHandle, 
+  if isc_attach_database(@FStatus, Length(DatabaseName), @DatabaseName[1], @FIBDatabaseHandle,
          Length(DPB), @DPB[1]) <> 0 then
     CheckError('TIBDatabase.Open', FStatus);
   SetDBDialect;
@@ -396,14 +397,14 @@ procedure TIBDatabase.StartTransaction;
 begin
   if FTransaction = nil then
     raise EDatabaseError.Create('TIBDatabase.StartTransaction: Transaction not set');
-  FTransaction.Active := True;    
+  FTransaction.Active := True;
 end;
 
 procedure TIBDatabase.EndTransaction;
 begin
   if FTransaction = nil then
     raise EDatabaseError.Create('TIBDatabase.EndTransaction: Transaction not set');
-  FTransaction.Active := False;    
+  FTransaction.Active := False;
 end;
 
 constructor TIBDatabase.Create(AOwner : TComponent);
@@ -452,7 +453,7 @@ begin
     amReadWrite : FTPB := FTPB + chr(isc_tpb_write);
     amReadOnly  : FTPB := FTPB + chr(isc_tpb_read);
   end;
-  
+
   case FIsolationLevel of
     ilConsistent        : FTPB := FTPB + chr(isc_tpb_consistency);
     ilConcurrent        : FTPB := FTPB + chr(isc_tpb_concurrency);
@@ -461,16 +462,16 @@ begin
     ilReadCommitted     : FTPB := FTPB + chr(isc_tpb_read_committed) +
       chr(isc_tpb_no_rec_version);
   end;
-  
+
   case FLockResolution of
     lrWait   : FTPB := FTPB + chr(isc_tpb_wait);
     lrNoWait : FTPB := FTPB + chr(isc_tpb_nowait);
   end;
-  
+
   case FTableReservation of
-    trSharedLockRead     : FTPB := FTPB + chr(isc_tpb_shared) + 
+    trSharedLockRead     : FTPB := FTPB + chr(isc_tpb_shared) +
       chr(isc_tpb_lock_read);
-    trSharedLockWrite    : FTPB := FTPB + chr(isc_tpb_shared) + 
+    trSharedLockWrite    : FTPB := FTPB + chr(isc_tpb_shared) +
       chr(isc_tpb_lock_write);
     trProtectedLockRead  : FTPB := FTPB + chr(isc_tpb_protected) +
       chr(isc_tpb_lock_read);
@@ -519,17 +520,17 @@ var
   DBHandle : pointer;
 begin
   if Active then Active := False;
-  
+
   if FDatabase = nil then
     Exception.Create('TIBTransaction.StartTransaction: Database not assigned!');
-  
+
   if not Database.Connected then
     Database.Open;
-  
+
   DBHandle := Database.GetHandle;
   SetTPB;
   FTransactionHandle := nil;
-  
+
   if isc_start_transaction(@FStatus, @FTransactionHandle, 1,
      [@DBHandle, Length(FTPB), @FTPB[1]]) <> 0 then
     CheckError('TIBTransaction.StartTransaction',FStatus)
@@ -548,7 +549,7 @@ begin
   FTableReservation := trNone;
   FTransactionHandle := nil;
   FDatabase := nil;
-  
+
   FillChar(FStatus, SizeOf(FStatus), #0);
 end;
 
@@ -560,14 +561,14 @@ begin
 {  // i really can't allow commit of transaction
   // on destroy...
 }
-{  
+{
   try
-    if Active then 
+    if Active then
       Active := False;
   except
   end;
 }
-  
+
   inherited Destroy;
 end;
 
@@ -598,7 +599,7 @@ begin
   GetMem(FSQLDA, XSQLDA_Length * Count);
   FSQLDAAllocated := Count;
   FSQLDA^.Version := sqlda_version1;
-  FSQLDA^.SQLN := Count; 
+  FSQLDA^.SQLN := Count;
 end;
 
 procedure TIBQuery.AllocStatement;
@@ -608,7 +609,7 @@ begin
   if not FDatabase.Connected then
     FDatabase.Open;
   dh := FDatabase.GetHandle;
-  
+
   if isc_dsql_allocate_statement(@FStatus, @dh, @FStatement) <> 0 then
     CheckError('TIBQuery.AllocStatement', FStatus);
 end;
@@ -627,10 +628,10 @@ var
   tr  : pointer;
 begin
   tr := FTransaction.GetHandle;
-  
+
   for x := 0 to FSQL.Count - 1 do
     Buf := Buf + FSQL[x] + ' ';
-    
+
   if isc_dsql_prepare(@FStatus, @tr, @FStatement, 0, @Buf[1], 1, nil) <> 0 then
     CheckError('TIBQuery.PrepareStatement', FStatus);
 end;
@@ -654,23 +655,23 @@ begin
   for x := 0 to FSQLDA^.SQLN - 1 do
   begin
     case FSQLDA^.SQLVar[x].SQLType of
-      sql_varying + 1: 
+      sql_varying + 1:
         FSQLDA^.SQLVar[x].SQLType := sql_varying;
-      sql_text + 1   : 
+      sql_text + 1   :
         FSQLDA^.SQLVar[x].SQLType := sql_text;
       sql_short, sql_short + 1, sql_long + 1:
         FSQLDA^.SQLVar[x].SQLType := sql_long;
       sql_float + 1  :
         FSQLDA^.SQLVar[x].SQLType := sql_float;
-      sql_double + 1 : 
+      sql_double + 1 :
         FSQLDA^.SQLVar[x].SQLType := sql_double;
-      sql_blob + 1   : 
+      sql_blob + 1   :
         FSQLDA^.SQLVar[x].SQLType := sql_blob;
       sql_type_time + 1   :
         FSQLDA^.SQLVar[x].SQLType := sql_type_time;
       sql_timestamp + 1:
         FSQLDA^.SQLVar[x].SQLType := sql_timestamp;
-    end; 
+    end;
   end;
 end;
 
@@ -699,7 +700,7 @@ begin
     if FSQLDA^.SQLVar[x].SQLData <> nil then
     begin
       FreeMem(FSQLDA^.SQLVar[x].SQLData);
-      FSQLDA^.SQLVar[x].SQLData := nil; 
+      FSQLDA^.SQLVar[x].SQLData := nil;
     end;
   end;
   {$R+}
@@ -709,14 +710,14 @@ procedure TIBQuery.Fetch;
 var
   retcode : integer;
 begin
-  if not (FStatementType in [stSelect]) then 
+  if not (FStatementType in [stSelect]) then
     Exit;
 
   retcode := isc_dsql_fetch(@FStatus, @FStatement, 1, FSQLDA);
   if (retcode <> 0) and (retcode <> 100) then
     CheckError('TIBQuery.Fetch', FStatus);
 
-  FIsEOF := (retcode = 100); 
+  FIsEOF := (retcode = 100);
 end;
 
 function TIBQuery.LoadBufferFromSQLDA(Buffer : PChar): TGetResult;
@@ -724,14 +725,14 @@ var
   x          : integer;
   VarcharLen : word;
 begin
-  
+
   Fetch;
   if FIsEOF then
   begin
     Result := grEOF;
     Exit;
   end;
-  
+
   {$R-}
   for x := 0 to FSQLDA^.SQLD - 1 do
   begin
@@ -747,7 +748,7 @@ begin
       Inc(Buffer, SQLLen);
     end;
   end;
-  {$R+} 
+  {$R+}
   Result := grOK;
 
 end;
@@ -759,7 +760,7 @@ var
 begin
   FStatementType := stNone;
   x := isc_info_sql_stmt_type;
-  if isc_dsql_sql_info(@FStatus, @FStatement, SizeOf(X), 
+  if isc_dsql_sql_info(@FStatus, @FStatement, SizeOf(X),
     @x, SizeOf(ResBuf), @ResBuf) <> 0 then
     CheckError('TIBQuery.GetStatementType', FStatus);
   if Ord(ResBuf[0]) = isc_info_sql_stmt_type then
@@ -788,13 +789,13 @@ begin
   LensSet := False;
 
   case (SQLType and not 1) of
-    SQL_VARYING : 
+    SQL_VARYING :
       begin
         LensSet := True;
         TrType := ftString;
         TrLen := SQLLen;
       end;
-    SQL_TEXT :      
+    SQL_TEXT :
       begin
         LensSet := True;
         TrType := ftString;
@@ -809,7 +810,7 @@ begin
     SQL_ARRAY :
       begin
       end;
-    SQL_BLOB : 
+    SQL_BLOB :
       begin
       end;
     SQL_SHORT :
@@ -865,8 +866,8 @@ var
   STime : TSystemTime;  // System time
   PTime : TDateTime;    // Pascal time
 begin
-  case (AType and not 1) of 
-    SQL_TYPE_DATE : 
+  case (AType and not 1) of
+    SQL_TYPE_DATE :
       isc_decode_sql_date(PISC_DATE(CurrBuff), @CTime);
     SQL_TYPE_TIME :
       isc_decode_sql_time(PISC_TIME(CurrBuff), @CTime);
@@ -880,7 +881,7 @@ begin
   STime.Minute      := CTime.tm_min;
   STime.Second      := CTime.tm_sec;
   STime.Millisecond := 0;
-  
+
   PTime := SystemTimeToDateTime(STime);
   Move(PTime, Buffer^, SizeOf(PTime));
 end;
@@ -919,7 +920,7 @@ end;
 
 procedure TIBQuery.GetBookmarkData(Buffer: PChar; Data: Pointer);
 begin
-  PInteger(Data)^ := PIBBookmark(Buffer + FRecordSize)^.BookmarkData; 
+  PInteger(Data)^ := PIBBookmark(Buffer + FRecordSize)^.BookmarkData;
 end;
 
 function TIBQuery.GetBookmarkFlag(Buffer: PChar): TBookmarkFlag;
@@ -935,14 +936,14 @@ var
 begin
   Result := False;
   CurrBuff := ActiveBuffer;
-  
+
   for x := 0 to FSQLDA^.SQLD - 1 do
   begin
     {$R-}
     if (Field.FieldName = FSQLDA^.SQLVar[x].SQLName) then
     begin
       case Field.DataType of
-        ftInteger : 
+        ftInteger :
           begin
             b := 0;
             Move(b, Buffer^, 4);
@@ -955,12 +956,12 @@ begin
             Move(CurrBuff^, Buffer^, Field.Size);
             PChar(Buffer + Field.Size)^ := #0;
           end;
-        ftFloat   : 
+        ftFloat   :
           GetFloat(CurrBuff, Buffer, Field);
       end;
-      
+
       Result := True;
-      
+
       Break;
     end
     else Inc(CurrBuff, FSQLDA^.SQLVar[x].SQLLen);
@@ -970,7 +971,7 @@ end;
 
 function TIBQuery.GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult;
 begin
-  if FStatementType <> stSelect then 
+  if FStatementType <> stSelect then
   begin
     Result := grEOF;
     Exit;
@@ -987,10 +988,10 @@ begin
           FCurrentRecord := -1;
         end
         else Dec(FCurrentRecord);
-      gmCurrent : 
+      gmCurrent :
         if (FCurrentRecord < 0) or (FCurrentRecord >= RecordCount) then
           Result := grError;
-      gmNext : 
+      gmNext :
         if FCurrentRecord >= (RecordCount - 1) then
         begin
           Result := LoadBufferFromSQLDA(Buffer);
@@ -1003,7 +1004,7 @@ begin
         else Inc(FCurrentRecord);
     end;
   end;
-  
+
   if Result = grOK then
   begin
     with PIBBookmark(Buffer + FRecordSize)^ do
@@ -1074,15 +1075,15 @@ begin
     Exit;
 
   FLoadingFieldDefs := True;
-  
+
   try
     FieldDefs.Clear;
     {$R-}
     for x := 0 to FSQLDA^.SQLD - 1 do
     begin
-      TranslateFldType(FSQLDA^.SQLVar[x].SQLType, FSQLDA^.SQLVar[x].SQLLen, lenset, 
+      TranslateFldType(FSQLDA^.SQLVar[x].SQLType, FSQLDA^.SQLVar[x].SQLLen, lenset,
         TransType, TransLen);
-      TFieldDef.Create(FieldDefs, FSQLDA^.SQLVar[x].SQLName, TransType, 
+      TFieldDef.Create(FieldDefs, FSQLDA^.SQLVar[x].SQLName, TransType,
         TransLen, False, (x + 1));
     end;
     {$R+}