mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-06-09 05:58:53 +02:00
507 lines
13 KiB
ObjectPascal
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.
|
|
|