⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testreftables.dpr

📁 俄国人写的内存数据库的delphi封装
💻 DPR
字号:
program TestRefTables;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  FastDbSession,
  FastDbQuery,
  FastDbVar,
  FastDbCLI;

var
  session : TFastDbSession;
  q       : TFastDbQuery;
  flds    : TFastDbFields;
  oidSwitch, oidSwitch2, oidLocation, oidCarrier : Integer;
  buffer: array[0..1] of TCliOID;
  bRefCheck : Boolean;
  bOrder    : Boolean;
  bUseIndex : Boolean;
  n         : Integer;
  f         : TFieldDescriptors;
begin
  if ParamCount < 2 then
    begin
      writeln('Usage: '+AppName+' InitDatabaseSize InitIndexSize [-describe] [-order]');
      writeln('                   (sizes are in kBytes)');
      writeln('                   -describe forces a check of an inverse reference');
      writeln('                   -order    changes field creationi order in Demand');
      writeln('                   -index    builds a hash index on Demand.SwitchLocationID');
      writeln('Example: '+AppName+' 10 100 -describe');
      halt;
    end;

  bRefCheck := FindCmdLineSwitch('describe', ['-'], True);
  bOrder    := FindCmdLineSwitch('order',    ['-'], True);
  bUseIndex := FindCmdLineSwitch('index',    ['-'], True);

  session := TFastDbSession.Create(nil);
  q       := TFastDbQuery.Create(nil);
  flds    := TFastDbFields.Create(nil);
  session.Database         := 'Test';
  session.DatabasePath     := 'Test.fdb';
  session.InitDatabaseSize := StrToInt(ParamStr(1))*1024;
  session.InitIndexSize    := StrToInt(ParamStr(2))*1024;

  DeleteFile(session.DatabasePath);

  session.Connected := True;
  q.Session := session;

  //------------------------------
  //-----QualityGroup-------------
  //------------------------------
  q.Clear;
  q.fields.Add('QualityID',    ctInt2,  [itHash]);
  q.fields.Add('QualityGroup', ctString);
  q.fields.Add('MinQuality',   ctInt1);
  q.fields.Add('MaxQuality',   ctInt1);
  q.fields.Add('Demands',      ctArrayOfOID, [], 'Demand', 'QualityGroups');
  session.CreateTable('QualityGroup', q.fields, True);

  //------------------------------
  //-----Demand-------------------
  //------------------------------
  q.Clear;
  if bOrder then
    q.fields.Add('QualityGroups',    ctArrayOfOID,  [], 'QualityGroup',  'Demands');
  q.fields.Add('Switch',           ctOID,         [], 'Switch',   'Demands');
  q.fields.Add('Location',         ctOID,         [], 'Location', 'Demands');
  if not bOrder then
    q.fields.Add('QualityGroups',    ctArrayOfOID,  [], 'QualityGroup',  'Demands');
  if bUseIndex then
    q.fields.Add('SwitchLocationID', ctInt8, [{itHash}])
  else
    q.fields.Add('SwitchLocationID', ctInt8, [itHash]);
  q.fields.Add('Demands',          ctArrayOfInt4);

