ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/public/ibx/trunk/runtime/IBCustomDataSet.pas
(Generate patch)

Comparing ibx/trunk/runtime/IBCustomDataSet.pas (file contents):
Revision 37 by tony, Mon Feb 15 14:44:25 2016 UTC vs.
Revision 43 by tony, Thu Sep 22 17:10:15 2016 UTC

# Line 33 | Line 33
33  
34   unit IBCustomDataSet;
35  
36 + {$IF FPC_FULLVERSION >= 20700 }
37 + {$codepage UTF8}
38 + {$DEFINE HAS_ANSISTRING_CODEPAGE}
39 + {$DEFINE NEW_TBOOKMARK}
40 + {$ENDIF}
41 +
42   {$R-}
43  
44   {$Mode Delphi}
# Line 92 | Line 98 | type
98      fdDataSize: Short;
99      fdDataLength: Short;
100      fdDataOfs: Integer;
101 +    {$IFDEF HAS_ANSISTRING_CODEPAGE}
102 +    fdCodePage: TSystemCodePage;
103 +    {$ENDIF}
104    end;
105    PFieldData = ^TFieldData;
106  
# Line 120 | Line 129 | type
129  
130    TIBStringField = class(TStringField)
131    private
132 <    FCharacterSetName: string;
132 >    FCharacterSetName: RawByteString;
133      FCharacterSetSize: integer;
134    protected
135      function GetDefaultWidth: Longint; override;
# Line 131 | Line 140 | type
140      function GetAsVariant: Variant; override;
141      function GetValue(var Value: string): Boolean;
142      procedure SetAsString(const Value: string); override;
143 <    property CharacterSetName: string read FCharacterSetName write FCharacterSetName;
135 <    property CharacterSetSize: integer read FCharacterSetSize write FCharacterSetSize;
136 <  end;
137 <
138 <  { TIBWideStringField }
139 <
140 <  TIBWideStringField = class(TWideStringField)
141 <  private
142 <    FCharacterSetName: string;
143 <    FCharacterSetSize: integer;
144 <  public
145 <    property CharacterSetName: string read FCharacterSetName write FCharacterSetName;
143 >    property CharacterSetName: RawByteString read FCharacterSetName write FCharacterSetName;
144      property CharacterSetSize: integer read FCharacterSetSize write FCharacterSetSize;
145 +    {$IFDEF HAS_ANSISTRING_CODEPAGE}
146 +    private
147 +      FCodePage: TSystemCodePage;
148 +    public
149 +      property CodePage: TSystemCodePage read FCodePage write FCodePage;
150 +    {$ENDIF}
151    end;
152  
153    { TIBBCDField }
# Line 172 | Line 176 | type
176  
177     TIBMemoField = class(TMemoField)
178     private
179 <     FCharacterSetName: string;
179 >     FCharacterSetName: RawByteString;
180       FCharacterSetSize: integer;
181       FDisplayTextAsClassName: boolean;
182       function GetTruncatedText: string;
183     protected
184 +     function GetAsString: string; override;
185       function GetDefaultWidth: Longint; override;
186       procedure GetText(var AText: string; ADisplayText: Boolean); override;
187 +     procedure SetAsString(const AValue: string); override;
188     public
189       constructor Create(AOwner: TComponent); override;
190 <     property CharacterSetName: string read FCharacterSetName write FCharacterSetName;
190 >     property CharacterSetName: RawByteString read FCharacterSetName write FCharacterSetName;
191       property CharacterSetSize: integer read FCharacterSetSize write FCharacterSetSize;
192 <  published
192 >   published
193       property DisplayTextAsClassName: boolean read FDisplayTextAsClassName
194                                              write FDisplayTextAsClassName;
195 <   end;
190 <
191 <   { TIBWideMemoField }
192 <
193 <   TIBWideMemoField = class(TWideMemoField)
195 >   {$IFDEF HAS_ANSISTRING_CODEPAGE}
196     private
197 <     FCharacterSetName: string;
198 <     FCharacterSetSize: integer;
197 <     FDisplayTextAsClassName: boolean;
198 <     function GetTruncatedText: string;
199 <   protected
200 <     function GetDefaultWidth: Longint; override;
201 <     procedure GetText(var AText: string; ADisplayText: Boolean); override;
197 >     FCodePage: TSystemCodePage;
198 >     FFCodePage: TSystemCodePage;
199     public
200 <     constructor Create(AOwner: TComponent); override;
201 <     property CharacterSetName: string read FCharacterSetName write FCharacterSetName;
205 <     property CharacterSetSize: integer read FCharacterSetSize write FCharacterSetSize;
206 <   published
207 <      property DisplayTextAsClassName: boolean read FDisplayTextAsClassName
208 <                                             write FDisplayTextAsClassName;
200 >     property CodePage: TSystemCodePage read FFCodePage write FFCodePage;
201 >   {$ENDIF}
202     end;
203  
204    TIBDataLink = class(TDetailDataLink)
# Line 719 | Line 712 | type
712    protected
713      FField: TField;
714      FBlobStream: TIBBlobStream;
715 +    function  GetSize: Int64; override;
716    public
717      constructor Create(AField: TField; ABlobStream: TIBBlobStream;
718                         Mode: TBlobStreamMode);
# Line 755 | Line 749 | DefaultFieldClasses: array[TFieldType] o
749      TBlobField,         { ftTypedBinary }
750      nil,                { ftCursor }
751      TStringField,       { ftFixedChar }
752 <    TIBWideStringField,    { ftWideString }
752 >    nil,    { ftWideString }
753      TLargeIntField,     { ftLargeInt }
754      nil,          { ftADT }
755      nil,        { ftArray }
# Line 770 | Line 764 | DefaultFieldClasses: array[TFieldType] o
764      TDateTimeField,    {ftTimestamp}
765      TIBBCDField,       {ftFMTBcd}
766      nil,  {ftFixedWideChar}
767 <    TIBWideMemoField);   {ftWideMemo}
767 >    nil);   {ftWideMemo}
768   (*
769      TADTField,          { ftADT }
770      TArrayField,        { ftArray }
# Line 787 | Line 781 | DefaultFieldClasses: array[TFieldType] o
781  
782   implementation
783  
784 < uses IBIntf, Variants, FmtBCD, LazUTF8;
784 > uses IBIntf, Variants, FmtBCD, LazUTF8, IBCodePage;
785  
786   const FILE_BEGIN = 0;
787        FILE_CURRENT = 1;
# Line 816 | Line 810 | type
810  
811    TIBFieldDef = class(TFieldDef)
812    private
813 <    FCharacterSetName: string;
813 >    FCharacterSetName: RawByteString;
814      FCharacterSetSize: integer;
815 +    {$IFDEF HAS_ANSISTRING_CODEPAGE}
816 +    FCodePage: TSystemCodePage;
817 +    {$ENDIF}
818    published
819 <    property CharacterSetName: string read FCharacterSetName write FCharacterSetName;
819 >    property CharacterSetName: RawByteString read FCharacterSetName write FCharacterSetName;
820      property CharacterSetSize: integer read FCharacterSetSize write FCharacterSetSize;
821 +    {$IFDEF HAS_ANSISTRING_CODEPAGE}
822 +    property CodePage: TSystemCodePage read FCodePage write FCodePage;
823 +    {$ENDIF}
824    end;
825  
826  
# Line 865 | Line 865 | type
865      Result := str;
866    end;
867  
868 { TIBWideMemoField }
869
870 function TIBWideMemoField.GetTruncatedText: string;
871 begin
872  Result := GetAsString;
873
874  if Result <> '' then
875    if DisplayWidth = 0 then
876      Result := TextToSingleLine(Result)
877    else
878    if Length(Result) > DisplayWidth then {Show truncation with elipses}
879      Result := TextToSingleLine(system.copy(Result,1,DisplayWidth-3)) + '...';
880 end;
881
882 function TIBWideMemoField.GetDefaultWidth: Longint;
883 begin
884  Result := 128;
885 end;
886
887 procedure TIBWideMemoField.GetText(var AText: string; ADisplayText: Boolean);
888 begin
889  if ADisplayText then
890  begin
891    if not DisplayTextAsClassName then
892      AText := GetTruncatedText
893    else
894      inherited GetText(AText, ADisplayText);
895  end
896  else
897    AText := GetAsString;
898 end;
899
900 constructor TIBWideMemoField.Create(AOwner: TComponent);
901 begin
902  inherited Create(AOwner);
903  BlobType := ftWideMemo;
904 end;
905
868   { TIBMemoField }
869  
870   function TIBMemoField.GetTruncatedText: string;
# Line 932 | Line 894 | begin
894     end
895   end;
896  
897 + function TIBMemoField.GetAsString: string;
898 + var s: RawByteString;
899 + begin
900 +  s := inherited GetAsString;
901 +  {$IFDEF HAS_ANSISTRING_CODEPAGE}
902 +  SetCodePage(s,CodePage,false);
903 +  if (CodePage <> CP_NONE) and (CodePage <> CP_UTF8) then
904 +    SetCodePage(s,CP_UTF8,true);  {LCL only accepts UTF8}
905 +  {$ENDIF}
906 +  Result := s;
907 + end;
908 +
909   function TIBMemoField.GetDefaultWidth: Longint;
910   begin
911    if DisplayTextAsClassName then
# Line 944 | Line 918 | procedure TIBMemoField.GetText(var AText
918   begin
919    if ADisplayText then
920    begin
921 <    if not DisplayTextAsClassName then
921 >    if not DisplayTextAsClassName and (CharacterSetName <> '') then
922        AText := GetTruncatedText
923      else
924        inherited GetText(AText, ADisplayText);
# Line 953 | Line 927 | begin
927      AText := GetAsString;
928   end;
929  
930 + procedure TIBMemoField.SetAsString(const AValue: string);
931 + var s: RawByteString;
932 + begin
933 +  s := AValue;
934 +  {$IFDEF HAS_ANSISTRING_CODEPAGE}
935 +  if StringCodePage(Value) <> CodePage then
936 +    SetCodePage(s,CodePage,CodePage<>CP_NONE);
937 +  {$ENDIF}
938 +  inherited SetAsString(s);
939 + end;
940 +
941   constructor TIBMemoField.Create(AOwner: TComponent);
942   begin
943    inherited Create(AOwner);
944    BlobType := ftMemo;
945 +  {$IFDEF HAS_ANSISTRING_CODEPAGE}
946 +  FCodePage := CP_NONE;
947 +  {$ENDIF}
948   end;
949  
950   { TIBControlLink }
# Line 999 | Line 987 | constructor TIBStringField.Create(aOwner
987   begin
988    inherited Create(aOwner);
989    FCharacterSetSize := 1;
990 +  {$IFDEF HAS_ANSISTRING_CODEPAGE}
991 +  FCodePage := CP_NONE;
992 +  {$ENDIF}
993   end;
994  
995   class procedure TIBStringField.CheckTypeSize(Value: Integer);
# Line 1021 | Line 1012 | end;
1012   function TIBStringField.GetValue(var Value: string): Boolean;
1013   var
1014    Buffer: PChar;
1015 +  s: RawByteString;
1016 + //  i: integer;
1017   begin
1018    Buffer := nil;
1019    IBAlloc(Buffer, 0, Size + 1);
# Line 1028 | Line 1021 | begin
1021      Result := GetData(Buffer);
1022      if Result then
1023      begin
1024 +      {$IFDEF HAS_ANSISTRING_CODEPAGE}
1025 +      s := string(Buffer);
1026 +      SetCodePage(s,CodePage,false);
1027 +      if (CodePage <> CP_NONE) and (CodePage <> CP_UTF8) then
1028 +        SetCodePage(s,CP_UTF8,true);  {LCL only accepts UTF8}
1029 +      Value := s;
1030 + (*      write(FieldName,': ', StringCodePage(Value),', ',Value,' ');
1031 +      for i := 1 to Length(Value) do
1032 +        write(Format('%x ',[byte(Value[i])]));
1033 +      writeln;*)
1034 +      {$ELSE}
1035        Value := string(Buffer);
1036 +      {$ENDIF}
1037        if Transliterate and (Value <> '') then
1038          DataSet.Translate(PChar(Value), PChar(Value), False);
1039      end
# Line 1040 | Line 1045 | end;
1045   procedure TIBStringField.SetAsString(const Value: string);
1046   var
1047    Buffer: PChar;
1048 +  s: RawByteString;
1049   begin
1050    Buffer := nil;
1051    IBAlloc(Buffer, 0, Size + 1);
1052    try
1053 <    StrLCopy(Buffer, PChar(Value), Size);
1053 >    s := Value;
1054 >    {$IFDEF HAS_ANSISTRING_CODEPAGE}
1055 >    if StringCodePage(s) <> CodePage then
1056 >      SetCodePage(s,CodePage,CodePage<>CP_NONE);
1057 >    {$ENDIF}
1058 >    StrLCopy(Buffer, PChar(s), Size);
1059      if Transliterate then
1060        DataSet.Translate(Buffer, Buffer, True);
1061      SetData(Buffer);
# Line 1260 | Line 1271 | end;
1271  
1272   procedure TIBCustomDataSet.ApplyUpdates;
1273   var
1274 <  {$IF FPC_FULLVERSION >= 20700 }
1274 >  {$IFDEF NEW_TBOOKMARK }
1275    CurBookmark: TBookmark;
1276    {$ELSE}
1277    CurBookmark: string;
# Line 1704 | Line 1715 | var
1715    LocalInt64: Int64;
1716    LocalCurrency: Currency;
1717    FieldsLoaded: Integer;
1707  temp: TIBXSQLVAR;
1718   begin
1719    p := PRecordData(Buffer);
1720    { Make sure blob cache is empty }
# Line 1753 | Line 1763 | begin
1763          (Qry.Current[i].Data^.sqltype and 1 = 1);
1764        rdFields[j].fdIsNull :=
1765          (rdFields[j].fdNullable and (Qry.Current[i].Data^.sqlind^ = -1));
1766 +      {$IFDEF HAS_ANSISTRING_CODEPAGE}
1767 +      rdFields[j].fdCodePage := 0;
1768 +      {$ENDIF}
1769        LocalData := Qry.Current[i].Data^.sqldata;
1770        case rdFields[j].fdDataType of
1771          SQL_TIMESTAMP:
# Line 1833 | Line 1846 | begin
1846          begin
1847            rdFields[j].fdDataSize := Qry.Current[i].Data^.sqllen;
1848            rdFields[j].fdDataLength := isc_vax_integer(Qry.Current[i].Data^.sqldata, 2);
1849 +          {$IFDEF HAS_ANSISTRING_CODEPAGE}
1850 +          TFirebirdCharacterSets.CharSetID2CodePage(Qry.Current[i].Data^.sqlsubtype and $FF,
1851 +                                                    rdFields[j].fdCodePage);
1852 +          {$ENDIF}
1853            if RecordNumber >= 0 then
1854            begin
1855              if (rdFields[j].fdDataLength = 0) then
1856                LocalData := nil
1857              else
1858 <            begin
1842 <              temp :=  Qry.Current[i];
1843 <              LocalData := @temp.Data^.sqldata[2];
1844 < (*              LocalData := @Qry.Current[i].Data^.sqldata[2];*)
1845 <            end;
1858 >              Inc(LocalData,2);
1859            end;
1860          end;
1861          SQL_BOOLEAN:
# Line 1853 | Line 1866 | begin
1866              LocalBool := Qry.Current[i].AsBoolean;
1867            LocalData := PChar(@LocalBool);
1868          end;
1869 <        else { SQL_TEXT, SQL_BLOB, SQL_ARRAY, SQL_QUAD }
1869 >        SQL_TEXT:
1870 >        begin
1871 >          rdFields[j].fdDataSize := Qry.Current[i].Data^.sqllen;
1872 >          rdFields[j].fdDataLength := rdFields[j].fdDataSize;
1873 >           {$IFDEF HAS_ANSISTRING_CODEPAGE}
1874 >          TFirebirdCharacterSets.CharSetID2CodePage(Qry.Current[i].Data^.sqlsubtype and $FF,
1875 >                                                    rdFields[j].fdCodePage);
1876 >          {$ENDIF}
1877 >       end;
1878 >        else {  SQL_BLOB, SQL_ARRAY, SQL_QUAD }
1879          begin
1880            rdFields[j].fdDataSize := Qry.Current[i].Data^.sqllen;
1859          if (rdFields[j].fdDataType = SQL_TEXT) then
1860            rdFields[j].fdDataLength := rdFields[j].fdDataSize;
1881          end;
1882        end;
1883        if RecordNumber < 0 then
# Line 1995 | Line 2015 | function TIBCustomDataSet.InternalLocate
2015    const KeyValues: Variant; Options: TLocateOptions): Boolean;
2016   var
2017    keyFieldList: TList;
2018 <  {$IF FPC_FULLVERSION >= 20700 }
2018 >  {$IFDEF NEW_TBOOKMARK }
2019    CurBookmark: TBookmark;
2020    {$ELSE}
2021    CurBookmark: string;
# Line 2392 | Line 2412 | procedure TIBCustomDataSet.SetInternalSQ
2412   var
2413    i, j: Integer;
2414    cr, data: PChar;
2415 <  fn, st: string;
2415 >  fn: string;
2416 >  st: RawByteString;
2417    OldBuffer: Pointer;
2418    ts: TTimeStamp;
2419   begin
# Line 2440 | Line 2461 | begin
2461                SQL_TEXT, SQL_VARYING:
2462                begin
2463                  SetString(st, data, rdFields[j].fdDataLength);
2464 +                {$IFDEF HAS_ANSISTRING_CODEPAGE}
2465 +                SetCodePage(st,rdFields[j].fdCodePage,false);
2466 +                {$ENDIF}
2467                  Qry.Params[i].AsString := st;
2468                end;
2469              SQL_FLOAT, SQL_DOUBLE, SQL_D_FLOAT:
# Line 2937 | Line 2961 | end;
2961  
2962   procedure TIBCustomDataSet.FetchAll;
2963   var
2964 <  {$IF FPC_FULLVERSION >= 20700 }
2964 >  {$IFDEF NEW_TBOOKMARK }
2965    CurBookmark: TBookmark;
2966    {$ELSE}
2967    CurBookmark: string;
# Line 3360 | Line 3384 | const
3384   var
3385    FieldType: TFieldType;
3386    FieldSize: Word;
3387 <  charSetID: short;
3387 >  charSetID: integer;
3388    CharSetSize: integer;
3389 <  CharSetName: string;
3389 >  CharSetName: RawByteString;
3390 >  {$IFDEF HAS_ANSISTRING_CODEPAGE}
3391 >  FieldCodePage: TSystemCodePage;
3392 >  {$ENDIF}
3393    FieldNullable : Boolean;
3394    i, FieldPosition, FieldPrecision: Integer;
3395    FieldAliasName, DBAliasName: string;
# Line 3495 | Line 3522 | begin
3522          FieldNullable := SourceQuery.Current[i].IsNullable;
3523          CharSetSize := 0;
3524          CharSetName := '';
3525 +        {$IFDEF HAS_ANSISTRING_CODEPAGE}
3526 +        FieldCodePage := CP_NONE;
3527 +        {$ENDIF}
3528          case sqltype and not 1 of
3529            { All VARCHAR's must be converted to strings before recording
3530             their values }
3531            SQL_VARYING, SQL_TEXT:
3532            begin
3533 <            CharSetSize := FBase.GetCharSetSize(sqlsubtype and $FF);
3534 <            CharSetName := FBase.GetCharSetName(sqlsubtype and $FF);
3535 <            {FieldSize is encoded for strings - see TIBStringField.SetSize for decode}
3533 >            CharSetID := SourceQuery.Current[i].GetCharSetID;
3534 >            TFirebirdCharacterSets.CharSetWidth(CharSetID,CharSetSize);
3535 >            CharSetName := TFirebirdCharacterSets.GetCharsetName(CharSetID);
3536 >            {$IFDEF HAS_ANSISTRING_CODEPAGE}
3537 >            TFirebirdCharacterSets.CharSetID2CodePage(CharSetID,FieldCodePage);
3538 >            {$ENDIF}
3539              FieldSize := sqllen;
3540 <            if CharSetSize = 2 then
3508 <              FieldType := ftWideString
3509 <            else
3510 <              FieldType := ftString;
3540 >            FieldType := ftString;
3541            end;
3542            { All Doubles/Floats should be cast to doubles }
3543            SQL_DOUBLE, SQL_FLOAT:
# Line 3567 | Line 3597 | begin
3597              FieldSize := sizeof (TISC_QUAD);
3598              if (sqlsubtype = 1) then
3599              begin
3600 <              if strpas(sqlname) = '' then {Complex SQL with no identifiable column - use connection default}
3601 <              begin
3602 <                CharSetSize := FBase.GetDefaultCharSetSize;
3603 <                CharSetName := FBase.GetDefaultCharSetName;
3604 <              end
3605 <              else
3606 <              begin
3577 <                charSetID := GetBlobCharSetID(Database.Handle,Database.InternalTransaction.Handle,
3578 <                        @relname,@sqlname);
3579 <                CharSetSize := FBase.GetCharSetSize(charSetID);
3580 <                CharSetName := FBase.GetCharSetName(charSetID);
3581 <              end;
3582 <              if CharSetSize = 2 then
3583 <                FieldType := ftWideMemo
3584 <              else
3585 <                FieldType := ftMemo;
3600 >              CharSetID := SourceQuery.Current[i].GetCharSetID;
3601 >              TFirebirdCharacterSets.CharSetWidth(CharSetID,CharSetSize);
3602 >              CharSetName := TFirebirdCharacterSets.GetCharsetName(CharSetID);
3603 >              {$IFDEF HAS_ANSISTRING_CODEPAGE}
3604 >              TFirebirdCharacterSets.CharSetID2CodePage(CharSetID,FieldCodePage);
3605 >              {$ENDIF}
3606 >              FieldType := ftMemo;
3607              end
3608              else
3609                FieldType := ftBlob;
# Line 3612 | Line 3633 | begin
3633              InternalCalcField := False;
3634              CharacterSetSize := CharSetSize;
3635              CharacterSetName := CharSetName;
3636 +            {$IFDEF HAS_ANSISTRING_CODEPAGE}
3637 +            CodePage := FieldCodePage;
3638 +            {$ENDIF}
3639              if (FieldName <> '') and (RelationName <> '') then
3640              begin
3641                if Has_COMPUTED_BLR(RelationName, FieldName) then
# Line 3779 | Line 3803 | procedure TIBCustomDataSet.InternalOpen;
3803            begin
3804              CharacterSetSize := IBFieldDef.CharacterSetSize;
3805              CharacterSetName := IBFieldDef.CharacterSetName;
3806 <          end;
3807 <        end
3808 <        else
3785 <        if(Fields[i] is TIBWideStringField) then
3786 <        with TIBWideStringField(Fields[i]) do
3787 <        begin
3788 <          IBFieldDef := GetFieldDef(FieldNo);
3789 <          if IBFieldDef <> nil then
3790 <          begin
3791 <            CharacterSetSize := IBFieldDef.CharacterSetSize;
3792 <            CharacterSetName := IBFieldDef.CharacterSetName;
3806 >            {$IFDEF HAS_ANSISTRING_CODEPAGE}
3807 >            CodePage := IBFieldDef.CodePage;
3808 >            {$ENDIF}
3809            end;
3810          end
3811          else
# Line 3801 | Line 3817 | procedure TIBCustomDataSet.InternalOpen;
3817            begin
3818              CharacterSetSize := IBFieldDef.CharacterSetSize;
3819              CharacterSetName := IBFieldDef.CharacterSetName;
3820 <          end;
3821 <        end
3822 <        else
3807 <        if(Fields[i] is TIBWideMemoField) then
3808 <        with TIBWideMemoField(Fields[i]) do
3809 <        begin
3810 <          IBFieldDef := GetFieldDef(FieldNo);
3811 <          if IBFieldDef <> nil then
3812 <          begin
3813 <            CharacterSetSize := IBFieldDef.CharacterSetSize;
3814 <            CharacterSetName := IBFieldDef.CharacterSetName;
3820 >            {$IFDEF HAS_ANSISTRING_CODEPAGE}
3821 >            CodePage := IBFieldDef.CodePage;
3822 >            {$ENDIF}
3823            end;
3824          end
3825        end
# Line 3970 | Line 3978 | end;
3978   function TIBCustomDataSet.Locate(const KeyFields: string; const KeyValues: Variant;
3979                                   Options: TLocateOptions): Boolean;
3980   var
3981 <  {$IF FPC_FULLVERSION >= 20700 }
3981 >  {$IFDEF NEW_TBOOKMARK }
3982    CurBookmark: TBookmark;
3983    {$ELSE}
3984    CurBookmark: string;
# Line 3992 | Line 4000 | function TIBCustomDataSet.Lookup(const K
4000                                   const ResultFields: string): Variant;
4001   var
4002    fl: TList;
4003 <  {$IF FPC_FULLVERSION >= 20700 }
4003 >  {$IFDEF NEW_TBOOKMARK }
4004    CurBookmark: TBookmark;
4005    {$ELSE}
4006    CurBookmark: string;
# Line 4576 | Line 4584 | begin
4584    DataSet.SetInternalSQLParams(Query, buff);
4585   end;
4586  
4587 + function TIBDSBlobStream.GetSize: Int64;
4588 + begin
4589 +  Result := FBlobStream.BlobSize;
4590 + end;
4591 +
4592   { TIBDSBlobStream }
4593   constructor TIBDSBlobStream.Create(AField: TField; ABlobStream: TIBBlobStream;
4594                                      Mode: TBlobStreamMode);
# Line 4584 | Line 4597 | begin
4597    FBlobStream := ABlobStream;
4598    FBlobStream.Seek(0, soFromBeginning);
4599    if (Mode = bmWrite) then
4600 +  begin
4601      FBlobStream.Truncate;
4602 +    TIBCustomDataSet(FField.DataSet).RecordModified(True);
4603 +    TBlobField(FField).Modified := true;
4604 +    FHasWritten := true;
4605 +  end;
4606   end;
4607  
4608   destructor TIBDSBlobStream.Destroy;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines