ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/public/ibx/trunk/runtime/IBIntf.pas
Revision: 37
Committed: Mon Feb 15 14:44:25 2016 UTC (8 years, 2 months ago) by tony
Content type: text/x-pascal
File size: 23742 byte(s)
Log Message:
Committing updates for Release R1-4-0

File Contents

# User Rev Content
1 tony 33 {************************************************************************}
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     { }
27     { IBX For Lazarus (Firebird Express) }
28     { Contributor: Tony Whyman, MWA Software http://www.mwasoftware.co.uk }
29     { Portions created by MWA Software are copyright McCallum Whyman }
30     { Associates Ltd 2011 }
31     { }
32     {************************************************************************}
33    
34     unit IBIntf;
35    
36     {$Mode Delphi}
37    
38     interface
39    
40     uses
41     {$IFDEF WINDOWS }
42     Windows,
43     {$ELSE}
44     unix,
45     {$ENDIF}
46     IBHeader,IBExternals;
47    
48     var
49     BLOB_get: TBLOB_get;
50     BLOB_put: TBLOB_put;
51     isc_sqlcode: Tisc_sqlcode;
52     isc_sql_interprete: Tisc_sql_interprete;
53     isc_interprete: Tisc_interprete;
54     isc_vax_integer: Tisc_vax_integer;
55     isc_portable_integer: Tisc_portable_integer;
56     isc_blob_info: Tisc_blob_info;
57 tony 35 isc_blob_lookup_desc: Tisc_blob_lookup_desc;
58 tony 33 isc_open_blob2: Tisc_open_blob2;
59     isc_close_blob: Tisc_close_blob;
60     isc_get_segment: Tisc_get_segment;
61     isc_put_segment: Tisc_put_segment;
62     isc_create_blob2: Tisc_create_blob2;
63     isc_service_attach: Tisc_service_attach;
64     isc_service_detach: Tisc_service_detach;
65     isc_service_query: Tisc_service_query;
66     isc_service_start: Tisc_service_start;
67     isc_decode_date: Tisc_decode_date;
68     isc_decode_sql_date: Tisc_decode_sql_date;
69     isc_decode_sql_time: Tisc_decode_sql_time;
70     isc_decode_timestamp: Tisc_decode_timestamp;
71     isc_encode_date: Tisc_encode_date;
72     isc_encode_sql_date: Tisc_encode_sql_date;
73     isc_encode_sql_time: Tisc_encode_sql_time;
74     isc_encode_timestamp: Tisc_encode_timestamp;
75     isc_dsql_free_statement: Tisc_dsql_free_statement;
76     isc_dsql_execute2: Tisc_dsql_execute2;
77     isc_dsql_execute: Tisc_dsql_execute;
78     isc_dsql_set_cursor_name: Tisc_dsql_set_cursor_name;
79     isc_dsql_fetch: Tisc_dsql_fetch;
80     isc_dsql_sql_info: Tisc_dsql_sql_info;
81     isc_dsql_alloc_statement2: Tisc_dsql_alloc_statement2;
82     isc_dsql_prepare: Tisc_dsql_prepare;
83     isc_dsql_describe_bind: Tisc_dsql_describe_bind;
84     isc_dsql_describe: Tisc_dsql_describe;
85     isc_dsql_execute_immediate: Tisc_dsql_execute_immediate;
86     isc_drop_database: Tisc_drop_database;
87     isc_detach_database: Tisc_detach_database;
88     isc_attach_database: Tisc_attach_database;
89     isc_database_info: Tisc_database_info;
90     isc_start_multiple: Tisc_start_multiple;
91     isc_commit_transaction: Tisc_commit_transaction;
92     isc_commit_retaining: Tisc_commit_retaining;
93     isc_rollback_transaction: Tisc_rollback_transaction;
94     isc_rollback_retaining: Tisc_rollback_retaining;
95     isc_cancel_events: Tisc_cancel_events;
96     isc_que_events: Tisc_que_events;
97     isc_event_counts: Tisc_event_counts;
98     isc_event_block: Tisc_event_block;
99     isc_free: Tisc_free;
100     isc_add_user : Tisc_add_user;
101     isc_delete_user: Tisc_delete_user;
102     isc_modify_user: Tisc_modify_user;
103    
104 tony 37 FBLibraryName: string;
105 tony 33
106 tony 37
107 tony 33 { Library Initialization }
108     procedure LoadIBLibrary;
109     procedure FreeIBLibrary;
110     function TryIBLoad: Boolean;
111     procedure CheckIBLoaded;
112    
113 tony 37 {Utility}
114     function IsEmbeddedServer: boolean;
115    
116 tony 33 { Stubs for 6.0 only functions }
117     function isc_rollback_retaining_stub(status_vector : PISC_STATUS;
118     tran_handle : PISC_TR_HANDLE):
119     ISC_STATUS; {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
120     function isc_service_attach_stub(status_vector : PISC_STATUS;
121     isc_arg2 : UShort;
122     isc_arg3 : PChar;
123     service_handle : PISC_SVC_HANDLE;
124     isc_arg5 : UShort;
125     isc_arg6 : PChar):
126     ISC_STATUS; {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
127     function isc_service_detach_stub(status_vector : PISC_STATUS;
128     service_handle : PISC_SVC_HANDLE):
129     ISC_STATUS; {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
130     function isc_service_query_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     isc_arg6 : UShort;
136     isc_arg7 : PChar;
137     isc_arg8 : UShort;
138     isc_arg9 : PChar):
139     ISC_STATUS; {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
140     function isc_service_start_stub(status_vector : PISC_STATUS;
141     service_handle : PISC_SVC_HANDLE;
142     recv_handle : PISC_SVC_HANDLE;
143     isc_arg4 : UShort;
144     isc_arg5 : PChar):
145     ISC_STATUS; {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
146    
147     procedure isc_encode_sql_date_stub(tm_date : PCTimeStructure;
148     ib_date : PISC_DATE);
149     {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
150    
151     procedure isc_encode_sql_time_stub(tm_date : PCTimeStructure;
152     ib_time : PISC_TIME);
153     {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
154    
155     procedure isc_encode_timestamp_stub(tm_date : PCTimeStructure;
156     ib_timestamp : PISC_TIMESTAMP);
157     {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
158    
159     procedure isc_decode_sql_date_stub(ib_date : PISC_DATE;
160     tm_date : PCTimeStructure);
161     {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
162    
163     procedure isc_decode_sql_time_stub(ib_time : PISC_TIME;
164     tm_date : PCTimeStructure);
165     {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
166    
167     procedure isc_decode_timestamp_stub(ib_timestamp : PISC_TIMESTAMP;
168     tm_date : PCTimeStructure);
169     {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
170    
171    
172     var IBServiceAPIPresent: boolean;
173    
174     type
175     TOnGetLibraryName = procedure(var libname: string);
176    
177     const
178     OnGetLibraryName: TOnGetLibraryName = nil;
179    
180    
181     implementation
182    
183     uses Sysutils, IB, Dynlibs, Classes
184     {$IFDEF WINDOWS}
185 tony 37 , Registry, WinDirs
186 tony 33 {$ENDIF}
187     ;
188    
189     var
190     IBLibrary: TLibHandle;
191    
192     procedure LoadIBLibrary;
193    
194     function GetProcAddr(ProcName: PChar): Pointer;
195     begin
196     Result := GetProcAddress(IBLibrary, ProcName);
197     if not Assigned(Result) then
198     raise Exception.Create('Unable to load Firebird Client Library');
199     end;
200     {$IFDEF UNIX }
201     function FindLibrary(LibNameList: string): TLibHandle;
202     var LibNames: TStringList;
203     i: integer;
204     begin
205     Result := NilHandle;
206     LibNames := TStringList.Create;
207     try
208     LibNames.Delimiter := ':';
209     LibNames.StrictDelimiter := true;
210     LibNames.DelimitedText := LibNameList; {Split list on semi-colon}
211     for i := 0 to LibNames.Count - 1 do
212     begin
213     Result := LoadLibrary(LibNames[i]);
214 tony 37 if Result <> NilHandle then
215     begin
216     FBLibraryName := LibNames[i];
217     Exit;
218     end;
219 tony 33 end;
220     finally
221     LibNames.Free;
222     end;
223     end;
224    
225     function InternalLoadLibrary: TLibHandle;
226     var LibName: string;
227     begin
228     //Use default unless FBLIB overrides
229     LibName := GetEnvironmentVariable('FBLIB');
230     if LibName = '' then
231     begin
232     if assigned(OnGetLibraryName) then
233     OnGetLibraryName(LibName)
234     else
235     LibName := FIREBIRD_SO2;
236     end;
237     Result := FindLibrary(LibName);
238     {$IFDEF DARWIN}
239     if Result = NilHandle then
240     begin
241     {See http://paulbeachsblog.blogspot.co.uk/2008/03/where-is-libfbclientdylib-on-macosx.html
242     Try loading direct from Firebird Framework}
243    
244     LibName := '/Library/Frameworks/Firebird.framework/Firebird';
245     Result := LoadLibrary(LibName);
246 tony 37 if Result <> NilHandle then
247     FBLibraryName := ExtractFileName(LibName);
248 tony 33 end
249     {$ENDIF}
250     end;
251     {$ENDIF}
252     {$IFDEF WINDOWS}
253 tony 37 function DoLoadLibrary(LibName: string): TLibHandle;
254     begin
255     Result := LoadLibrary(LibName);
256     if Result <> NilHandle then
257     FBLibraryName := ExtractFileName(LibName);
258     end;
259    
260 tony 33 function InternalLoadLibrary: TLibHandle;
261     var InstallDir: string;
262     dllPathName: string;
263     begin
264 tony 37 Result := NilHandle;
265     {If OnGetLibraryName given then use this}
266 tony 33 if assigned(OnGetLibraryName) then
267     begin
268     OnGetLibraryName(dllPathName);
269 tony 37 Result := DoLoadLibrary(dllPathName);
270 tony 33 Exit
271     end;
272    
273 tony 37 {Then look in application installation directory}
274     InstallDir := ExtractFilePath(Paramstr(0)); {Using ParamStr(0) assumes windows conventions}
275    
276 tony 33 //First look for Firebird Embedded Server in installation dir
277     if FileExists(InstallDir + FIREBIRD_EMBEDDED) then
278     begin
279     dllPathName := InstallDir + FIREBIRD_EMBEDDED;
280 tony 37 Result := DoLoadLibrary(dllPathName)
281 tony 33 end
282     else
283     //Otherwise look for Firebird Client in installation dir
284     if FileExists(InstallDir + FIREBIRD_CLIENT) then
285     begin
286     //assume firebird.conf and firebird.msg in same dir
287     SetEnvironmentVariable('FIREBIRD',PChar(InstallDir));
288     dllPathName := InstallDir +FIREBIRD_CLIENT;
289 tony 37 Result := DoLoadLibrary(dllPathName)
290     end;
291    
292     {If FIREBIRD environment variable available then try this}
293     if Result = NilHandle then
294 tony 33 begin
295 tony 37 InstallDir := GetEnvironmentVariable('FIREBIRD');
296     if (InstallDir <> '') and FileExists(InstallDir + FIREBIRD_CLIENT) then
297     begin
298     //assume firebird.conf and firebird.msg in same dir
299     dllPathName := InstallDir + FIREBIRD_CLIENT;
300     Result := DoLoadLibrary(dllPathName)
301     end
302     else
303     if (InstallDir <> '') and FileExists(InstallDir + 'bin' + DirectorySeparator + FIREBIRD_CLIENT) then
304     begin
305     dllPathName := InstallDir + FIREBIRD_CLIENT;
306     Result := DoLoadLibrary(dllPathName)
307     end
308     end;
309    
310     if Result = NilHandle then
311     {Use Registry key if it exists to locate library}
312     begin
313 tony 33 with TRegistry.Create do
314     try
315     RootKey := HKEY_LOCAL_MACHINE;
316     if OpenKey('SOFTWARE\Firebird Project\Firebird Server\Instances',false) then
317     begin
318     if ValueExists('DefaultInstance') then
319     begin
320 tony 37 InstallDir := ReadString('DefaultInstance') + 'bin' + DirectorySeparator ;
321     dllPathName := InstallDir + FIREBIRD_CLIENT;
322     Result := DoLoadLibrary(dllPathName)
323 tony 33 end
324     end
325     finally
326     Free
327     end;
328    
329 tony 37 {Now try default install dir}
330     if Result = NilHandle then
331     begin
332     InstallDir := GetWindowsSpecialDir(CSIDL_PROGRAM_FILES) +
333     DirectorySeparator + 'Firebird' +
334     DirectorySeparator + 'Firebird_2_5' +
335     DirectorySeparator + 'bin' + DirectorySeparator;
336     dllPathName := InstallDir + FIREBIRD_CLIENT;
337     Result := DoLoadLibrary(dllPathName)
338     end;
339    
340 tony 33 //Otherwise see if Firebird client is in path
341     //and rely on registry for location of firebird.conf and firebird.msg
342 tony 37 if Result = NilHandle then
343     begin
344     Result := DoLoadLibrary(FIREBIRD_CLIENT);
345     if Result <= HINSTANCE_ERROR then
346 tony 33 //well maybe InterBase is present...
347 tony 37 Result := DoLoadLibrary(IBASE_DLL);
348     end;
349 tony 33 end
350     end;
351     {$ENDIF}
352    
353     begin
354     IBLibrary := InternalLoadLibrary;
355     if (IBLibrary <> NilHandle) then
356     begin
357     BLOB_get := GetProcAddr('BLOB_get'); {do not localize}
358     BLOB_put := GetProcAddr('BLOB_put'); {do not localize}
359     isc_sqlcode := GetProcAddr('isc_sqlcode'); {do not localize}
360     isc_sql_interprete := GetProcAddr('isc_sql_interprete'); {do not localize}
361     isc_interprete := GetProcAddr('isc_interprete'); {do not localize}
362     isc_vax_integer := GetProcAddr('isc_vax_integer'); {do not localize}
363     isc_portable_integer := GetProcAddr('isc_portable_integer'); {do not localize}
364     isc_blob_info := GetProcAddr('isc_blob_info'); {do not localize}
365 tony 35 isc_blob_lookup_desc := GetProcAddr('isc_blob_lookup_desc'); {do not localize}
366 tony 33 isc_open_blob2 := GetProcAddr('isc_open_blob2'); {do not localize}
367     isc_close_blob := GetProcAddr('isc_close_blob'); {do not localize}
368     isc_get_segment := GetProcAddr('isc_get_segment'); {do not localize}
369     isc_put_segment := GetProcAddr('isc_put_segment'); {do not localize}
370     isc_create_blob2 := GetProcAddr('isc_create_blob2'); {do not localize}
371     isc_decode_date := GetProcAddr('isc_decode_date'); {do not localize}
372     isc_encode_date := GetProcAddr('isc_encode_date'); {do not localize}
373     isc_dsql_free_statement := GetProcAddr('isc_dsql_free_statement'); {do not localize}
374     isc_dsql_execute2 := GetProcAddr('isc_dsql_execute2'); {do not localize}
375     isc_dsql_execute := GetProcAddr('isc_dsql_execute'); {do not localize}
376     isc_dsql_set_cursor_name := GetProcAddr('isc_dsql_set_cursor_name'); {do not localize}
377     isc_dsql_fetch := GetProcAddr('isc_dsql_fetch'); {do not localize}
378     isc_dsql_sql_info := GetProcAddr('isc_dsql_sql_info'); {do not localize}
379     isc_dsql_alloc_statement2 := GetProcAddr('isc_dsql_alloc_statement2'); {do not localize}
380     isc_dsql_prepare := GetProcAddr('isc_dsql_prepare'); {do not localize}
381     isc_dsql_describe_bind := GetProcAddr('isc_dsql_describe_bind'); {do not localize}
382     isc_dsql_describe := GetProcAddr('isc_dsql_describe'); {do not localize}
383     isc_dsql_execute_immediate := GetProcAddr('isc_dsql_execute_immediate'); {do not localize}
384     isc_drop_database := GetProcAddr('isc_drop_database'); {do not localize}
385     isc_detach_database := GetProcAddr('isc_detach_database'); {do not localize}
386     isc_attach_database := GetProcAddr('isc_attach_database'); {do not localize}
387     isc_database_info := GetProcAddr('isc_database_info'); {do not localize}
388     isc_start_multiple := GetProcAddr('isc_start_multiple'); {do not localize}
389     isc_commit_transaction := GetProcAddr('isc_commit_transaction'); {do not localize}
390     isc_commit_retaining := GetProcAddr('isc_commit_retaining'); {do not localize}
391     isc_rollback_transaction := GetProcAddr('isc_rollback_transaction'); {do not localize}
392     isc_cancel_events := GetProcAddr('isc_cancel_events'); {do not localize}
393     isc_que_events := GetProcAddr('isc_que_events'); {do not localize}
394     isc_event_counts := GetProcAddr('isc_event_counts'); {do not localize}
395     isc_event_block := GetProcAddr('isc_event_block'); {do not localize}
396     isc_free := GetProcAddr('isc_free'); {do not localize}
397     isc_add_user := GetProcAddr('isc_add_user'); {do not localize}
398     isc_delete_user := GetProcAddr('isc_delete_user'); {do not localize}
399     isc_modify_user := GetProcAddr('isc_modify_user'); {do not localize}
400    
401     IBServiceAPIPresent := true;
402     isc_rollback_retaining := GetProcAddress(IBLibrary, 'isc_rollback_retaining'); {do not localize}
403     if Assigned(isc_rollback_retaining) then
404     begin
405     isc_service_attach := GetProcAddr('isc_service_attach'); {do not localize}
406     isc_service_detach := GetProcAddr('isc_service_detach'); {do not localize}
407     isc_service_query := GetProcAddr('isc_service_query'); {do not localize}
408     isc_service_start := GetProcAddr('isc_service_start'); {do not localize}
409     isc_decode_sql_date := GetProcAddr('isc_decode_sql_date'); {do not localize}
410     isc_decode_sql_time := GetProcAddr('isc_decode_sql_time'); {do not localize}
411     isc_decode_timestamp := GetProcAddr('isc_decode_timestamp'); {do not localize}
412     isc_encode_sql_date := GetProcAddr('isc_encode_sql_date'); {do not localize}
413     isc_encode_sql_time := GetProcAddr('isc_encode_sql_time'); {do not localize}
414     isc_encode_timestamp := GetProcAddr('isc_encode_timestamp'); {do not localize}
415     end else
416     begin
417     IBServiceAPIPresent := false;
418     isc_rollback_retaining := isc_rollback_retaining_stub;
419     isc_service_attach := isc_service_attach_stub;
420     isc_service_detach := isc_service_detach_stub;
421     isc_service_query := isc_service_query_stub;
422     isc_service_start := isc_service_start_stub;
423     isc_decode_sql_date := isc_decode_sql_date_stub;
424     isc_decode_sql_time := isc_decode_sql_time_stub;
425     isc_decode_timestamp := isc_decode_timestamp_stub;
426     isc_encode_sql_date := isc_encode_sql_date_stub;
427     isc_encode_sql_time := isc_encode_sql_time_stub;
428     isc_encode_timestamp := isc_encode_timestamp_stub;
429     end;
430     end;
431     end;
432    
433     procedure FreeIBLibrary;
434     begin
435     if IBLibrary <> NilHandle then
436     begin
437     FreeLibrary(IBLibrary);
438     IBLibrary := 0;
439     end;
440     end;
441    
442     function TryIBLoad: Boolean;
443     begin
444     if (IBLibrary = NilHandle) then
445     LoadIBLibrary;
446     if (IBLibrary = NilHandle) then
447     result := False
448     else
449     result := True;
450     end;
451    
452     procedure CheckIBLoaded;
453     begin
454     if not TryIBLoad then
455     IBError(ibxeInterBaseMissing, [nil]);
456     end;
457    
458 tony 37 function IsEmbeddedServer: boolean;
459     begin
460     Result := false;
461     {$IFDEF UNIX}
462     Result := Pos('libfbembed',FBLibraryName) = 1;
463     {$ENDIF}
464     {$IFDEF WINDOWS}
465     Result := CompareText(FBLibraryName,FIREBIRD_EMBEDDED) = 0
466     {$ENDIF}
467     end;
468 tony 33
469     function isc_rollback_retaining_stub(status_vector : PISC_STATUS;
470     tran_handle : PISC_TR_HANDLE):
471     ISC_STATUS; {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
472     begin
473     Result := 0;
474     IBError(ibxeIB60feature, ['isc_rollback_retaining']); {do not localize}
475     end;
476    
477     function isc_service_attach_stub(status_vector : PISC_STATUS;
478     isc_arg2 : UShort;
479     isc_arg3 : PChar;
480     service_handle : PISC_SVC_HANDLE;
481     isc_arg5 : UShort;
482     isc_arg6 : PChar):
483     ISC_STATUS; {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
484     begin
485     Result := 0;
486     IBError(ibxeIB60feature, ['isc_service_attach']); {do not localize}
487     end;
488    
489     function isc_service_detach_stub(status_vector : PISC_STATUS;
490     service_handle : PISC_SVC_HANDLE):
491     ISC_STATUS; {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
492     begin
493     Result := 0;
494     IBError(ibxeIB60feature, ['isc_service_detach']); {do not localize}
495     end;
496    
497     function isc_service_query_stub(status_vector : PISC_STATUS;
498     service_handle : PISC_SVC_HANDLE;
499     recv_handle : PISC_SVC_HANDLE;
500     isc_arg4 : UShort;
501     isc_arg5 : PChar;
502     isc_arg6 : UShort;
503     isc_arg7 : PChar;
504     isc_arg8 : UShort;
505     isc_arg9 : PChar):
506     ISC_STATUS; {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
507     begin
508     Result := 0;
509     IBError(ibxeIB60feature, ['isc_service_query']); {do not localize}
510     end;
511    
512     function isc_service_start_stub(status_vector : PISC_STATUS;
513     service_handle : PISC_SVC_HANDLE;
514     recv_handle : PISC_SVC_HANDLE;
515     isc_arg4 : UShort;
516     isc_arg5 : PChar):
517     ISC_STATUS; {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
518     begin
519     Result := 0;
520     IBError(ibxeIB60feature, ['isc_service_start']); {do not localize}
521     end;
522    
523     procedure isc_encode_sql_date_stub(tm_date : PCTimeStructure;
524     ib_date : PISC_DATE);
525     {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
526     begin
527     IBError(ibxeIB60feature, ['isc_encode_sql_date']); {do not localize}
528     end;
529    
530     procedure isc_encode_sql_time_stub(tm_date : PCTimeStructure;
531     ib_time : PISC_TIME);
532     {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
533     begin
534     IBError(ibxeIB60feature, ['isc_encode_sql_time']); {do not localize}
535     end;
536    
537     procedure isc_encode_timestamp_stub(tm_date : PCTimeStructure;
538     ib_timestamp : PISC_TIMESTAMP);
539     {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
540     begin
541     IBError(ibxeIB60feature, ['isc_encode_sql_timestamp']); {do not localize}
542     end;
543    
544     procedure isc_decode_sql_date_stub(ib_date : PISC_DATE;
545     tm_date : PCTimeStructure);
546     {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
547     begin
548     IBError(ibxeIB60feature, ['isc_decode_sql_date']); {do not localize}
549     end;
550    
551     procedure isc_decode_sql_time_stub(ib_time : PISC_TIME;
552     tm_date : PCTimeStructure);
553     {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
554     begin
555     IBError(ibxeIB60feature, ['isc_decode_sql_time']); {do not localize}
556     end;
557    
558     procedure isc_decode_timestamp_stub(ib_timestamp : PISC_TIMESTAMP;
559     tm_date : PCTimeStructure);
560     {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
561     begin
562     IBError(ibxeIB60feature, ['isc_decode_timestamp']); {do not localize}
563     end;
564     initialization
565    
566     finalization
567     FreeIBLibrary;
568     end.