123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- {
- Contains the Interbase/Firebird-functions calls
- In this stage only the calls needed for IBConnection are implemented
- Other calls could be simply implemented, using copy-paste from ibase60
-
- Call InitialiseIbase60 before using any of the calls, and call ReleaseIbase60
- when finished.
- }
- unit ibase60dyn;
- {$mode objfpc}{$H+}
- {$MACRO on}
- interface
- uses
- dynlibs,sysutils;
- {$IFDEF Unix}
- {$LINKLIB c}
- {$LINKLIB crypt}
- {$DEFINE gdsdecl:=cdecl}
- const
- gdslib = 'libgds.so';
- fbclib = 'libfbclient.so';
- {$ENDIF}
- {$IFDEF Win32}
- {$DEFINE gdsdecl:=stdcall}
- const
- gdslib = 'gds32.dll';
- fbclib = 'fbclient.dll';
- {$ENDIF}
- {$i ibase60types.inc}
- var isc_attach_database : function (_para1:PISC_STATUS; _para2:smallint; _para3:Pchar; _para4:Pisc_db_handle; _para5:smallint;
- _para6:Pchar):ISC_STATUS; gdsdecl;
- isc_interprete : function (_para1:Pchar; _para2:PPISC_STATUS):ISC_STATUS; gdsdecl;
- isc_commit_transaction : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle):ISC_STATUS; gdsdecl;
- isc_rollback_transaction : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle):ISC_STATUS; gdsdecl;
- isc_start_transaction : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle; _para3:smallint; args:array of const):ISC_STATUS; cdecl;
- isc_commit_retaining : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle):ISC_STATUS; gdsdecl;
- isc_rollback_retaining : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle):ISC_STATUS; gdsdecl;
- isc_detach_database : function (_para1:PISC_STATUS; _para2:Pisc_db_handle):ISC_STATUS; gdsdecl;
- isc_vax_integer : function (_para1:Pchar; _para2:smallint):ISC_LONG; gdsdecl;
- isc_dsql_free_statement : function (_para1:PISC_STATUS; _para2:Pisc_stmt_handle; _para3:word):ISC_STATUS; gdsdecl;
- isc_dsql_allocate_statement : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:Pisc_stmt_handle):ISC_STATUS; gdsdecl;
- isc_dsql_prepare : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle; _para3:Pisc_stmt_handle; _para4:word; _para5:Pchar;
- _para6:word; _para7:PXSQLDA):ISC_STATUS; gdsdecl;
- isc_dsql_describe : function (_para1:PISC_STATUS; _para2:Pisc_stmt_handle; _para3:word; _para4:PXSQLDA):ISC_STATUS; gdsdecl;
- isc_dsql_execute : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle; _para3:Pisc_stmt_handle; _para4:word; _para5:PXSQLDA):ISC_STATUS; gdsdecl;
- isc_dsql_fetch : function (_para1:PISC_STATUS; _para2:Pisc_stmt_handle; _para3:word; _para4:PXSQLDA):ISC_STATUS; gdsdecl;
- isc_decode_date : procedure (_para1:PISC_QUAD; _para2:pointer); gdsdecl;
- isc_decode_sql_date : procedure (_para1:PISC_DATE; _para2:pointer); gdsdecl;
- isc_decode_sql_time : procedure (_para1:PISC_TIME; _para2:pointer); gdsdecl;
- isc_decode_timestamp : procedure (_para1:PISC_TIMESTAMP; _para2:pointer); gdsdecl;
- isc_database_info : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:smallint; _para4:Pchar; _para5:smallint;
- _para6:Pchar):ISC_STATUS; gdsdecl;
- Procedure InitialiseIBase60;
- Procedure ReleaseIBase60;
- var IBaseLibraryHandle : TLibHandle;
- implementation
- var RefCount : integer;
- Procedure InitialiseIBase60;
- begin
- inc(RefCount);
- if RefCount = 1 then
- begin
- IBaseLibraryHandle := loadlibrary(fbclib);
- if IBaseLibraryHandle = nilhandle then
- begin
- IBaseLibraryHandle := loadlibrary(gdslib);
- if loadlibrary(gdslib) = nilhandle then
- begin
- RefCount := 0;
- Raise EInOutError.Create('Can not load Firebird or Interbase client. Is it installed? ('+gdslib+' or '+fbclib+')');
- end;
- end;
- pointer(isc_attach_database) := GetProcedureAddress(IBaseLibraryHandle,'isc_attach_database');
- pointer(isc_interprete) := GetProcedureAddress(IBaseLibraryHandle,'isc_interprete');
- pointer(isc_commit_transaction) := GetProcedureAddress(IBaseLibraryHandle,'isc_commit_transaction');
- pointer(isc_rollback_transaction) := GetProcedureAddress(IBaseLibraryHandle,'isc_rollback_transaction');
- pointer(isc_start_transaction) := GetProcedureAddress(IBaseLibraryHandle,'isc_start_transaction');
- pointer(isc_commit_retaining) := GetProcedureAddress(IBaseLibraryHandle,'isc_commit_retaining');
- pointer(isc_rollback_retaining) := GetProcedureAddress(IBaseLibraryHandle,'isc_rollback_retaining');
- pointer(isc_detach_database) := GetProcedureAddress(IBaseLibraryHandle,'isc_detach_database');
- pointer(isc_vax_integer) := GetProcedureAddress(IBaseLibraryHandle,'isc_vax_integer');
- pointer(isc_dsql_free_statement) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_free_statement');
- pointer(isc_dsql_allocate_statement) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_allocate_statement');
- pointer(isc_dsql_prepare) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_prepare');
- pointer(isc_dsql_describe) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_describe');
- pointer(isc_dsql_execute) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_execute');
- pointer(isc_dsql_fetch) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_fetch');
- pointer(isc_decode_date) := GetProcedureAddress(IBaseLibraryHandle,'isc_decode_date');
- pointer(isc_decode_sql_date) := GetProcedureAddress(IBaseLibraryHandle,'isc_decode_sql_date');
- pointer(isc_decode_sql_time) := GetProcedureAddress(IBaseLibraryHandle,'isc_decode_sql_time');
- pointer(isc_decode_timestamp) := GetProcedureAddress(IBaseLibraryHandle,'isc_decode_timestamp');
- pointer(isc_database_info) := GetProcedureAddress(IBaseLibraryHandle,'isc_database_info');
- end;
- end;
- Procedure ReleaseIBase60;
- begin
- if RefCount > 0 then dec(RefCount);
- if RefCount = 0 then
- begin
- if not UnloadLibrary(IBaseLibraryHandle) then inc(RefCount);
- end;
- end;
- // This function is also defined in ibase60!
- function XSQLDA_LENGTH(n: Integer): Integer;
- begin
- Result := SizeOf(XSQLDA) + (n - 1) * SizeOf(XSQLVAR);
- end;
- end.
|