ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/public/ibx/branches/journaling/fbintf/client/FBEvents.pas
Revision: 47
Committed: Mon Jan 9 15:31:51 2017 UTC (7 years, 11 months ago) by tony
Content type: text/x-pascal
Original Path: ibx/trunk/fbintf/client/FBEvents.pas
File size: 8623 byte(s)
Log Message:
Committing updates for Release R2-0-1

File Contents

# User Rev Content
1 tony 45 (*
2     * Firebird Interface (fbintf). The fbintf components provide a set of
3     * Pascal language bindings for the Firebird API. Although predominantly
4     * a new development they include source code taken from IBX and may be
5     * considered a derived product. This software thus also includes the copyright
6     * notice and license conditions from IBX.
7     *
8     * Except for those parts dervied from IBX, contents of this file are subject
9     * to the Initial Developer's Public License Version 1.0 (the "License"); you
10     * may not use this file except in compliance with the License. You may obtain a
11     * copy of the License here:
12     *
13     * http://www.firebirdsql.org/index.php?op=doc&id=idpl
14     *
15     * Software distributed under the License is distributed on an "AS
16     * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
17     * implied. See the License for the specific language governing rights
18     * and limitations under the License.
19     *
20     * The Initial Developer of the Original Code is Tony Whyman.
21     *
22     * The Original Code is (C) 2016 Tony Whyman, MWA Software
23     * (http://www.mwasoftware.co.uk).
24     *
25     * All Rights Reserved.
26     *
27     * Contributor(s): ______________________________________.
28     *
29     *)
30     {************************************************************************}
31     { }
32     { Borland Delphi Visual Component Library }
33     { InterBase Express core components }
34     { }
35     { Copyright (c) 1998-2000 Inprise Corporation }
36     { }
37     { InterBase Express is based in part on the product }
38     { Free IB Components, written by Gregory H. Deatz for }
39     { Hoagland, Longo, Moran, Dunst & Doukas Company. }
40     { Free IB Components is used under license. }
41     { }
42     { The contents of this file are subject to the InterBase }
43     { Public License Version 1.0 (the "License"); you may not }
44     { use this file except in compliance with the License. You }
45     { may obtain a copy of the License at http://www.Inprise.com/IPL.html }
46     { Software distributed under the License is distributed on }
47     { an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either }
48     { express or implied. See the License for the specific language }
49     { governing rights and limitations under the License. }
50     { The Original Code was created by InterBase Software Corporation }
51     { and its successors. }
52     { Portions created by Inprise Corporation are Copyright (C) Inprise }
53     { Corporation. All Rights Reserved. }
54     { Contributor(s): Jeff Overcash }
55     { }
56     { IBX For Lazarus (Firebird Express) }
57     { Contributor: Tony Whyman, MWA Software http://www.mwasoftware.co.uk }
58     { Portions created by MWA Software are copyright McCallum Whyman }
59     { Associates Ltd 2011 - 2015 }
60     { }
61     {************************************************************************}
62     unit FBEvents;
63    
64     {$IFDEF FPC}
65     {$mode objfpc}{$H+}
66     {$interfaces COM}
67     {$ENDIF}
68    
69     interface
70    
71     uses
72     Classes, SysUtils, IB, FBClientAPI, syncobjs, FBActivityMonitor;
73    
74     type
75    
76     { TFBEvents }
77    
78     TFBEvents = class(TActivityReporter)
79     private
80     FEvents: TStringList;
81     FAttachment: IAttachment;
82 tony 47 FEventCounts: TEventCounts;
83 tony 45 protected
84     FEventBuffer: PChar;
85     FEventBufferLen: integer;
86     FResultBuffer: PChar;
87     FEventHandler: TEventHandler;
88     FCriticalSection: TCriticalSection;
89     FInWaitState: boolean;
90     procedure CreateEventBlock;
91     procedure CancelEvents(Force: boolean = false); virtual;
92     procedure EventSignaled;
93     function GetIEvents: IEvents; virtual; abstract;
94 tony 47 procedure ProcessEventCounts;
95 tony 45 public
96     constructor Create(DBAttachment: IAttachment; aMonitor: IActivityMonitor; Events: TStrings);
97     destructor Destroy; override;
98    
99     {IEvents}
100     procedure GetEvents(EventNames: TStrings);
101     procedure SetEvents(EventNames: TStrings); overload;
102     procedure SetEvents(Event: string); overload;
103     procedure Cancel;
104     function ExtractEventCounts: TEventCounts;
105     function GetAttachment: IAttachment;
106 tony 47 procedure AsyncWaitForEvent(EventHandler: TEventHandler); virtual; abstract;
107 tony 45 end;
108    
109    
110     implementation
111    
112     uses FBMessages, IBExternals;
113    
114     const
115     MaxEvents = 15;
116    
117     { TFBEvents }
118    
119     procedure TFBEvents.CreateEventBlock;
120     var
121     i: integer;
122     EventNames: array of PChar;
123     begin
124     with FirebirdClientAPI do
125     begin
126     if FEventBuffer <> nil then
127     isc_free( FEventBuffer);
128     FEventBuffer := nil;
129     if FResultBuffer <> nil then
130     isc_free( FResultBuffer);
131     FResultBuffer := nil;
132    
133     setlength(EventNames,MaxEvents);
134     try
135     for i := 0 to FEvents.Count-1 do
136     EventNames[i] := PChar(FEvents[i]);
137    
138     FEventBufferlen := isc_event_block(@FEventBuffer,@FResultBuffer,
139     FEvents.Count,
140     EventNames[0],EventNames[1],EventNames[2],
141     EventNames[3],EventNames[4],EventNames[5],
142     EventNames[6],EventNames[7],EventNames[8],
143     EventNames[9],EventNames[10],EventNames[11],
144     EventNames[12],EventNames[13],EventNames[14]
145     );
146     finally
147     SetLength(EventNames,0)
148     end;
149     end;
150     end;
151    
152     procedure TFBEvents.CancelEvents(Force: boolean);
153     begin
154     FEventHandler := nil;
155     end;
156    
157     procedure TFBEvents.EventSignaled;
158     var Handler: TEventHandler;
159     begin
160 tony 47 Handler := nil;
161 tony 45 FCriticalSection.Enter;
162     try
163     if not FInWaitState then Exit;
164     FInWaitState := false;
165 tony 47 ProcessEventCounts;
166 tony 45 if assigned(FEventHandler) then
167     begin
168     Handler := FEventHandler;
169     FEventHandler := nil;
170     end;
171     finally
172 tony 47 FCriticalSection.Leave;
173 tony 45 end;
174 tony 47 if assigned(Handler) then
175     Handler(GetIEvents);
176 tony 45 end;
177    
178 tony 47 procedure TFBEvents.ProcessEventCounts;
179     var P: PISC_LONG;
180     EventCountList: array[0..19] of ISC_LONG;
181     i: integer;
182     j: integer;
183     begin
184     SetLength(FEventCounts,0);
185     if FResultBuffer = nil then Exit;
186    
187     FillChar(EventCountList,sizeof(EventCountList),0);
188    
189     with FirebirdClientAPI do
190     isc_event_counts( @EventCountList, FEventBufferLen, FEventBuffer, FResultBuffer);
191     j := 0;
192     P := EventCountList;
193     for i := 0 to FEvents.Count - 1 do
194     begin
195     if EventCountList[i] <> 0 then
196     begin
197     Inc(j);
198     SetLength(FEventCounts,j);
199     FEventCounts[j-1].EventName := FEvents[i];
200     FEventCounts[j-1].Count := P^;
201     Inc(P);
202     // writeln('Event: ',FEventCounts[j-1].EventName,' Count = ',FEventCounts[j-1].Count);
203     end;
204     end;
205     end;
206    
207 tony 45 constructor TFBEvents.Create(DBAttachment: IAttachment;
208     aMonitor: IActivityMonitor; Events: TStrings);
209     begin
210     inherited Create(aMonitor);
211     FAttachment := DBAttachment;
212     if Events.Count > MaxEvents then
213     IBError(ibxeMaximumEvents, [nil]);
214    
215     FCriticalSection := TCriticalSection.Create;
216     FEvents := TStringList.Create;
217     FEvents.Assign(Events);
218     CreateEventBlock;
219     end;
220    
221     destructor TFBEvents.Destroy;
222     begin
223     if assigned(FCriticalSection) then FCriticalSection.Free;
224     if assigned(FEvents) then FEvents.Free;
225     with FirebirdClientAPI do
226     begin
227     if FEventBuffer <> nil then
228     isc_free( FEventBuffer);
229     if FResultBuffer <> nil then
230     isc_free( FResultBuffer);
231     end;
232     inherited Destroy;
233     end;
234    
235     procedure TFBEvents.GetEvents(EventNames: TStrings);
236     begin
237     EventNames.Assign(FEvents)
238     end;
239    
240     procedure TFBEvents.SetEvents(EventNames: TStrings);
241     begin
242     if EventNames.Text <> FEvents.Text then
243     begin
244     Cancel;
245     FEvents.Assign(EventNames);
246     CreateEventBlock;
247     end;
248     end;
249    
250     procedure TFBEvents.SetEvents(Event: string);
251     var S: TStringList;
252     begin
253     S := TStringList.Create;
254     try
255     S.Add(Event);
256     SetEvents(S);
257     finally
258     S.Free;
259     end;
260     end;
261    
262     procedure TFBEvents.Cancel;
263     begin
264     if assigned(FEventHandler) then
265     CancelEvents;
266     end;
267    
268     function TFBEvents.ExtractEventCounts: TEventCounts;
269     begin
270 tony 47 Result := FEventCounts;
271 tony 45 end;
272    
273     function TFBEvents.GetAttachment: IAttachment;
274     begin
275     Result := FAttachment;
276     end;
277    
278     end.
279