diff --git a/packages/fcl-db/src/sqldb/interbase/ibconnection.pp b/packages/fcl-db/src/sqldb/interbase/ibconnection.pp index e8c937926c..51127ab83d 100644 --- a/packages/fcl-db/src/sqldb/interbase/ibconnection.pp +++ b/packages/fcl-db/src/sqldb/interbase/ibconnection.pp @@ -26,16 +26,23 @@ type ServerVersionString : string; //Complete version string, including name, platform end; + TStatusVector = array [0..19] of ISC_STATUS; + + { EIBDatabaseError } + EIBDatabaseError = class(ESQLDatabaseError) - public - property GDSErrorCode: integer read ErrorCode; deprecated 'Please use ErrorCode instead of GDSErrorCode'; // Nov 2014 + private + FStatusVector: TStatusVector; + public + Property StatusVector: TStatusVector Read FStatusVector Write FStatusVector; + property GDSErrorCode: integer read ErrorCode; deprecated 'Please use ErrorCode instead of GDSErrorCode'; // Nov 2014 end; { TIBCursor } TIBCursor = Class(TSQLCursor) protected - Status : array [0..19] of ISC_STATUS; + Status : TStatusVector; TransactionHandle : pointer; StatementHandle : pointer; SQLDA : PXSQLDA; @@ -48,7 +55,7 @@ type protected TransactionHandle : pointer; TPB : string; // Transaction parameter buffer - Status : array [0..19] of ISC_STATUS; + Status : TStatusVector; end; { TIBConnection } @@ -57,7 +64,7 @@ type private FCheckTransactionParams: Boolean; FDatabaseHandle : pointer; - FStatus : array [0..19] of ISC_STATUS; + FStatus : TStatusVector; FDatabaseInfo : TDatabaseInfo; FDialect : integer; FBlobSegmentSize : word; //required for backward compatibilty; not used @@ -159,16 +166,17 @@ const SQL_BOOLEAN_FIREBIRD = 32764; INVALID_DATA = -1; - procedure TIBConnection.CheckError(ProcName : string; Status : PISC_STATUS); var - ErrorCode : longint; + i,ErrorCode : longint; Msg, SQLState : string; Buf : array [0..1023] of char; + aStatusVector: TStatusVector; + Exc : EIBDatabaseError; begin if ((Status[0] = 1) and (Status[1] <> 0)) then - begin + begin ErrorCode := Status[1]; {$IFDEF LinkDynamically} if assigned(fb_sqlstate) then // >= Firebird 2.5 @@ -177,11 +185,16 @@ begin SQLState := StrPas(Buf); end; {$ENDIF} + { get a local copy of status vector } + for i := 0 to 19 do + aStatusVector[i] := Status[i]; Msg := ''; while isc_interprete(Buf, @Status) > 0 do Msg := Msg + LineEnding + ' -' + StrPas(Buf); - raise EIBDatabaseError.CreateFmt('%s : %s', [ProcName,Msg], Self, ErrorCode, SQLState); - end; + Exc:=EIBDatabaseError.CreateFmt('%s : %s', [ProcName,Msg], Self, ErrorCode, SQLState); + Exc.StatusVector:=aStatusVector; + raise Exc; + end; end;