Ignore:
Timestamp:
Mar 17, 2015, 12:09:11 AM (9 years ago)
Author:
chronos
Message:
  • Modified: Now records are loaded from SQL database using SQL query. The query is parsed also by XML database client to load records from XML file.
  • Added: Packages Network and Synapse.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/DbEngines/UEngineXML.pas

    r12 r13  
    77uses
    88  Classes, SysUtils, DOM, XMLRead, XMLWrite, UDatabase, UXMLUtils, FileUtil,
    9   UHtmlClasses;
     9  UHtmlClasses, USqlDatabase, SpecializedDictionary;
    1010
    1111type
     
    2929    procedure LoadFromFile(FileName: string);
    3030    procedure SaveToFile(FileName: string);
     31    function GetNextPart(var Text: string): string;
    3132  public
     33    procedure Query(DbRows: TDbRows; Text: string); override;
    3234    procedure Load; override;
    3335    procedure Save; override;
     
    280282end;
    281283
     284function TDatabaseXML.GetNextPart(var Text: string): string;
     285begin
     286  if Pos(' ', Text) > 0 then begin
     287    Result := Trim(Copy(Text, 1, Pos(' ', Text) - 1));
     288    Delete(Text, 1, Pos(' ', Text));
     289  end else begin
     290    Result := Text;
     291    Text := '';
     292  end;
     293end;
     294
     295procedure TDatabaseXML.Query(DbRows: TDbRows; Text: string);
     296var
     297  Command: string;
     298  Columns: string;
     299  TableName: string;
     300  Table: TTable;
     301  NewRecord: TDictionaryStringString;
     302  I: Integer;
     303  F: Integer;
     304begin
     305  Command := GetNextPart(Text);
     306  if Command = 'SELECT' then begin
     307    Columns := GetNextPart(Text);
     308    Command := GetNextPart(Text);
     309    if Command = 'FROM' then begin
     310      TableName := GetNextPart(Text);
     311    end;
     312    Table := Database.Tables.SearchByName(TableName);
     313    if Assigned(Table) then begin
     314      DbRows.Count := 0;
     315      if Columns = '*' then begin
     316        for I := 0 to Table.Records.Count - 1 do begin
     317          NewRecord := TDictionaryStringString.Create;
     318          for F := 0 to Table.Fields.Count - 1 do
     319            NewRecord.Add(TField(Table.Fields[F]).Name, TValue(TRecord(Table.Records[I]).Values[I]).GetString);
     320          DbRows.Add(NewRecord);
     321        end;
     322      end else
     323      if Columns = 'COUNT(*)' then begin
     324        NewRecord := TDictionaryStringString.Create;
     325        NewRecord.Add('COUNT(*)', IntToStr(Table.Records.Count));
     326        DbRows.Add(NewRecord);
     327      end else raise Exception.Create('Unsupported columns ' + Columns + ' specification');
     328    end else raise Exception.Create('Table ' + TableName + ' not found.');
     329  end else raise Exception.Create('Unsupported SQL command ' + Command);
     330end;
     331
    282332procedure TDatabaseXML.Load;
    283333begin
Note: See TracChangeset for help on using the changeset viewer.