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

📄 jvquibmetadata.pas

📁 East make Tray Icon in delphi
💻 PAS
📖 第 1 页 / 共 5 页
字号:
  Stream := TStringStream.Create('');
  try
    SaveToDDL(Stream);
    Result := Stream.DataString;
  finally
    Stream.Free;
  end;
end;

function TMetaNode.GetItems(const ClassIndex, Index: Integer): TMetaNode;
var
  FChilds: TList;
begin
  FChilds := FNodeItems[ClassIndex].Childs;
  if (FChilds.Count > 0) and (Index >= 0) and
    (Index < FChilds.Count) then
    Result := TMetaNode(FChilds.Items[Index])
  else
    raise EUIBError.CreateFmt(EUIB_INDEXERROR, [Index]);
end;

procedure TMetaNode.SaveToStream(Stream: TStream);
var
  I, J: Integer;
begin
  for J := 0 to FNodeItemsCount - 1 do
  begin
    I := FNodeItems[J].Childs.Count;
    Stream.Write(I, SizeOf(I));
    for I := 0 to I - 1 do
      TMetaNode(FNodeItems[J].Childs.Items[I]).SaveToStream(Stream);
  end;
end;

procedure TMetaNode.AddClass(ClassID: TMetaNodeClass);
begin
  SetLength(FNodeItems, FNodeItemsCount + 1);
  FNodeItems[FNodeItemsCount].Childs := TList.Create;
  FNodeItems[FNodeItemsCount].ClassID := ClassID;
  Inc(FNodeItemsCount);
end;

procedure TMetaNode.CheckTransaction(Transaction: TJvUIBTransaction);
begin
  Assert(Transaction <> nil);
  Assert(Transaction.DataBase <> nil);
end;

procedure TMetaNode.SaveNode(Stream: TStringStream; OID: Integer;
  Separator: string);
var
  I: Integer;
begin
  for I := 0 to FNodeItems[OID].Childs.Count - 1 do
  begin
    if I = 0 then
      Stream.WriteString(NewLine)
    else
      Stream.WriteString(Separator);
    TMetaNode(FNodeItems[OID].Childs[I]).SaveToDDL(Stream);
  end;
end;

procedure TMetaNode.SaveToDDLNode(Stream: TStringStream);
begin
end;

function TMetaNode.GetNodes(const Index: Integer): TNodeItem;
begin
  Assert((Index >= 0) and (FNodeItemsCount > 0) and (Index < FNodeItemsCount));
  Result := FNodeItems[Index];
end;

class function TMetaNode.NodeClass: string;
begin
  Result := 'Node'
end;

procedure TMetaNode.SaveToDDL(Stream: TStringStream);
begin
  SaveToDDLNode(Stream);
end;

function TMetaNode.GetAsDDLNode: string;
var
  Stream: TStringStream;
begin
  Stream := TStringStream.Create('');
  try
    SaveToDDLNode(Stream);
    Result := Stream.DataString;
  finally
    Stream.Free;
  end;
end;

class function TMetaNode.NodeType: TMetaNodeType;
begin
  Result := MetaNode;
end;

//=== { TMetaGenerator } =====================================================

procedure TMetaGenerator.LoadFromDataBase(Transaction: TJvUIBTransaction;
  const Name: string);
var
  Query: TJvUIBStatement;
begin
  CheckTransaction(Transaction);
  Query := TJvUIBStatement.Create(nil);
  Query.Transaction := Transaction;
  Query.CachedFetch := False;
  try
    FName := Name;
    Query.SQL.Text := Format('select gen_id(%s, 0) from rdb$database', [FName]);
    Query.Open;
    if not Query.Eof then
      FValue := Query.Fields.AsInteger[0]
    else
      raise EUIBError.CreateFmt(EUIB_NOGENERATOR, [FName]);
  finally
    Query.Free;
  end;
end;

procedure TMetaGenerator.LoadFromStream(Stream: TStream);
begin
  ReadString(Stream, FName);
  Stream.Read(FValue, SizeOf(FValue));
end;

procedure TMetaGenerator.SaveToStream(Stream: TStream);
begin
  WriteString(Stream, FName);
  Stream.Write(FValue, SizeOf(FValue));
end;

procedure TMetaGenerator.SaveToDDLNode(Stream: TStringStream);
begin
  Stream.WriteString(Format(
    'CREATE GENERATOR %s;%sSET GENERATOR %0:s TO %2:d;',
    [FName, BreakLine, FValue]));
