Icon View Incident Report

Serious Serious
Reported By: Michael Haralabos
Reported On: 8/10/2002
For: Version 3.12 Build 1
# 1173 Using CopyOnAppend to Add Record with BLOB Fields and then Using Plain Append Causes BLOB Corruption

Executing the following code causes BLOB corruption.

unit Main;

interface

uses
  Forms, DBISAMTb, DB, Grids, DBGrids, StdCtrls, Mask, DBCtrls, 
Controls,
  Classes, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    RootKeyComboBox: TComboBox;
    DBMemo1: TDBMemo;
    ValueTypeComboBox: TComboBox;
    DBEdit1: TDBEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    DBEdit2: TDBEdit;
    Label5: TLabel;
    DataSource1: TDataSource;
    DataTable: TDBISAMTable;
    MainDatabase: TDBISAMDatabase;
    Button1: TButton;
    DBEdit3: TDBEdit;
    Label6: TLabel;
    MainSession: TDBISAMSession;
    Button2: TButton;
    DataTableRECORDID: TAutoIncField;
    DataTableROOTKEY: TSmallintField;
    DataTableSUBKEY: TMemoField;
    DataTableVALUENAME: TStringField;
    DataTableVALUETYPE: TSmallintField;
    DataTableDEFAULT: TStringField;
    DataTableTWEAKED: TStringField;
    DataTableDESCRIPTION: TMemoField;
    DataTableWIN95: TBooleanField;
    DataTableWIN98: TBooleanField;
    DataTableWINME: TBooleanField;
    DataTableWIN2K: TBooleanField;
    DataTableWINXP: TBooleanField;
    Button3: TButton;
    DBGrid1: TDBGrid;
    procedure RootKeyComboBoxChange(Sender: TObject);
    procedure ValueTypeComboBoxChange(Sender: TObject);
    procedure DataTableAfterScroll(DataSet: TDataSet);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.RootKeyComboBoxChange(Sender: TObject);
begin
  DataTable.Edit;
  DataTableROOTKEY.AsInteger := RootKeyComboBox.ItemIndex;
end;

procedure TForm1.ValueTypeComboBoxChange(Sender: TObject);
begin
  DataTable.Edit;
  DataTableVALUETYPE.AsInteger := ValueTypeComboBox.ItemIndex;
end;

procedure TForm1.DataTableAfterScroll(DataSet: TDataSet);
begin
  RootKeyComboBox.ItemIndex := DataTableROOTKEY.AsInteger;
  ValueTypeComboBox.ItemIndex := DataTableVALUETYPE.AsInteger;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  with DataTable do
  begin
    Append;
    Post;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  with DataTable do
  begin
    CopyOnAppend := True;
    Append;
    Post;
    CopyOnAppend := False;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DataTable.Open;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  // Causes the corruption
  Button2.Click;
  Button1.Click;
end;

end.



Comments Comments
The problem was related to the fact that there was a DBMemo component also attached to the table that was basically the root cause of the bug in the engine.


Resolution Resolution
Fixed Problem on 8/11/2002 in version 3.13 build 1
Image