ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/public/ibx/trunk/testsuite/Test14.pas
Revision: 319
Committed: Thu Feb 25 12:05:40 2021 UTC (3 years, 1 month ago) by tony
Content type: text/x-pascal
File size: 6630 byte(s)
Log Message:
Merge into public release

File Contents

# Content
1 unit Test14;
2
3 {$mode objfpc}{$H+}
4
5 {Test 14: Open and read from Employee Database with ISQLMonitor}
6
7 { This is a simple use of IBX to access the employee database in console mode.
8 The program opens the database, runs a query and writes the result to stdout.
9
10 ISQLMonitor is used to trace the activity.
11
12 The Monitor is in a separate process
13
14 }
15
16 interface
17
18 uses
19 Classes, SysUtils, TestApplication, IBXTestBase, IB, IBCustomDataSet, IBDatabase,
20 IBQuery, IBInternals, IBSQLMonitor, Process {$IFDEF UNIX}, BaseUnix {$ENDIF};
21
22 const
23 aTestID = '14';
24 aTestTitle = 'Open and read from Employee Database with ISQLMonitor and external monitor';
25
26 type
27
28 { TTest14 }
29
30 TTest14 = class(TIBXTestBase)
31 private
32 class var FTerminated: boolean;
33 private
34 FIBSQLMonitor: TIBSQLMonitor;
35 FLog: TStringList;
36 FProcess: TProcess;
37 FIsChild: boolean;
38 FLogFile: Text;
39 {$IFDEF UNIX}
40 Foa,Fna : PSigActionRec;
41 procedure SetupSignalHandler;
42 {$ENDIF}
43 procedure HandleOnSQL(EventText: String; EventTime : TDateTime);
44 procedure ShowStatistics(Sender: TObject);
45 protected
46 procedure CreateObjects(Application: TTestApplication); override;
47 function GetTestID: AnsiString; override;
48 function GetTestTitle: AnsiString; override;
49 procedure InitTest; override;
50 procedure ProcessResults; override;
51 public
52 destructor Destroy; override;
53 function ChildProcess: boolean; override;
54 procedure RunTest(CharSet: AnsiString; SQLDialect: integer); override;
55 end;
56
57
58 implementation
59
60 const
61 sqlExample =
62 'with recursive Depts As ( '+
63 'Select DEPT_NO, DEPARTMENT, HEAD_DEPT, cast(DEPARTMENT as VarChar(256)) as DEPT_PATH,'+
64 'cast(DEPT_NO as VarChar(64)) as DEPT_KEY_PATH '+
65 'From DEPARTMENT Where HEAD_DEPT is NULL '+
66 'UNION ALL '+
67 'Select D.DEPT_NO, D.DEPARTMENT, D.HEAD_DEPT, Depts.DEPT_PATH || '' / '' || D.DEPARTMENT as DEPT_PATH,'+
68 'Depts.DEPT_KEY_PATH || '';'' || D.DEPT_NO as DEPT_KEY_PATH '+
69 'From DEPARTMENT D '+
70 'JOIN Depts On D.HEAD_DEPT = Depts.DEPT_NO '+
71 ')'+
72
73 'Select First 2 A.EMP_NO, A.FIRST_NAME, A.LAST_NAME, A.PHONE_EXT, A.HIRE_DATE, A.DEPT_NO, A.JOB_CODE,'+
74 'A.JOB_GRADE, A.JOB_COUNTRY, A.SALARY, A.FULL_NAME, D.DEPT_PATH, D.DEPT_KEY_PATH '+
75 'From EMPLOYEE A '+
76 'JOIN Depts D On D.DEPT_NO = A.DEPT_NO';
77
78 LogFileName = 'Test_ISQLMonitor' + '.log';
79
80 { TTest14 }
81
82 procedure TTest14.HandleOnSQL(EventText: String; EventTime: TDateTime);
83 begin
84 if FIsChild then
85 begin
86 writeln(FLogFile,'*Monitor* '{+DateTimeToStr(EventTime)}+' '+EventText);
87 Flush(FLogFile);
88 end;
89 end;
90
91 procedure TTest14.ShowStatistics(Sender: TObject);
92 begin
93 if ChildProcess then
94 begin
95 writeln(FLogFile,FIBSQLMonitor.ReadCount,' ISQL Monitor Messages Received');
96 Flush(FLogFile);
97 Close(FLogFile);
98 end;
99 end;
100
101 {$IFDEF UNIX}
102 procedure DoSigTerm(sig : cint);cdecl;
103 begin
104 TTest14.FTerminated := true;
105 end;
106
107 procedure TTest14.SetupSignalHandler;
108 begin
109 FTerminated := false;
110 new(Fna);
111 new(Foa);
112 Fna^.sa_Handler:=SigActionHandler(@DoSigTerm);
113 fillchar(Fna^.Sa_Mask,sizeof(Fna^.sa_mask),#0);
114 Fna^.Sa_Flags:=0;
115 {$ifdef Linux} // Linux specific
116 Fna^.Sa_Restorer:=Nil;
117 {$endif}
118 if fpSigAction(SigTerm,Fna,Foa)<>0 then
119 begin
120 writeln('Error setting signal handler: ',fpgeterrno,'.');
121 halt(1);
122 end;
123 end;
124 {$ENDIF}
125
126 procedure TTest14.CreateObjects(Application: TTestApplication);
127 begin
128 inherited CreateObjects(Application);
129 if ChildProcess then
130 begin
131 FIBSQLMonitor := TIBSQLMonitor.Create(Application);
132 FIBSQLMonitor.TraceFlags := [tfQPrepare, tfQExecute, tfQFetch, tfError, tfStmt, tfConnect,
133 tfTransact, tfBlob, tfService, tfMisc];
134 FIBSQLMonitor.OnSQL := @HandleOnSQL;
135 FIBSQLMonitor.OnMonitoringDisabled := @ShowStatistics;
136 end
137 else
138 begin
139 IBDatabase.TraceFlags := [tfQPrepare, tfQExecute, tfQFetch, tfError, tfStmt, tfConnect,
140 tfTransact, tfBlob, tfService, tfMisc];
141 FLog := TStringList.Create;
142 FProcess := TProcess.Create(Application);
143 end;
144 end;
145
146 function TTest14.GetTestID: AnsiString;
147 begin
148 Result := aTestID;
149 end;
150
151 function TTest14.GetTestTitle: AnsiString;
152 begin
153 Result := aTestTitle;
154 end;
155
156 procedure TTest14.InitTest;
157 begin
158 inherited InitTest;
159 IBDatabase.DatabaseName := Owner.GetEmployeeDatabaseName;
160 ReadOnlyTransaction;
161 FIsChild := Owner.TestOption <> '';
162 if FIsChild then
163 begin
164 {$IFDEF UNIX}
165 SetupSignalHandler;
166 {$ENDIF}
167 FIBSQLMonitor.Enabled := true;
168 assignFile(FLogFile,Owner.TestOption);
169 Rewrite(FLogFile);
170 end
171 else
172 begin
173 FProcess.Executable := ParamStr(0);
174 FProcess.Parameters.Clear;
175 FProcess.Parameters.Add('-q');
176 FProcess.Parameters.Add('-t');
177 FProcess.Parameters.Add(GetTestID);
178 FProcess.Parameters.Add('-O');
179 FProcess.Parameters.Add(LogFileName);
180 FProcess.Options := [];
181 end;
182 end;
183
184 procedure TTest14.ProcessResults;
185 begin
186 inherited ProcessResults;
187 if assigned(FLog) then
188 FreeAndNil(FLog);
189 if assigned(FProcess) then
190 FreeAndNil(FProcess);
191 end;
192
193 destructor TTest14.Destroy;
194 begin
195 if assigned(FLog) then
196 FreeAndNil(FLog);
197 if assigned(FProcess) then
198 FreeAndNil(FProcess);
199 inherited Destroy;
200 end;
201
202 function TTest14.ChildProcess: boolean;
203 begin
204 Result := Owner.TestOption <> '';
205 end;
206
207 procedure TTest14.RunTest(CharSet: AnsiString; SQLDialect: integer);
208 var stats: TPerfCounters;
209 i: integer;
210 aLogFile: Text;
211 Line: string;
212 begin
213 writeln(OutFile);
214 EnableMonitoring;
215 if not FIsChild then
216 FProcess.Execute
217 else
218 begin
219 while not FTerminated do
220 CheckSynchronize(1); //loop until terminated
221 Exit;
222 end;
223
224 Sleep(1000); {wait for child to become ready}
225 CheckSynchronize(1);
226 with IBQuery do
227 begin
228 AllowAutoActivateTransaction := true;
229 Unidirectional := true;
230 SQL.Text := sqlExample;
231 EnableStatistics := true;
232 Active := true;
233 PrintDataSet(IBQuery);
234
235 if GetPerfStatistics(stats) then
236 WritePerfStats(stats);
237 PrintAffectedRows(IBQuery);
238 writeln(OutFile);
239 writeln(OutFile,'Reconnect');
240 IBDatabase.ReConnect;
241 Unidirectional := false;
242 Active := true;
243 PrintDataSet(IBQuery);
244 end;
245 IBDatabase.Connected := false;
246 Sleep(1000);
247 CheckSynchronize(1);
248 Sleep(1000);
249 DisableMonitoring;
250 writeln(Outfile,MonitorHook.GetWriteCount,' ISQL Monitor Messages written');
251 Sleep(1000);
252 FProcess.Terminate(0);
253 Sleep(1000);
254 assignFile(aLogFile,LogFileName);
255 Reset(aLogFile);
256 while not EOF(aLogFile) do
257 begin
258 readln(aLogFile,Line);
259 writeln(OutFile,Line);
260 end;
261 end;
262
263 initialization
264 RegisterTest(TTest14);
265
266 end.
267