You are not logged in.
Pages: 1
The InternalState Property is only filled with data in TSQLRestClientURI.Retrieve
All other Methods declared in TSQLRest did not fill the Property - but they can fill
I just made the changes to TSQLRest.Retrieve(const SQLWhere: RawUTF8; Value: TSQLRecord)
function TSQLRest.Retrieve(const SQLWhere: RawUTF8; Value: TSQLRecord): boolean;
var T: TSQLTable;
begin
if (self=nil) or (Value=nil) then
T := nil else
T := InternalListJSON(Value.RecordClass,Value.RecordProps.
SQLFromSelectWhere('*',SQLWhere+' LIMIT 1'));
if T=nil then
result := false else
try
if T.RowCount>=1 then begin
Value.FillFrom(T,1); // fetch data from first result row
Value.fInternalState := T.InternalState; // the missing row in here
result := true;
end else
result := false;
finally
T.Free;
end;
end;
It's very useful to check the InternalState of the Record against the ServerInternalState, to decide if there are possible changes on the Server.
EDIT
This Method is the only one which did not fill the InternalState of the Record
Last edited by Sir Rufo (2011-12-07 13:14:37)
Offline
Nice catch.
I preferred to change TSQLRecord.FillFrom() method, but the fix is very similar.
See http://synopse.info/fossil/info/4d8613523e
Thanks!
I'd like to a tuned per-class or per-instance caching at both Client and Server side.
This would ensure another level of performance tuning for mORMot-based applications.
add a generic per-TSQLRecordClass or per-TSQLRecord caching, at TSQLRest level (with timeout and RESTful safety) - this may be used on both Client and Server side for speed enhancement of immutable objects (like configuration);
Offline
Hi,
is it possible to add filling InternalState property for RetrieveList* methods? Especially in generics version it would be very usefull for me. It could be done in TSQLTable.ToObjectList<T>
function TSQLTable.ToObjectList<T>: TObjectList<T>;
var R,Item: TSQLRecord;
Row: PPUtf8Char;
i: integer;
begin
result := TObjectList<T>.Create; // TObjectList<T> will free each T instance
if (self=nil) or (fRowCount=0) then
exit;
R := TSQLRecordClass(T).Create;
try
R.FillPrepare(self);
Row := @fResults[FieldCount]; // Row^ points to first row of data
{$ifdef ISDELPHIXE3}
result.Count := fRowCount; // faster than manual Add()
for i := 0 to fRowCount-1 do begin
Item := TSQLRecordClass(T).Create;
PPointerArray(result.List)[i] := Item;
{$else}
for i := 0 to fRowCount-1 do begin
Item := TSQLRecordClass(T).Create;
Result.Add(Item);
{$endif}
R.fFill.Fill(pointer(Row),Item);
Item.fInternalState := Self.InternalState; // Filling InternalState property
Inc(Row,FieldCount); // next data row
end;
finally
R.Free;
end;
end;
If it is impossible to change TSQLTable.ToObjectList function it could be done in TSQLRest.RetrieveList<T>. In this case function should be changed to:
function TSQLRest.RetrieveList<T>(const FormatSQLWhere: RawUTF8;
const BoundsSQLWhere: array of const; const aCustomFieldsCSV: RawUTF8): TObjectList<T>;
var Table: TSQLTable;
i: Integer;
begin
result := nil;
if self=nil then
exit;
Table := MultiFieldValues(TSQLRecordClass(T),aCustomFieldsCSV,FormatSQLWhere,BoundsSQLWhere);
if Table<>nil then
try
result := Table.ToObjectList<T>;
// filling InternalState property
for i := 0 to result.Count - 1 do
result[i].fInternalState := Table.InternalState;
finally
Table.Free;
end;
end;
Last edited by ASiwon (2017-06-19 21:27:08)
best regards
Adam Siwon
Offline
Hi,
I have add a pull request for this issue: https://github.com/synopse/mORMot/pull/43
Please add this correction to the mORMot source code.
best regards
Adam Siwon
Offline
Pages: 1