Skip to content

Commit 454a4e9

Browse files
authored
Merge pull request #25 from cybertec-postgresql/24_task_add
[+] implement task adding to a chain, closes #24
2 parents de9d031 + 4249c1e commit 454a4e9

4 files changed

Lines changed: 93 additions & 18 deletions

File tree

forms/fmmain.lfm

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ object fmMain: TfmMain
105105
ShowHint = True
106106
TabOrder = 0
107107
OnDrawColumnCell = gridTasksDrawColumnCell
108+
OnSelectEditor = gridTasksSelectEditor
108109
end
109110
object splitDetails: TSplitter
110111
Cursor = crVSplit
@@ -308,6 +309,8 @@ object fmMain: TfmMain
308309
Align = alTop
309310
ClientHeight = 42
310311
ClientWidth = 1506
312+
ParentShowHint = False
313+
ShowHint = True
311314
TabOrder = 1
312315
object toolbarMain: TToolBar
313316
Left = 1
@@ -795,6 +798,7 @@ object fmMain: TfmMain
795798
Category = 'Tasks'
796799
Caption = 'acTaskDelete'
797800
DisableIfNoHandler = False
801+
Hint = 'Delete selected task'
798802
ImageIndex = 4
799803
OnExecute = acTaskDeleteExecute
800804
OnUpdate = acTaskToolbarUpdate
@@ -812,6 +816,7 @@ object fmMain: TfmMain
812816
Category = 'Tasks'
813817
Caption = 'acTaskEdit'
814818
DisableIfNoHandler = False
819+
Hint = 'Edit selected task'
815820
ImageIndex = 5
816821
OnExecute = acTaskEditExecute
817822
OnUpdate = acTaskToolbarUpdate
@@ -820,6 +825,7 @@ object fmMain: TfmMain
820825
Category = 'Tasks'
821826
Caption = 'acTaskPost'
822827
DisableIfNoHandler = False
828+
Hint = 'Save changes to selected task'
823829
ImageIndex = 6
824830
OnExecute = acTaskPostExecute
825831
OnUpdate = acTaskToolbarUpdate
@@ -828,6 +834,7 @@ object fmMain: TfmMain
828834
Category = 'Tasks'
829835
Caption = 'acTaskCancel'
830836
DisableIfNoHandler = False
837+
Hint = 'Cancel changes to selected task'
831838
ImageIndex = 7
832839
OnExecute = acTaskCancelExecute
833840
OnUpdate = acTaskToolbarUpdate
@@ -836,6 +843,7 @@ object fmMain: TfmMain
836843
Category = 'Tasks'
837844
Caption = 'acTaskRefresh'
838845
DisableIfNoHandler = False
846+
Hint = 'Refresh tasks for selected chain'
839847
ImageIndex = 8
840848
OnExecute = acTaskRefreshExecute
841849
OnUpdate = acTaskToolbarUpdate
@@ -844,41 +852,47 @@ object fmMain: TfmMain
844852
Category = 'Chains'
845853
Caption = 'acChainAdd'
846854
DisableIfNoHandler = False
855+
Hint = 'Add new chain'
847856
ImageIndex = 3
848857
OnExecute = acChainAddExecute
849858
OnUpdate = acChainToolbarUpdate
850859
end
851860
object acChainDelete: TAction
852861
Category = 'Chains'
853862
Caption = 'acChainDelete'
863+
Hint = 'Delete selected chain'
854864
ImageIndex = 4
855865
OnExecute = acChainDeleteExecute
856866
OnUpdate = acChainToolbarUpdate
857867
end
858868
object acChainEdit: TAction
859869
Category = 'Chains'
860870
Caption = 'acChainEdit'
871+
Hint = 'Edit selected chain'
861872
ImageIndex = 5
862873
OnExecute = acChainEditExecute
863874
OnUpdate = acChainToolbarUpdate
864875
end
865876
object acChainPost: TAction
866877
Category = 'Chains'
867878
Caption = 'acChainPost'
879+
Hint = 'Save changes in selected chain'
868880
ImageIndex = 6
869881
OnExecute = acChainPostExecute
870882
OnUpdate = acChainToolbarUpdate
871883
end
872884
object acChainCancel: TAction
873885
Category = 'Chains'
874886
Caption = 'acChainCancel'
887+
Hint = 'Cancel changes in selected chain'
875888
ImageIndex = 7
876889
OnExecute = acChainCancelExecute
877890
OnUpdate = acChainToolbarUpdate
878891
end
879892
object acChainRefresh: TAction
880893
Category = 'Chains'
881894
Caption = 'acChainRefresh'
895+
Hint = 'Refresh chain list from database'
882896
ImageIndex = 8
883897
OnExecute = acChainRefreshExecute
884898
OnUpdate = acChainToolbarUpdate