//  for n:=0 to q.Fields.Count-1 do
//    if q.Fields[n].RefTable <> '' then
//      session.DescribeTable(q.Fields[n].RefTable, flds, False);

  session.CreateTable('Demand', q.fields, False);

  //------------------------------
  //-----Switch-------------------
  //------------------------------
  q.Clear;
  q.fields.Add('SwitchID',           ctInt2,   [itHash]);
  q.fields.Add('SwitchName',         ctString);
  q.fields.Add('Carriers',           ctArrayOfOID, [], 'Carrier', 'Switch');
  q.fields.Add('Demands',            ctArrayOfOID, [], 'Demand',  'Switch');
  q.Fields.Add('Rates',              ctArrayOfOID, [], 'Rate',    'Switch');
  session.CreateTable('Switch', q.fields, bRefCheck);

  //------------------------------
  //-----Location-----------------
  //------------------------------
  q.Clear;
  q.fields.Add('LocationID',       ctInt4,  [itHash]);
  q.fields.Add('LocationName',     ctString);
  q.fields.Add('Rates',            ctArrayOfOID, [], 'Rate',    'Location');
  q.fields.Add('Demands',          ctArrayOfOID, [], 'Demand',  'Location');
  session.CreateTable ('Location', q.fields, bRefCheck);

  //q.Clear;
  //session.DescribeTable('Switch', q.Fields);

  //session.Commit(True);
  //------------------------------
  //-----Carrier------------------
  //------------------------------
  q.Clear;
  //q.fields.Add('Switch',            ctOID,        [], 'Switch',  'Carriers');
  q.fields.Add('Switch',            ctArrayOfOID, [], 'Switch',  'Carriers');
  q.fields.Add('CarrierID',         ctInt4,       [itHash]);
  q.fields.Add('SwitchCarrierID',   ctInt8,       [itHash]);
  q.fields.Add('CarrierName',       ctString);
  q.fields.Add('Rates',             ctArrayOfOID, [], 'Rate',    'Carrier');
  q.fields.Add('TotalCapacity',     ctInt4);
  q.fields.Add('AvailableCapacity', ctInt4);
  q.fields.Add('TotalLines',        ctInt2);
  q.fields.Add('AvailableLines',    ctInt2);
  session.CreateTable('Carrier', q.fields, bRefCheck);

  //------------------------------
  //-----Rate---------------------
  //------------------------------
  q.Clear;
  q.fields.Add('CarrierLocationID',    ctInt8,       [itHash]);
  q.fields.Add('Switch',               ctOID,        [], 'Switch',   'Rates');
  q.fields.Add('Location',             ctOID,        [], 'Location', 'Rates');
  q.fields.Add('Carrier',              ctOID,        [], 'Carrier',  'Rates');
  q.fields.Add('Quality',              ctInt1);
  q.fields.Add('Rate',                 ctReal4);
  q.fields.Add('RealDemand',           ctInt4);
  session.CreateTable('Rate', q.fields, bRefCheck);

  q.Clear;
  q.SQL := 'insert into Switch';
  q.Describe;
  q.Fields[0].asInteger := 1;
  q.Fields[1].asString  := 'Test Sw1';
  oidSwitch := q.Insert;
  q.Fields[0].asInteger := 2;
  q.Fields[1].asString  := 'Test Sw2';
  oidSwitch2 := q.Insert;

  q.Clear;
  q.SQL := 'insert into Location';
  q.Describe;
  q.Fields[0].asInteger := 10;
  q.Fields[1].asString  := 'Test Loc';
  oidLocation := q.Insert;

  q.Clear;
  q.SQL := 'insert into Carrier';
  q.Describe;
  q.Fields[0].ArraySize := 2;
  buffer[0] := oidSwitch;
  buffer[1] := oidSwitch2;
  q.Fields[0].SetValue(@buffer[0], 2*SizeOf(TCliOID));
  //q.Fields[0].asArrayOID[0] := oidSwitch;
  //q.Fields[0].asArrayOID[1] := oidSwitch2;
  //q.Fields[0].asOID     := oidSwitch;
  q.Fields[1].asInteger := 100;
  q.Fields[3].asString  := 'Test Carrier';
  oidCarrier := q.Insert;

  q.Clear;
  q.SQL := 'insert into Rate';
  q.Describe;
  q.Field('Switch').asOID   := oidSwitch;
  q.Field('Location').asOID := oidLocation;
  q.Field('Carrier').asOID  := oidCarrier;
  q.Field('Rate').asSingle  := 345.25;
  oidCarrier := q.Insert;

  q.Clear;
  q.SQL := 'select * from Rate where Switch.SwitchID = %d';
  q.Variables.Add('d', ctInt4);
  q.Variables[0].asInteger := 1;
  n := q.Execute;
  if n <> 1 then
    writeln('Error: "select * from Rate" returned '+IntToStr(n)+' records!');

  session.Commit(True);
  writeln('Success.  Press <Enter> to exit...');
  readln;
end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -