ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/public/ibx/trunk/runtime/IBIntf.pas
Revision: 5
Committed: Fri Feb 18 16:26:16 2011 UTC (13 years, 9 months ago) by tony
Content type: text/x-pascal
File size: 19370 byte(s)
Log Message:
Committing updates for Release pre-release

File Contents

# User Rev Content
1 tony 1 {************************************************************************}
2     { }
3     { Borland Delphi Visual Component Library }
4     { InterBase Express core components }
5     { }
6     { Copyright (c) 1998-2000 Inprise Corporation }
7     { }
8     { InterBase Express is based in part on the product }
9     { Free IB Components, written by Gregory H. Deatz for }
10     { Hoagland, Longo, Moran, Dunst & Doukas Company. }
11     { Free IB Components is used under license. }
12     { }
13     { The contents of this file are subject to the InterBase }
14     { Public License Version 1.0 (the "License"); you may not }
15     { use this file except in compliance with the License. You }
16     { may obtain a copy of the License at http://www.Inprise.com/IPL.html }
17     { Software distributed under the License is distributed on }
18     { an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either }
19     { express or implied. See the License for the specific language }
20     { governing rights and limitations under the License. }
21     { The Original Code was created by InterBase Software Corporation }
22     { and its successors. }
23     { Portions created by Inprise Corporation are Copyright (C) Inprise }
24     { Corporation. All Rights Reserved. }
25     { Contributor(s): Jeff Overcash }
26 tony 5 { Tony Whyman, MWA Software (Ported to Lazarus) }
27     { http://www.mwasoftware.co.uk }
28 tony 1 { }
29     {************************************************************************}
30    
31     unit IBIntf;
32    
33 tony 5 {$Mode Delphi}
34    
35 tony 1 interface
36    
37 tony 5 uses
38     {$IFDEF LINUX }
39     unix,
40     {$ELSE}
41     Windows,
42     {$ENDIF}
43     IBHeader,IBExternals;
44 tony 1
45     var
46     BLOB_get: TBLOB_get;
47     BLOB_put: TBLOB_put;
48     isc_sqlcode: Tisc_sqlcode;
49     isc_sql_interprete: Tisc_sql_interprete;
50     isc_interprete: Tisc_interprete;
51     isc_vax_integer: Tisc_vax_integer;
52     isc_blob_info: Tisc_blob_info;
53     isc_open_blob2: Tisc_open_blob2;
54     isc_close_blob: Tisc_close_blob;
55     isc_get_segment: Tisc_get_segment;
56     isc_put_segment: Tisc_put_segment;
57     isc_create_blob2: Tisc_create_blob2;
58     isc_service_attach: Tisc_service_attach;
59     isc_service_detach: Tisc_service_detach;
60     isc_service_query: Tisc_service_query;
61     isc_service_start: Tisc_service_start;
62     isc_decode_date: Tisc_decode_date;
63     isc_decode_sql_date: Tisc_decode_sql_date;
64     isc_decode_sql_time: Tisc_decode_sql_time;
65     isc_decode_timestamp: Tisc_decode_timestamp;
66     isc_encode_date: Tisc_encode_date;
67     isc_encode_sql_date: Tisc_encode_sql_date;
68     isc_encode_sql_time: Tisc_encode_sql_time;
69     isc_encode_timestamp: Tisc_encode_timestamp;
70     isc_dsql_free_statement: Tisc_dsql_free_statement;
71     isc_dsql_execute2: Tisc_dsql_execute2;
72     isc_dsql_execute: Tisc_dsql_execute;
73     isc_dsql_set_cursor_name: Tisc_dsql_set_cursor_name;
74     isc_dsql_fetch: Tisc_dsql_fetch;
75     isc_dsql_sql_info: Tisc_dsql_sql_info;
76     isc_dsql_alloc_statement2: Tisc_dsql_alloc_statement2;
77     isc_dsql_prepare: Tisc_dsql_prepare;
78     isc_dsql_describe_bind: Tisc_dsql_describe_bind;
79     isc_dsql_describe: Tisc_dsql_describe;
80     isc_dsql_execute_immediate: Tisc_dsql_execute_immediate;
81     isc_drop_database: Tisc_drop_database;
82     isc_detach_database: Tisc_detach_database;
83     isc_attach_database: Tisc_attach_database;
84     isc_database_info: Tisc_database_info;
85     isc_start_multiple: Tisc_start_multiple;
86     isc_commit_transaction: Tisc_commit_transaction;
87     isc_commit_retaining: Tisc_commit_retaining;
88     isc_rollback_transaction: Tisc_rollback_transaction;
89     isc_rollback_retaining: Tisc_rollback_retaining;
90     isc_cancel_events: Tisc_cancel_events;
91     isc_que_events: Tisc_que_events;
92     isc_event_counts: Tisc_event_counts;
93     isc_event_block: Tisc_event_block;
94     isc_free: Tisc_free;
95     isc_add_user : Tisc_add_user;
96     isc_delete_user: Tisc_delete_user;
97     isc_modify_user: Tisc_modify_user;
98    
99    
100     { Library Initialization }
101     procedure LoadIBLibrary;
102     procedure FreeIBLibrary;
103     function TryIBLoad: Boolean;
104     procedure CheckIBLoaded;
105    
106     { Stubs for 6.0 only functions }
107     function isc_rollback_retaining_stub(status_vector : PISC_STATUS;
108     tran_handle : PISC_TR_HANDLE):
109 tony 5 ISC_STATUS; {$IFDEF LINUX} cdecl; {$ELSE} stdcall; {$ENDIF}
110 tony 1 function isc_service_attach_stub(status_vector : PISC_STATUS;
111     isc_arg2 : UShort;
112     isc_arg3 : PChar;
113     service_handle : PISC_SVC_HANDLE;
114     isc_arg5 : UShort;
115     isc_arg6 : PChar):
116 tony 5 ISC_STATUS; {$IFDEF LINUX} cdecl; {$ELSE} stdcall; {$ENDIF}
117 tony 1 function isc_service_detach_stub(status_vector : PISC_STATUS;
118     service_handle : PISC_SVC_HANDLE):
119 tony 5 ISC_STATUS; {$IFDEF LINUX} cdecl; {$ELSE} stdcall; {$ENDIF}
120 tony 1 function isc_service_query_stub(status_vector : PISC_STATUS;
121     service_handle : PISC_SVC_HANDLE;
122     recv_handle : PISC_SVC_HANDLE;
123     isc_arg4 : UShort;
124     isc_arg5 : PChar;
125     isc_arg6 : UShort;
126     isc_arg7 : PChar;
127     isc_arg8 : UShort;
128     isc_arg9 : PChar):
129 tony 5 ISC_STATUS; {$IFDEF LINUX} cdecl; {$ELSE} stdcall; {$ENDIF}
130 tony 1 function isc_service_start_stub(status_vector : PISC_STATUS;
131     service_handle : PISC_SVC_HANDLE;
132     recv_handle : PISC_SVC_HANDLE;
133     isc_arg4 : UShort;
134     isc_arg5 : PChar):
135 tony 5 ISC_STATUS; {$IFDEF LINUX} cdecl; {$ELSE} stdcall; {$ENDIF}
136 tony 1
137     procedure isc_encode_sql_date_stub(tm_date : PCTimeStructure;
138     ib_date : PISC_DATE);
139 tony 5 {$IFDEF LINUX} cdecl; {$ELSE} stdcall; {$ENDIF}
140 tony 1
141     procedure isc_encode_sql_time_stub(tm_date : PCTimeStructure;
142     ib_time : PISC_TIME);
143 tony 5 {$IFDEF LINUX} cdecl; {$ELSE} stdcall; {$ENDIF}
144 tony 1
145     procedure isc_encode_timestamp_stub(tm_date : PCTimeStructure;
146     ib_timestamp : PISC_TIMESTAMP);
147 tony 5 {$IFDEF LINUX} cdecl; {$ELSE} stdcall; {$ENDIF}
148 tony 1
149     procedure isc_decode_sql_date_stub(ib_date : PISC_DATE;
150     tm_date : PCTimeStructure);
151 tony 5 {$IFDEF LINUX} cdecl; {$ELSE} stdcall; {$ENDIF}
152 tony 1
153     procedure isc_decode_sql_time_stub(ib_time : PISC_TIME;
154     tm_date : PCTimeStructure);
155 tony 5 {$IFDEF LINUX} cdecl; {$ELSE} stdcall; {$ENDIF}
156 tony 1
157     procedure isc_decode_timestamp_stub(ib_timestamp : PISC_TIMESTAMP;
158     tm_date : PCTimeStructure);
159 tony 5 {$IFDEF LINUX} cdecl; {$ELSE} stdcall; {$ENDIF}
160 tony 1
161    
162 tony 5 var IBServiceAPIPresent: boolean;
163    
164 tony 1 implementation
165    
166 tony 5 uses Sysutils, IB, Dynlibs;
167 tony 1
168     var
169 tony 5 IBLibrary: TLibHandle;
170 tony 1
171     procedure LoadIBLibrary;
172    
173     function GetProcAddr(ProcName: PChar): Pointer;
174     begin
175     Result := GetProcAddress(IBLibrary, ProcName);
176     if not Assigned(Result) then
177 tony 5 raise Exception.Create('Unable to load Firebird Client Library');
178 tony 1 end;
179 tony 5 {$IFDEF LINUX }
180     function InternalLoadLibrary: TLibHandle;
181     var LibName: string;
182     begin
183     //Use default unless FBLIB overrides
184     LibName := GetEnvironmentVariable('FBLIB');
185     if LibName = '' then LibName := FIREBIRD_SO;
186     Result := LoadLibrary(LibName);
187     end;
188     {$ELSE}
189     // "Else" is currently Windozze
190     function InternalLoadLibrary: TLibHandle;
191     var InstallDir: string;
192     dllPathName: string;
193     begin
194     //First look for Firebird Embedded Server in installation dir
195     InstallDir := ExtractFilePath(Application.ExeName);
196     if FileExists(InstallDir + FIREBIRD_EMBEDDED) then
197     begin
198     dllPathName := InstallDir + FIREBIRD_EMBEDDED;
199     Result := LoadLibrary(dllPathName)
200     end
201     else
202     //Otherwise look for Firebird Client in installation dir
203     if FileExists(InstallDir + FIREBIRD_CLIENT) then
204     begin
205     //assume firebird.conf and firebird.msg in same dir
206     SetEnvironmentVariable('FIREBIRD',InstallDir);
207     dllPathName := InstallDir +FIREBIRD_CLIENT;
208     Result := LoadLibrary(dllPathName)
209     end
210     else
211     //Otherwise see if Firebird client is in path
212     //and rely on registry for location of firebird.conf and firebird.msg
213     begin
214     Result := LoadLibrary(FIREBIRD_CLIENT);
215     if Result <= HINSTANCE_ERROR then
216     //well maybe InterBase is present...
217     Result := LoadLibrary(IBASE_DLL);
218     end
219     end;
220     {$ENDIF}
221 tony 1
222     begin
223 tony 5 IBLibrary := InternalLoadLibrary;
224     if (IBLibrary <> NilHandle) then
225 tony 1 begin
226     BLOB_get := GetProcAddr('BLOB_get'); {do not localize}
227     BLOB_put := GetProcAddr('BLOB_put'); {do not localize}
228     isc_sqlcode := GetProcAddr('isc_sqlcode'); {do not localize}
229     isc_sql_interprete := GetProcAddr('isc_sql_interprete'); {do not localize}
230     isc_interprete := GetProcAddr('isc_interprete'); {do not localize}
231     isc_vax_integer := GetProcAddr('isc_vax_integer'); {do not localize}
232     isc_blob_info := GetProcAddr('isc_blob_info'); {do not localize}
233     isc_open_blob2 := GetProcAddr('isc_open_blob2'); {do not localize}
234     isc_close_blob := GetProcAddr('isc_close_blob'); {do not localize}
235     isc_get_segment := GetProcAddr('isc_get_segment'); {do not localize}
236     isc_put_segment := GetProcAddr('isc_put_segment'); {do not localize}
237     isc_create_blob2 := GetProcAddr('isc_create_blob2'); {do not localize}
238     isc_decode_date := GetProcAddr('isc_decode_date'); {do not localize}
239     isc_encode_date := GetProcAddr('isc_encode_date'); {do not localize}
240     isc_dsql_free_statement := GetProcAddr('isc_dsql_free_statement'); {do not localize}
241     isc_dsql_execute2 := GetProcAddr('isc_dsql_execute2'); {do not localize}
242     isc_dsql_execute := GetProcAddr('isc_dsql_execute'); {do not localize}
243     isc_dsql_set_cursor_name := GetProcAddr('isc_dsql_set_cursor_name'); {do not localize}
244     isc_dsql_fetch := GetProcAddr('isc_dsql_fetch'); {do not localize}
245     isc_dsql_sql_info := GetProcAddr('isc_dsql_sql_info'); {do not localize}
246     isc_dsql_alloc_statement2 := GetProcAddr('isc_dsql_alloc_statement2'); {do not localize}
247     isc_dsql_prepare := GetProcAddr('isc_dsql_prepare'); {do not localize}
248     isc_dsql_describe_bind := GetProcAddr('isc_dsql_describe_bind'); {do not localize}
249     isc_dsql_describe := GetProcAddr('isc_dsql_describe'); {do not localize}
250     isc_dsql_execute_immediate := GetProcAddr('isc_dsql_execute_immediate'); {do not localize}
251     isc_drop_database := GetProcAddr('isc_drop_database'); {do not localize}
252     isc_detach_database := GetProcAddr('isc_detach_database'); {do not localize}
253     isc_attach_database := GetProcAddr('isc_attach_database'); {do not localize}
254     isc_database_info := GetProcAddr('isc_database_info'); {do not localize}
255     isc_start_multiple := GetProcAddr('isc_start_multiple'); {do not localize}
256     isc_commit_transaction := GetProcAddr('isc_commit_transaction'); {do not localize}
257     isc_commit_retaining := GetProcAddr('isc_commit_retaining'); {do not localize}
258     isc_rollback_transaction := GetProcAddr('isc_rollback_transaction'); {do not localize}
259     isc_cancel_events := GetProcAddr('isc_cancel_events'); {do not localize}
260     isc_que_events := GetProcAddr('isc_que_events'); {do not localize}
261     isc_event_counts := GetProcAddr('isc_event_counts'); {do not localize}
262     isc_event_block := GetProcAddr('isc_event_block'); {do not localize}
263     isc_free := GetProcAddr('isc_free'); {do not localize}
264     isc_add_user := GetProcAddr('isc_add_user'); {do not localize}
265     isc_delete_user := GetProcAddr('isc_delete_user'); {do not localize}
266     isc_modify_user := GetProcAddr('isc_modify_user'); {do not localize}
267    
268 tony 5 IBServiceAPIPresent := true;
269 tony 1 isc_rollback_retaining := GetProcAddress(IBLibrary, 'isc_rollback_retaining'); {do not localize}
270     if Assigned(isc_rollback_retaining) then
271     begin
272     isc_service_attach := GetProcAddr('isc_service_attach'); {do not localize}
273     isc_service_detach := GetProcAddr('isc_service_detach'); {do not localize}
274     isc_service_query := GetProcAddr('isc_service_query'); {do not localize}
275     isc_service_start := GetProcAddr('isc_service_start'); {do not localize}
276     isc_decode_sql_date := GetProcAddr('isc_decode_sql_date'); {do not localize}
277     isc_decode_sql_time := GetProcAddr('isc_decode_sql_time'); {do not localize}
278     isc_decode_timestamp := GetProcAddr('isc_decode_timestamp'); {do not localize}
279     isc_encode_sql_date := GetProcAddr('isc_encode_sql_date'); {do not localize}
280     isc_encode_sql_time := GetProcAddr('isc_encode_sql_time'); {do not localize}
281     isc_encode_timestamp := GetProcAddr('isc_encode_timestamp'); {do not localize}
282     end else
283     begin
284 tony 5 IBServiceAPIPresent := false;
285 tony 1 isc_rollback_retaining := isc_rollback_retaining_stub;
286     isc_service_attach := isc_service_attach_stub;
287     isc_service_detach := isc_service_detach_stub;
288     isc_service_query := isc_service_query_stub;
289     isc_service_start := isc_service_start_stub;
290     isc_decode_sql_date := isc_decode_sql_date_stub;
291     isc_decode_sql_time := isc_decode_sql_time_stub;
292     isc_decode_timestamp := isc_decode_timestamp_stub;
293     isc_encode_sql_date := isc_encode_sql_date_stub;
294     isc_encode_sql_time := isc_encode_sql_time_stub;
295     isc_encode_timestamp := isc_encode_timestamp_stub;
296     end;
297     end;
298     end;
299    
300     procedure FreeIBLibrary;
301     begin
302 tony 5 if IBLibrary <> NilHandle then
303 tony 1 begin
304     FreeLibrary(IBLibrary);
305     IBLibrary := 0;
306     end;
307     end;
308    
309     function TryIBLoad: Boolean;
310     begin
311 tony 5 if (IBLibrary = NilHandle) then
312 tony 1 LoadIBLibrary;
313 tony 5 if (IBLibrary = NilHandle) then
314 tony 1 result := False
315     else
316     result := True;
317     end;
318    
319     procedure CheckIBLoaded;
320     begin
321     if not TryIBLoad then
322     IBError(ibxeInterBaseMissing, [nil]);
323     end;
324    
325    
326     function isc_rollback_retaining_stub(status_vector : PISC_STATUS;
327     tran_handle : PISC_TR_HANDLE):
328 tony 5 ISC_STATUS; {$IFDEF LINUX} cdecl; {$ELSE} stdcall; {$ENDIF}
329 tony 1 begin
330     Result := 0;
331     IBError(ibxeIB60feature, ['isc_rollback_retaining']); {do not localize}
332     end;
333    
334     function isc_service_attach_stub(status_vector : PISC_STATUS;
335     isc_arg2 : UShort;
336     isc_arg3 : PChar;
337     service_handle : PISC_SVC_HANDLE;
338     isc_arg5 : UShort;
339     isc_arg6 : PChar):
340 tony 5 ISC_STATUS; {$IFDEF LINUX} cdecl; {$ELSE} stdcall; {$ENDIF}
341 tony 1 begin
342     Result := 0;
343     IBError(ibxeIB60feature, ['isc_service_attach']); {do not localize}
344     end;
345    
346     function isc_service_detach_stub(status_vector : PISC_STATUS;
347     service_handle : PISC_SVC_HANDLE):
348 tony 5 ISC_STATUS; {$IFDEF LINUX} cdecl; {$ELSE} stdcall; {$ENDIF}
349 tony 1 begin
350     Result := 0;
351     IBError(ibxeIB60feature, ['isc_service_detach']); {do not localize}
352     end;
353    
354     function isc_service_query_stub(status_vector : PISC_STATUS;
355     service_handle : PISC_SVC_HANDLE;
356     recv_handle : PISC_SVC_HANDLE;
357     isc_arg4 : UShort;
358     isc_arg5 : PChar;
359     isc_arg6 : UShort;
360     isc_arg7 : PChar;
361     isc_arg8 : UShort;
362     isc_arg9 : PChar):
363 tony 5 ISC_STATUS; {$IFDEF LINUX} cdecl; {$ELSE} stdcall; {$ENDIF}
364 tony 1 begin
365     Result := 0;
366     IBError(ibxeIB60feature, ['isc_service_query']); {do not localize}
367     end;
368    
369     function isc_service_start_stub(status_vector : PISC_STATUS;
370     service_handle : PISC_SVC_HANDLE;
371     recv_handle : PISC_SVC_HANDLE;
372     isc_arg4 : UShort;
373     isc_arg5 : PChar):
374 tony 5 ISC_STATUS; {$IFDEF LINUX} cdecl; {$ELSE} stdcall; {$ENDIF}
375 tony 1 begin
376     Result := 0;
377     IBError(ibxeIB60feature, ['isc_service_start']); {do not localize}
378     end;
379    
380     procedure isc_encode_sql_date_stub(tm_date : PCTimeStructure;
381     ib_date : PISC_DATE);
382 tony 5 {$IFDEF LINUX} cdecl; {$ELSE} stdcall; {$ENDIF}
383 tony 1 begin
384     IBError(ibxeIB60feature, ['isc_encode_sql_date']); {do not localize}
385     end;
386    
387     procedure isc_encode_sql_time_stub(tm_date : PCTimeStructure;
388     ib_time : PISC_TIME);
389 tony 5 {$IFDEF LINUX} cdecl; {$ELSE} stdcall; {$ENDIF}
390 tony 1 begin
391     IBError(ibxeIB60feature, ['isc_encode_sql_time']); {do not localize}
392     end;
393    
394     procedure isc_encode_timestamp_stub(tm_date : PCTimeStructure;
395     ib_timestamp : PISC_TIMESTAMP);
396 tony 5 {$IFDEF LINUX} cdecl; {$ELSE} stdcall; {$ENDIF}
397 tony 1 begin
398     IBError(ibxeIB60feature, ['isc_encode_sql_timestamp']); {do not localize}
399     end;
400    
401     procedure isc_decode_sql_date_stub(ib_date : PISC_DATE;
402     tm_date : PCTimeStructure);
403 tony 5 {$IFDEF LINUX} cdecl; {$ELSE} stdcall; {$ENDIF}
404 tony 1 begin
405     IBError(ibxeIB60feature, ['isc_decode_sql_date']); {do not localize}
406     end;
407    
408     procedure isc_decode_sql_time_stub(ib_time : PISC_TIME;
409     tm_date : PCTimeStructure);
410 tony 5 {$IFDEF LINUX} cdecl; {$ELSE} stdcall; {$ENDIF}
411 tony 1 begin
412     IBError(ibxeIB60feature, ['isc_decode_sql_time']); {do not localize}
413     end;
414    
415     procedure isc_decode_timestamp_stub(ib_timestamp : PISC_TIMESTAMP;
416     tm_date : PCTimeStructure);
417 tony 5 {$IFDEF LINUX} cdecl; {$ELSE} stdcall; {$ENDIF}
418 tony 1 begin
419     IBError(ibxeIB60feature, ['isc_decode_timestamp']); {do not localize}
420     end;
421     initialization
422    
423     finalization
424     FreeIBLibrary;
425     end.