forms/fmmain.pas

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ TfmMain = class(TForm)
8686
procedure gridChainsTitleClick(Column: TColumn);
8787
procedure gridTasksDrawColumnCell(Sender: TObject; const Rect: TRect;
8888
DataCol: integer; Column: TColumn; State: TGridDrawState);
89+
procedure gridTasksSelectEditor(Sender: TObject; Column: TColumn;
90+
var Editor: TWinControl);
8991
procedure miCloseClick(Sender: TObject);
9092
private
9193
FLastColumn: TColumn; //last sorted grid column
@@ -195,6 +197,17 @@ procedure TfmMain.gridTasksDrawColumnCell(Sender: TObject; const Rect: TRect;
195197
imglGrids.Draw(gridTasks.Canvas, aLeft, aTop, ImgIdx);
196198
end;
197199

200+
procedure TfmMain.gridTasksSelectEditor(Sender: TObject; Column: TColumn;
201+
var Editor: TWinControl);
202+
begin
203+
if Column.FieldName = 'kind' then
204+
with Editor as TCustomComboBox do
205+
begin
206+
Style := csDropDownList;
207+
AutoDropDown := True;
208+
end;
209+
end;
210+
198211
procedure TfmMain.miCloseClick(Sender: TObject);
199212
begin
200213
Close();
@@ -288,8 +301,8 @@ procedure TfmMain.acTaskToolbarUpdate(Sender: TObject);
288301
begin
289302
CanModify := dmPgEngine.IsConnected() and dmPgEngine.qryTasks.CanModify;
290303
acTaskAdd.Enabled := CanModify;
291-
acMoveTaskUp.Enabled := CanModify and not dmPgEngine.qryTasks.BOF;
292-
acMoveTaskDown.Enabled := CanModify and not dmPgEngine.qryTasks.EOF;
304+
acMoveTaskUp.Enabled := CanModify and (dmPgEngine.qryTasks.RecNo > 1);
305+
acMoveTaskDown.Enabled := CanModify and (dmPgEngine.qryTasks.RecNo < dmPgEngine.qryTasks.RecordCount);
293306
acTaskDelete.Enabled := CanModify and
294307
(not (dmPgEngine.qryTasks.BOF and dmPgEngine.qryTasks.EOF));
295308
acTaskEdit.Enabled := CanModify and not (dmPgEngine.qryTasks.State in dsEditModes);

udatamodule.lfm

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,21 +32,21 @@ object dmPgEngine: TdmPgEngine
3232
AfterClose = qryChainsAfterClose
3333
AfterDelete = qryChainsAfterDelete
3434
AfterInsert = qryChainsAfterInsert
35-
AfterPost = qryChainsAfterPost
35+
AfterPost = qryAfterPost
3636
BeforeDelete = qryChainsBeforeDelete
3737
Database = PQConn
3838
Transaction = transChains
3939
SQL.Strings = (
4040
'SELECT'
4141
' chain_id,'
4242
' task_id,'
43-
' chain_name :: varchar(255) as chain_name,'
44-
' COALESCE(run_at, ''* * * * *'') :: varchar(100) as run_at,'
43+
' chain_name,'
44+
' COALESCE(run_at, ''* * * * *'') as run_at,'
4545
' max_instances,'
4646
' live,'
4747
' self_destruct,'
4848
' exclusive_execution,'
49-
' client_name :: varchar(100) as client_name,'
49+
' client_name,'
5050
' timeout,'
5151
' max_instances'
5252
'FROM timetable.chain'
@@ -114,6 +114,11 @@ object dmPgEngine: TdmPgEngine
114114
IndexName = 'DEFAULT_ORDER'
115115
MaxIndexesCount = 4
116116
FieldDefs = <>
117+
AfterInsert = qryTasksAfterInsert
118+
AfterOpen = qryTasksAfterOpen
119+
AfterPost = qryAfterPost
120+
AfterRefresh = qryTasksAfterOpen
121+
BeforePost = qryTasksBeforePost
117122
Database = PQConn
118123
Transaction = transChains
119124
SQL.Strings = (
@@ -160,11 +165,23 @@ object dmPgEngine: TdmPgEngine
160165
' x'
161166
)
162167
InsertSQL.Strings = (
163-
'INSERT INTO timetable.task'
164-
'(parent_id, task_name, kind, command, run_as, database_connection, ignore_error, autonomous, timeout)'
165-
'VALUES'
166-
'(0, '''',''SQL'', '''', '''', '''', false, false, 0)'
167-
''
168+
'INSERT INTO timetable.task('
169+
' parent_id,'
170+
' command,'
171+
' kind,'
172+
' run_as,'
173+
' ignore_error,'
174+
' autonomous,'
175+
' database_connection'
176+
') VALUES ('
177+
' :"parent_id",'
178+
' :"command",'
179+
' :"kind",'
180+
' :"run_as",'
181+
' :"ignore_error",'
182+
' :"autonomous",'
183+
' :"connect_string"'
184+
')'
168185
)
169186
Options = [sqoKeepOpenOnCommit, sqoAutoApplyUpdates, sqoAutoCommit, sqoRefreshUsingSelect]
170187
Params = <

udatamodule.pas

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,13 @@ TdmPgEngine = class(TDataModule)
2424
procedure qryChainsAfterClose(DataSet: TDataSet);
2525
procedure qryChainsAfterDelete(DataSet: TDataSet);
2626
procedure qryChainsAfterInsert(DataSet: TDataSet);
27-
procedure qryChainsAfterPost(DataSet: TDataSet);
27+
procedure qryAfterPost(DataSet: TDataSet);
2828
procedure qryChainsBeforeDelete(DataSet: TDataSet);
29+
procedure qryTasksAfterInsert(DataSet: TDataSet);
30+
procedure qryTasksAfterOpen(DataSet: TDataSet);
31+
procedure qryTasksBeforePost(DataSet: TDataSet);
2932
private
33+
FLastTaskID: integer;
3034
public
3135
procedure Connect;
3236
procedure Disconnect;
@@ -80,14 +84,18 @@ procedure TdmPgEngine.qryChainsAfterInsert(DataSet: TDataSet);
8084
end;
8185
end;
8286

83-
procedure TdmPgEngine.qryChainsAfterPost(DataSet: TDataSet);
87+
procedure TdmPgEngine.qryAfterPost(DataSet: TDataSet);
8488
var
85-
c: variant;
89+
FldVal: variant;
90+
FldName: string;
8691
Q: TSQLQuery;
92+
const
93+
FldNames: array[boolean] of string = ('chain_name', 'parent_id');
8794
begin
8895
Q := DataSet as TSQLQuery;
96+
FldName := FldNames[Q = qryTasks];
8997
Q.IndexName := '';
90-
c := DataSet.FieldValues['chain_name'];
98+
FldVal := DataSet.FieldValues[FldName];
9199
try
92100
Q.ApplyUpdates;
93101
DataSet.Refresh;
@@ -98,15 +106,38 @@ procedure TdmPgEngine.qryChainsAfterPost(DataSet: TDataSet);
98106
Q.CancelUpdates;
99107
end;
100108
end;
101-
DataSet.Locate('chain_name', c, []);
102-
fmMain.MainForm.UpdateSortIndication(nil);
109+
DataSet.Locate(FldName, FldVal, []);
110+
if Q = qryChains then
111+
fmMain.MainForm.UpdateSortIndication(nil);
103112
end;
104113

105114
procedure TdmPgEngine.qryChainsBeforeDelete(DataSet: TDataSet);
106115
begin
107116
if MessageDlg('Delete confirmation',
108117
'Are you sure you want delete current chain?', mtWarning, [mbOK, mbCancel], 0) = mrCancel then
109-
Abort;
118+
Abort();
119+
end;
120+
121+
procedure TdmPgEngine.qryTasksAfterInsert(DataSet: TDataSet);
122+
begin
123+
with DataSet do
124+
begin
125+
FieldByName('parent_id').AsInteger := FLastTaskID;
126+
FieldByName('kind').AsString := 'SQL';
127+
FieldByName('ignore_error').AsBoolean := False;
128+
FieldByName('autonomous').AsBoolean := False;
129+
end;
130+
end;
131+
132+
procedure TdmPgEngine.qryTasksAfterOpen(DataSet: TDataSet);
133+
begin
134+
DataSet.Last();
135+
FLastTaskID := DataSet.FieldByName('task_id').AsInteger;
136+
end;
137+
138+
procedure TdmPgEngine.qryTasksBeforePost(DataSet: TDataSet);
139+
begin
140+
if DataSet.FieldByName('command').IsNull then Abort();
110141
end;
111142

112143
procedure TdmPgEngine.Connect;

0 commit comments

Comments
 (0)