end;

class function TMetaGenerator.NodeClass: string;
begin
  Result := 'Generator';
end;

class function TMetaGenerator.NodeType: TMetaNodeType;
begin
  Result := MetaGenerator;
end;

//=== { TMetaTable } =========================================================

constructor TMetaTable.Create(AOwner: TMetaNode; ClassIndex: Integer);
begin
  inherited Create(AOwner, ClassIndex);
  AddClass(TMetaTableField);
  AddClass(TMetaPrimary);
  AddClass(TMetaForeign);
  AddClass(TMetaTrigger);
  AddClass(TMetaUnique);
  AddClass(TMetaIndex);
  AddClass(TMetaCheck);
end;

function TMetaTable.FindFieldName(const Name: string): TMetaTableField;
var
  I: Integer;
begin
  for I := 0 to FieldsCount - 1 do
    if Fields[I].FName = Name then
    begin
      Result := Fields[I];
      Exit;
    end;
  raise EUIBError.CreateFmt(EUIB_NOFIELD, [Name]);
end;

function TMetaTable.GetFields(const Index: Integer): TMetaTableField;
begin
  Result := TMetaTableField(GetItems(Ord(OIDTableField), Index))
end;

function TMetaTable.GetFieldsCount: Integer;
begin
  Result := FNodeItems[Ord(OIDTableField)].Childs.Count;
end;

function TMetaTable.GetPrimary(const Index: Integer): TMetaPrimary;
begin
  Result := TMetaPrimary(GetItems(Ord(OIDPrimary), Index))
end;

function TMetaTable.GetPrimaryCount: Integer;
begin
  Result := FNodeItems[Ord(OIDPrimary)].Childs.Count;
end;

function TMetaTable.GetUniques(const Index: Integer): TMetaUnique;
begin
  Result := TMetaUnique(GetItems(Ord(OIDUnique), Index))
end;

function TMetaTable.GetUniquesCount: Integer;
begin
  Result := FNodeItems[Ord(OIDUnique)].Childs.Count;
end;

procedure TMetaTable.LoadFromDataBase(QNames, QFields, QCharset, QPrimary,
  QIndex, QForeign, QCheck, QTrigger: TJvUIBStatement; OIDs: TOIDTables);
var
  Unk: string;
begin
  // Fields
  FName := Trim(QNames.Fields.AsString[0]);

  if OIDTableField in OIDs then
  begin
    QFields.Params.AsString[0] := FName;
    QFields.Open;
    while not QFields.Eof do
    begin
      with TMetaTableField.Create(Self, Ord(OIDTableField)) do
        LoadFromQuery(QFields, QCharset);
      QFields.Next;
    end;

    // PRIMARY
    if OIDPrimary in OIDs then
    begin
      QPrimary.Params.AsString[1] := FName;
      QPrimary.Params.AsString[0] := 'PRIMARY KEY';
      QPrimary.Open;
      if not QPrimary.Eof then
        TMetaPrimary.Create(Self, Ord(OIDPrimary)).LoadFromQuery(QPrimary);
    end;

    // INDICES
    if OIDIndex in OIDs then
    begin
      Unk := '';
      QIndex.Params.AsString[0] := FName;
      QIndex.Open;
      while not QIndex.Eof do
      begin
        if Unk <> Trim(QIndex.Fields.AsString[0]) then
          with TMetaIndex.Create(Self, Ord(OIDIndex)) do
          begin
            SetLength(FFields, 1);
            FName := Trim(QIndex.Fields.AsString[0]);
            FFields[0] := FindFieldIndex(Trim(QIndex.Fields.AsString[1]));
            FUnique := QIndex.Fields.AsSingle[2] = 1;
            FActive := QIndex.Fields.AsSingle[3] = 0;
            if QIndex.Fields.AsSingle[4] = 0 then
              FOrder := IoAscending
            else
              FOrder := IoDescending;
            Unk := FName;
          end
        else
          with Indices[IndicesCount - 1] do
          begin
            SetLength(FFields, FieldsCount + 1);
            FFields[FieldsCount - 1] := FindFieldIndex(Trim(QIndex.Fields.AsString[1]));
            Include(Fields[FieldsCount - 1].FInfos, fIndice);
          end;
        QIndex.Next;
      end;
    end;

    // UNIQUE
    if OIDUnique in OIDs then
    begin
      QPrimary.Params.AsString[0] := 'UNIQUE';
      if not (OIDPrimary in OIDs) then
        QPrimary.Params.AsString[1] := FName;
      QPrimary.Open;
      while not QPrimary.Eof do
      begin
        if Unk <> Trim(QPrimary.Fields.AsString[0]) then
          with TMetaUnique.Create(Self, Ord(OIDUnique)) do
          begin
            SetLength(FFields, 1);
            FName := Trim(QPrimary.Fields.AsString[0]);
            FFields[0] := FindFieldIndex(Trim(QPrimary.Fields.AsString[1]));
            Unk := FName;
          end
        else
          with Uniques[UniquesCount - 1] do
          begin
            SetLength(FFields, FieldsCount + 1);
            FFields[FieldsCount - 1] := FindFieldIndex(Trim(QPrimary.Fields.AsString[1]));
            Include(Fields[FieldsCount - 1].FInfos, fUnique);
          end;
        QPrimary.Next;
      end;
    end;

  end;

  // Check
  if OIDCheck in OIDs then
  begin
    QCheck.Params.AsString[0] := FName;
    QCheck.Open;
    while not QCheck.Eof do
      with TMetaCheck.Create(Self, Ord(OIDCheck)) do
      begin
        FName := Trim(QCheck.Fields.AsString[0]);
        QCheck.ReadBlob(1, FConstraint);
        QCheck.Next;
      end;
  end;

  // TRIGGER
  if OIDTableTrigger in OIDs then
  begin
    QTrigger.Params.AsString[0] := FName;
    QTrigger.Open;
    while not QTrigger.Eof do
    begin
      TMetaTrigger.Create(Self, Ord(OIDTableTrigger)).LoadFromQuery(QTrigger);
      QTrigger.Next;
    end;
  end;
