Jelajahi Sumber

* Add possibility to read updated data

Michaël Van Canneyt 2 tahun lalu
induk
melakukan
9acf192141

+ 2 - 1
packages/fcl-web/src/restbridge/sqldbrestbridge.pp

@@ -1334,7 +1334,7 @@ begin
       R:=Nil;
     end;
   If Assigned(Evt) then
-    Evt(Self,IO.OPeration,IO.RestContext,IO.Resource);
+    Evt(Self,IO.Operation,IO.RestContext,IO.Resource);
   If Assigned(ResEvt) then
     ResEvt(Self,IO.Operation,IO.RestContext,IO.Resource);
   If Assigned(R) then
@@ -1378,6 +1378,7 @@ begin
     Include(opts,rhoAllowMultiUpdate);
   // Options may have been set in handler class, make sure we don't unset any.
   Result.Options:=Result.Options+Opts;
+  Result.UpdatedData:=IO.UpdatedData;
 end;
 
 

+ 23 - 2
packages/fcl-web/src/restbridge/sqldbrestdata.pp

@@ -19,7 +19,7 @@ unit sqldbrestdata;
 interface
 
 uses
-  Classes, SysUtils, sqldb, db, fpjson, sqldbrestio, sqldbrestschema;
+  Classes, SysUtils, bufdataset, sqldb, db, fpjson, sqldbrestio, sqldbrestschema;
 
 Type
   TSQLQueryClass = Class of TSQLQuery;
@@ -49,12 +49,14 @@ Type
     FStrings : TRestStringsConfig;
     FResource : TSQLDBRestResource;
     FOwnsResource : Boolean;
+    FUpdatedData: TBufDataset;
     procedure CheckAllRequiredFieldsPresent;
     function GetAllowMultiUpdate: Boolean;
     function GetCheckUpdateCount: Boolean;
     function GetUseLegacyPUT: Boolean;
     procedure SetExternalDataset(AValue: TDataset);
   Protected
+    Procedure CreateUpdatedData(aSrc : TDataset);
     function StreamRecord(O: TRestOutputStreamer; D: TDataset; FieldList: TRestFieldPairArray): Boolean; virtual;
     function FindExistingRecord(D: TDataset): Boolean;
     function GetRequestFields: TSQLDBRestFieldArray;
@@ -110,7 +112,7 @@ Type
     Property EmulateOffsetLimit : Boolean Read FEmulateOffsetLimit Write FEmulateOffsetLimit;
     Property DeriveResourceFromDataset : Boolean Read FDeriveResourceFromDataset Write FDeriveResourceFromDataset;
     Property Options : TSQLDBRestDBHandlerOptions Read FOptions Write FOptions;
-
+    Property UpdatedData : TBufDataset Read FUpdatedData Write FUpdatedData;
   end;
   TSQLDBRestDBHandlerClass = class of TSQLDBRestDBHandler;
 
@@ -655,6 +657,17 @@ begin
     FExternalDataset.FreeNotification(Self);
 end;
 
+procedure TSQLDBRestDBHandler.CreateUpdatedData(aSrc: TDataset);
+
+begin
+  if not Assigned(FUpdatedData) then
+    Exit;
+  aSrc.First;
+  FUpdatedData.CopyFromDataset(aSrc,True);
+  FUpdatedData.First;
+  aSrc.First;
+end;
+
 function TSQLDBRestDBHandler.SpecialResource: Boolean;
 
 begin
@@ -930,10 +943,13 @@ begin
   try
     D.Open;
     IO.RESTOutput.OutputOptions:=IO.RESTOutput.OutputOptions-[ooMetadata];
+    CreateUpdatedData(D);
     StreamDataset(IO.RESTOutput,D,FieldList);
   finally
     D.Free;
   end;
+  if Assigned(UpdatedData) then
+    UpdatedData.First;
 end;
 
 procedure TSQLDBRestDBHandler.DoHandlePutPatch(IsPatch: Boolean);
@@ -966,10 +982,13 @@ begin
       D.Open;
       end;
     IO.RESTOutput.OutputOptions:=IO.RESTOutput.OutputOptions-[ooMetadata];
