TQubesDataViewSource - Exemples
| TQubesDataViewSource = class (TDataViewSource) | Interface de TQubesDataViewSource | Exemples 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;
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;