end;

procedure TMetaTable.LoadFromStream(Stream: TStream);
begin
  ReadString(Stream, FName);
end;

procedure TMetaTable.SaveToStream(Stream: TStream);
begin
  WriteString(Stream, FName);
  inherited SaveToStream(Stream);
end;

procedure TMetaTable.SaveToDDL(Stream: TStringStream);
begin
  inherited SaveToDDL(Stream);
  SaveNode(Stream, Ord(OIDPrimary));
  SaveNode(Stream, Ord(OIDUnique));
  SaveNode(Stream, Ord(OIDIndex));
  SaveNode(Stream, Ord(OIDForeign));
  SaveNode(Stream, Ord(OIDCheck));
  SaveNode(Stream, Ord(OIDTableTrigger), NewLine);
end;

function TMetaTable.GetIndices(const Index: Integer): TMetaIndex;
begin
  Result := TMetaIndex(GetItems(Ord(OIDIndex), Index))
end;

function TMetaTable.GetIndicesCount: Integer;
begin
  Result := FNodeItems[Ord(OIDIndex)].Childs.Count;
end;

function TMetaTable.GetForeign(const Index: Integer): TMetaForeign;
begin
  Result := TMetaForeign(GetItems(Ord(OIDForeign), Index))
end;

function TMetaTable.GetForeignCount: Integer;
begin
  Result := FNodeItems[Ord(OIDForeign)].Childs.Count;
end;

function TMetaTable.FindFieldIndex(const Name: string): Integer;
begin
  for Result := 0 to FieldsCount - 1 do
    if Fields[Result].FName = Name then
      Exit;
  raise EUIBError.CreateFmt(EUIB_FIELDSTRNOTFOUND, [Name]);
end;

function TMetaTable.GetChecks(const Index: Integer): TMetaCheck;
begin
  Result := TMetaCheck(GetItems(Ord(OIDCheck), Index));
end;

function TMetaTable.GetChecksCount: Integer;
begin
  Result := FNodeItems[Ord(OIDCheck)].Childs.Count;
end;

function TMetaTable.GetTriggers(const Index: Integer): TMetaTrigger;
begin
  Result := TMetaTrigger(GetItems(Ord(OIDTableTrigger), Index));
end;

function TMetaTable.GetTriggersCount: Integer;
begin
  Result := FNodeItems[Ord(OIDTableTrigger)].Childs.Count;
end;

procedure TMetaTable.SaveToDDLNode(Stream: TStringStream);

⌨️ 快捷键说明

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