ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/public/ibx/trunk/testsuite/Test14.pas
Revision: 315
Committed: Thu Feb 25 11:56:36 2021 UTC (3 years, 2 months ago) by tony
Content type: text/x-pascal
File size: 6079 byte(s)
Log Message:
Updated for IBX 4 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 protected
45 procedure CreateObjects(Application: TTestApplication); override;
46 function GetTestID: AnsiString; override;
47 function GetTestTitle: AnsiString; override;
48 procedure InitTest; override;
49 procedure ProcessResults; override;
50 public
51 destructor Destroy; override;
52 function ChildProcess: boolean; override;
53 procedure RunTest(CharSet: AnsiString; SQLDialect: integer); override;
54 end;
55
56
57 implementation
58
59 const
60 sqlExample =
61 'with recursive Depts As ( '+
62 'Select DEPT_NO, DEPARTMENT, HEAD_DEPT, cast(DEPARTMENT as VarChar(256)) as DEPT_PATH,'+
63 'cast(DEPT_NO as VarChar(64)) as DEPT_KEY_PATH '+
64 'From DEPARTMENT Where HEAD_DEPT is NULL '+
65 'UNION ALL '+
66 'Select D.DEPT_NO, D.DEPARTMENT, D.HEAD_DEPT, Depts.DEPT_PATH || '' / '' || D.DEPARTMENT as DEPT_PATH,'+
67 'Depts.DEPT_KEY_PATH || '';'' || D.DEPT_NO as DEPT_KEY_PATH '+
68 'From DEPARTMENT D '+
69 'JOIN Depts On D.HEAD_DEPT = Depts.DEPT_NO '+
70 ')'+
71
72 'Select First 2 A.EMP_NO, A.FIRST_NAME, A.LAST_NAME, A.PHONE_EXT, A.HIRE_DATE, A.DEPT_NO, A.JOB_CODE,'+
73 'A.JOB_GRADE, A.JOB_COUNTRY, A.SALARY, A.FULL_NAME, D.DEPT_PATH, D.DEPT_KEY_PATH '+
74 'From EMPLOYEE A '+
75 'JOIN Depts D On D.DEPT_NO = A.DEPT_NO';
76
77 LogFileName = 'Test_ISQLMonitor' + '.log';
78
79 { TTest14 }
80
81 procedure TTest14.HandleOnSQL(EventText: String; EventTime: TDateTime);
82 begin
83 if FIsChild then
84 begin
85 writeln(FLogFile,'*Monitor* '+DateTimeToStr(EventTime)+' '+EventText);
86 Flush(FLogFile);
87 end;
88 end;
89
90 {$IFDEF UNIX}
91 procedure DoSigTerm(sig : cint);cdecl;
92 begin
93 TTest14.FTerminated := true;
94 end;
95
96 procedure TTest14.SetupSignalHandler;
97 begin
98 FTerminated := false;
99 new(Fna);
100 new(Foa);
101 Fna^.sa_Handler:=SigActionHandler(@DoSigTerm);
102 fillchar(Fna^.Sa_Mask,sizeof(Fna^.sa_mask),#0);
103 Fna^.Sa_Flags:=0;
104 {$ifdef Linux} // Linux specific
105 Fna^.Sa_Restorer:=Nil;
106 {$endif}
107 if fpSigAction(SigTerm,Fna,Foa)<>0 then
108 begin
109 writeln(OutFile,'Error setting signal handler: ',fpgeterrno,'.');
110 halt(1);
111 end;
112 end;
113 {$ENDIF}
114
115 procedure TTest14.CreateObjects(Application: TTestApplication);
116 begin
117 inherited CreateObjects(Application);
118 FIBSQLMonitor := TIBSQLMonitor.Create(Application);
119 FIBSQLMonitor.TraceFlags := [tfQPrepare, tfQExecute, tfQFetch, tfError, tfStmt, tfConnect,
120 tfTransact, tfBlob, tfService, tfMisc];
121 IBDatabase.TraceFlags := [tfQPrepare, tfQExecute, tfQFetch, tfError, tfStmt, tfConnect,
122 tfTransact, tfBlob, tfService, tfMisc];
123 FIBSQLMonitor.OnSQL := @HandleOnSQL;
124 FLog := TStringList.Create;
125 FProcess := TProcess.Create(Application);
126 end;
127
128 function TTest14.GetTestID: AnsiString;
129 begin
130 Result := aTestID;
131 end;
132
133 function TTest14.GetTestTitle: AnsiString;
134 begin
135 Result := aTestTitle;
136 end;
137
138 procedure TTest14.InitTest;
139 begin
140 inherited InitTest;
141 IBDatabase.DatabaseName := Owner.GetEmployeeDatabaseName;
142 ReadOnlyTransaction;
143 FIsChild := Owner.TestOption <> '';
144 if FIsChild then
145 begin
146 {$IFDEF UNIX}
147 SetupSignalHandler;
148 {$ENDIF}
149 FIBSQLMonitor.Enabled := true;
150 assignFile(FLogFile,Owner.TestOption);
151 Rewrite(FLogFile);
152 end
153 else
154 begin
155 FProcess.Executable := ParamStr(0);
156 FProcess.Parameters.Clear;
157 FProcess.Parameters.Add('-q');
158 FProcess.Parameters.Add('-t');
159 FProcess.Parameters.Add(GetTestID);
160 FProcess.Parameters.Add('-O');
161 FProcess.Parameters.Add(LogFileName);
162 FProcess.Options := [];
163 end;
164 end;
165
166 procedure TTest14.ProcessResults;
167 begin
168 inherited ProcessResults;
169 if assigned(FLog) then
170 FreeAndNil(FLog);
171 if assigned(FProcess) then
172 FreeAndNil(FProcess);
173 end;
174
175 destructor TTest14.Destroy;
176 begin
177 if assigned(FLog) then
178 FreeAndNil(FLog);
179 if assigned(FProcess) then
180 FreeAndNil(FProcess);
181 inherited Destroy;
182 end;
183
184 function TTest14.ChildProcess: boolean;
185 begin
186 Result := Owner.TestOption <> '';
187 end;
188
189 procedure TTest14.RunTest(CharSet: AnsiString; SQLDialect: integer);
190 var stats: TPerfCounters;
191 i: integer;
192 aLogFile: Text;
193 Line: string;
194 begin
195 writeln(OutFile);
196 EnableMonitoring;
197 if not FIsChild then
198 FProcess.Execute
199 else
200 begin
201 while not FTerminated do
202 CheckSynchronize(1); //loop until terminated
203 Close(FLogFile);
204 Exit;
205 end;
206
207 CheckSynchronize(1);
208 with IBQuery do
209 begin
210 AllowAutoActivateTransaction := true;
211 Unidirectional := true;
212 SQL.Text := sqlExample;
213 EnableStatistics := true;
214 Active := true;
215 PrintDataSet(IBQuery);
216
217 if GetPerfStatistics(stats) then
218 WritePerfStats(stats);
219 PrintAffectedRows(IBQuery);
220 writeln(OutFile);
221 writeln(OutFile,'Reconnect');
222 IBDatabase.ReConnect;
223 Unidirectional := false;
224 Active := true;
225 PrintDataSet(IBQuery);
226 end;
227 IBDatabase.Connected := false;
228 CheckSynchronize(1);
229 DisableMonitoring;
230 FProcess.Terminate(0);
231 Sleep(1000);
232 assignFile(aLogFile,LogFileName);
233 Reset(aLogFile);
234 while not EOF(aLogFile) do
235 begin
236 readln(aLogFile,Line);
237 writeln(OutFile,Line);
238 end;
239 end;
240
241 initialization
242 RegisterTest(TTest14);
243
244 end.
245