program project1;
{$mode objfpc}{$H+}
{.$DEFINE USE_MEM_DATASET}
uses
SysUtils, classes, db, memds, bufdataset;
const
TABLENAME = 'people'; //name for the database table, extension will be added
DATADIR = 'data'; //subdirectory where database is stored
const
NUM_RECORDS = 5000;
var
FExportDataset: TDataset;
procedure CreateDatabase;
var
i: Integer;
fn: String;
stream: TMemoryStream;
t: TDateTime;
begin
ForceDirectories(DATADIR);
fn := DATADIR + DirectorySeparator + TABLENAME + '.db';
DeleteFile(fn);
{$IFDEF USE_MEM_DATASET}
FExportDataset := TMemDataset.Create(nil);
{$ELSE}
FExportDataset := TBufDataset.Create(nil);
{$ENDIF}
FExportDataset.FieldDefs.Add('Last name', ftString, 15);
FExportDataset.FieldDefs.Add('First name', ftString, 10);
FExportDataset.FieldDefs.Add('City', ftString, 15);
FExportDataset.FieldDefs.Add('Birthday', ftDate);
FExportDataset.FieldDefs.Add('Salary', ftCurrency);
FExportDataset.FieldDefs.Add('Work begin', ftDateTime);
FExportDataset.FieldDefs.Add('Work end', ftDateTime);
FExportDataset.FieldDefs.Add('Size', ftFloat);
{$IFNDEF USE_MEM_DATASET}
TBufDataset(FExportDataset).CreateDataset;
{$ENDIF}
FExportDataset.Open;
// Random data
for i:=1 to NUM_RECORDS do begin
if (i mod 100 = 0) then begin
WriteLn(Format('Adding record %d...', [i]));
{$IFNDEF USE_MEM_DATASET}
TBufDataset(FExportDataset).MergeChangeLog;
{$ENDIF}
end;
FExportDataset.Insert;
// just dummy data...
FExportDataset.FieldByName('Last name').AsString := 'A';
FExportDataset.FieldByName('First name').AsString := 'B';
FExportDataset.FieldByName('City').AsString := 'C';
FExportDataset.FieldByName('Birthday').AsDateTime := 0;
FExportDataset.FieldByName('Salary').AsFloat := 0;
FExportDataset.FieldByName('Size').AsFloat := 0;
FExportDataSet.FieldByName('Work begin').AsDateTime := 0;
FExportDataSet.FieldByName('Work end').AsDateTime := 0;
FExportDataset.Post;
end;
WriteLn('Saving...');
t := now;
stream := TMemoryStream.Create;
try
{$IFDEF USE_MEM_DATASET}
TMemDataset(FExportDataset).SaveToStream(stream);
{$ELSE}
TBufDataset(FExportDataset).SaveToStream(stream);
{$ENDIF}
stream.Position := 0;
WriteLn('Written to memory stream: ', FormatFloat('0.000 s', (now - t) * SECONDS_PER_DAY));
stream.SaveToFile(fn);
finally
stream.Free;
end;
Writeln('Done. Total time needed for saving: ', FormatFloat('0.000 s', (now - t) * SECONDS_PER_DAY));
FExportDataset.Close;
writeLn(Format('Created file "%s" in folder "data".', [
ExtractFileName(fn), ExtractFileDir(fn)
]));
FExportDataset.Free;
end;
begin
CreateDatabase;
WriteLn;
WriteLn('Press ENTER to close.');
ReadLn;
end.