Browse Source

* Merging revisions 421 from trunk:
------------------------------------------------------------------------
r421 | michael | 2019-03-31 16:17:55 +0200 (Sun, 31 Mar 2019) | 1 line

* out-of-the-box support for custom SQL statement, add databaseconnection property to dataset
------------------------------------------------------------------------

michael 6 years ago
parent
commit
d2f37d31a3
1 changed files with 77 additions and 1 deletions
  1. 77 1
      packages/fcl-db/sqldbrestdataset.pp

+ 77 - 1
packages/fcl-db/sqldbrestdataset.pp

@@ -28,6 +28,8 @@ Type
 
   TSQLDBRestConnection = Class(TRestConnection)
   private
+    FConnectionsResourceName: String;
+    FCustomViewResourceName: String;
     FDataProperty: String;
     FmetaDataProperty: String;
     FMetaDataResourceName: String;
@@ -55,6 +57,8 @@ Type
     Property MetaDataResourceName : String Read FMetaDataResourceName Write FMetaDataResourceName Stored DoStoreMetadata;
     Property UserName : String Read FUserName Write FUserName;
     Property Password : String Read FPassword Write FPassword;
+    Property ConnectionsResourceName : String Read FConnectionsResourceName Write FConnectionsResourceName;
+    Property CustomViewResourceName : String Read FCustomViewResourceName Write FCustomViewResourceName;
   end;
 
   { TSQLDBRestDataset }
@@ -62,9 +66,16 @@ Type
   TSQLDBRestDataset = Class(TJSONDataset)
   private
     FConnection: TSQLDBRestConnection;
+    FDatabaseConnection: String;
     FResourceName: String;
+    FSQL: TStrings;
+    function CleanSQL: String;
+    function CustomViewResourceName: String;
+    procedure DoSQLChange(Sender: TObject);
+    function MyURL: String;
     procedure SetConnection(AValue: TSQLDBRestConnection);
     procedure SetResourceName(AValue: String);
+    procedure SetSQL(AValue: TStrings);
   Protected
     function DataPacketReceived(ARequest: TDataRequest): Boolean; override;
     function GetStringFieldLength(F: TJSObject; AName: String; AIndex: Integer): integer;virtual;
@@ -72,8 +83,13 @@ Type
     Function DoGetDataProxy: TDataProxy; override;
     Procedure MetaDataToFieldDefs; override;
   Public
+    Constructor Create(aOwner : TComponent); override;
+    Destructor Destroy; override;
+  Published
     Property Connection: TSQLDBRestConnection Read FConnection Write SetConnection;
     Property ResourceName : String Read FResourceName Write SetResourceName;
+    Property SQL : TStrings Read FSQL Write SetSQL;
+    property DatabaseConnection : String Read FDatabaseConnection Write FDatabaseConnection;
   end;
 
 implementation
@@ -178,9 +194,14 @@ begin
 end;
 
 function TSQLDBRestConnection.GetReadBaseURL(aRequest: TDataRequest): String;
+
+Var
+  DS : TSQLDBRestDataset;
+
 begin
   Result:=inherited GetReadBaseURL(aRequest);
-  Result:=IncludeTrailingPathDelimiter(Result)+TSQLDBRestDataset(aRequest.Dataset).ResourceName;
+  DS:=TSQLDBRestDataset(aRequest.Dataset);
+  Result:=IncludeTrailingPathDelimiter(Result)+DS.MyURL;
 end;
 
 procedure TSQLDBRestConnection.DoResources(Sender: TObject);
@@ -256,13 +277,55 @@ begin
     FConnection.FreeNotification(Self);
 end;
 
+function TSQLDBRestDataset.MyURL: String;
+
+begin
+  Result:=DatabaseConnection;
+  if (Result<>'') and (Result[Length(Result)]<>'/') then
+    Result:=Result+'/';
+  Result:=Result+ResourceName;
+  if SameText(ResourceName,CustomViewResourceName) then
+    Result:=Result+'?SQL='+ EncodeURIComponent(CleanSQL);
+end;
+
+procedure TSQLDBRestDataset.DoSQLChange(Sender: TObject);
+begin
+  if Trim(FSQL.Text)<>'' then
+    FResourceName:=CustomViewResourceName;
+end;
+
 procedure TSQLDBRestDataset.SetResourceName(AValue: String);
 begin
   if FResourceName=AValue then Exit;
   CheckInactive;
+  if Not SameText(aValue,CustomViewResourceName) then
+    FSQL.Clear;
   FResourceName:=AValue;
 end;
 
+function TSQLDBRestDataset.CustomViewResourceName : String;
+
+begin
+  if Assigned(Connection) then
+    Result:=Connection.CustomViewResourceName
+  else
+    Result:='customView';
+end;
+
+function TSQLDBRestDataset.CleanSQL: String;
+
+begin
+  Result:=StringReplace(SQL.Text,#13#10,' ',[rfReplaceAll]);
+  Result:=StringReplace(Result,#10,' ',[rfReplaceAll]);
+  Result:=StringReplace(Result,#10,' ',[rfReplaceAll]);
+end;
+
+procedure TSQLDBRestDataset.SetSQL(AValue: TStrings);
+begin
+  if FSQL=AValue then Exit;
+  FSQL.Assign(AValue);
+end;
+
 function TSQLDBRestDataset.DoGetDataProxy: TDataProxy;
 begin
   Result:=Connection.DataProxy;
@@ -372,6 +435,19 @@ begin
     end;
 end;
 
+constructor TSQLDBRestDataset.Create(aOwner: TComponent);
+begin
+  inherited Create(aOwner);
+  FSQL:=TStringList.Create;
+  TStringList(FSQL).OnChange:=@DoSQLChange;
+end;
+
+destructor TSQLDBRestDataset.Destroy;
+begin
+  FreeAndNil(FSQL);
+  inherited Destroy;
+end;
+
 function TSQLDBRestDataset.DataPacketReceived(ARequest: TDataRequest): Boolean;
 
 Var