--- ibx/trunk/fbintf/client/FBSQLData.pas 2019/04/11 08:51:23 287 +++ ibx/trunk/fbintf/client/FBSQLData.pas 2020/04/17 10:26:08 291 @@ -119,6 +119,7 @@ type function GetSQLType: cardinal; virtual; abstract; function GetSQLTypeName: AnsiString; overload; class function GetSQLTypeName(SQLType: short): AnsiString; overload; + function GetStrDataLength: short; function GetName: AnsiString; virtual; abstract; function GetScale: integer; virtual; abstract; function GetAsBoolean: boolean; @@ -292,7 +293,6 @@ type FIBXSQLVAR: TSQLVarData; FOwner: IUnknown; {Keep reference to ensure Metadata/statement not discarded} FPrepareSeqNo: integer; - FStatement: IStatement; FChangeSeqNo: integer; protected procedure CheckActive; override; @@ -304,7 +304,6 @@ type constructor Create(aOwner: IUnknown; aIBXSQLVAR: TSQLVarData); destructor Destroy; override; function GetSQLDialect: integer; override; - property Statement: IStatement read FStatement; public {IColumnMetaData} @@ -322,19 +321,26 @@ type function GetSize: cardinal; function GetArrayMetaData: IArrayMetaData; function GetBlobMetaData: IBlobMetaData; + function GetStatement: IStatement; + function GetTransaction: ITransaction; virtual; property Name: AnsiString read GetName; property Size: cardinal read GetSize; property CharSetID: cardinal read getCharSetID; property SQLSubtype: integer read getSubtype; property IsNullable: Boolean read GetIsNullable; + public + property Statement: IStatement read GetStatement; end; { TIBSQLData } TIBSQLData = class(TColumnMetaData,ISQLData) + private + FTransaction: ITransaction; protected procedure CheckActive; override; public + function GetTransaction: ITransaction; override; function GetIsNull: Boolean; override; function GetAsArray: IArray; function GetAsBlob: IBlob; overload; @@ -443,6 +449,7 @@ type function ByName(Idx: AnsiString): ISQLData; function getSQLData(index: integer): ISQLData; procedure GetData(index: integer; var IsNull:boolean; var len: short; var data: PByte); + function GetStatement: IStatement; function GetTransaction: ITransaction; virtual; procedure SetRetainInterfaces(aValue: boolean); end; @@ -949,6 +956,15 @@ begin end; end; +function TSQLDataItem.GetStrDataLength: short; +begin + with FFirebirdClientAPI do + if SQLType = SQL_VARYING then + Result := DecodeInteger(SQLData, 2) + else + Result := DataLength; +end; + function TSQLDataItem.GetAsBoolean: boolean; begin CheckActive; @@ -1674,6 +1690,16 @@ begin result := FIBXSQLVAR.GetBlobMetaData; end; +function TColumnMetaData.GetStatement: IStatement; +begin + Result := FIBXSQLVAR.GetStatement; +end; + +function TColumnMetaData.GetTransaction: ITransaction; +begin + Result := GetStatement.GetTransaction; +end; + { TIBSQLData } procedure TIBSQLData.CheckActive; @@ -1693,6 +1719,14 @@ begin IBError(ibxeBOF,[nil]); end; +function TIBSQLData.GetTransaction: ITransaction; +begin + if FTransaction = nil then + Result := inherited GetTransaction + else + Result := FTransaction; +end; + function TIBSQLData.GetIsNull: Boolean; begin CheckActive; @@ -2416,13 +2450,16 @@ begin end; function TResults.GetISQLData(aIBXSQLVAR: TSQLVarData): ISQLData; +var col: TIBSQLData; begin if (aIBXSQLVAR.Index < 0) or (aIBXSQLVAR.Index >= getCount) then IBError(ibxeInvalidColumnIndex,[nil]); if not HasInterface(aIBXSQLVAR.Index) then AddInterface(aIBXSQLVAR.Index, TIBSQLData.Create(self,aIBXSQLVAR)); - Result := TIBSQLData(GetInterface(aIBXSQLVAR.Index)); + col := TIBSQLData(GetInterface(aIBXSQLVAR.Index)); + col.FTransaction := GetTransaction; + Result := col; end; constructor TResults.Create(aResults: TSQLDataArea); @@ -2479,6 +2516,11 @@ begin FResults.GetData(index,IsNull, len,data); end; +function TResults.GetStatement: IStatement; +begin + Result := FStatement; +end; + function TResults.GetTransaction: ITransaction; begin Result := FStatement.GetTransaction;