lazarus/components/sqldbrest/design/frasqldbrestresourceedit.pp
2023-10-04 23:00:58 +02:00

507 lines
13 KiB
ObjectPascal

unit frasqldbrestresourceedit;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, StdCtrls, ExtCtrls, ComCtrls, ActnList,
lresources, Menus, db, sqldbrestbridge, sqldbRestSchema, SynEdit, SynHighlighterSQL,
sqldbschemaedittools, frasqldbresourcefields, frasqldbresourceparams;
type
{ TSQLDBRestResourceEditFrame }
TSQLDBRestResourceEditFrame = class(TBaseEditFrame)
AInsertAdditonalWhere: TAction;
AInsertLimit: TAction;
aInsertOrderBy: TAction;
AInsertFullOrderBy: TAction;
AInsertOptionalWhere: TAction;
AInsertRequiredWhere: TAction;
AInsertFullWhere: TAction;
AUpdateParams: TAction;
AUpdateFields: TAction;
AValidateSQL: TAction;
AGenerateSQL: TAction;
aLResource: TActionList;
BFields1: TButton;
BGenerate: TButton;
BParams: TButton;
BParams1: TButton;
BValidate: TButton;
BFields: TButton;
CBEnabled: TCheckBox;
CGOperations: TCheckGroup;
CBConnection: TComboBox;
CBInMetadata: TCheckBox;
EName: TEdit;
ETableName: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
MenuItem1: TMenuItem;
MenuItem10: TMenuItem;
MenuItem11: TMenuItem;
MenuItem12: TMenuItem;
MenuItem13: TMenuItem;
MenuItem2: TMenuItem;
MenuItem3: TMenuItem;
MenuItem4: TMenuItem;
MenuItem5: TMenuItem;
MenuItem6: TMenuItem;
MenuItem7: TMenuItem;
MenuItem8: TMenuItem;
MenuItem9: TMenuItem;
pnlParambuttons: TPanel;
PCResource: TPageControl;
PButtons: TPanel;
PButtons1: TPanel;
fraFields: TResourceFieldsEditFrame;
fraParameters: TResourceParametersEditFrame;
PMEdit: TPopupMenu;
SESelect: TSynEdit;
SEInsert: TSynEdit;
SEupdate: TSynEdit;
SEDelete: TSynEdit;
SynSQLSyn1: TSynSQLSyn;
TSparameters: TTabSheet;
TSFields: TTabSheet;
TSSelect: TTabSheet;
TSInsert: TTabSheet;
TabSheet3: TTabSheet;
TSDelete: TTabSheet;
procedure AGenerateSQLExecute(Sender: TObject);
procedure AInsertFullOrderByExecute(Sender: TObject);
procedure AInsertFullWhereExecute(Sender: TObject);
procedure AInsertLimitExecute(Sender: TObject);
procedure AInsertOptionalWhereExecute(Sender: TObject);
procedure aInsertOrderByExecute(Sender: TObject);
procedure AInsertRequiredWhereExecute(Sender: TObject);
procedure AUpdateFieldsExecute(Sender: TObject);
procedure AUpdateFieldsUpdate(Sender: TObject);
procedure AUpdateParamsExecute(Sender: TObject);
procedure AUpdateParamsUpdate(Sender: TObject);
procedure AValidateSQLExecute(Sender: TObject);
procedure AValidateSQLUpdate(Sender: TObject);
procedure ETableNameEditingDone(Sender: TObject);
private
FOnFieldsChanged: TNotifyEvent;
FOnParametersChanged: TNotifyEvent;
FResource: TSQLDBRestResource;
function GetOnFieldSelected: TNotifyEvent;
function GetOnParameterSelected: TNotifyEvent;
function HaveSelectSQL: Boolean;
procedure InsertInSelect(const aPlaceholder: string);
procedure InsertInSynedit(aSyn: TSynedit; const aPlaceHolder: string);
procedure SetOnFieldSelected(AValue: TNotifyEvent);
procedure SetOnParameterSelected(AValue: TNotifyEvent);
procedure SetResource(AValue: TSQLDBRestResource);
procedure SetTableNames;
Protected
procedure FieldsChanged;
Procedure UpdateFieldList;
procedure ParametersChanged;
Procedure UpdateParameterList;
procedure SetConnections(AValue: TSQLDBRestConnectionList); override;
Procedure SetFrameData(aData: TObject); override;
public
constructor create(aOwner : TComponent); override;
Function Modified : Boolean; override;
Procedure SaveData; override;
procedure ShowConnections;
Procedure ShowResource;
Function FrameCaption: String; override;
Property Resource : TSQLDBRestResource Read FResource Write SetResource;
Property OnFieldsChanged : TNotifyEvent Read FOnFieldsChanged Write FOnFieldsChanged;
Property OnParametersChanged : TNotifyEvent Read FOnParametersChanged Write FOnParametersChanged;
Property OnSelectField : TNotifyEvent Read GetOnFieldSelected Write SetOnFieldSelected;
Property OnSelectParameter : TNotifyEvent Read GetOnParameterSelected Write SetOnParameterSelected;
end;
implementation
uses dialogs, sqldb, TypInfo;
{$R *.lfm}
{ TSQLDBRestResourceEditFrame }
procedure TSQLDBRestResourceEditFrame.AGenerateSQLExecute(Sender: TObject);
begin
SESelect.Lines.Text:=Resource.GenerateDefaultSQL(skSelect);
end;
procedure TSQLDBRestResourceEditFrame.AInsertFullOrderByExecute(Sender: TObject);
begin
InsertInSelect('%FULLORDERBY%');
end;
procedure TSQLDBRestResourceEditFrame.AInsertFullWhereExecute(Sender: TObject);
begin
InsertInSelect('%FULLWHERE%');
end;
procedure TSQLDBRestResourceEditFrame.InsertInSynedit(aSyn : TSynedit; const aPlaceHolder : string);
begin
aSyn.SelText:=aPlaceHolder;
end;
procedure TSQLDBRestResourceEditFrame.InsertInSelect(const aPlaceholder : string);
begin
InsertInSynedit(SESelect,aPlaceHolder);
end;
procedure TSQLDBRestResourceEditFrame.AInsertLimitExecute(Sender: TObject);
begin
InsertInSelect('%LIMIT%');
end;
procedure TSQLDBRestResourceEditFrame.AInsertOptionalWhereExecute(Sender: TObject);
begin
InsertInSelect('%OPTIONALWHERE%');
end;
procedure TSQLDBRestResourceEditFrame.aInsertOrderByExecute(Sender: TObject);
begin
InsertInSelect('%ORDERBY%');
end;
procedure TSQLDBRestResourceEditFrame.AInsertRequiredWhereExecute(Sender: TObject);
begin
InsertInSelect('%REQUIREDWHERE%');
end;
procedure TSQLDBRestResourceEditFrame.AUpdateFieldsExecute(Sender: TObject);
begin
if Resource.Fields.Count>0 then
if QuestionDlg(SResetFields, Format(SResetFieldsPrompt, [LineEnding, LineEnding]), mtWarning, [mrYes, SYesResetFields, mrNo,
SDoNotResetFields], 0) <> mrYes then exit;
UpdateFieldList;
end;
function TSQLDBRestResourceEditFrame.HaveSelectSQL: Boolean;
begin
Result:=(SESelect.Lines.Count>0) and (Trim(SESelect.Lines[0])<>'');
end;
function TSQLDBRestResourceEditFrame.GetOnFieldSelected: TNotifyEvent;
begin
Result:=FraFields.OnSelectField;
end;
function TSQLDBRestResourceEditFrame.GetOnParameterSelected: TNotifyEvent;
begin
Result:=FraParameters.OnSelectParameter;
end;
procedure TSQLDBRestResourceEditFrame.SetOnFieldSelected(AValue: TNotifyEvent);
begin
FraFields.OnSelectField:=aValue;
end;
procedure TSQLDBRestResourceEditFrame.SetOnParameterSelected(
AValue: TNotifyEvent);
begin
FraParameters.OnSelectParameter:=aValue;
end;
procedure TSQLDBRestResourceEditFrame.AUpdateFieldsUpdate(Sender: TObject);
begin
(Sender as Taction).Enabled:=(ETableName.Text<>'') or HaveSelectSQL;
end;
procedure TSQLDBRestResourceEditFrame.AUpdateParamsExecute(Sender: TObject);
begin
if Resource.Parameters.Count>0 then
if QuestionDlg(SResetParameters, Format(SResetParametersPrompt, [LineEnding, LineEnding]), mtWarning,
[mrYes, SYesResetParameters, mrNo,SDoNotResetParameters], 0) <> mrYes then exit;
UpdateParameterList;
end;
procedure TSQLDBRestResourceEditFrame.AUpdateParamsUpdate(Sender: TObject);
begin
(Sender as Taction).Enabled:=HaveSelectSQL;
end;
procedure TSQLDBRestResourceEditFrame.AValidateSQLExecute(Sender: TObject);
begin
With ExecuteSelect(CBConnection.Text,Resource.ProcessSQl(SESelect.Lines.text,'(1=0)','','')) do
Free;
ShowMessage(SSQLValidatesOK);
end;
procedure TSQLDBRestResourceEditFrame.AValidateSQLUpdate(Sender: TObject);
begin
(Sender as Taction).Enabled:=CanGetSQLConnection and HaveSelectSQL;
end;
procedure TSQLDBRestResourceEditFrame.ETableNameEditingDone(Sender: TObject);
begin
if Not SameText(ETableName.Text,Resource.TableName)
and (Resource.Fields.Count>0)
and Not HaveSelectSQL then
if MessageDlg(Format(STableNameChanged, [LineEnding]), mtWarning, [mbYes, mbNo], 0) = mrYes then
UpdateFieldList;
end;
procedure TSQLDBRestResourceEditFrame.SetResource(AValue: TSQLDBRestResource);
begin
if FResource=AValue then Exit;
FResource:=AValue;
fraFields.Resource:=Resource;
fraParameters.Resource:=Resource;
SetTableNames;
ShowResource;
end;
procedure TSQLDBRestResourceEditFrame.SetTableNames;
Var
L : TSQLDBRestResourceList;
aTables : TStringList;
I : integer;
TN : String;
begin
if not Assigned(FResource) then exit;
if not (FResource.Collection is TSQLDBRestResourceList) then exit;
L:=FResource.Collection as TSQLDBRestResourceList;
aTables:=TStringList.Create;
Try
aTables.Sorted:=true;
aTables.Duplicates:=dupIgnore;
for I:=0 to L.Count-1 do
begin
TN:=L[i].TableName;
if TN<>'' then
aTables.Add(TN);
end;
SynSQLSyn1.TableNames:=aTables;
finally
aTables.Free;
end;
end;
procedure TSQLDBRestResourceEditFrame.FieldsChanged;
begin
FraFields.ShowResource;
If Assigned(FonFieldsChanged) then
FOnFieldsChanged(FResource);
end;
procedure TSQLDBRestResourceEditFrame.UpdateFieldList;
Var
Q : TSQLQuery;
SQL : String;
idxFields : TStringArray;
begin
SQL:=Trim(SESelect.Lines.Text);
if SQL='' then
SQL:=Resource.GenerateDefaultSQL(skSelect);
Q:=ExecuteSelect(CBConnection.Text,Resource.ProcessSQl(SQL,'(1=0)','',''));
try
Resource.Fields.Clear;
idxFields:=TSQLDBRestSchema.GetPrimaryIndexFields(Q);
Resource.PopulateFieldsFromFieldDefs(Q.FieldDefs,idxFields,Nil,MinFieldOptions);
FieldsChanged;
finally
Q.Free;
end;
end;
procedure TSQLDBRestResourceEditFrame.ParametersChanged;
begin
FraParameters.ShowResource;
If Assigned(FOnParametersChanged) then
FOnParametersChanged(FResource);
end;
procedure TSQLDBRestResourceEditFrame.UpdateParameterList;
Var
Q : TSQLQuery;
SQL : String;
idxFields : TStringArray;
Parms : TParams;
begin
SQL:=Trim(SESelect.Lines.Text);
if SQL='' then
SQL:=Resource.GenerateDefaultSQL(skSelect);
Resource.PopulateParametersFromSQl(SQL,true);
ParametersChanged;
end;
procedure TSQLDBRestResourceEditFrame.ShowConnections;
Var
I : Integer;
begin
With CBConnection.Items do
begin
BeginUpdate;
try
if Not assigned(Connections) then
For I:=0 to Connections.Count-1 do
AddObject(Connections[i].Name,Connections[i]);
finally
EndUpdate;
end;
end;
end;
procedure TSQLDBRestResourceEditFrame.SetConnections(AValue: TSQLDBRestConnectionList);
begin
inherited SetConnections(AValue);
ShowConnections;
end;
procedure TSQLDBRestResourceEditFrame.SetFrameData(aData: TObject);
begin
Resource:=aData as TMySQLDBRestResource;
end;
constructor TSQLDBRestResourceEditFrame.create(aOwner: TComponent);
var
ro : TRestOperation;
S : String;
begin
inherited create(aOwner);
CGOperations.Items.Clear;
For ro:=Succ(Low(TRestOperation)) to High(TRestOperation) do
begin
S:=GetEnumName(TypeInfo(TRestOperation),Ord(RO));
Delete(S,1,2);
CGOperations.Items.Add(S);
end;
AUpdateParams.Visible:=Not FakeParams;
PCResource.ActivePageIndex:=0;
end;
function TSQLDBRestResourceEditFrame.Modified: Boolean;
Function Diff(S1,S2 : TStrings) : Boolean;
begin
Result:=Trim(S1.Text)<>Trim(S2.Text);
end;
Procedure DoOperation(O : TRestOperation);
begin
Result:=Result or (CGOperations.Checked[Ord(O)-1] <> (O in Resource.AllowedOperations));
end;
Var
O : TRestOperation;
begin
Result:=False;
With Resource do
begin
Result:=(ResourceName<>eName.Text) Or
(TableName<>ETableName.Text) Or
(Enabled<>CBEnabled.Checked) Or
(InMetadata<>CBInMetadata.Checked) or
Diff(SQLSelect, SESelect.Lines) Or
Diff(SQLInsert,SEInsert.Lines) Or
Diff(SQLUpdate,SEUpdate.Lines) Or
Diff(SQLDelete,SEDelete.Lines);
for O in TRestOperation do
if o<>roUnknown then
DoOperation(O);
end;
end;
procedure TSQLDBRestResourceEditFrame.SaveData;
Procedure DoOperation(O : TRestOperation);
begin
if CGOperations.Checked[Ord(O)-1] then
Resource.AllowedOperations:=Resource.AllowedOperations+[O]
else
Resource.AllowedOperations:=Resource.AllowedOperations-[O]
end;
Var
O : TRestOperation;
begin
With Resource do
begin
ResourceName := eName.Text;
TableName := ETableName.Text;
SQLSelect := SESelect.Lines;
SQLInsert := SEInsert.Lines;
SQLUpdate := SEUpdate.Lines;
SQLDelete := SEDelete.Lines;
Enabled := CBEnabled.Checked;
InMetadata := CBInMetadata.Checked;
for O in TRestOperation do
if o<>roUnknown then
DoOperation(O);
end;
end;
procedure TSQLDBRestResourceEditFrame.ShowResource;
Procedure DoOperation(O : TRestOperation);
begin
CGOperations.Checked[Ord(O)-1]:=O in Resource.AllowedOperations;
end;
Var
O : TRestOperation;
begin
With Resource do
begin
eName.Text:=ResourceName;
ETableName.Text:=TableName;
SESelect.Lines:=SQLSelect;
SEInsert.Lines:=SQLInsert;
SEUpdate.Lines:=SQLUpdate;
SEDelete.Lines:=SQLDelete;
CBEnabled.Checked:=Enabled;
CBInMetadata.Checked:=InMetadata;
for O in TRestOperation do
if o<>roUnknown then
DoOperation(O);
end;
end;
function TSQLDBRestResourceEditFrame.FrameCaption: String;
begin
if FResource=Nil then
Result:=SUnknownObject
else
Result:=FResource.ResourceName;
Result:=Format(SEditObject,[SResource,Result]);
end;
end.