+    CreateUpdatedData(D);
     StreamDataset(IO.RESTOutput,D,FieldList);
   finally
     D.Free;
   end;
+  if Assigned(UpdatedData) then
+    UpdatedData.First;
 end;
 
 
@@ -1139,6 +1158,8 @@ end;
 
 destructor TSQLDBRestDBHandler.Destroy;
 begin
+  if Assigned(FUpdatedData) and (FUpdatedData.Owner=Self) then
+    FreeAndNil(FUpdatedData);
   FreeAndNil(FPostParams);
   If FOwnsResource then
      FreeAndNil(FResource);

+ 12 - 1
packages/fcl-web/src/restbridge/sqldbrestio.pp

@@ -19,7 +19,7 @@ unit sqldbrestio;
 interface
 
 uses
-  Classes, SysUtils, fpjson, sqldb, db, httpdefs, sqldbrestschema;
+  Classes, SysUtils, fpjson, bufdataset, sqldb, db, httpdefs, sqldbrestschema;
 
 
 Type
@@ -279,6 +279,7 @@ Type
     function GetConnection: TSQLConnection; override;
     function GetTransaction: TSQLTransaction; override;
     Function DoGetInputData(aName : UTF8string) : TJSONData; override;
+    Function GetUpdateData : TDataset; override;
     property IO : TRestIO Read FIO;
   Public
     Function GetVariable(Const aName : UTF8String; aSources : TVariableSources; Out aValue : UTF8String) : Boolean; override;
@@ -304,6 +305,7 @@ Type
     FSchema: UTF8String;
     FTrans: TSQLTransaction;
     FContentStream : TStream;
+    FUpdatedData: TBufDataset;
     function GetResourceName: UTF8String;
     function GetUserID: String;
     procedure SetUserID(AValue: String);
@@ -341,6 +343,7 @@ Type
     Property RestStrings : TRestStringsConfig Read FRestStrings;
     Property RestStatuses : TRestStatusConfig Read FRestStatuses;
     // owned by TRestIO
+    Property UpdatedData : TBufDataset Read FUpdatedData;
     Property RESTInput : TRestInputStreamer read FInput;
     Property RESTOutput : TRestOutputStreamer read FOutput;
     Property RequestContentStream : TStream Read FContentStream;
@@ -352,6 +355,7 @@ Type
     Property UserID : String Read GetUserID Write SetUserID;
     // For logging
     Property OnSQLLog :TSQLLogNotifyEvent Read FOnSQLLog Write FOnSQLLog;
+
   end;
   TRestIOClass = Class of TRestIO;
 
@@ -555,6 +559,11 @@ begin
   Result:=IO.RESTInput.GetContentField(aName);
 end;
 
+function TRestContext.GetUpdateData: TDataset;
+begin
+  Result:=IO.UpdatedData;
+end;
+
 
 { TStreamerDefList }
 
@@ -972,10 +981,12 @@ begin
   FContentStream:=TStringStream.Create(aRequest.Content);
   FRestContext:=CreateRestContext;
   FRestContext.FIO:=Self;
+  FUpdatedData:=TBufDataset.Create(Nil);
 end;
 
 destructor TRestIO.Destroy;
 begin
+  FreeAndNil(FUpdatedData);
   FreeAndNil(FRestContext);
   if Assigned(FInput) then
     Finput.FOnGetVar:=Nil;

+ 3 - 0
packages/fcl-web/src/restbridge/sqldbrestschema.pp

@@ -69,6 +69,7 @@ Type
     function DoGetInputData(aName: UTF8string): TJSONData; virtual; abstract;
     Function GetConnection : TSQLConnection; virtual; abstract;
     Function GetTransaction : TSQLTransaction; virtual; abstract;
+    Function GetUpdateData : TDataset; virtual; abstract;
   Public
     Destructor Destroy; override;
     // Call this to get a HTTP Query variable, header,...
@@ -84,6 +85,8 @@ Type
     Property Connection : TSQLConnection Read GetConnection;
     // Get transaction in use
     Property Transaction : TSQLTransaction Read GetTransaction;
+    // Updated data after PUT/POST/PATCH
+    Property UpdatedData : TDataset Read GetUpdateData;
   end;
 
   { ESQLDBRest }