ibase60dyn.pp 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. {
  2. Contains the Interbase/Firebird-functions calls
  3. In this stage only the calls needed for IBConnection are implemented
  4. Other calls could be simply implemented, using copy-paste from ibase60
  5. Call InitialiseIbase60 before using any of the calls, and call ReleaseIbase60
  6. when finished.
  7. }
  8. unit ibase60dyn;
  9. {$mode objfpc}{$H+}
  10. {$MACRO on}
  11. interface
  12. uses
  13. dynlibs,sysutils;
  14. {$IFDEF Unix}
  15. {$LINKLIB c}
  16. {$LINKLIB crypt}
  17. {$DEFINE gdsdecl:=cdecl}
  18. const
  19. gdslib = 'libgds.so';
  20. fbclib = 'libfbclient.so';
  21. {$ENDIF}
  22. {$IFDEF Win32}
  23. {$DEFINE gdsdecl:=stdcall}
  24. const
  25. gdslib = 'gds32.dll';
  26. fbclib = 'fbclient.dll';
  27. {$ENDIF}
  28. {$i ibase60types.inc}
  29. var isc_attach_database : function (_para1:PISC_STATUS; _para2:smallint; _para3:Pchar; _para4:Pisc_db_handle; _para5:smallint;
  30. _para6:Pchar):ISC_STATUS; gdsdecl;
  31. isc_interprete : function (_para1:Pchar; _para2:PPISC_STATUS):ISC_STATUS; gdsdecl;
  32. isc_commit_transaction : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle):ISC_STATUS; gdsdecl;
  33. isc_rollback_transaction : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle):ISC_STATUS; gdsdecl;
  34. isc_start_transaction : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle; _para3:smallint; args:array of const):ISC_STATUS; cdecl;
  35. isc_commit_retaining : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle):ISC_STATUS; gdsdecl;
  36. isc_rollback_retaining : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle):ISC_STATUS; gdsdecl;
  37. isc_detach_database : function (_para1:PISC_STATUS; _para2:Pisc_db_handle):ISC_STATUS; gdsdecl;
  38. isc_vax_integer : function (_para1:Pchar; _para2:smallint):ISC_LONG; gdsdecl;
  39. isc_dsql_free_statement : function (_para1:PISC_STATUS; _para2:Pisc_stmt_handle; _para3:word):ISC_STATUS; gdsdecl;
  40. isc_dsql_allocate_statement : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:Pisc_stmt_handle):ISC_STATUS; gdsdecl;
  41. isc_dsql_prepare : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle; _para3:Pisc_stmt_handle; _para4:word; _para5:Pchar;
  42. _para6:word; _para7:PXSQLDA):ISC_STATUS; gdsdecl;
  43. isc_dsql_describe : function (_para1:PISC_STATUS; _para2:Pisc_stmt_handle; _para3:word; _para4:PXSQLDA):ISC_STATUS; gdsdecl;
  44. isc_dsql_execute : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle; _para3:Pisc_stmt_handle; _para4:word; _para5:PXSQLDA):ISC_STATUS; gdsdecl;
  45. isc_dsql_fetch : function (_para1:PISC_STATUS; _para2:Pisc_stmt_handle; _para3:word; _para4:PXSQLDA):ISC_STATUS; gdsdecl;
  46. isc_decode_date : procedure (_para1:PISC_QUAD; _para2:pointer); gdsdecl;
  47. isc_decode_sql_date : procedure (_para1:PISC_DATE; _para2:pointer); gdsdecl;
  48. isc_decode_sql_time : procedure (_para1:PISC_TIME; _para2:pointer); gdsdecl;
  49. isc_decode_timestamp : procedure (_para1:PISC_TIMESTAMP; _para2:pointer); gdsdecl;
  50. isc_database_info : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:smallint; _para4:Pchar; _para5:smallint;
  51. _para6:Pchar):ISC_STATUS; gdsdecl;
  52. Procedure InitialiseIBase60;
  53. Procedure ReleaseIBase60;
  54. var IBaseLibraryHandle : TLibHandle;
  55. implementation
  56. var RefCount : integer;
  57. Procedure InitialiseIBase60;
  58. begin
  59. inc(RefCount);
  60. if RefCount = 1 then
  61. begin
  62. IBaseLibraryHandle := loadlibrary(fbclib);
  63. if IBaseLibraryHandle = nilhandle then
  64. begin
  65. IBaseLibraryHandle := loadlibrary(gdslib);
  66. if loadlibrary(gdslib) = nilhandle then
  67. begin
  68. RefCount := 0;
  69. Raise EInOutError.Create('Can not load Firebird or Interbase client. Is it installed? ('+gdslib+' or '+fbclib+')');
  70. end;
  71. end;
  72. pointer(isc_attach_database) := GetProcedureAddress(IBaseLibraryHandle,'isc_attach_database');
  73. pointer(isc_interprete) := GetProcedureAddress(IBaseLibraryHandle,'isc_interprete');
  74. pointer(isc_commit_transaction) := GetProcedureAddress(IBaseLibraryHandle,'isc_commit_transaction');
  75. pointer(isc_rollback_transaction) := GetProcedureAddress(IBaseLibraryHandle,'isc_rollback_transaction');
  76. pointer(isc_start_transaction) := GetProcedureAddress(IBaseLibraryHandle,'isc_start_transaction');
  77. pointer(isc_commit_retaining) := GetProcedureAddress(IBaseLibraryHandle,'isc_commit_retaining');
  78. pointer(isc_rollback_retaining) := GetProcedureAddress(IBaseLibraryHandle,'isc_rollback_retaining');
  79. pointer(isc_detach_database) := GetProcedureAddress(IBaseLibraryHandle,'isc_detach_database');
  80. pointer(isc_vax_integer) := GetProcedureAddress(IBaseLibraryHandle,'isc_vax_integer');
  81. pointer(isc_dsql_free_statement) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_free_statement');
  82. pointer(isc_dsql_allocate_statement) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_allocate_statement');
  83. pointer(isc_dsql_prepare) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_prepare');
  84. pointer(isc_dsql_describe) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_describe');
  85. pointer(isc_dsql_execute) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_execute');
  86. pointer(isc_dsql_fetch) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_fetch');
  87. pointer(isc_decode_date) := GetProcedureAddress(IBaseLibraryHandle,'isc_decode_date');
  88. pointer(isc_decode_sql_date) := GetProcedureAddress(IBaseLibraryHandle,'isc_decode_sql_date');
  89. pointer(isc_decode_sql_time) := GetProcedureAddress(IBaseLibraryHandle,'isc_decode_sql_time');
  90. pointer(isc_decode_timestamp) := GetProcedureAddress(IBaseLibraryHandle,'isc_decode_timestamp');
  91. pointer(isc_database_info) := GetProcedureAddress(IBaseLibraryHandle,'isc_database_info');
  92. end;
  93. end;
  94. Procedure ReleaseIBase60;
  95. begin
  96. if RefCount > 0 then dec(RefCount);
  97. if RefCount = 0 then
  98. begin
  99. if not UnloadLibrary(IBaseLibraryHandle) then inc(RefCount);
  100. end;
  101. end;
  102. // This function is also defined in ibase60!
  103. function XSQLDA_LENGTH(n: Integer): Integer;
  104. begin
  105. Result := SizeOf(XSQLDA) + (n - 1) * SizeOf(XSQLVAR);
  106. end;
  107. end.