TQubesDataViewSource - Exemples

TQubesDataViewSource = class (TDataViewSource)Interface de TQubesDataViewSourceExemples de TQubesDataViewSource

creation d'une source sur une donnée Qubes

unit MyNewSource;

interface

uses SysUtils, QubesDataViews, QubesDataViewsSources;

type
   TMyNewSource = class(TQubesDataViewSource)
      public
         constructor Create;
         function Restart(dataView: TDataView): string; override;
         function Update(dataView: TDataView; checkpoint: string): string; override;
   end;


implementation

uses System.Data, com, Qubes;

const cPrefixFieldName = '_';

constructor TMyNewSource.Create;
begin
   FFieldsDef := TStrings.Create;
   FFieldsDef.Add('ID=ID');
   FFieldsDef.Add('field1=fieldXXX');
   ...
   FFieldsDef.Add('fiendN=fieldXXX');
   FFieldsType.Add(ftInteger, ftString, ..., ftString);
   FMarginUpdate := 1/24;
end;

function TMyNewSource.Restart(dataView: TDataView): string;
begin
   dataView.ClearData;
   Result := Update(dataView, '0');
end;

function TMyNewSource.Update(dataView: TDataView; checkpoint: string): string;
var
   values : array of Variant;
   select : array of String;
begin
   var db := new DataBase('SDB', ['QubesArchive']);
   Result := UTCDateTime.ToString;
   values.SetLength(dataView.FieldsCount-1);

   for var i:=0 to dataView.Fields.Count-1 do
      select.Add(FFieldsDef.Values[dataView.FieldsSource[i]]);
   dataView.UpdateMetadata(['LastUpdateBegin='+Result]);
   dataView.StartTransaction;
   try
      var rowCount := 0;
      LocalStartTransaction;
           try
         var query := 'select '+select.Join(',')+' from ... where DATE_CREATION>=:checkpoint';
         var q := db.Query(query, [OleDate(checkpoint.ToFloatDef(0)-FMarginUpdate)]);
         while q.Step do begin
            for var i:=1 to dataView.FieldsCount-1 do begin
               case dataView.FieldsType[i] of
                  ftInteger : values[i-1] := q.AsInteger(i);
                  ftString : values[i-1] := q.AsString(i);
                  ftFloat : values[i-1] := q.AsFloat(i);
                  ftItemIDToGPAOID : values[i-1] := ArticleGPAOIDFromArticleID(q.AsInteger(i));
                  ftUserIDToLogin : begin
                     var userid := q.AsInteger(i);
                     if userid<>0 then
                        values[i-1] := UserLoginFromUserID(userid)
                     else
                        values[i-1] := '';
                  end;
               end;
            end;
            dataView.Replace(q.AsString(0), values);
            Inc(rowCount);
         end;
           finally
                   LocalCommit;
           end;
      dataView.UpdateMetadata(['LastUpdateEnd='+UTCDateTime.ToString,'NbRowUpdated='+rowCount.ToString, 'LastError=']);
      dataView.Commit;
        except
      on E: Exception do begin
         dataView.Rollback;
         dataView.UpdateMetadata(['LastError='+E.Message+#13#10+E.StackTrace]);
         raise;
      end;
        end;
end;