Sfoglia il codice sorgente

* unmerged table based initialization of libraries.

git-svn-id: trunk@16941 -
marco 14 anni fa
parent
commit
88e22be01a

+ 408 - 359
packages/ibase/src/ibase60.inc

@@ -1,11 +1,20 @@
+{
+}
+
 {$MODE objfpc}
 {$MACRO on}
-{$PACKRECORDS C}
 
 interface
 
-uses
-  Dynlibs, ctypes;
+{$IFDEF LinkDynamically}
+uses Dynlibs, sysutils,ctypes;
+
+Var
+  UseEmbeddedFirebird : Boolean = False;
+
+{$ELSE}
+uses Dynlibs,ctypes;
+{$ENDIF}
 
 {$IFDEF Unix}
   {$DEFINE extdecl:=cdecl}
@@ -22,41 +31,58 @@ uses
     fbembedlib = 'fbembed.dll';
 {$ENDIF}
 
-const
-   ISC_TRUE      = 1;
-   ISC_FALSE     = 0;
-   ISC__TRUE     = ISC_TRUE;
-   ISC__FALSE    = ISC_FALSE;
+type
+  {  Unsigned types }
+
+  UChar                = Byte;
+  UShort               = Word;
+  UInt                 = DWord;
+  ULong                = DWord;
 
-Type
-   ISC_SCHAR     = char;
-   ISC_UCHAR     = cuchar;
-   ISC_SHORT     = cshort;
-   ISC_USHORT    = cushort;
-   ISC_STATUS    = ptrint;   // bug 17360
-   ISC_INT64     = clonglong;
-   ISC_UINT64    = culonglong;
-{$IFDEF CPU64}
-   ISC_LONG      = cint;
-   ISC_ULONG     = cuint;
-{$ELSE}
-   ISC_LONG      = clong;
-   ISC_ULONG     = culong;
-{$ENDIF}
+  { Signed types }
+
+  Int                  = LongInt;
+  Long                 = LongInt;
+  Short                = SmallInt;
+  Float                = Single;
 
-   PISC_SCHAR    = pchar;
-   PISC_UCHAR    = ^ISC_UCHAR;
-   PISC_SHORT    = ^ISC_SHORT;
-   PISC_USHORT   = ^ISC_USHORT;
-   PISC_STATUS   = ^ISC_STATUS;
-   PPISC_STATUS  = ^PISC_STATUS;
-   PISC_INT64    = ^ISC_INT64;
-   PISC_UINT64   = ^ISC_UINT64;
-   PISC_LONG     = ^ISC_LONG;
+  { Pointers to basic types }
 
-const
-   DSQL_close    = 1;
-   DSQL_drop     = 2;
+  PInt                 = ^Int;
+  PShort               = ^Short;
+  PUShort              = ^UShort;
+  PLong                = ^Long;
+  PULong               = ^ULong;
+  PFloat               = ^Float;
+  PUChar               = ^UChar;
+  PVoid                = ^Pointer;
+
+{$PACKRECORDS C}
+
+  const
+     ISC_TRUE = 1;
+     ISC_FALSE = 0;
+  const
+     ISC__TRUE = ISC_TRUE;
+     ISC__FALSE = ISC_FALSE;
+
+Type
+   ISC_USHORT    = word;
+   ISC_STATUS    = clong;
+   ISC_INT64     = int64;
+   ISC_UINT64    = qword;
+   ISC_LONG      = Longint;
+
+   PISC_USHORT = ^ISC_USHORT;
+   PISC_STATUS = ^ISC_STATUS;
+   PPISC_STATUS = ^PISC_STATUS;
+   PISC_INT64 = ^ISC_INT64;
+   PISC_UINT64 = ^ISC_UINT64;
+   PISC_LONG = ^ISC_LONG;
+
+  const
+     DSQL_close = 1;
+     DSQL_drop = 2;
 
   {!!MVC
     Removed all ISC_FAR, ISC_EXPORT_VARARG and ISC_EXPORT
@@ -70,8 +96,8 @@ const
 
   type
 
-     ISC_DATE = cint;
-     ISC_TIME = cuint;
+     ISC_DATE = longint;
+     ISC_TIME = dword;
      ISC_TIMESTAMP = record
           timestamp_date : ISC_DATE;
           timestamp_time : ISC_TIME;
@@ -93,57 +119,19 @@ const
   { Blob id structure                                                }
   {                                                                  }
 
-type
-  PGDS_QUAD = ^GDS_QUAD;
-  GDS_QUAD = record
-    gds_quad_high : ISC_LONG;
-    gds_quad_low : ISC_LONG;
-  end;
-  TGDS_QUAD = GDS_QUAD;
+Type
 
-  ISC_QUAD = GDS_QUAD;
-  TISC_QUAD = ISC_QUAD;
-  PISC_QUAD = ^ISC_QUAD;
-
-  {                               }
-  { InterBase Handle Definitions  }
-  {                               }
-
-  type
-     isc_att_handle = pointer;
-     isc_blob_handle = pointer;
-     isc_db_handle = pointer;
-     isc_form_handle = pointer;
-     isc_req_handle = pointer;
-     isc_stmt_handle = pointer;
-     isc_svc_handle = pointer;
-     isc_tr_handle = pointer;
-     isc_win_handle = pointer;
-     isc_callback = procedure ;extdecl;
-     isc_resv_handle = ISC_LONG;
-     tisc_att_handle = isc_att_handle;
-     tisc_blob_handle = isc_blob_handle;
-     tisc_db_handle = isc_db_handle;
-     tisc_form_handle = isc_form_handle;
-     tisc_req_handle = isc_req_handle;
-     tisc_stmt_handle = isc_stmt_handle;
-     tisc_svc_handle = isc_svc_handle;
-     tisc_tr_handle = isc_tr_handle;
-     tisc_win_handle = isc_win_handle;
-     tisc_callback = isc_callback;
-     tisc_resv_handle = isc_resv_handle;
-     pisc_att_handle  =^isc_att_handle ;
-     pisc_blob_handle  =^isc_blob_handle ;
-     pisc_db_handle  =^isc_db_handle ;
-     pisc_form_handle  =^isc_form_handle ;
-     pisc_req_handle  =^isc_req_handle ;
-     pisc_stmt_handle  =^isc_stmt_handle ;
-     pisc_svc_handle  =^isc_svc_handle ;
-     pisc_tr_handle  =^isc_tr_handle ;
-     pisc_win_handle  =^isc_win_handle ;
-     pisc_callback  = ^isc_callback;
-     pisc_resv_handle  =^isc_resv_handle ;
+   GDS_QUAD = record
+      gds_quad_high : ISC_LONG;
+      gds_quad_low : ISC_LONG;
+   end;
+   TGDS_QUAD = GDS_QUAD;
+   PGDS_QUAD = ^GDS_QUAD;
 
+Type
+     ISC_QUAD = GDS_QUAD;
+     TISC_QUAD = ISC_QUAD;
+     PISC_QUAD = ^ISC_QUAD;
 
 { !!field redefinitions !!
      isc_quad_high = gds_quad_high;
@@ -153,31 +141,31 @@ type
 type
 
      ISC_ARRAY_BOUND = record
-          array_bound_lower : cshort;
-          array_bound_upper : cshort;
+          array_bound_lower : smallint;
+          array_bound_upper : smallint;
        end;
      TISC_ARRAY_BOUND = ISC_ARRAY_BOUND;
      PISC_ARRAY_BOUND = ^ISC_ARRAY_BOUND;
 
      ISC_ARRAY_DESC = record
-          array_desc_dtype : ISC_UCHAR;
-          array_desc_scale : ISC_SCHAR;
-          array_desc_length : cushort;
-          array_desc_field_name : array[0..31] of ISC_SCHAR;
-          array_desc_relation_name : array[0..31] of ISC_SCHAR;
-          array_desc_dimensions : cushort;
-          array_desc_flags : cushort;
+          array_desc_dtype : byte;
+          array_desc_scale : char;
+          array_desc_length : word;
+          array_desc_field_name : array[0..31] of char;
+          array_desc_relation_name : array[0..31] of char;
+          array_desc_dimensions : smallint;
+          array_desc_flags : smallint;
           array_desc_bounds : array[0..15] of ISC_ARRAY_BOUND;
        end;
      TISC_ARRAY_DESC = ISC_ARRAY_DESC;
      PISC_ARRAY_DESC = ^ISC_ARRAY_DESC;
 
      ISC_BLOB_DESC = record
-          blob_desc_subtype : cushort;
-          blob_desc_charset : cushort;
-          blob_desc_segment_size : cushort;
-          blob_desc_field_name : array[0..31] of ISC_UCHAR;
-          blob_desc_relation_name : array[0..31] of ISC_UCHAR;
+          blob_desc_subtype : smallint;
+          blob_desc_charset : smallint;
+          blob_desc_segment_size : smallint;
+          blob_desc_field_name : array[0..31] of byte;
+          blob_desc_relation_name : array[0..31] of byte;
        end;
      TISC_BLOB_DESC = ISC_BLOB_DESC;
      PISC_BLOB_DESC = ^ISC_BLOB_DESC ;
@@ -205,24 +193,24 @@ type
   { Total length of blob  }
   { Address of status vector  }
   { Application specific data  }
-  TCTLSourceFunction  = function : ISC_STATUS;
+  TCTLSourceFunction  = function : isc_long;
 
      PISC_BLOB_CTL = ^ISC_BLOB_CTL ;
      ISC_BLOB_CTL = record
           ctl_source : TCTLSourceFunction;     //  was ISC_STATUS ( *ctl_source)();
           ctl_source_handle : pisc_blob_ctl  ; // was struct isc_blob_ctl  * ctl_source_handle;
-          ctl_to_sub_type : cshort;
-          ctl_from_sub_type : cshort;
-          ctl_buffer_length : cushort;
-          ctl_segment_length : cushort;
-          ctl_bpb_length : cushort;
-          ctl_bpb : PISC_SCHAR;
-          ctl_buffer : PISC_UCHAR;
+          ctl_to_sub_type : smallint;
+          ctl_from_sub_type : smallint;
+          ctl_buffer_length : word;
+          ctl_segment_length : word;
+          ctl_bpb_length : word;
+          ctl_bpb : Pchar;
+          ctl_buffer : Pbyte;
           ctl_max_segment : ISC_LONG;
           ctl_number_segments : ISC_LONG;
           ctl_total_length : ISC_LONG;
           ctl_status : PISC_STATUS;
-          ctl_data : array[0..7] of clong;
+          ctl_data : array[0..7] of longint;
        end;
      TISC_BLOB_CTL = ISC_BLOB_CTL;
 
@@ -237,12 +225,12 @@ type
   { (mode) ? OUTPUT : INPUT  }
 
      BSTREAM = record
-          bstr_blob : isc_blob_handle;
-          bstr_buffer : PISC_SCHAR;
-          bstr_ptr : PISC_SCHAR;
-          bstr_length : cshort;
-          bstr_cnt : cshort;
-          bstr_mode : cchar;
+          bstr_blob : pointer;
+          bstr_buffer : Pchar;
+          bstr_ptr : Pchar;
+          bstr_length : smallint;
+          bstr_cnt : smallint;
+          bstr_mode : char;
        end;
      TBSTREAM = BSTREAM;
      PBstream = ^BSTREAM;
@@ -280,20 +268,20 @@ type
   { NULL  }
 
      XSQLVAR = record
-          sqltype : ISC_SHORT;
-          sqlscale : ISC_SHORT;
-          sqlsubtype : ISC_SHORT;
-          sqllen : ISC_SHORT;
-          sqldata : PISC_SCHAR;
-          sqlind : PISC_SHORT;
-          sqlname_length : ISC_SHORT;
-          sqlname : array[0..31] of ISC_SCHAR;
-          relname_length : ISC_SHORT;
-          relname : array[0..31] of ISC_SCHAR;
-          ownname_length : ISC_SHORT;
-          ownname : array[0..31] of ISC_SCHAR;
-          aliasname_length : ISC_SHORT;
-          aliasname : array[0..31] of ISC_SCHAR;
+          sqltype : smallint;
+          sqlscale : smallint;
+          sqlsubtype : smallint;
+          sqllen : smallint;
+          sqldata : Pchar;
+          sqlind : Psmallint;
+          sqlname_length : smallint;
+          sqlname : array[0..31] of char;
+          relname_length : smallint;
+          relname : array[0..31] of char;
+          ownname_length : smallint;
+          ownname : array[0..31] of char;
+          aliasname_length : smallint;
+          aliasname : array[0..31] of char;
        end;
      TXSQLVAR = XSQLVAR;
      PXSQLVAR =^XSQLVAR;
@@ -305,11 +293,11 @@ type
   { first field address  }
 
      XSQLDA = record
-          version : ISC_SHORT;
-          sqldaid : array[0..7] of ISC_SCHAR;
+          version : smallint;
+          sqldaid : array[0..7] of char;
           sqldabc : ISC_LONG;
-          sqln : ISC_SHORT;
-          sqld : ISC_SHORT;
+          sqln : smallint;
+          sqld : smallint;
           sqlvar : array[0..0] of XSQLVAR;
        end;
      TXSQLDA = XSQLDA;
@@ -334,6 +322,44 @@ type
      SQL_DIALECT_V6 = 3;
   { latest IB DIALECT  }
      SQL_DIALECT_CURRENT = SQL_DIALECT_V6;
+  {                               }
+  { InterBase Handle Definitions  }
+  {                               }
+
+  type
+     isc_att_handle = pointer;
+     isc_blob_handle = pointer;
+     isc_db_handle = pointer;
+     isc_form_handle = pointer;
+     isc_req_handle = pointer;
+     isc_stmt_handle = pointer;
+     isc_svc_handle = pointer;
+     isc_tr_handle = pointer;
+     isc_win_handle = pointer;
+     isc_callback = procedure ;extdecl;
+     isc_resv_handle = ISC_LONG;
+     tisc_att_handle = isc_att_handle;
+     tisc_blob_handle = isc_blob_handle;
+     tisc_db_handle = isc_db_handle;
+     tisc_form_handle = isc_form_handle;
+     tisc_req_handle = isc_req_handle;
+     tisc_stmt_handle = isc_stmt_handle;
+     tisc_svc_handle = isc_svc_handle;
+     tisc_tr_handle = isc_tr_handle;
+     tisc_win_handle = isc_win_handle;
+     tisc_callback = isc_callback;
+     tisc_resv_handle = isc_resv_handle;
+     pisc_att_handle  =^isc_att_handle ;
+     pisc_blob_handle  =^isc_blob_handle ;
+     pisc_db_handle  =^isc_db_handle ;
+     pisc_form_handle  =^isc_form_handle ;
+     pisc_req_handle  =^isc_req_handle ;
+     pisc_stmt_handle  =^isc_stmt_handle ;
+     pisc_svc_handle  =^isc_svc_handle ;
+     pisc_tr_handle  =^isc_tr_handle ;
+     pisc_win_handle  =^isc_win_handle ;
+     pisc_callback  = ^isc_callback;
+     pisc_resv_handle  =^isc_resv_handle ;
 
 
   {                                    }
@@ -372,19 +398,19 @@ type
   type
 
      USER_SEC_DATA = record
-          sec_flags : cshort;
-          uid : cint;
-          gid : cint;
-          protocol : cint;
+          sec_flags : smallint;
+          uid : longint;
+          gid : longint;
+          protocol : longint;
           server : Pchar;
-          user_name : PISC_SCHAR;
-          password : PISC_SCHAR;
-          group_name : PISC_SCHAR;
-          first_name : PISC_SCHAR;
-          middle_name : PISC_SCHAR;
-          last_name : PISC_SCHAR;
-          dba_user_name : PISC_SCHAR;
-          dba_password : PISC_SCHAR;
+          user_name : Pchar;
+          password : Pchar;
+          group_name : Pchar;
+          first_name : Pchar;
+          middle_name : Pchar;
+          last_name : Pchar;
+          dba_user_name : Pchar;
+          dba_password : Pchar;
        end;
      TUSER_SEC_DATA = USER_SEC_DATA;
      PUSER_SEC_DATA = ^USER_SEC_DATA;
@@ -1599,7 +1625,7 @@ type
      isc_blob_dbase_ole = 23;
      isc_blob_typed_binary = 24;
 
-{$IFNDEF LOAD_DYNAMICALLY}
+{$IFNDEF LinkDynamically}
 
   {                          }
   { OSRI database functions  }
@@ -1717,7 +1743,7 @@ type
 
   function isc_event_block(_para1:PPchar; _para2:PPchar; _para3:word; args:array of const):ISC_LONG; cdecl; external gdslib;
 
-  procedure isc_event_counts(_para1: PISC_STATUS; _para2: cshort; _para3: pchar; _para4: pchar); extdecl;  external gdslib;
+  procedure isc_event_counts(_para1: PISC_STATUS; _para2: short; _para3: pchar; _para4: pchar); extdecl;  external gdslib;
 
   procedure isc_expand_dpb(_para1:PPchar; _para2:Psmallint; args:array of const); cdecl; external gdslib;
 
@@ -2196,7 +2222,7 @@ type
   function Bopen2:PBSTREAM; extdecl; external gdslib;
 {$ENDIF}
 
-{$ELSE} // LOAD_DYNAMICALLY
+{$ELSE} // LinkDynamically
 
 var
 
@@ -2250,7 +2276,7 @@ var
   isc_encode_sql_time : procedure (_para1:pointer; _para2:PISC_TIME); extdecl;
   isc_encode_timestamp : procedure (_para1:pointer; _para2:PISC_TIMESTAMP); extdecl;
   isc_event_block : function (_para1:PPchar; _para2:PPchar; _para3:word; args:array of const):ISC_LONG; cdecl;
-  isc_event_counts: procedure (_para1: PISC_STATUS; _para2: cshort; _para3: pchar; _para4: pchar); extdecl;
+  isc_event_counts: procedure (_para1: PISC_STATUS; _para2: short; _para3: pchar; _para4: pchar); extdecl;
   isc_expand_dpb : procedure (_para1:PPchar; _para2:Psmallint; args:array of const); cdecl;
   isc_modify_dpb : function (_para1:PPchar; _para2:Psmallint; _para3:word; _para4:Pchar; _para5:smallint):longint; extdecl;
   isc_free : function (_para1:Pchar):ISC_LONG; extdecl;
@@ -2404,240 +2430,263 @@ var
   isc_suspend_window : function (_para1:PISC_STATUS; _para2:Pisc_win_handle):ISC_STATUS; extdecl;
 {$ENDIF}
 
-function InitializeIBase(UseEmbeddedFirebird: Boolean = False): Integer;
-function InitializeIBase(const LibraryName: String): Integer;
-function TryInitializeIBase(const LibraryName: string): Integer;
-function ReleaseIBase: Integer;
-
-var
-  IBaseLibrary: TLibHandler;
-
-function InitialiseIBase60(Const LibraryName : String) : integer; deprecated;
-function InitialiseIBase60 : integer; deprecated;
-procedure ReleaseIBase60; deprecated;
+function InitialiseIBase60(Const LibraryName : String) : integer;
+function InitialiseIBase60 : integer;
+procedure ReleaseIBase60;
 
-Var
-  UseEmbeddedFirebird: Boolean = False deprecated;
+var IBaseLibraryHandle : TLibHandle;
 
 {$ENDIF}
 
 implementation
 
-function XSQLDA_LENGTH(n: Integer): Integer;
-begin
-  Result := SizeOf(XSQLDA) + (n - 1) * SizeOf(XSQLVAR);
-end;
+{$IFDEF LinkDynamically}
 
-{$IFDEF LOAD_DYNAMICALLY}
-const
-  ibsymbols: array[0..140{$IFDEF UNIX}+20{$ENDIF}] of TLibSymbol = (
-    (pvar:@isc_attach_database; name:'isc_attach_database'; weak:false),
-    (pvar:@isc_array_gen_sdl; name:'isc_array_gen_sdl'; weak:false),
-    (pvar:@isc_array_get_slice; name:'isc_array_get_slice'; weak:false),
-    (pvar:@isc_array_lookup_bounds; name:'isc_array_lookup_bounds'; weak:false),
-    (pvar:@isc_array_lookup_desc; name:'isc_array_lookup_desc'; weak:false),
-    (pvar:@isc_array_set_desc; name:'isc_array_set_desc'; weak:false),
-    (pvar:@isc_array_put_slice; name:'isc_array_put_slice'; weak:false),
-    (pvar:@isc_blob_default_desc; name:'isc_blob_default_desc'; weak:false),
-    (pvar:@isc_blob_gen_bpb; name:'isc_blob_gen_bpb'; weak:false),
-    (pvar:@isc_blob_info; name:'isc_blob_info'; weak:false),
-    (pvar:@isc_blob_lookup_desc; name:'isc_blob_lookup_desc'; weak:false),
-    (pvar:@isc_blob_set_desc; name:'isc_blob_set_desc'; weak:false),
-    (pvar:@isc_cancel_blob; name:'isc_cancel_blob'; weak:false),
-    (pvar:@isc_cancel_events; name:'isc_cancel_events'; weak:false),
-    (pvar:@isc_close_blob; name:'isc_close_blob'; weak:false),
-    (pvar:@isc_commit_retaining; name:'isc_commit_retaining'; weak:false),
-    (pvar:@isc_commit_transaction; name:'isc_commit_transaction'; weak:false),
-    (pvar:@isc_create_blob; name:'isc_create_blob'; weak:false),
-    (pvar:@isc_create_blob2; name:'isc_create_blob2'; weak:false),
-    (pvar:@isc_create_database; name:'isc_create_database'; weak:false),
-    (pvar:@isc_database_info; name:'isc_database_info'; weak:false),
-    (pvar:@isc_decode_date; name:'isc_decode_date'; weak:false),
-    (pvar:@isc_decode_sql_date; name:'isc_decode_sql_date'; weak:false),
-    (pvar:@isc_decode_sql_time; name:'isc_decode_sql_time'; weak:false),
-    (pvar:@isc_decode_timestamp; name:'isc_decode_timestamp'; weak:false),
-    (pvar:@isc_detach_database; name:'isc_detach_database'; weak:false),
-    (pvar:@isc_drop_database; name:'isc_drop_database'; weak:false),
-    (pvar:@isc_dsql_allocate_statement; name:'isc_dsql_allocate_statement'; weak:false),
-    (pvar:@isc_dsql_alloc_statement2; name:'isc_dsql_alloc_statement2'; weak:false),
-    (pvar:@isc_dsql_describe; name:'isc_dsql_describe'; weak:false),
-    (pvar:@isc_dsql_describe_bind; name:'isc_dsql_describe_bind'; weak:false),
-    (pvar:@isc_dsql_exec_immed2; name:'isc_dsql_exec_immed2'; weak:false),
-    (pvar:@isc_dsql_execute; name:'isc_dsql_execute'; weak:false),
-    (pvar:@isc_dsql_execute2; name:'isc_dsql_execute2'; weak:false),
-    (pvar:@isc_dsql_execute_immediate; name:'isc_dsql_execute_immediate'; weak:false),
-    (pvar:@isc_dsql_fetch; name:'isc_dsql_fetch'; weak:false),
-    (pvar:@isc_dsql_finish; name:'isc_dsql_finish'; weak:false),
-    (pvar:@isc_dsql_free_statement; name:'isc_dsql_free_statement'; weak:false),
-    (pvar:@isc_dsql_insert; name:'isc_dsql_insert'; weak:false),
-    (pvar:@isc_dsql_prepare; name:'isc_dsql_prepare'; weak:false),
-    (pvar:@isc_dsql_set_cursor_name; name:'isc_dsql_set_cursor_name'; weak:false),
-    (pvar:@isc_dsql_sql_info; name:'isc_dsql_sql_info'; weak:false),
-    (pvar:@isc_encode_date; name:'isc_encode_date'; weak:false),
-    (pvar:@isc_encode_sql_date; name:'isc_encode_sql_date'; weak:false),
-    (pvar:@isc_encode_sql_time; name:'isc_encode_sql_time'; weak:false),
-    (pvar:@isc_encode_timestamp; name:'isc_encode_timestamp'; weak:false),
-    (pvar:@isc_event_block; name:'isc_event_block'; weak:false),
-    (pvar:@isc_event_counts; name:'isc_event_counts'; weak:false),
-    (pvar:@isc_expand_dpb; name:'isc_expand_dpb'; weak:false),
-    (pvar:@isc_modify_dpb; name:'isc_modify_dpb'; weak:false),
-    (pvar:@isc_free; name:'isc_free'; weak:false),
-    (pvar:@isc_get_segment; name:'isc_get_segment'; weak:false),
-    (pvar:@isc_get_slice; name:'isc_get_slice'; weak:false),
-    (pvar:@isc_interprete; name:'isc_interprete'; weak:false),
-    (pvar:@isc_open_blob; name:'isc_open_blob'; weak:false),
-    (pvar:@isc_open_blob2; name:'isc_open_blob2'; weak:false),
-    (pvar:@isc_prepare_transaction2; name:'isc_prepare_transaction2'; weak:false),
-    (pvar:@isc_print_sqlerror; name:'isc_print_sqlerror'; weak:false),
-    (pvar:@isc_print_status; name:'isc_print_status'; weak:false),
-    (pvar:@isc_put_segment; name:'isc_put_segment'; weak:false),
-    (pvar:@isc_put_slice; name:'isc_put_slice'; weak:false),
-    (pvar:@isc_que_events; name:'isc_que_events'; weak:false),
-    (pvar:@isc_rollback_retaining; name:'isc_rollback_retaining'; weak:false),
-    (pvar:@isc_rollback_transaction; name:'isc_rollback_transaction'; weak:false),
-    (pvar:@isc_start_multiple; name:'isc_start_multiple'; weak:false),
-    (pvar:@isc_start_transaction; name:'isc_start_transaction'; weak:false),
-    (pvar:@isc_sqlcode; name:'isc_sqlcode'; weak:false),
-    (pvar:@isc_sql_interprete; name:'isc_sql_interprete'; weak:false),
-    (pvar:@isc_transaction_info; name:'isc_transaction_info'; weak:false),
-    (pvar:@isc_transact_request; name:'isc_transact_request'; weak:false),
-    (pvar:@isc_vax_integer; name:'isc_vax_integer'; weak:false),
-    (pvar:@isc_portable_integer; name:'isc_portable_integer'; weak:false),
-    (pvar:@isc_add_user; name:'isc_add_user'; weak:false),
-    (pvar:@isc_delete_user; name:'isc_delete_user'; weak:false),
-    (pvar:@isc_modify_user; name:'isc_modify_user'; weak:false),
-    (pvar:@isc_compile_request; name:'isc_compile_request'; weak:false),
-    (pvar:@isc_compile_request2; name:'isc_compile_request2'; weak:false),
-    (pvar:@isc_ddl; name:'isc_ddl'; weak:false),
-    (pvar:@isc_prepare_transaction; name:'isc_prepare_transaction'; weak:false),
-    (pvar:@isc_receive; name:'isc_receive'; weak:false),
-    (pvar:@isc_reconnect_transaction; name:'isc_reconnect_transaction'; weak:false),
-    (pvar:@isc_release_request; name:'isc_release_request'; weak:false),
-    (pvar:@isc_request_info; name:'isc_request_info'; weak:false),
-    (pvar:@isc_seek_blob; name:'isc_seek_blob'; weak:false),
-    (pvar:@isc_send; name:'isc_send'; weak:false),
-    (pvar:@isc_start_and_send; name:'isc_start_and_send'; weak:false),
-    (pvar:@isc_start_request; name:'isc_start_request'; weak:false),
-    (pvar:@isc_unwind_request; name:'isc_unwind_request'; weak:false),
-    (pvar:@isc_wait_for_event; name:'isc_wait_for_event'; weak:false),
-    (pvar:@isc_close; name:'isc_close'; weak:false),
-    (pvar:@isc_declare; name:'isc_declare'; weak:false),
-    (pvar:@isc_describe; name:'isc_describe'; weak:false),
-    (pvar:@isc_describe_bind; name:'isc_describe_bind'; weak:false),
-    (pvar:@isc_execute; name:'isc_execute'; weak:false),
-    (pvar:@isc_execute_immediate; name:'isc_execute_immediate'; weak:false),
-    (pvar:@isc_fetch; name:'isc_fetch'; weak:false),
-    (pvar:@isc_open; name:'isc_open'; weak:false),
-    (pvar:@isc_prepare; name:'isc_prepare'; weak:false),
-    (pvar:@isc_dsql_execute_m; name:'isc_dsql_execute_m'; weak:false),
-    (pvar:@isc_dsql_execute2_m; name:'isc_dsql_execute2_m'; weak:false),
-    (pvar:@isc_dsql_execute_immediate_m; name:'isc_dsql_execute_immediate_m'; weak:false),
-    (pvar:@isc_dsql_exec_immed3_m; name:'isc_dsql_exec_immed3_m'; weak:false),
-    (pvar:@isc_dsql_fetch_m; name:'isc_dsql_fetch_m'; weak:false),
-    (pvar:@isc_dsql_insert_m; name:'isc_dsql_insert_m'; weak:false),
-    (pvar:@isc_dsql_prepare_m; name:'isc_dsql_prepare_m'; weak:false),
-    (pvar:@isc_dsql_release; name:'isc_dsql_release'; weak:false),
-    (pvar:@isc_embed_dsql_close; name:'isc_embed_dsql_close'; weak:false),
-    (pvar:@isc_embed_dsql_declare; name:'isc_embed_dsql_declare'; weak:false),
-    (pvar:@isc_embed_dsql_describe; name:'isc_embed_dsql_describe'; weak:false),
-    (pvar:@isc_embed_dsql_describe_bind; name:'isc_embed_dsql_describe_bind'; weak:false),
-    (pvar:@isc_embed_dsql_execute; name:'isc_embed_dsql_execute'; weak:false),
-    (pvar:@isc_embed_dsql_execute2; name:'isc_embed_dsql_execute2'; weak:false),
-    (pvar:@isc_embed_dsql_execute_immed; name:'isc_embed_dsql_execute_immed'; weak:false),
-    (pvar:@isc_embed_dsql_fetch; name:'isc_embed_dsql_fetch'; weak:false),
-    (pvar:@isc_embed_dsql_open; name:'isc_embed_dsql_open'; weak:false),
-    (pvar:@isc_embed_dsql_open2; name:'isc_embed_dsql_open2'; weak:false),
-    (pvar:@isc_embed_dsql_insert; name:'isc_embed_dsql_insert'; weak:false),
-    (pvar:@isc_embed_dsql_prepare; name:'isc_embed_dsql_prepare'; weak:false),
-    (pvar:@isc_embed_dsql_release; name:'isc_embed_dsql_release'; weak:false),
-    (pvar:@BLOB_open; name:'BLOB_open'; weak:false),
-    (pvar:@BLOB_put; name:'BLOB_put'; weak:false),
-    (pvar:@BLOB_close; name:'BLOB_close'; weak:false),
-    (pvar:@BLOB_get; name:'BLOB_get'; weak:false),
-    (pvar:@BLOB_display; name:'BLOB_display'; weak:false),
-    (pvar:@BLOB_dump; name:'BLOB_dump'; weak:false),
-    (pvar:@BLOB_edit; name:'BLOB_edit'; weak:false),
-    (pvar:@BLOB_load; name:'BLOB_load'; weak:false),
-    (pvar:@BLOB_text_dump; name:'BLOB_text_dump'; weak:false),
-    (pvar:@BLOB_text_load; name:'BLOB_text_load'; weak:false),
-    (pvar:@Bopen; name:'Bopen'; weak:false),
-{$IFDEF Unix} { weak functions, be careful! }
-    (pvar:@Bopen2; name:'Bopen2'; weak:true),
-{$ENDIF}
-    (pvar:@isc_ftof; name:'isc_ftof'; weak:false),
-    (pvar:@isc_print_blr; name:'isc_print_blr'; weak:false),
-    (pvar:@isc_set_debug; name:'isc_set_debug'; weak:false),
-    (pvar:@isc_qtoq; name:'isc_qtoq'; weak:false),
-    (pvar:@isc_vtof; name:'isc_vtof'; weak:false),
-    (pvar:@isc_vtov; name:'isc_vtov'; weak:false),
-    (pvar:@isc_version; name:'isc_version'; weak:false),
-    (pvar:@isc_service_attach; name:'isc_service_attach'; weak:false),
-    (pvar:@isc_service_detach; name:'isc_service_detach'; weak:false),
-    (pvar:@isc_service_query; name:'isc_service_query'; weak:false),
-    (pvar:@isc_service_start; name:'isc_service_start'; weak:false)
-{$IFDEF Unix} { weak functions, be careful! }
-    ,(pvar:@isc_reset_fpe; name:'isc_reset_fpe'; weak:true),
-    (pvar:@isc_compile_map; name:'isc_compile_map'; weak:true),
-    (pvar:@isc_compile_menu; name:'isc_compile_menu'; weak:true),
-    (pvar:@isc_compile_sub_map; name:'isc_compile_sub_map'; weak:true),
-    (pvar:@isc_create_window; name:'isc_create_window'; weak:true),
-    (pvar:@isc_delete_window; name:'isc_delete_window'; weak:true),
-    (pvar:@isc_drive_form; name:'isc_drive_form'; weak:true),
-    (pvar:@isc_drive_menu; name:'isc_drive_menu'; weak:true),
-    (pvar:@isc_form_delete; name:'isc_form_delete'; weak:true),
-    (pvar:@isc_form_fetch; name:'isc_form_fetch'; weak:true),
-    (pvar:@isc_form_insert; name:'isc_form_insert'; weak:true),
-    (pvar:@isc_get_entree; name:'isc_get_entree'; weak:true),
-    (pvar:@isc_initialize_menu; name:'isc_initialize_menu'; weak:true),
-    (pvar:@isc_menu; name:'isc_menu'; weak:true),
-    (pvar:@isc_load_form; name:'isc_load_form'; weak:true),
-    (pvar:@isc_pop_window; name:'isc_pop_window'; weak:true),
-    (pvar:@isc_put_entree; name:'isc_put_entree'; weak:true),
-    (pvar:@isc_reset_form; name:'isc_reset_form'; weak:true),
-    (pvar:@isc_suspend_window; name:'isc_suspend_window'; weak:true)
-{$ENDIF}
-  );
+ResourceString
+  SErrEmbeddedFailed = 'Can not load embedded Firebird client "%s". Check your installation.';
+  SErrDefaultsFailed = 'Can not load default Firebird clients ("%s" or "%s"). Check your installation.';
+  SErrLoadFailed     = 'Can not load Firebird client library "%s". Check your installation.';
+  SErrAlreadyLoaded  = 'Firebird interface already initialized from library %s.';
+  
+var 
+  RefCount : integer;
+  LoadedLibrary : String;
 
-function InitializeIBase(UseEmbeddedFirebird: Boolean): Integer;
-begin
-  if UseEmbeddedFirebird then
-    Result := InitializeLibrary(IBaseLibrary, fbembedlib)
-  else
-    Result := InitializeLibrary(IBaseLibrary);
-end;
+Function TryInitialiseIBase60(Const LibraryName : String) : integer;
 
-function InitializeIBase(const LibraryName: String): Integer;
 begin
-  Result := InitializeLibrary(IBaseLibrary, LibraryName);
+  Result := 0;
+  if (RefCount=0) then
+    begin
+    IBaseLibraryHandle:=LoadLibrary(LibraryName);
+    if (IBaseLibraryHandle=nilhandle) then
+      Exit;
+    inc(RefCount);
+    LoadedLibrary:=LibraryName;
+    pointer(isc_attach_database) := GetProcedureAddress(IBaseLibraryHandle,'isc_attach_database');
+    pointer(isc_array_gen_sdl) := GetProcedureAddress(IBaseLibraryHandle,'isc_array_gen_sdl');
+    pointer(isc_array_get_slice) := GetProcedureAddress(IBaseLibraryHandle,'isc_array_get_slice');
+    pointer(isc_array_lookup_bounds) := GetProcedureAddress(IBaseLibraryHandle,'isc_array_lookup_bounds');
+    pointer(isc_array_lookup_desc) := GetProcedureAddress(IBaseLibraryHandle,'isc_array_lookup_desc');
+    pointer(isc_array_set_desc) := GetProcedureAddress(IBaseLibraryHandle,'isc_array_set_desc');
+    pointer(isc_array_put_slice) := GetProcedureAddress(IBaseLibraryHandle,'isc_array_put_slice');
+    pointer(isc_blob_default_desc) := GetProcedureAddress(IBaseLibraryHandle,'isc_blob_default_desc');
+    pointer(isc_blob_gen_bpb) := GetProcedureAddress(IBaseLibraryHandle,'isc_blob_gen_bpb');
+    pointer(isc_blob_info) := GetProcedureAddress(IBaseLibraryHandle,'isc_blob_info');
+    pointer(isc_blob_lookup_desc) := GetProcedureAddress(IBaseLibraryHandle,'isc_blob_lookup_desc');
+    pointer(isc_blob_set_desc) := GetProcedureAddress(IBaseLibraryHandle,'isc_blob_set_desc');
+    pointer(isc_cancel_blob) := GetProcedureAddress(IBaseLibraryHandle,'isc_cancel_blob');
+    pointer(isc_cancel_events) := GetProcedureAddress(IBaseLibraryHandle,'isc_cancel_events');
+    pointer(isc_close_blob) := GetProcedureAddress(IBaseLibraryHandle,'isc_close_blob');
+    pointer(isc_commit_retaining) := GetProcedureAddress(IBaseLibraryHandle,'isc_commit_retaining');
+    pointer(isc_commit_transaction) := GetProcedureAddress(IBaseLibraryHandle,'isc_commit_transaction');
+    pointer(isc_create_blob) := GetProcedureAddress(IBaseLibraryHandle,'isc_create_blob');
+    pointer(isc_create_blob2) := GetProcedureAddress(IBaseLibraryHandle,'isc_create_blob2');
+    pointer(isc_create_database) := GetProcedureAddress(IBaseLibraryHandle,'isc_create_database');
+    pointer(isc_database_info) := GetProcedureAddress(IBaseLibraryHandle,'isc_database_info');
+    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_detach_database) := GetProcedureAddress(IBaseLibraryHandle,'isc_detach_database');
+    pointer(isc_drop_database) := GetProcedureAddress(IBaseLibraryHandle,'isc_drop_database');
+    pointer(isc_dsql_allocate_statement) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_allocate_statement');
+    pointer(isc_dsql_alloc_statement2) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_alloc_statement2');
+    pointer(isc_dsql_describe) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_describe');
+    pointer(isc_dsql_describe_bind) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_describe_bind');
+    pointer(isc_dsql_exec_immed2) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_exec_immed2');
+    pointer(isc_dsql_execute) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_execute');
+    pointer(isc_dsql_execute2) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_execute2');
+    pointer(isc_dsql_execute_immediate) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_execute_immediate');
+    pointer(isc_dsql_fetch) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_fetch');
+    pointer(isc_dsql_finish) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_finish');
+    pointer(isc_dsql_free_statement) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_free_statement');
+    pointer(isc_dsql_insert) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_insert');
+    pointer(isc_dsql_prepare) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_prepare');
+    pointer(isc_dsql_set_cursor_name) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_set_cursor_name');
+    pointer(isc_dsql_sql_info) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_sql_info');
+    pointer(isc_encode_date) := GetProcedureAddress(IBaseLibraryHandle,'isc_encode_date');
+    pointer(isc_encode_sql_date) := GetProcedureAddress(IBaseLibraryHandle,'isc_encode_sql_date');
+    pointer(isc_encode_sql_time) := GetProcedureAddress(IBaseLibraryHandle,'isc_encode_sql_time');
+    pointer(isc_encode_timestamp) := GetProcedureAddress(IBaseLibraryHandle,'isc_encode_timestamp');
+    pointer(isc_event_block) := GetProcedureAddress(IBaseLibraryHandle,'isc_event_block');
+    pointer(isc_event_counts) := GetProcedureAddress(IBaseLibraryHandle,'isc_event_counts');
+    pointer(isc_expand_dpb) := GetProcedureAddress(IBaseLibraryHandle,'isc_expand_dpb');
+    pointer(isc_modify_dpb) := GetProcedureAddress(IBaseLibraryHandle,'isc_modify_dpb');
+    pointer(isc_free) := GetProcedureAddress(IBaseLibraryHandle,'isc_free');
+    pointer(isc_get_segment) := GetProcedureAddress(IBaseLibraryHandle,'isc_get_segment');
+    pointer(isc_get_slice) := GetProcedureAddress(IBaseLibraryHandle,'isc_get_slice');
+    pointer(isc_interprete) := GetProcedureAddress(IBaseLibraryHandle,'isc_interprete');
+    pointer(isc_open_blob) := GetProcedureAddress(IBaseLibraryHandle,'isc_open_blob');
+    pointer(isc_open_blob2) := GetProcedureAddress(IBaseLibraryHandle,'isc_open_blob2');
+    pointer(isc_prepare_transaction2) := GetProcedureAddress(IBaseLibraryHandle,'isc_prepare_transaction2');
+    pointer(isc_print_sqlerror) := GetProcedureAddress(IBaseLibraryHandle,'isc_print_sqlerror');
+    pointer(isc_print_status) := GetProcedureAddress(IBaseLibraryHandle,'isc_print_status');
+    pointer(isc_put_segment) := GetProcedureAddress(IBaseLibraryHandle,'isc_put_segment');
+    pointer(isc_put_slice) := GetProcedureAddress(IBaseLibraryHandle,'isc_put_slice');
+    pointer(isc_que_events) := GetProcedureAddress(IBaseLibraryHandle,'isc_que_events');
+    pointer(isc_rollback_retaining) := GetProcedureAddress(IBaseLibraryHandle,'isc_rollback_retaining');
+    pointer(isc_rollback_transaction) := GetProcedureAddress(IBaseLibraryHandle,'isc_rollback_transaction');
+    pointer(isc_start_multiple) := GetProcedureAddress(IBaseLibraryHandle,'isc_start_multiple');
+    pointer(isc_start_transaction) := GetProcedureAddress(IBaseLibraryHandle,'isc_start_transaction');
+    pointer(isc_sqlcode) := GetProcedureAddress(IBaseLibraryHandle,'isc_sqlcode');
+    pointer(isc_sql_interprete) := GetProcedureAddress(IBaseLibraryHandle,'isc_sql_interprete');
+    pointer(isc_transaction_info) := GetProcedureAddress(IBaseLibraryHandle,'isc_transaction_info');
+    pointer(isc_transact_request) := GetProcedureAddress(IBaseLibraryHandle,'isc_transact_request');
+    pointer(isc_vax_integer) := GetProcedureAddress(IBaseLibraryHandle,'isc_vax_integer');
+    pointer(isc_portable_integer) := GetProcedureAddress(IBaseLibraryHandle,'isc_portable_integer');
+    pointer(isc_add_user) := GetProcedureAddress(IBaseLibraryHandle,'isc_add_user');
+    pointer(isc_delete_user) := GetProcedureAddress(IBaseLibraryHandle,'isc_delete_user');
+    pointer(isc_modify_user) := GetProcedureAddress(IBaseLibraryHandle,'isc_modify_user');
+    pointer(isc_compile_request) := GetProcedureAddress(IBaseLibraryHandle,'isc_compile_request');
+    pointer(isc_compile_request2) := GetProcedureAddress(IBaseLibraryHandle,'isc_compile_request2');
+    pointer(isc_ddl) := GetProcedureAddress(IBaseLibraryHandle,'isc_ddl');
+    pointer(isc_prepare_transaction) := GetProcedureAddress(IBaseLibraryHandle,'isc_prepare_transaction');
+    pointer(isc_receive) := GetProcedureAddress(IBaseLibraryHandle,'isc_receive');
+    pointer(isc_reconnect_transaction) := GetProcedureAddress(IBaseLibraryHandle,'isc_reconnect_transaction');
+    pointer(isc_release_request) := GetProcedureAddress(IBaseLibraryHandle,'isc_release_request');
+    pointer(isc_request_info) := GetProcedureAddress(IBaseLibraryHandle,'isc_request_info');
+    pointer(isc_seek_blob) := GetProcedureAddress(IBaseLibraryHandle,'isc_seek_blob');
+    pointer(isc_send) := GetProcedureAddress(IBaseLibraryHandle,'isc_send');
+    pointer(isc_start_and_send) := GetProcedureAddress(IBaseLibraryHandle,'isc_start_and_send');
+    pointer(isc_start_request) := GetProcedureAddress(IBaseLibraryHandle,'isc_start_request');
+    pointer(isc_unwind_request) := GetProcedureAddress(IBaseLibraryHandle,'isc_unwind_request');
+    pointer(isc_wait_for_event) := GetProcedureAddress(IBaseLibraryHandle,'isc_wait_for_event');
+    pointer(isc_close) := GetProcedureAddress(IBaseLibraryHandle,'isc_close');
+    pointer(isc_declare) := GetProcedureAddress(IBaseLibraryHandle,'isc_declare');
+    pointer(isc_describe) := GetProcedureAddress(IBaseLibraryHandle,'isc_describe');
+    pointer(isc_describe_bind) := GetProcedureAddress(IBaseLibraryHandle,'isc_describe_bind');
+    pointer(isc_execute) := GetProcedureAddress(IBaseLibraryHandle,'isc_execute');
+    pointer(isc_execute_immediate) := GetProcedureAddress(IBaseLibraryHandle,'isc_execute_immediate');
+    pointer(isc_fetch) := GetProcedureAddress(IBaseLibraryHandle,'isc_fetch');
+    pointer(isc_open) := GetProcedureAddress(IBaseLibraryHandle,'isc_open');
+    pointer(isc_prepare) := GetProcedureAddress(IBaseLibraryHandle,'isc_prepare');
+    pointer(isc_dsql_execute_m) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_execute_m');
+    pointer(isc_dsql_execute2_m) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_execute2_m');
+    pointer(isc_dsql_execute_immediate_m) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_execute_immediate_m');
+    pointer(isc_dsql_exec_immed3_m) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_exec_immed3_m');
+    pointer(isc_dsql_fetch_m) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_fetch_m');
+    pointer(isc_dsql_insert_m) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_insert_m');
+    pointer(isc_dsql_prepare_m) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_prepare_m');
+    pointer(isc_dsql_release) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_release');
+    pointer(isc_embed_dsql_close) := GetProcedureAddress(IBaseLibraryHandle,'isc_embed_dsql_close');
+    pointer(isc_embed_dsql_declare) := GetProcedureAddress(IBaseLibraryHandle,'isc_embed_dsql_declare');
+    pointer(isc_embed_dsql_describe) := GetProcedureAddress(IBaseLibraryHandle,'isc_embed_dsql_describe');
+    pointer(isc_embed_dsql_describe_bind) := GetProcedureAddress(IBaseLibraryHandle,'isc_embed_dsql_describe_bind');
+    pointer(isc_embed_dsql_execute) := GetProcedureAddress(IBaseLibraryHandle,'isc_embed_dsql_execute');
+    pointer(isc_embed_dsql_execute2) := GetProcedureAddress(IBaseLibraryHandle,'isc_embed_dsql_execute2');
+    pointer(isc_embed_dsql_execute_immed) := GetProcedureAddress(IBaseLibraryHandle,'isc_embed_dsql_execute_immed');
+    pointer(isc_embed_dsql_fetch) := GetProcedureAddress(IBaseLibraryHandle,'isc_embed_dsql_fetch');
+    pointer(isc_embed_dsql_open) := GetProcedureAddress(IBaseLibraryHandle,'isc_embed_dsql_open');
+    pointer(isc_embed_dsql_open2) := GetProcedureAddress(IBaseLibraryHandle,'isc_embed_dsql_open2');
+    pointer(isc_embed_dsql_insert) := GetProcedureAddress(IBaseLibraryHandle,'isc_embed_dsql_insert');
+    pointer(isc_embed_dsql_prepare) := GetProcedureAddress(IBaseLibraryHandle,'isc_embed_dsql_prepare');
+    pointer(isc_embed_dsql_release) := GetProcedureAddress(IBaseLibraryHandle,'isc_embed_dsql_release');
+    pointer(BLOB_open) := GetProcedureAddress(IBaseLibraryHandle,'BLOB_open');
+    pointer(BLOB_put) := GetProcedureAddress(IBaseLibraryHandle,'BLOB_put');
+    pointer(BLOB_close) := GetProcedureAddress(IBaseLibraryHandle,'BLOB_close');
+    pointer(BLOB_get) := GetProcedureAddress(IBaseLibraryHandle,'BLOB_get');
+    pointer(BLOB_display) := GetProcedureAddress(IBaseLibraryHandle,'BLOB_display');
+    pointer(BLOB_dump) := GetProcedureAddress(IBaseLibraryHandle,'BLOB_dump');
+    pointer(BLOB_edit) := GetProcedureAddress(IBaseLibraryHandle,'BLOB_edit');
+    pointer(BLOB_load) := GetProcedureAddress(IBaseLibraryHandle,'BLOB_load');
+    pointer(BLOB_text_dump) := GetProcedureAddress(IBaseLibraryHandle,'BLOB_text_dump');
+    pointer(BLOB_text_load) := GetProcedureAddress(IBaseLibraryHandle,'BLOB_text_load');
+    pointer(Bopen) := GetProcedureAddress(IBaseLibraryHandle,'Bopen');
+{$IFDEF Unix}
+    pointer(Bopen2) := GetProcedureAddress(IBaseLibraryHandle,'Bopen2');
+{$ENDIF}
+    pointer(isc_ftof) := GetProcedureAddress(IBaseLibraryHandle,'isc_ftof');
+    pointer(isc_print_blr) := GetProcedureAddress(IBaseLibraryHandle,'isc_print_blr');
+    pointer(isc_set_debug) := GetProcedureAddress(IBaseLibraryHandle,'isc_set_debug');
+    pointer(isc_qtoq) := GetProcedureAddress(IBaseLibraryHandle,'isc_qtoq');
+    pointer(isc_vtof) := GetProcedureAddress(IBaseLibraryHandle,'isc_vtof');
+    pointer(isc_vtov) := GetProcedureAddress(IBaseLibraryHandle,'isc_vtov');
+    pointer(isc_version) := GetProcedureAddress(IBaseLibraryHandle,'isc_version');
+{$IFDEF Unix}
+    pointer(isc_reset_fpe) := GetProcedureAddress(IBaseLibraryHandle,'isc_reset_fpe');
+{$ENDIF}
+    pointer(isc_service_attach) := GetProcedureAddress(IBaseLibraryHandle,'isc_service_attach');
+    pointer(isc_service_detach) := GetProcedureAddress(IBaseLibraryHandle,'isc_service_detach');
+    pointer(isc_service_query) := GetProcedureAddress(IBaseLibraryHandle,'isc_service_query');
+    pointer(isc_service_start) := GetProcedureAddress(IBaseLibraryHandle,'isc_service_start');
+{$IFDEF Unix}
+    pointer(isc_compile_map) := GetProcedureAddress(IBaseLibraryHandle,'isc_compile_map');
+    pointer(isc_compile_menu) := GetProcedureAddress(IBaseLibraryHandle,'isc_compile_menu');
+    pointer(isc_compile_sub_map) := GetProcedureAddress(IBaseLibraryHandle,'isc_compile_sub_map');
+    pointer(isc_create_window) := GetProcedureAddress(IBaseLibraryHandle,'isc_create_window');
+    pointer(isc_delete_window) := GetProcedureAddress(IBaseLibraryHandle,'isc_delete_window');
+    pointer(isc_drive_form) := GetProcedureAddress(IBaseLibraryHandle,'isc_drive_form');
+    pointer(isc_drive_menu) := GetProcedureAddress(IBaseLibraryHandle,'isc_drive_menu');
+    pointer(isc_form_delete) := GetProcedureAddress(IBaseLibraryHandle,'isc_form_delete');
+    pointer(isc_form_fetch) := GetProcedureAddress(IBaseLibraryHandle,'isc_form_fetch');
+    pointer(isc_form_insert) := GetProcedureAddress(IBaseLibraryHandle,'isc_form_insert');
+    pointer(isc_get_entree) := GetProcedureAddress(IBaseLibraryHandle,'isc_get_entree');
+    pointer(isc_initialize_menu) := GetProcedureAddress(IBaseLibraryHandle,'isc_initialize_menu');
+    pointer(isc_menu) := GetProcedureAddress(IBaseLibraryHandle,'isc_menu');
+    pointer(isc_load_form) := GetProcedureAddress(IBaseLibraryHandle,'isc_load_form');
+    pointer(isc_pop_window) := GetProcedureAddress(IBaseLibraryHandle,'isc_pop_window');
+    pointer(isc_put_entree) := GetProcedureAddress(IBaseLibraryHandle,'isc_put_entree');
+    pointer(isc_reset_form) := GetProcedureAddress(IBaseLibraryHandle,'isc_reset_form');
+    pointer(isc_suspend_window) := GetProcedureAddress(IBaseLibraryHandle,'isc_suspend_window');
+{$ENDIF}
+    end
+  else
+    inc(RefCount);
+  Result := RefCount;
 end;
 
-function TryInitializeIBase(const LibraryName: string): Integer;
-begin
-  Result := TryInitializeLibrary(IBaseLibrary, LibraryName);
-end;
+function InitialiseIBase60 : integer;
 
-function ReleaseIBase: Integer;
 begin
-  Result := ReleaseLibrary(IBaseLibrary);
+  Result := 0;
+  If UseEmbeddedFirebird then
+    begin
+    If (TryInitialiseIBase60(fbembedlib)=0) then
+      Raise EInOutError.CreateFmt(SErrEmbeddedFailed,[fbembedlib]);
+    end
+  else
+    begin
+    If (TryInitialiseIBase60(fbclib)=0) and
+       (TryInitialiseIBase60(gdslib)=0) then
+        Raise EInOutError.CreateFmt(SErrDefaultsFailed,[gdslib,fbclib]);
+    end;    
+  Result := RefCount;
 end;
 
 function InitialiseIBase60(Const LibraryName : String) : integer;
-begin
-  Result := InitializeIBase(LibraryName);
-end;
 
-function InitialiseIBase60: integer;
 begin
-  Result := InitializeIBase(UseEmbeddedFirebird);
+  Result := TryInitialiseIBase60(LibraryName);
+  If Result = 0 then
+    Raise EInOutError.CreateFmt(SErrLoadFailed,[LibraryName])
+  else If (LibraryName<>LoadedLibrary) then
+    begin
+    Dec(RefCount);
+    Result := RefCount;
+    Raise EInOUtError.CreateFmt(SErrAlreadyLoaded,[LoadedLibrary]);
+    end;
 end;
 
-procedure ReleaseIBase60;
+
+Procedure ReleaseIBase60;
+
 begin
-  ReleaseIBase;
+  if RefCount>1 then
+    Dec(RefCount)
+  else if UnloadLibrary(IBaseLibraryHandle) then 
+    begin
+    Dec(RefCount);
+    IBaseLibraryHandle := NilHandle;
+    LoadedLibrary:='';
+    end;
 end;
 
-initialization
-  IBaseLibrary := LibraryHandler('Interbase', [gdslib,fbclib], @ibsymbols, length(ibsymbols));
 {$ENDIF}
 
+function XSQLDA_LENGTH(n: Integer): Integer;
+begin
+  Result := SizeOf(XSQLDA) + (n - 1) * SizeOf(XSQLVAR);
+end;
+
 

+ 1 - 1
packages/ibase/src/ibase60.pp

@@ -2,7 +2,7 @@
 }
 unit ibase60;
 
-{$UNDEF LOAD_DYNAMICALLY}
+{$UNDEF LinkDynamically}
 
 {$i ibase60.inc}
 

+ 1 - 1
packages/ibase/src/ibase60dyn.pp

@@ -11,7 +11,7 @@
 
 unit ibase60dyn;
 
-{$DEFINE LOAD_DYNAMICALLY}
+{$DEFINE LinkDynamically}
 
 {$i ibase60.inc}
 

+ 401 - 404
packages/mysql/src/mysql.inc

@@ -15,20 +15,19 @@
     mysqlclient
     mysql_com.h / mysql.h
 
-
-  NOTE: MySQL 5.1 support is not finished. I just added some parts so that my code is working. I
-    guess there are many things missing. This mysql.inc file is also getting a littlebit messy...
-    -Ivo Steinmann ([email protected])
 }
 {$MODE objfpc}
 {$MACRO on}
 
 interface
-
+{$ifdef Load_Dynamically}{$define LinkDynamically}{$endif}
 uses
-  dynlibs, ctypes;
+{$IFDEF LinkDynamically}
+      sysutils,
+{$ENDIF}
+     dynlibs,ctypes;
 
-{$IFDEF UNIX}
+{$IFDEF Unix}
   {$DEFINE extdecl:=cdecl}
   const
     mysqllib = 'libmysqlclient.'+sharedsuffix;
@@ -42,11 +41,11 @@ uses
     mysqlvlib = mysqllib+'.12';
   {$ENDIF}
 {$ENDIF}
-{$IFDEF WINDOWS}
+{$IFDEF Windows}
   {$DEFINE extdecl:=stdcall}
   const
     mysqllib = 'libmysql.dll';
-    mysqlvlib = mysqllib;
+    mysqlvlib = 'libmysql.dll';
 {$ENDIF}
 
 {$IFDEF mysql51}
@@ -60,17 +59,17 @@ uses
 {$PACKRECORDS C}
 
   { Copyright (C) 2000-2003 MySQL AB
-
+  
      This program is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published by
      the Free Software Foundation; either version 2 of the License, or
      (at your option) any later version.
-
+  
      This program is distributed in the hope that it will be useful,
      but WITHOUT ANY WARRANTY; without even the implied warranty of
      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      GNU General Public License for more details.
-
+  
      You should have received a copy of the GNU General Public License
      along with this program; if not, write to the Free Software
      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA  }
@@ -78,8 +77,8 @@ uses
     type
        my_bool = cchar;
        Pmy_bool  = ^my_bool;
-       pppchar = ^ppchar;
-       ppbyte = ^pbyte;
+//       pppchar = ^ppchar;
+//       ppbyte = ^pbyte;
 
        PVIO = Pointer;
 
@@ -88,7 +87,7 @@ uses
 
        Pmy_socket = ^my_socket;
        my_socket = cint;
-
+       
 {  ------------ Start of declaration in "mysql_com.h"   ---------------------  }
 
   {
@@ -418,18 +417,18 @@ uses
 
     function net_new_transaction(net : st_net) : st_net;
 
-{$IFNDEF LOAD_DYNAMICALLY}
-    function my_net_init(net:PNET; vio:PVio):my_bool;cdecl;external mysqlvlib name 'my_net_init';
-    procedure my_net_local_init(net:PNET);cdecl;external mysqlvlib name 'my_net_local_init';
-    procedure net_end(net:PNET);cdecl;external mysqlvlib name 'net_end';
-    procedure net_clear(net:PNET);cdecl;external mysqlvlib name 'net_clear';
-    function net_realloc(net:PNET; length:culong):my_bool;cdecl;external mysqlvlib name 'net_realloc';
-    function net_flush(net:PNET):my_bool;cdecl;external mysqlvlib name 'net_flush';
-    function my_net_write(net:PNET; packet:Pchar; len:culong):my_bool;cdecl;external mysqlvlib name 'my_net_write';
+{$IFNDEF LinkDynamically}
+    function my_net_init(net:PNET; vio:PVio):my_bool;cdecl;external mysqllib name 'my_net_init';
+    procedure my_net_local_init(net:PNET);cdecl;external mysqllib name 'my_net_local_init';
+    procedure net_end(net:PNET);cdecl;external mysqllib name 'net_end';
+    procedure net_clear(net:PNET);cdecl;external mysqllib name 'net_clear';
+    function net_realloc(net:PNET; length:culong):my_bool;cdecl;external mysqllib name 'net_realloc';
+    function net_flush(net:PNET):my_bool;cdecl;external mysqllib name 'net_flush';
+    function my_net_write(net:PNET; packet:Pchar; len:culong):my_bool;cdecl;external mysqllib name 'my_net_write';
     function net_write_command(net:PNET; command:cuchar; header:Pchar; head_len:culong; packet:Pchar;
-               len:culong):my_bool;cdecl;external mysqlvlib name 'net_write_command';
-    function net_real_write(net:PNET; packet:Pchar; len:culong):cint;cdecl;external mysqlvlib name 'net_real_write';
-    function my_net_read(net:PNET):culong;cdecl;external mysqlvlib name 'my_net_read';
+               len:culong):my_bool;cdecl;external mysqllib name 'net_write_command';
+    function net_real_write(net:PNET; packet:Pchar; len:culong):cint;cdecl;external mysqllib name 'net_real_write';
+    function my_net_read(net:PNET):culong;cdecl;external mysqllib name 'my_net_read';
 {$ENDIF}
     { The following function is not meant for normal usage
       Currently it's used internally by manager.c  }
@@ -439,8 +438,8 @@ uses
        sockaddr = record
            // undefined structure
          end;
-{$IFNDEF LOAD_DYNAMICALLY}
-    function my_connect(s:my_socket; name:Psockaddr; namelen:cuint; timeout:cuint):cint;cdecl;external mysqlvlib name 'my_connect';
+{$IFNDEF LinkDynamically}
+    function my_connect(s:my_socket; name:Psockaddr; namelen:cuint; timeout:cuint):cint;cdecl;external mysqllib name 'my_connect';
 {$ENDIF}
 
     type
@@ -499,38 +498,38 @@ uses
 
     { These functions are used for authentication by client and server and
       implemented in sql/password.c     }
-{$IFNDEF LOAD_DYNAMICALLY}
-    procedure randominit(_para1:Prand_struct; seed1:culong; seed2:culong);cdecl;external mysqlvlib name 'randominit';
-    function my_rnd(_para1:Prand_struct):cdouble;cdecl;external mysqlvlib name 'my_rnd';
-    procedure create_random_string(fto:Pchar; length:cuint; rand_st:Prand_struct);cdecl;external mysqlvlib name 'create_random_string';
-    procedure hash_password(fto:culong; password:Pchar; password_len:cuint);cdecl;external mysqlvlib name 'hash_password';
-    procedure make_scrambled_password_323(fto:Pchar; password:Pchar);cdecl;external mysqlvlib name 'make_scrambled_password_323';
-    procedure scramble_323(fto:Pchar; message:Pchar; password:Pchar);cdecl;external mysqlvlib name 'scramble_323';
-    function check_scramble_323(_para1:Pchar; message:Pchar; salt:culong):my_bool;cdecl;external mysqlvlib name 'check_scramble_323';
-    procedure get_salt_from_password_323(res:pculong; password:Pchar);cdecl;external mysqlvlib name 'get_salt_from_password_323';
-    procedure make_password_from_salt_323(fto:Pchar; salt:pculong);cdecl;external mysqlvlib name 'make_password_from_salt_323';
+{$IFNDEF LinkDynamically}
+    procedure randominit(_para1:Prand_struct; seed1:culong; seed2:culong);cdecl;external mysqllib name 'randominit';
+    function my_rnd(_para1:Prand_struct):cdouble;cdecl;external mysqllib name 'my_rnd';
+    procedure create_random_string(fto:Pchar; length:cuint; rand_st:Prand_struct);cdecl;external mysqllib name 'create_random_string';
+    procedure hash_password(fto:culong; password:Pchar; password_len:cuint);cdecl;external mysqllib name 'hash_password';
+    procedure make_scrambled_password_323(fto:Pchar; password:Pchar);cdecl;external mysqllib name 'make_scrambled_password_323';
+    procedure scramble_323(fto:Pchar; message:Pchar; password:Pchar);cdecl;external mysqllib name 'scramble_323';
+    function check_scramble_323(_para1:Pchar; message:Pchar; salt:culong):my_bool;cdecl;external mysqllib name 'check_scramble_323';
+    procedure get_salt_from_password_323(res:pculong; password:Pchar);cdecl;external mysqllib name 'get_salt_from_password_323';
+    procedure make_password_from_salt_323(fto:Pchar; salt:pculong);cdecl;external mysqllib name 'make_password_from_salt_323';
 {$IFDEF mysql50}
-    function octet2hex(fto:Pchar; str:Pchar; len:cuint):pchar;cdecl;external mysqlvlib name 'octet2hex';
+    function octet2hex(fto:Pchar; str:Pchar; len:cuint):pchar;cdecl;external mysqllib name 'octet2hex';
 {$ENDIF}
-    procedure make_scrambled_password(fto:Pchar; password:Pchar);cdecl;external mysqlvlib name 'make_scrambled_password';
-    procedure scramble(fto:Pchar; message:Pchar; password:Pchar);cdecl;external mysqlvlib name 'scramble';
-    function check_scramble(reply:Pchar; message:Pchar; hash_stage2:Pbyte):my_bool;cdecl;external mysqlvlib name 'check_scramble';
-    procedure get_salt_from_password(res:Pbyte; password:Pchar);cdecl;external mysqlvlib name 'get_salt_from_password';
-    procedure make_password_from_salt(fto:Pchar; hash_stage2:Pbyte);cdecl;external mysqlvlib name 'make_password_from_salt';
+    procedure make_scrambled_password(fto:Pchar; password:Pchar);cdecl;external mysqllib name 'make_scrambled_password';
+    procedure scramble(fto:Pchar; message:Pchar; password:Pchar);cdecl;external mysqllib name 'scramble';
+    function check_scramble(reply:Pchar; message:Pchar; hash_stage2:Pbyte):my_bool;cdecl;external mysqllib name 'check_scramble';
+    procedure get_salt_from_password(res:Pbyte; password:Pchar);cdecl;external mysqllib name 'get_salt_from_password';
+    procedure make_password_from_salt(fto:Pchar; hash_stage2:Pbyte);cdecl;external mysqllib name 'make_password_from_salt';
     { end of password.c  }
 
-    function get_tty_password(opt_message:Pchar):Pchar;cdecl;external mysqlvlib name 'get_tty_password';
-    function mysql_errno_to_sqlstate(mysql_errno:cuint):Pchar;cdecl;external mysqlvlib name 'mysql_errno_to_sqlstate';
+    function get_tty_password(opt_message:Pchar):Pchar;cdecl;external mysqllib name 'get_tty_password';
+    function mysql_errno_to_sqlstate(mysql_errno:cuint):Pchar;cdecl;external mysqllib name 'mysql_errno_to_sqlstate';
 
     { Some other useful functions  }
 {$IFDEF mysql50}
-    function modify_defaults_file(file_location:Pchar; option:Pchar; option_value:Pchar; section_name:Pchar; remove_option:cint):cint;cdecl;external mysqlvlib name 'load_defaults';
+    function modify_defaults_file(file_location:Pchar; option:Pchar; option_value:Pchar; section_name:Pchar; remove_option:cint):cint;cdecl;external mysqllib name 'load_defaults';
 {$ENDIF}
 
-    function load_defaults(conf_file:Pchar; groups:PPchar; argc:pcint; argv:PPPchar):cint;cdecl;external mysqlvlib name 'load_defaults';
-    function my_init:my_bool;cdecl;external mysqlvlib name 'my_init';
-    function my_thread_init:my_bool;cdecl;external mysqlvlib name 'my_thread_init';
-    procedure my_thread_end;cdecl;external mysqlvlib name 'my_thread_end';
+    function load_defaults(conf_file:Pchar; groups:PPchar; argc:pcint; argv:PPPchar):cint;cdecl;external mysqllib name 'load_defaults';
+    function my_init:my_bool;cdecl;external mysqllib name 'my_init';
+    function my_thread_init:my_bool;cdecl;external mysqllib name 'my_thread_init';
+    procedure my_thread_end;cdecl;external mysqllib name 'my_thread_end';
 {$ELSE}
     var
       my_init : function :my_bool;cdecl;
@@ -539,10 +538,10 @@ uses
 {$ENDIF}
 
 {$ifdef _global_h}
-{$IFNDEF LOAD_DYNAMICALLY}
-    function net_field_length(packet:PPuchar):culong;extdecl;external mysqlvlib name 'net_field_length_ll';
-    function net_field_length_ll(packet:PPuchar):my_ulonglong;cdecl;external mysqlvlib name 'net_field_length_ll';
-    function net_store_length(pkg:Pchar; length:ulonglong):Pchar;cdecl;external mysqlvlib name 'net_store_length';
+{$IFNDEF LinkDynamically}
+    function net_field_length(packet:PPuchar):culong;extdecl;external mysqllib name 'net_field_length_ll';
+    function net_field_length_ll(packet:PPuchar):my_ulonglong;cdecl;external mysqllib name 'net_field_length_ll';
+    function net_store_length(pkg:Pchar; length:ulonglong):Pchar;cdecl;external mysqllib name 'net_store_length';
 {$ENDIF}
 {$endif}
 
@@ -585,7 +584,7 @@ uses
 { $include "typelib.h"}
 { $include "my_list.h" /* for LISTs used in 'MYSQL' and 'MYSQL_STMT' */}
 
-{$IFNDEF LOAD_DYNAMICALLY}
+{$IFNDEF LinkDynamically}
       var
          mysql_port : cuint;cvar;external;
          mysql_unix_port : Pchar;cvar;external;
@@ -594,7 +593,7 @@ uses
       const
          CLIENT_NET_READ_TIMEOUT = 365*24*3600;     // Timeout on read
          CLIENT_NET_WRITE_TIMEOUT = 365*24*3600;    // Timeout on write
-
+      
 {$ifdef NETWARE}
 (** unsupported pragma#pragma pack(push, 8)		/* 8 byte alignment */*)
 {$endif}
@@ -728,7 +727,7 @@ uses
 {$ENDIF}
 { $endif}
          end;
-
+         
        MYSQL_DATA = st_mysql_data;
        PMYSQL_DATA = ^MYSQL_DATA;
        mysql_option = (MYSQL_OPT_CONNECT_TIMEOUT,MYSQL_OPT_COMPRESS,
@@ -1045,7 +1044,7 @@ uses
 
     {
       Note: this info is from the mysql-5.0 version:
-
+    
       This structure is used to define bind information, and
       internally by the client library.
       Public members with their descriptions are listed below
@@ -1232,12 +1231,12 @@ uses
 //#define max_allowed_packet (*mysql_get_parameters()->p_max_allowed_packet)
 //#define net_buffer_length (*mysql_get_parameters()->p_net_buffer_length)
 
-{$IFNDEF LOAD_DYNAMICALLY}
+{$IFNDEF LinkDynamically}
     { Set up and bring down the server; to ensure that applications will
       work when linked against either the standard client library or the
       embedded server library, these functions should be called.     }
-    function mysql_server_init(argc:cint; argv:PPchar; groups:PPchar):cint;extdecl;external mysqlvlib name 'mysql_server_init';
-    procedure mysql_server_end;extdecl;external mysqlvlib name 'mysql_server_end';
+    function mysql_server_init(argc:cint; argv:PPchar; groups:PPchar):cint;extdecl;external mysqllib name 'mysql_server_init';
+    procedure mysql_server_end;extdecl;external mysqllib name 'mysql_server_end';
 
     { mysql_server_init/end need to be called when using libmysqld or
       libmysqlclient (exactly, mysql_server_init() is called by mysql_init() so
@@ -1247,49 +1246,49 @@ uses
       names which suit well whether you're using libmysqld or libmysqlclient. We
       intend to promote these aliases over the mysql_server* ones.     }
 
-    function mysql_library_init(argc:cint; argv:PPchar; groups:PPchar):cint;extdecl;external mysqlvlib name 'mysql_server_init';
-    procedure mysql_library_end;extdecl;external mysqlvlib name 'mysql_server_end';
+    function mysql_library_init(argc:cint; argv:PPchar; groups:PPchar):cint;extdecl;external mysqllib name 'mysql_server_init';
+    procedure mysql_library_end;extdecl;external mysqllib name 'mysql_server_end';
 
-    function mysql_get_parameters:PMYSQL_PARAMETERS;extdecl;external mysqlvlib name 'mysql_get_parameters';
+    function mysql_get_parameters:PMYSQL_PARAMETERS;extdecl;external mysqllib name 'mysql_get_parameters';
 
     { Set up and bring down a thread; these function should be called
       for each thread in an application which opens at least one MySQL
       connection.  All uses of the connection(s) should be between these
       function calls.     }
-    function mysql_thread_init:my_bool;extdecl;external mysqlvlib name 'mysql_thread_init';
-    procedure mysql_thread_end;extdecl;external mysqlvlib name 'mysql_thread_end';
+    function mysql_thread_init:my_bool;extdecl;external mysqllib name 'mysql_thread_init';
+    procedure mysql_thread_end;extdecl;external mysqllib name 'mysql_thread_end';
     { Functions to get information from the MYSQL and MYSQL_RES structures
       Should definitely be used if one uses shared libraries.     }
-    function mysql_num_rows(res:PMYSQL_RES):my_ulonglong;extdecl;external mysqlvlib name 'mysql_num_rows';
-    function mysql_num_fields(res:PMYSQL_RES):cuint;extdecl;external mysqlvlib name 'mysql_num_fields';
-    function mysql_eof(res:PMYSQL_RES):my_bool;extdecl;external mysqlvlib name 'mysql_eof';
-    function mysql_fetch_field_direct(res:PMYSQL_RES; fieldnr:cuint):PMYSQL_FIELD;extdecl;external mysqlvlib name 'mysql_fetch_field_direct';
-    function mysql_fetch_fields(res:PMYSQL_RES):PMYSQL_FIELD;extdecl;external mysqlvlib name 'mysql_fetch_fields';
-    function mysql_row_tell(res:PMYSQL_RES):MYSQL_ROW_OFFSET;extdecl;external mysqlvlib name 'mysql_row_tell';
-    function mysql_field_tell(res:PMYSQL_RES):MYSQL_FIELD_OFFSET;extdecl;external mysqlvlib name 'mysql_field_tell';
-    function mysql_field_count(mysql:PMYSQL):cuint;extdecl;external mysqlvlib name 'mysql_field_count';
-    function mysql_affected_rows(mysql:PMYSQL):my_ulonglong;extdecl;external mysqlvlib name 'mysql_affected_rows';
-    function mysql_insert_id(mysql:PMYSQL):my_ulonglong;extdecl;external mysqlvlib name 'mysql_insert_id';
-    function mysql_errno(mysql:PMYSQL):cuint;extdecl;external mysqlvlib name 'mysql_errno';
-    function mysql_error(mysql:PMYSQL):Pchar;extdecl;external mysqlvlib name 'mysql_error';
-    function mysql_sqlstate(mysql:PMYSQL):Pchar;extdecl;external mysqlvlib name 'mysql_sqlstate';
-    function mysql_warning_count(mysql:PMYSQL):cuint;extdecl;external mysqlvlib name 'mysql_warning_count';
-    function mysql_info(mysql:PMYSQL):Pchar;extdecl;external mysqlvlib name 'mysql_info';
-    function mysql_thread_id(mysql:PMYSQL):culong;extdecl;external mysqlvlib name 'mysql_thread_id';
-    function mysql_character_set_name(mysql:PMYSQL):Pchar;extdecl;external mysqlvlib name 'mysql_character_set_name';
-    function mysql_set_character_set(mysql:PMYSQL; csname:Pchar):longint;extdecl;external mysqlvlib name 'mysql_set_character_set';
-    function mysql_init(mysql:PMYSQL):PMYSQL;extdecl;external mysqlvlib name 'mysql_init';
+    function mysql_num_rows(res:PMYSQL_RES):my_ulonglong;extdecl;external mysqllib name 'mysql_num_rows';
+    function mysql_num_fields(res:PMYSQL_RES):cuint;extdecl;external mysqllib name 'mysql_num_fields';
+    function mysql_eof(res:PMYSQL_RES):my_bool;extdecl;external mysqllib name 'mysql_eof';
+    function mysql_fetch_field_direct(res:PMYSQL_RES; fieldnr:cuint):PMYSQL_FIELD;extdecl;external mysqllib name 'mysql_fetch_field_direct';
+    function mysql_fetch_fields(res:PMYSQL_RES):PMYSQL_FIELD;extdecl;external mysqllib name 'mysql_fetch_fields';
+    function mysql_row_tell(res:PMYSQL_RES):MYSQL_ROW_OFFSET;extdecl;external mysqllib name 'mysql_row_tell';
+    function mysql_field_tell(res:PMYSQL_RES):MYSQL_FIELD_OFFSET;extdecl;external mysqllib name 'mysql_field_tell';
+    function mysql_field_count(mysql:PMYSQL):cuint;extdecl;external mysqllib name 'mysql_field_count';
+    function mysql_affected_rows(mysql:PMYSQL):my_ulonglong;extdecl;external mysqllib name 'mysql_affected_rows';
+    function mysql_insert_id(mysql:PMYSQL):my_ulonglong;extdecl;external mysqllib name 'mysql_insert_id';
+    function mysql_errno(mysql:PMYSQL):cuint;extdecl;external mysqllib name 'mysql_errno';
+    function mysql_error(mysql:PMYSQL):Pchar;extdecl;external mysqllib name 'mysql_error';
+    function mysql_sqlstate(mysql:PMYSQL):Pchar;extdecl;external mysqllib name 'mysql_sqlstate';
+    function mysql_warning_count(mysql:PMYSQL):cuint;extdecl;external mysqllib name 'mysql_warning_count';
+    function mysql_info(mysql:PMYSQL):Pchar;extdecl;external mysqllib name 'mysql_info';
+    function mysql_thread_id(mysql:PMYSQL):culong;extdecl;external mysqllib name 'mysql_thread_id';
+    function mysql_character_set_name(mysql:PMYSQL):Pchar;extdecl;external mysqllib name 'mysql_character_set_name';
+    function mysql_set_character_set(mysql:PMYSQL; csname:Pchar):longint;extdecl;external mysqllib name 'mysql_set_character_set';
+    function mysql_init(mysql:PMYSQL):PMYSQL;extdecl;external mysqllib name 'mysql_init';
     function mysql_ssl_set(mysql:PMYSQL; key:Pchar; cert:Pchar; ca:Pchar; capath:Pchar;
-               cipher:Pchar):my_bool;extdecl;external mysqlvlib name 'mysql_ssl_set';
-    function mysql_change_user(mysql:PMYSQL; user:Pchar; passwd:Pchar; db:Pchar):my_bool;extdecl;external mysqlvlib name 'mysql_change_user';
+               cipher:Pchar):my_bool;extdecl;external mysqllib name 'mysql_ssl_set';
+    function mysql_change_user(mysql:PMYSQL; user:Pchar; passwd:Pchar; db:Pchar):my_bool;extdecl;external mysqllib name 'mysql_change_user';
     function mysql_real_connect(mysql:PMYSQL; host:Pchar; user:Pchar; passwd:Pchar; db:Pchar;
-               port:cuint; unix_socket:Pchar; clientflag:culong):PMYSQL;extdecl;external mysqlvlib name 'mysql_real_connect';
-    function mysql_select_db(mysql:PMYSQL; db:Pchar):cint;extdecl;external mysqlvlib name 'mysql_select_db';
-    function mysql_query(mysql:PMYSQL; q:Pchar):cint;extdecl;external mysqlvlib name 'mysql_query';
-    function mysql_send_query(mysql:PMYSQL; q:Pchar; length:culong):cint;extdecl;external mysqlvlib name 'mysql_send_query';
-    function mysql_real_query(mysql:PMYSQL; q:Pchar; length:culong):cint;extdecl;external mysqlvlib name 'mysql_real_query';
-    function mysql_store_result(mysql:PMYSQL):PMYSQL_RES;extdecl;external mysqlvlib name 'mysql_store_result';
-    function mysql_use_result(mysql:PMYSQL):PMYSQL_RES;extdecl;external mysqlvlib name 'mysql_use_result';
+               port:cuint; unix_socket:Pchar; clientflag:culong):PMYSQL;extdecl;external mysqllib name 'mysql_real_connect';
+    function mysql_select_db(mysql:PMYSQL; db:Pchar):cint;extdecl;external mysqllib name 'mysql_select_db';
+    function mysql_query(mysql:PMYSQL; q:Pchar):cint;extdecl;external mysqllib name 'mysql_query';
+    function mysql_send_query(mysql:PMYSQL; q:Pchar; length:culong):cint;extdecl;external mysqllib name 'mysql_send_query';
+    function mysql_real_query(mysql:PMYSQL; q:Pchar; length:culong):cint;extdecl;external mysqllib name 'mysql_real_query';
+    function mysql_store_result(mysql:PMYSQL):PMYSQL_RES;extdecl;external mysqllib name 'mysql_store_result';
+    function mysql_use_result(mysql:PMYSQL):PMYSQL_RES;extdecl;external mysqllib name 'mysql_use_result';
 
 {$ELSE}
 
@@ -1330,16 +1329,16 @@ uses
       mysql_use_result: function (mysql:PMYSQL):PMYSQL_RES;extdecl;
 {$ENDIF}
 
-{$IFNDEF LOAD_DYNAMICALLY}
+{$IFNDEF LinkDynamically}
     { perform query on master  }
-    function mysql_master_query(mysql:PMYSQL; q:Pchar; length:culong):my_bool;extdecl;external mysqlvlib name 'mysql_master_query';
-    function mysql_master_send_query(mysql:PMYSQL; q:Pchar; length:culong):my_bool;extdecl;external mysqlvlib name 'mysql_master_send_query';
+    function mysql_master_query(mysql:PMYSQL; q:Pchar; length:culong):my_bool;extdecl;external mysqllib name 'mysql_master_query';
+    function mysql_master_send_query(mysql:PMYSQL; q:Pchar; length:culong):my_bool;extdecl;external mysqllib name 'mysql_master_send_query';
 
     { perform query on slave  }
-    function mysql_slave_query(mysql:PMYSQL; q:Pchar; length:culong):my_bool;extdecl;external mysqlvlib name 'mysql_slave_query';
-    function mysql_slave_send_query(mysql:PMYSQL; q:Pchar; length:culong):my_bool;extdecl;external mysqlvlib name 'mysql_slave_send_query';
+    function mysql_slave_query(mysql:PMYSQL; q:Pchar; length:culong):my_bool;extdecl;external mysqllib name 'mysql_slave_query';
+    function mysql_slave_send_query(mysql:PMYSQL; q:Pchar; length:culong):my_bool;extdecl;external mysqllib name 'mysql_slave_send_query';
 {$IFDEF mysql50}
-    procedure mysql_get_character_set_info(mysql : PMYSQL; charset : PMY_CHARSET_INFO);extdecl;external mysqlvlib name 'mysql_get_character_set_info';
+    procedure mysql_get_character_set_info(mysql : PMYSQL; charset : PMY_CHARSET_INFO);extdecl;external mysqllib name 'mysql_get_character_set_info';
 {$ENDIF}
 {$ENDIF}
 
@@ -1348,110 +1347,110 @@ uses
     const
        LOCAL_INFILE_ERROR_LEN = 512;
 
-{$IFNDEF LOAD_DYNAMICALLY}
+{$IFNDEF LinkDynamically}
 {    procedure mysql_set_local_infile_handler(mysql:PMYSQL; local_infile_init:function (_para1:Ppointer; _para2:Pchar; _para3:pointer):longint; local_infile_read:function (_para1:pointer; _para2:Pchar; _para3:dword):longint; local_infile_end:procedure (_pa
-                _para6:pointer);cdecl;external mysqlvlib name 'mysql_set_local_infile_handler';}
-    procedure mysql_set_local_infile_default(mysql:PMYSQL);cdecl;external mysqlvlib name 'mysql_set_local_infile_default';
+                _para6:pointer);cdecl;external mysqllib name 'mysql_set_local_infile_handler';}
+    procedure mysql_set_local_infile_default(mysql:PMYSQL);cdecl;external mysqllib name 'mysql_set_local_infile_default';
 
     { enable/disable parsing of all queries to decide if they go on master or
       slave     }
-    procedure mysql_enable_rpl_parse(mysql:PMYSQL);extdecl;external mysqlvlib name 'mysql_enable_rpl_parse';
-    procedure mysql_disable_rpl_parse(mysql:PMYSQL);extdecl;external mysqlvlib name 'mysql_disable_rpl_parse';
+    procedure mysql_enable_rpl_parse(mysql:PMYSQL);extdecl;external mysqllib name 'mysql_enable_rpl_parse';
+    procedure mysql_disable_rpl_parse(mysql:PMYSQL);extdecl;external mysqllib name 'mysql_disable_rpl_parse';
 
     { get the value of the parse flag  }
-    function mysql_rpl_parse_enabled(mysql:PMYSQL):cint;extdecl;external mysqlvlib name 'mysql_rpl_parse_enabled';
+    function mysql_rpl_parse_enabled(mysql:PMYSQL):cint;extdecl;external mysqllib name 'mysql_rpl_parse_enabled';
 
     {  enable/disable reads from master  }
-    procedure mysql_enable_reads_from_master(mysql:PMYSQL);extdecl;external mysqlvlib name 'mysql_enable_reads_from_master';
-    procedure mysql_disable_reads_from_master(mysql:PMYSQL);extdecl;external mysqlvlib name 'mysql_disable_reads_from_master';
+    procedure mysql_enable_reads_from_master(mysql:PMYSQL);extdecl;external mysqllib name 'mysql_enable_reads_from_master';
+    procedure mysql_disable_reads_from_master(mysql:PMYSQL);extdecl;external mysqllib name 'mysql_disable_reads_from_master';
 
     { get the value of the master read flag  }
-    function mysql_reads_from_master_enabled(mysql:PMYSQL):my_bool;extdecl;external mysqlvlib name 'mysql_reads_from_master_enabled';
+    function mysql_reads_from_master_enabled(mysql:PMYSQL):my_bool;extdecl;external mysqllib name 'mysql_reads_from_master_enabled';
 
-    function mysql_rpl_query_type(q : pchar;len : cint):mysql_rpl_type;extdecl;external mysqlvlib name 'mysql_rpl_query_type';
+    function mysql_rpl_query_type(q : pchar;len : cint):mysql_rpl_type;extdecl;external mysqllib name 'mysql_rpl_query_type';
 
     { discover the master and its slaves  }
-    function mysql_rpl_probe(mysql:PMYSQL):my_bool;extdecl;external mysqlvlib name 'mysql_rpl_probe';
+    function mysql_rpl_probe(mysql:PMYSQL):my_bool;extdecl;external mysqllib name 'mysql_rpl_probe';
 
     { set the master, close/free the old one, if it is not a pivot  }
-    function mysql_set_master(mysql:PMYSQL; host:Pchar; port:cuint; user:Pchar; passwd:Pchar):cint;extdecl;external mysqlvlib name 'mysql_set_master';
-    function mysql_add_slave(mysql:PMYSQL; host:Pchar; port:cuint; user:Pchar; passwd:Pchar):cint;extdecl;external mysqlvlib name 'mysql_add_slave';
-    function mysql_shutdown(mysql:PMYSQL; shutdown_level:mysql_enum_shutdown_level):cint;extdecl;external mysqlvlib name 'mysql_shutdown';
-    function mysql_dump_debug_info(mysql:PMYSQL):cint;extdecl;external mysqlvlib name 'mysql_dump_debug_info';
-    function mysql_refresh(mysql:PMYSQL; refresh_options:cuint):cint;extdecl;external mysqlvlib name 'mysql_refresh';
-    function mysql_kill(mysql:PMYSQL; pid:culong):cint;extdecl;external mysqlvlib name 'mysql_kill';
-    function mysql_set_server_option(mysql:PMYSQL; option:enum_mysql_set_option):cint;extdecl;external mysqlvlib name 'mysql_set_server_option';
-    function mysql_ping(mysql:PMYSQL):cint;extdecl;external mysqlvlib name 'mysql_ping';
-    function mysql_stat(mysql:PMYSQL):Pchar;extdecl;external mysqlvlib name 'mysql_stat';
-    function mysql_get_server_info(mysql:PMYSQL):Pchar;extdecl;external mysqlvlib name 'mysql_get_server_info';
-    function mysql_get_client_info:Pchar;extdecl;external mysqlvlib name 'mysql_get_client_info';
-    function mysql_get_client_version:culong;extdecl;external mysqlvlib name 'mysql_get_client_version';
-    function mysql_get_host_info(mysql:PMYSQL):Pchar;extdecl;external mysqlvlib name 'mysql_get_host_info';
-    function mysql_get_server_version(mysql:PMYSQL):culong;extdecl;external mysqlvlib name 'mysql_get_server_version';
-    function mysql_get_proto_info(mysql:PMYSQL):cuint;extdecl;external mysqlvlib name 'mysql_get_proto_info';
-    function mysql_list_dbs(mysql:PMYSQL; wild:Pchar):PMYSQL_RES;extdecl;external mysqlvlib name 'mysql_list_dbs';
-
-    function mysql_list_tables(mysql:PMYSQL; wild:Pchar):PMYSQL_RES;extdecl;external mysqlvlib name 'mysql_list_tables';
-    function mysql_list_processes(mysql:PMYSQL):PMYSQL_RES;extdecl;external mysqlvlib name 'mysql_list_processes';
-    function mysql_options(mysql:PMYSQL; option:mysql_option; arg:Pchar):cint;extdecl;external mysqlvlib name 'mysql_options';
-    procedure mysql_free_result(result:PMYSQL_RES);extdecl;external mysqlvlib name 'mysql_free_result';
-    procedure mysql_data_seek(result:PMYSQL_RES; offset:my_ulonglong);extdecl;external mysqlvlib name 'mysql_data_seek';
-    function mysql_row_seek(result:PMYSQL_RES; offset:MYSQL_ROW_OFFSET):MYSQL_ROW_OFFSET;extdecl;external mysqlvlib name 'mysql_row_seek';
-    function mysql_field_seek(result:PMYSQL_RES; offset:MYSQL_FIELD_OFFSET):MYSQL_FIELD_OFFSET;extdecl;external mysqlvlib name 'mysql_field_seek';
-    function mysql_fetch_row(result:PMYSQL_RES):MYSQL_ROW;extdecl;external mysqlvlib name 'mysql_fetch_row';
-    function mysql_fetch_lengths(result:PMYSQL_RES):pculong;extdecl;external mysqlvlib name 'mysql_fetch_lengths';
-    function mysql_fetch_field(result:PMYSQL_RES):PMYSQL_FIELD;extdecl;external mysqlvlib name 'mysql_fetch_field';
-    function mysql_list_fields(mysql:PMYSQL; table:Pchar; wild:Pchar):PMYSQL_RES;extdecl;external mysqlvlib name 'mysql_list_fields';
-    function mysql_escape_string(fto:Pchar; from:Pchar; from_length:culong):culong;extdecl;external mysqlvlib name 'mysql_escape_string';
-    function mysql_hex_string(fto:Pchar; from:Pchar; from_length:culong):culong;extdecl;external mysqlvlib name 'mysql_hex_string';
-    function mysql_real_escape_string(mysql:PMYSQL; fto:Pchar; from:Pchar; length:culong):culong;extdecl;external mysqlvlib name 'mysql_real_escape_string';
-    procedure mysql_debug(debug:Pchar);extdecl;external mysqlvlib name 'mysql_debug';
+    function mysql_set_master(mysql:PMYSQL; host:Pchar; port:cuint; user:Pchar; passwd:Pchar):cint;extdecl;external mysqllib name 'mysql_set_master';
+    function mysql_add_slave(mysql:PMYSQL; host:Pchar; port:cuint; user:Pchar; passwd:Pchar):cint;extdecl;external mysqllib name 'mysql_add_slave';
+    function mysql_shutdown(mysql:PMYSQL; shutdown_level:mysql_enum_shutdown_level):cint;extdecl;external mysqllib name 'mysql_shutdown';
+    function mysql_dump_debug_info(mysql:PMYSQL):cint;extdecl;external mysqllib name 'mysql_dump_debug_info';
+    function mysql_refresh(mysql:PMYSQL; refresh_options:cuint):cint;extdecl;external mysqllib name 'mysql_refresh';
+    function mysql_kill(mysql:PMYSQL; pid:culong):cint;extdecl;external mysqllib name 'mysql_kill';
+    function mysql_set_server_option(mysql:PMYSQL; option:enum_mysql_set_option):cint;extdecl;external mysqllib name 'mysql_set_server_option';
+    function mysql_ping(mysql:PMYSQL):cint;extdecl;external mysqllib name 'mysql_ping';
+    function mysql_stat(mysql:PMYSQL):Pchar;extdecl;external mysqllib name 'mysql_stat';
+    function mysql_get_server_info(mysql:PMYSQL):Pchar;extdecl;external mysqllib name 'mysql_get_server_info';
+    function mysql_get_client_info:Pchar;extdecl;external mysqllib name 'mysql_get_client_info';
+    function mysql_get_client_version:culong;extdecl;external mysqllib name 'mysql_get_client_version';
+    function mysql_get_host_info(mysql:PMYSQL):Pchar;extdecl;external mysqllib name 'mysql_get_host_info';
+    function mysql_get_server_version(mysql:PMYSQL):culong;extdecl;external mysqllib name 'mysql_get_server_version';
+    function mysql_get_proto_info(mysql:PMYSQL):cuint;extdecl;external mysqllib name 'mysql_get_proto_info';
+    function mysql_list_dbs(mysql:PMYSQL; wild:Pchar):PMYSQL_RES;extdecl;external mysqllib name 'mysql_list_dbs';
+
+    function mysql_list_tables(mysql:PMYSQL; wild:Pchar):PMYSQL_RES;extdecl;external mysqllib name 'mysql_list_tables';
+    function mysql_list_processes(mysql:PMYSQL):PMYSQL_RES;extdecl;external mysqllib name 'mysql_list_processes';
+    function mysql_options(mysql:PMYSQL; option:mysql_option; arg:Pchar):cint;extdecl;external mysqllib name 'mysql_options';
+    procedure mysql_free_result(result:PMYSQL_RES);extdecl;external mysqllib name 'mysql_free_result';
+    procedure mysql_data_seek(result:PMYSQL_RES; offset:my_ulonglong);extdecl;external mysqllib name 'mysql_data_seek';
+    function mysql_row_seek(result:PMYSQL_RES; offset:MYSQL_ROW_OFFSET):MYSQL_ROW_OFFSET;extdecl;external mysqllib name 'mysql_row_seek';
+    function mysql_field_seek(result:PMYSQL_RES; offset:MYSQL_FIELD_OFFSET):MYSQL_FIELD_OFFSET;extdecl;external mysqllib name 'mysql_field_seek';
+    function mysql_fetch_row(result:PMYSQL_RES):MYSQL_ROW;extdecl;external mysqllib name 'mysql_fetch_row';
+    function mysql_fetch_lengths(result:PMYSQL_RES):pculong;extdecl;external mysqllib name 'mysql_fetch_lengths';
+    function mysql_fetch_field(result:PMYSQL_RES):PMYSQL_FIELD;extdecl;external mysqllib name 'mysql_fetch_field';
+    function mysql_list_fields(mysql:PMYSQL; table:Pchar; wild:Pchar):PMYSQL_RES;extdecl;external mysqllib name 'mysql_list_fields';
+    function mysql_escape_string(fto:Pchar; from:Pchar; from_length:culong):culong;extdecl;external mysqllib name 'mysql_escape_string';
+    function mysql_hex_string(fto:Pchar; from:Pchar; from_length:culong):culong;extdecl;external mysqllib name 'mysql_hex_string';
+    function mysql_real_escape_string(mysql:PMYSQL; fto:Pchar; from:Pchar; length:culong):culong;extdecl;external mysqllib name 'mysql_real_escape_string';
+    procedure mysql_debug(debug:Pchar);extdecl;external mysqllib name 'mysql_debug';
 {    function mysql_odbc_escape_string(mysql:PMYSQL; fto:Pchar; to_length:dword; from:Pchar; from_length:dword;
-               param:pointer; extend_buffer:function (_para1:pointer; to:Pchar; length:Pdword):Pchar):Pchar;extdecl;external mysqlvlib name 'mysql_odbc_escape_string';}
-    procedure myodbc_remove_escape(mysql:PMYSQL; name:Pchar);extdecl;external mysqlvlib name 'myodbc_remove_escape';
-    function mysql_thread_safe:cuint;extdecl;external mysqlvlib name 'mysql_thread_safe';
-    function mysql_embedded:my_bool;extdecl;external mysqlvlib name 'mysql_embedded';
-    function mysql_manager_init(con:PMYSQL_MANAGER):PMYSQL_MANAGER;extdecl;external mysqlvlib name 'mysql_manager_init';
-    function mysql_manager_connect(con:PMYSQL_MANAGER; host:Pchar; user:Pchar; passwd:Pchar; port:cuint):PMYSQL_MANAGER;extdecl;external mysqlvlib name 'mysql_manager_connect';
-    procedure mysql_manager_close(con:PMYSQL_MANAGER);extdecl;external mysqlvlib name 'mysql_manager_close';
-    function mysql_manager_command(con:PMYSQL_MANAGER; cmd:Pchar; cmd_len:cint):cint;extdecl;external mysqlvlib name 'mysql_manager_command';
-    function mysql_manager_fetch_line(con:PMYSQL_MANAGER; res_buf:Pchar; res_buf_size:cint):cint;extdecl;external mysqlvlib name 'mysql_manager_fetch_line';
-    function mysql_read_query_result(mysql:PMYSQL):my_bool;extdecl;external mysqlvlib name 'mysql_read_query_result';
-
-    function mysql_stmt_init(mysql:PMYSQL):PMYSQL_STMT;extdecl;external mysqlvlib name 'mysql_stmt_init';
-    function mysql_stmt_prepare(stmt:PMYSQL_STMT; query:Pchar; length:culong):cint;extdecl;external mysqlvlib name 'mysql_stmt_prepare';
-    function mysql_stmt_execute(stmt:PMYSQL_STMT):cint;extdecl;external mysqlvlib name 'mysql_stmt_execute';
-    function mysql_stmt_fetch(stmt:PMYSQL_STMT):cint;extdecl;external mysqlvlib name 'mysql_stmt_fetch';
-    function mysql_stmt_fetch_column(stmt:PMYSQL_STMT; bind:PMYSQL_BIND; column:cuint; offset:culong):cint;extdecl;external mysqlvlib name 'mysql_stmt_fetch_column';
-    function mysql_stmt_store_result(stmt:PMYSQL_STMT):cint;extdecl;external mysqlvlib name 'mysql_stmt_store_result';
-    function mysql_stmt_param_count(stmt:PMYSQL_STMT):culong;extdecl;external mysqlvlib name 'mysql_stmt_param_count';
-    function mysql_stmt_attr_set(stmt:PMYSQL_STMT; attr_type:enum_stmt_attr_type; attr:pointer):my_bool;extdecl;external mysqlvlib name 'mysql_stmt_attr_set';
-    function mysql_stmt_attr_get(stmt:PMYSQL_STMT; attr_type:enum_stmt_attr_type; attr:pointer):my_bool;extdecl;external mysqlvlib name 'mysql_stmt_attr_get';
-    function mysql_stmt_bind_param(stmt:PMYSQL_STMT; bnd:PMYSQL_BIND):my_bool;extdecl;external mysqlvlib name 'mysql_stmt_bind_param';
-    function mysql_stmt_bind_result(stmt:PMYSQL_STMT; bnd:PMYSQL_BIND):my_bool;extdecl;external mysqlvlib name 'mysql_stmt_bind_result';
-    function mysql_stmt_close(stmt:PMYSQL_STMT):my_bool;extdecl;external mysqlvlib name 'mysql_stmt_close';
-    function mysql_stmt_reset(stmt:PMYSQL_STMT):my_bool;extdecl;external mysqlvlib name 'mysql_stmt_reset';
-    function mysql_stmt_free_result(stmt:PMYSQL_STMT):my_bool;extdecl;external mysqlvlib name 'mysql_stmt_free_result';
-    function mysql_stmt_send_long_data(stmt:PMYSQL_STMT; param_number:cuint; data:Pchar; length:culong):my_bool;extdecl;external mysqlvlib name 'mysql_stmt_send_long_data';
-    function mysql_stmt_result_metadata(stmt:PMYSQL_STMT):PMYSQL_RES;extdecl;external mysqlvlib name 'mysql_stmt_result_metadata';
-    function mysql_stmt_param_metadata(stmt:PMYSQL_STMT):PMYSQL_RES;extdecl;external mysqlvlib name 'mysql_stmt_param_metadata';
-    function mysql_stmt_errno(stmt:PMYSQL_STMT):cuint;extdecl;external mysqlvlib name 'mysql_stmt_errno';
-    function mysql_stmt_error(stmt:PMYSQL_STMT):Pchar;extdecl;external mysqlvlib name 'mysql_stmt_error';
-    function mysql_stmt_sqlstate(stmt:PMYSQL_STMT):Pchar;extdecl;external mysqlvlib name 'mysql_stmt_sqlstate';
-    function mysql_stmt_row_seek(stmt:PMYSQL_STMT; offset:MYSQL_ROW_OFFSET):MYSQL_ROW_OFFSET;extdecl;external mysqlvlib name 'mysql_stmt_row_seek';
-    function mysql_stmt_row_tell(stmt:PMYSQL_STMT):MYSQL_ROW_OFFSET;extdecl;external mysqlvlib name 'mysql_stmt_row_tell';
-    procedure mysql_stmt_data_seek(stmt:PMYSQL_STMT; offset:my_ulonglong);extdecl;external mysqlvlib name 'mysql_stmt_data_seek';
-    function mysql_stmt_num_rows(stmt:PMYSQL_STMT):my_ulonglong;extdecl;external mysqlvlib name 'mysql_stmt_num_rows';
-    function mysql_stmt_affected_rows(stmt:PMYSQL_STMT):my_ulonglong;extdecl;external mysqlvlib name 'mysql_stmt_affected_rows';
-    function mysql_stmt_insert_id(stmt:PMYSQL_STMT):my_ulonglong;extdecl;external mysqlvlib name 'mysql_stmt_insert_id';
-    function mysql_stmt_field_count(stmt:PMYSQL_STMT):cuint;extdecl;external mysqlvlib name 'mysql_stmt_field_count';
-
-    function mysql_commit(mysql:PMYSQL):my_bool;extdecl;external mysqlvlib name 'mysql_commit';
-    function mysql_rollback(mysql:PMYSQL):my_bool;extdecl;external mysqlvlib name 'mysql_rollback';
-    function mysql_autocommit(mysql:PMYSQL; auto_mode:my_bool):my_bool;extdecl;external mysqlvlib name 'mysql_autocommit';
-    function mysql_more_results(mysql:PMYSQL):my_bool;extdecl;external mysqlvlib name 'mysql_more_results';
-    function mysql_next_result(mysql:PMYSQL):cint;extdecl;external mysqlvlib name 'mysql_next_result';
-    procedure mysql_close(sock:PMYSQL);extdecl;external mysqlvlib name 'mysql_close';
+               param:pointer; extend_buffer:function (_para1:pointer; to:Pchar; length:Pdword):Pchar):Pchar;extdecl;external mysqllib name 'mysql_odbc_escape_string';}
+    procedure myodbc_remove_escape(mysql:PMYSQL; name:Pchar);extdecl;external mysqllib name 'myodbc_remove_escape';
+    function mysql_thread_safe:cuint;extdecl;external mysqllib name 'mysql_thread_safe';
+    function mysql_embedded:my_bool;extdecl;external mysqllib name 'mysql_embedded';
+    function mysql_manager_init(con:PMYSQL_MANAGER):PMYSQL_MANAGER;extdecl;external mysqllib name 'mysql_manager_init';
+    function mysql_manager_connect(con:PMYSQL_MANAGER; host:Pchar; user:Pchar; passwd:Pchar; port:cuint):PMYSQL_MANAGER;extdecl;external mysqllib name 'mysql_manager_connect';
+    procedure mysql_manager_close(con:PMYSQL_MANAGER);extdecl;external mysqllib name 'mysql_manager_close';
+    function mysql_manager_command(con:PMYSQL_MANAGER; cmd:Pchar; cmd_len:cint):cint;extdecl;external mysqllib name 'mysql_manager_command';
+    function mysql_manager_fetch_line(con:PMYSQL_MANAGER; res_buf:Pchar; res_buf_size:cint):cint;extdecl;external mysqllib name 'mysql_manager_fetch_line';
+    function mysql_read_query_result(mysql:PMYSQL):my_bool;extdecl;external mysqllib name 'mysql_read_query_result';
+
+    function mysql_stmt_init(mysql:PMYSQL):PMYSQL_STMT;extdecl;external mysqllib name 'mysql_stmt_init';
+    function mysql_stmt_prepare(stmt:PMYSQL_STMT; query:Pchar; length:culong):cint;extdecl;external mysqllib name 'mysql_stmt_prepare';
+    function mysql_stmt_execute(stmt:PMYSQL_STMT):cint;extdecl;external mysqllib name 'mysql_stmt_execute';
+    function mysql_stmt_fetch(stmt:PMYSQL_STMT):cint;extdecl;external mysqllib name 'mysql_stmt_fetch';
+    function mysql_stmt_fetch_column(stmt:PMYSQL_STMT; bind:PMYSQL_BIND; column:cuint; offset:culong):cint;extdecl;external mysqllib name 'mysql_stmt_fetch_column';
+    function mysql_stmt_store_result(stmt:PMYSQL_STMT):cint;extdecl;external mysqllib name 'mysql_stmt_store_result';
+    function mysql_stmt_param_count(stmt:PMYSQL_STMT):culong;extdecl;external mysqllib name 'mysql_stmt_param_count';
+    function mysql_stmt_attr_set(stmt:PMYSQL_STMT; attr_type:enum_stmt_attr_type; attr:pointer):my_bool;extdecl;external mysqllib name 'mysql_stmt_attr_set';
+    function mysql_stmt_attr_get(stmt:PMYSQL_STMT; attr_type:enum_stmt_attr_type; attr:pointer):my_bool;extdecl;external mysqllib name 'mysql_stmt_attr_get';
+    function mysql_stmt_bind_param(stmt:PMYSQL_STMT; bnd:PMYSQL_BIND):my_bool;extdecl;external mysqllib name 'mysql_stmt_bind_param';
+    function mysql_stmt_bind_result(stmt:PMYSQL_STMT; bnd:PMYSQL_BIND):my_bool;extdecl;external mysqllib name 'mysql_stmt_bind_result';
+    function mysql_stmt_close(stmt:PMYSQL_STMT):my_bool;extdecl;external mysqllib name 'mysql_stmt_close';
+    function mysql_stmt_reset(stmt:PMYSQL_STMT):my_bool;extdecl;external mysqllib name 'mysql_stmt_reset';
+    function mysql_stmt_free_result(stmt:PMYSQL_STMT):my_bool;extdecl;external mysqllib name 'mysql_stmt_free_result';
+    function mysql_stmt_send_long_data(stmt:PMYSQL_STMT; param_number:cuint; data:Pchar; length:culong):my_bool;extdecl;external mysqllib name 'mysql_stmt_send_long_data';
+    function mysql_stmt_result_metadata(stmt:PMYSQL_STMT):PMYSQL_RES;extdecl;external mysqllib name 'mysql_stmt_result_metadata';
+    function mysql_stmt_param_metadata(stmt:PMYSQL_STMT):PMYSQL_RES;extdecl;external mysqllib name 'mysql_stmt_param_metadata';
+    function mysql_stmt_errno(stmt:PMYSQL_STMT):cuint;extdecl;external mysqllib name 'mysql_stmt_errno';
+    function mysql_stmt_error(stmt:PMYSQL_STMT):Pchar;extdecl;external mysqllib name 'mysql_stmt_error';
+    function mysql_stmt_sqlstate(stmt:PMYSQL_STMT):Pchar;extdecl;external mysqllib name 'mysql_stmt_sqlstate';
+    function mysql_stmt_row_seek(stmt:PMYSQL_STMT; offset:MYSQL_ROW_OFFSET):MYSQL_ROW_OFFSET;extdecl;external mysqllib name 'mysql_stmt_row_seek';
+    function mysql_stmt_row_tell(stmt:PMYSQL_STMT):MYSQL_ROW_OFFSET;extdecl;external mysqllib name 'mysql_stmt_row_tell';
+    procedure mysql_stmt_data_seek(stmt:PMYSQL_STMT; offset:my_ulonglong);extdecl;external mysqllib name 'mysql_stmt_data_seek';
+    function mysql_stmt_num_rows(stmt:PMYSQL_STMT):my_ulonglong;extdecl;external mysqllib name 'mysql_stmt_num_rows';
+    function mysql_stmt_affected_rows(stmt:PMYSQL_STMT):my_ulonglong;extdecl;external mysqllib name 'mysql_stmt_affected_rows';
+    function mysql_stmt_insert_id(stmt:PMYSQL_STMT):my_ulonglong;extdecl;external mysqllib name 'mysql_stmt_insert_id';
+    function mysql_stmt_field_count(stmt:PMYSQL_STMT):cuint;extdecl;external mysqllib name 'mysql_stmt_field_count';
+
+    function mysql_commit(mysql:PMYSQL):my_bool;extdecl;external mysqllib name 'mysql_commit';
+    function mysql_rollback(mysql:PMYSQL):my_bool;extdecl;external mysqllib name 'mysql_rollback';
+    function mysql_autocommit(mysql:PMYSQL; auto_mode:my_bool):my_bool;extdecl;external mysqllib name 'mysql_autocommit';
+    function mysql_more_results(mysql:PMYSQL):my_bool;extdecl;external mysqllib name 'mysql_more_results';
+    function mysql_next_result(mysql:PMYSQL):cint;extdecl;external mysqllib name 'mysql_next_result';
+    procedure mysql_close(sock:PMYSQL);extdecl;external mysqllib name 'mysql_close';
 
 {$ELSE}
     var
@@ -1532,7 +1531,7 @@ uses
 
     function mysql_reload(mysql : PMySQL) : cint;
 
-{$IFNDEF LOAD_DYNAMICALLY}
+{$IFNDEF LinkDynamically}
 {$ifdef USE_OLD_FUNCTIONS}
     function mysql_connect(mysql:PMYSQL; host:Pchar; user:Pchar; passwd:Pchar):PMYSQL;extdecl;external External_library name 'mysql_connect';
     function mysql_create_db(mysql:PMYSQL; DB:Pchar):cint;extdecl;external External_library name 'mysql_create_db';
@@ -1541,262 +1540,260 @@ uses
 {$endif}
 {$endif}
 
-{$define HAVE_MYSQL_REAL_CONNECT}
+{$define HAVE_MYSQL_REAL_CONNECT}    
     { The following functions are mainly exported because of mysqlbinlog;
       They are not for general usage     }
 
     function simple_command(mysql,command,arg,length,skip_check : cint) : cint;
-{$IFNDEF LOAD_DYNAMICALLY}
-    function net_safe_read(mysql:PMYSQL):cuint;cdecl;external mysqlvlib name 'net_safe_read';
+{$IFNDEF LinkDynamically}
+    function net_safe_read(mysql:PMYSQL):cuint;cdecl;external mysqllib name 'net_safe_read';
 {$ENDIF}
 
 {$ifdef NETWARE}
 (** unsupported pragma#pragma pack(pop)		/* restore alignment */*)
 {$endif}
 
-{$IFDEF LOAD_DYNAMICALLY}
-function InitializeMysql(const LibraryName: String = ''; argc: cint = -1; argv: PPchar = nil; groups: PPchar = nil): Integer;
-function TryInitializeMysql(const LibraryName: string = ''; argc: cint = -1; argv: PPchar = nil; groups: PPchar = nil): Integer;
-function ReleaseMysql: Integer;
+{$IFDEF LinkDynamically}
+Function InitialiseMysql(Const LibraryName : String; argc:cint = -1; argv:PPchar = nil; groups:PPchar = nil) : Integer;
+Function InitialiseMysql(argc:cint = -1; argv:PPchar = nil; groups:PPchar = nil) : Integer;
+Procedure ReleaseMysql;
 
-var
-  MysqlLibrary: TLibHandler;
-
-function InitialiseMysql(argc: cint = -1; argv: PPchar = nil; groups: PPchar = nil): Integer; deprecated;
-function InitialiseMysql(const LibraryName: String; argc: cint = -1; argv: PPchar = nil; groups: PPchar = nil): Integer; deprecated;
-function TryInitialiseMysql(const LibraryName: string; argc: cint = -1; argv: PPchar = nil; groups: PPchar = nil): Integer; deprecated;
+var MysqlLibraryHandle : TLibHandle;
 {$ENDIF}
 
 implementation
 
+{$IFDEF LinkDynamically}
 
-function net_new_transaction(net : st_net) : st_net;
-begin
-  net.pkt_nr := 0;
-  result := net;
-end;
+ResourceString
+  SErrAlreadyLoaded  = 'MySQL interface already initialized from library %s.';
+  SErrLoadFailed     = 'Can not load MySQL library "%s". Please check your installation.';
+  SErrDefaultsFailed = 'Can not load default MySQL library ("%s" or "%s"). Check your installation.';
 
-function IS_PRI_KEY(n : longint) : boolean;
-begin
-  IS_PRI_KEY:=(n and PRI_KEY_FLAG)<>0;
-end;
+var 
+  RefCount : integer;
+  LoadedLibrary : String;
 
-function IS_NOT_NULL(n : longint) : boolean;
-begin
- IS_NOT_NULL:=(n and NOT_NULL_FLAG)<>0;
-end;
+Function TryInitialiseMysql(Const LibraryName: String; argc: cint; argv: PPchar; groups: PPchar) : Integer;
 
-function IS_BLOB(n : longint) : boolean;
 begin
- IS_BLOB:=(n and BLOB_FLAG)<>0;
-end;
+  Result := 0;
+  if (RefCount=0) then
+    begin
+    MysqlLibraryHandle := loadlibrary(LibraryName);
+    if (MysqlLibraryHandle=nilhandle) then
+      Exit;
+    Inc(RefCount);
+    LoadedLibrary:=LibraryName;
+// Only the procedure that are given in the c-library documentation are loaded, to
+// avoid problems with 'incomplete' libraries
+    pointer(my_init) := GetProcedureAddress(MysqlLibraryHandle,'my_init');
+    pointer(my_thread_init) := GetProcedureAddress(MysqlLibraryHandle,'my_thread_init');
+    pointer(my_thread_end) := GetProcedureAddress(MysqlLibraryHandle,'my_thread_end');
+
+    pointer(mysql_affected_rows) := GetProcedureAddress(MysqlLibraryHandle,'mysql_affected_rows');
+    pointer(mysql_autocommit) := GetProcedureAddress(MysqlLibraryHandle,'mysql_autocommit');
+    pointer(mysql_change_user) := GetProcedureAddress(MysqlLibraryHandle,'mysql_change_user');
+//    pointer(mysql_charset_name) := GetProcedureAddress(MysqlLibraryHandle,'mysql_charset_name');
+    pointer(mysql_close) := GetProcedureAddress(MysqlLibraryHandle,'mysql_close');
+    pointer(mysql_commit) := GetProcedureAddress(MysqlLibraryHandle,'mysql_commit');
+//    pointer(mysql_connect) := GetProcedureAddress(MysqlLibraryHandle,'mysql_connect');
+//    pointer(mysql_create_db) := GetProcedureAddress(MysqlLibraryHandle,'mysql_create_db');
+    pointer(mysql_data_seek) := GetProcedureAddress(MysqlLibraryHandle,'mysql_data_seek');
+//    pointer(mysql_drop_db) := GetProcedureAddress(MysqlLibraryHandle,'mysql_drop_db');
+    pointer(mysql_debug) := GetProcedureAddress(MysqlLibraryHandle,'mysql_debug');
+    pointer(mysql_dump_debug_info) := GetProcedureAddress(MysqlLibraryHandle,'mysql_dump_debug_info');
+    pointer(mysql_eof) := GetProcedureAddress(MysqlLibraryHandle,'mysql_eof');
+    pointer(mysql_errno) := GetProcedureAddress(MysqlLibraryHandle,'mysql_errno');
+    pointer(mysql_error) := GetProcedureAddress(MysqlLibraryHandle,'mysql_error');
+    pointer(mysql_escape_string) := GetProcedureAddress(MysqlLibraryHandle,'mysql_escape_string');
+    pointer(mysql_fetch_field) := GetProcedureAddress(MysqlLibraryHandle,'mysql_fetch_field');
+    pointer(mysql_fetch_field_direct) := GetProcedureAddress(MysqlLibraryHandle,'mysql_fetch_field_direct');
+    pointer(mysql_fetch_fields) := GetProcedureAddress(MysqlLibraryHandle,'mysql_fetch_fields');
+    pointer(mysql_fetch_lengths) := GetProcedureAddress(MysqlLibraryHandle,'mysql_fetch_lengths');
+    pointer(mysql_fetch_row) := GetProcedureAddress(MysqlLibraryHandle,'mysql_fetch_row');
+    pointer(mysql_field_seek) := GetProcedureAddress(MysqlLibraryHandle,'mysql_field_seek');
+    pointer(mysql_field_count) := GetProcedureAddress(MysqlLibraryHandle,'mysql_field_count');
+    pointer(mysql_field_tell) := GetProcedureAddress(MysqlLibraryHandle,'mysql_field_tell');
+    pointer(mysql_free_result) := GetProcedureAddress(MysqlLibraryHandle,'mysql_free_result');
+    pointer(mysql_get_client_info) := GetProcedureAddress(MysqlLibraryHandle,'mysql_get_client_info');
+    pointer(mysql_get_client_version) := GetProcedureAddress(MysqlLibraryHandle,'mysql_get_client_version');
+    pointer(mysql_get_host_info) := GetProcedureAddress(MysqlLibraryHandle,'mysql_get_host_info');
+    pointer(mysql_get_server_version) := GetProcedureAddress(MysqlLibraryHandle,'mysql_get_server_version');
+    pointer(mysql_get_proto_info) := GetProcedureAddress(MysqlLibraryHandle,'mysql_get_proto_info');
+    pointer(mysql_get_server_info) := GetProcedureAddress(MysqlLibraryHandle,'mysql_get_server_info');
+    pointer(mysql_info) := GetProcedureAddress(MysqlLibraryHandle,'mysql_info');
+    pointer(mysql_init) := GetProcedureAddress(MysqlLibraryHandle,'mysql_init');
+    pointer(mysql_insert_id) := GetProcedureAddress(MysqlLibraryHandle,'mysql_insert_id');
+    pointer(mysql_kill) := GetProcedureAddress(MysqlLibraryHandle,'mysql_kill');
+    pointer(mysql_library_end) := GetProcedureAddress(MysqlLibraryHandle,'mysql_server_end');
+    pointer(mysql_library_init) := GetProcedureAddress(MysqlLibraryHandle,'mysql_server_init');
+    pointer(mysql_list_dbs) := GetProcedureAddress(MysqlLibraryHandle,'mysql_list_dbs');
+    pointer(mysql_list_fields) := GetProcedureAddress(MysqlLibraryHandle,'mysql_list_fields');
+    pointer(mysql_list_processes) := GetProcedureAddress(MysqlLibraryHandle,'mysql_list_processes');
+    pointer(mysql_list_tables) := GetProcedureAddress(MysqlLibraryHandle,'mysql_list_tables');
+    pointer(mysql_more_results) := GetProcedureAddress(MysqlLibraryHandle,'mysql_more_results');
+    pointer(mysql_next_result) := GetProcedureAddress(MysqlLibraryHandle,'mysql_next_result');
+    pointer(mysql_num_fields) := GetProcedureAddress(MysqlLibraryHandle,'mysql_num_fields');
+    pointer(mysql_num_rows) := GetProcedureAddress(MysqlLibraryHandle,'mysql_num_rows');
+    pointer(mysql_options) := GetProcedureAddress(MysqlLibraryHandle,'mysql_options');
+    pointer(mysql_ping) := GetProcedureAddress(MysqlLibraryHandle,'mysql_ping');
+    pointer(mysql_query) := GetProcedureAddress(MysqlLibraryHandle,'mysql_query');
+    pointer(mysql_real_connect) := GetProcedureAddress(MysqlLibraryHandle,'mysql_real_connect');
+    pointer(mysql_real_escape_string) := GetProcedureAddress(MysqlLibraryHandle,'mysql_real_escape_string');
+    pointer(mysql_real_query) := GetProcedureAddress(MysqlLibraryHandle,'mysql_real_query');
+    pointer(mysql_refresh) := GetProcedureAddress(MysqlLibraryHandle,'mysql_refresh');
+//    pointer(mysql_reload) := GetProcedureAddress(MysqlLibraryHandle,'mysql_reload');
+    pointer(mysql_rollback) := GetProcedureAddress(MysqlLibraryHandle,'mysql_rollback');
+    pointer(mysql_row_seek) := GetProcedureAddress(MysqlLibraryHandle,'mysql_row_seek');
+    pointer(mysql_row_tell) := GetProcedureAddress(MysqlLibraryHandle,'mysql_row_tell');
+    pointer(mysql_select_db) := GetProcedureAddress(MysqlLibraryHandle,'mysql_select_db');
+    pointer(mysql_server_end) := GetProcedureAddress(MysqlLibraryHandle,'mysql_server_end');
+    pointer(mysql_server_init) := GetProcedureAddress(MysqlLibraryHandle,'mysql_server_init');
+    pointer(mysql_set_server_option) := GetProcedureAddress(MysqlLibraryHandle,'mysql_set_server_option');
+    pointer(mysql_sqlstate) := GetProcedureAddress(MysqlLibraryHandle,'mysql_sqlstate');
+    pointer(mysql_shutdown) := GetProcedureAddress(MysqlLibraryHandle,'mysql_shutdown');
+    pointer(mysql_stat) := GetProcedureAddress(MysqlLibraryHandle,'mysql_stat');
+    pointer(mysql_store_result) := GetProcedureAddress(MysqlLibraryHandle,'mysql_store_result');
+    pointer(mysql_thread_id) := GetProcedureAddress(MysqlLibraryHandle,'mysql_thread_id');
+//    pointer(mysql_thread_save) := GetProcedureAddress(MysqlLibraryHandle,'mysql_thread_save');
+    pointer(mysql_use_result) := GetProcedureAddress(MysqlLibraryHandle,'mysql_use_result');
+    pointer(mysql_warning_count) := GetProcedureAddress(MysqlLibraryHandle,'mysql_warning_count');
+    pointer(mysql_stmt_init) := GetProcedureAddress(MysqlLibraryHandle,'mysql_stmt_init');
+    pointer(mysql_stmt_prepare) := GetProcedureAddress(MysqlLibraryHandle,'mysql_stmt_prepare');
+    pointer(mysql_stmt_execute) := GetProcedureAddress(MysqlLibraryHandle,'mysql_stmt_execute');
+    pointer(mysql_stmt_fetch) := GetProcedureAddress(MysqlLibraryHandle,'mysql_stmt_fetch');
+    pointer(mysql_stmt_fetch_column) := GetProcedureAddress(MysqlLibraryHandle,'mysql_stmt_fetch_column');
+    pointer(mysql_stmt_store_result) := GetProcedureAddress(MysqlLibraryHandle,'mysql_stmt_store_result');
+    pointer(mysql_stmt_param_count) := GetProcedureAddress(MysqlLibraryHandle,'mysql_stmt_param_count');
+    pointer(mysql_stmt_attr_set) := GetProcedureAddress(MysqlLibraryHandle,'mysql_stmt_attr_set');
+    pointer(mysql_stmt_attr_get) := GetProcedureAddress(MysqlLibraryHandle,'mysql_stmt_attr_get');
+    pointer(mysql_stmt_bind_param) := GetProcedureAddress(MysqlLibraryHandle,'mysql_stmt_bind_param');
+    pointer(mysql_stmt_bind_result) := GetProcedureAddress(MysqlLibraryHandle,'mysql_stmt_bind_result');
+    pointer(mysql_stmt_close) := GetProcedureAddress(MysqlLibraryHandle,'mysql_stmt_close');
+    pointer(mysql_stmt_reset) := GetProcedureAddress(MysqlLibraryHandle,'mysql_stmt_reset');
+    pointer(mysql_stmt_free_result) := GetProcedureAddress(MysqlLibraryHandle,'mysql_stmt_free_result');
+    pointer(mysql_stmt_send_long_data) := GetProcedureAddress(MysqlLibraryHandle,'mysql_stmt_send_long_data');
+    pointer(mysql_stmt_result_metadata) := GetProcedureAddress(MysqlLibraryHandle,'mysql_stmt_result_metadata');
+    pointer(mysql_stmt_param_metadata) := GetProcedureAddress(MysqlLibraryHandle,'mysql_stmt_param_metadata');
+    pointer(mysql_stmt_errno) := GetProcedureAddress(MysqlLibraryHandle,'mysql_stmt_errno');
+    pointer(mysql_stmt_error) := GetProcedureAddress(MysqlLibraryHandle,'mysql_stmt_error');
+    pointer(mysql_stmt_sqlstate) := GetProcedureAddress(MysqlLibraryHandle,'mysql_stmt_sqlstate');
+    pointer(mysql_stmt_row_seek) := GetProcedureAddress(MysqlLibraryHandle,'mysql_stmt_row_seek');
+    pointer(mysql_stmt_row_tell) := GetProcedureAddress(MysqlLibraryHandle,'mysql_stmt_row_tell');
+    pointer(mysql_stmt_data_seek) := GetProcedureAddress(MysqlLibraryHandle,'mysql_stmt_data_seek');
+    pointer(mysql_stmt_num_rows) := GetProcedureAddress(MysqlLibraryHandle,'mysql_stmt_num_rows');
+    pointer(mysql_stmt_affected_rows) := GetProcedureAddress(MysqlLibraryHandle,'mysql_stmt_affected_rows');
+    pointer(mysql_stmt_insert_id) := GetProcedureAddress(MysqlLibraryHandle,'mysql_stmt_insert_id');
+    pointer(mysql_stmt_field_count) := GetProcedureAddress(MysqlLibraryHandle,'mysql_stmt_field_count');
+
+    if mysql_library_init(argc, argv, groups) <> 0 then
+      Exit;
+    end
+  else
+    inc(RefCount);
 
-function IS_NUM_FIELD(f : pst_mysql_field) : boolean;
-begin
-   IS_NUM_FIELD:=((f^.flags) and NUM_FLAG)<>0;
+  Result:=RefCount;
 end;
 
-function IS_NUM(t : enum_field_types) : boolean;
-begin
-{$IF DEFINED(mysql50) or DEFINED(mysql51)}
-  IS_NUM := (t <= FIELD_TYPE_INT24) or (t=FIELD_TYPE_YEAR) or (t=FIELD_TYPE_NEWDECIMAL);
-{$ELSE}
-  IS_NUM := (t <= FIELD_TYPE_INT24) or (t=FIELD_TYPE_YEAR);
-{$ENDIF}
-end;
 
-function INTERNAL_NUM_FIELD(f : Pst_mysql_field) : boolean;
-begin
-  INTERNAL_NUM_FIELD := (f^.ftype <= FIELD_TYPE_INT24) and ((f^.ftype <> FIELD_TYPE_TIMESTAMP)
-  or (f^.length = 14) or (f^.length=8)) or (f^.ftype=FIELD_TYPE_YEAR);
-end;
 
-function mysql_reload(mysql : PMySQL) : cint;
-begin
-  mysql_reload:=mysql_refresh(mysql,REFRESH_GRANT);
-end;
+Function InitialiseMysql(argc: cint; argv: PPchar; groups: PPchar) : Integer;
 
-function simple_command(mysql,command,arg,length,skip_check : longint) : longint;
 begin
-  //simple_command:=mysql^.(methods^.advanced_command)(mysqlcommandNullS0arglengthskip_check);
-  result := -1;
+  Result := 0;
+  If (TryInitialiseMysql(mysqlvlib,argc,argv,groups) = 0) and
+     (TryInitialiseMysql(mysqllib,argc,argv,groups) = 0) then
+      Raise EInOutError.CreateFmt(SErrDefaultsFailed,[mysqlvlib,mysqllib]);
+  Result := RefCount;
 end;
 
+Function InitialiseMysql(Const LibraryName: String; argc: cint; argv: PPchar; groups:PPchar) : Integer;
 
-{$IFDEF LOAD_DYNAMICALLY}
-const
-  mysql_symbols: array[0..91] of TLibSymbol = (
-  // Only the procedure that are given in the c-library documentation are loaded, to
-  // avoid problems with 'incomplete' libraries
-    (pvar:@my_init; name:'my_init'; weak:true),
-    (pvar:@my_thread_init; name:'my_thread_init'; weak:true),
-    (pvar:@my_thread_end; name:'my_thread_end'; weak:true),
-
-    (pvar:@mysql_affected_rows; name:'mysql_affected_rows'; weak:false),
-    (pvar:@mysql_autocommit; name:'mysql_autocommit'; weak:false),
-    (pvar:@mysql_change_user; name:'mysql_change_user'; weak:false),
-  //    (pvar:@mysql_charset_name; name:'mysql_charset_name'; weak:false),
-    (pvar:@mysql_close; name:'mysql_close'; weak:false),
-    (pvar:@mysql_commit; name:'mysql_commit'; weak:false),
-  //    (pvar:@mysql_connect; name:'mysql_connect'; weak:false),
-  //    (pvar:@mysql_create_db; name:'mysql_create_db'; weak:false),
-    (pvar:@mysql_data_seek; name:'mysql_data_seek'; weak:false),
-  //    (pvar:@mysql_drop_db; name:'mysql_drop_db'; weak:false),
-    (pvar:@mysql_debug; name:'mysql_debug'; weak:false),
-    (pvar:@mysql_dump_debug_info; name:'mysql_dump_debug_info'; weak:false),
-    (pvar:@mysql_eof; name:'mysql_eof'; weak:false),
-    (pvar:@mysql_errno; name:'mysql_errno'; weak:false),
-    (pvar:@mysql_error; name:'mysql_error'; weak:false),
-    (pvar:@mysql_escape_string; name:'mysql_escape_string'; weak:false),
-    (pvar:@mysql_fetch_field; name:'mysql_fetch_field'; weak:false),
-    (pvar:@mysql_fetch_field_direct; name:'mysql_fetch_field_direct'; weak:false),
-    (pvar:@mysql_fetch_fields; name:'mysql_fetch_fields'; weak:false),
-    (pvar:@mysql_fetch_lengths; name:'mysql_fetch_lengths'; weak:false),
-    (pvar:@mysql_fetch_row; name:'mysql_fetch_row'; weak:false),
-    (pvar:@mysql_field_seek; name:'mysql_field_seek'; weak:false),
-    (pvar:@mysql_field_count; name:'mysql_field_count'; weak:false),
-    (pvar:@mysql_field_tell; name:'mysql_field_tell'; weak:false),
-    (pvar:@mysql_free_result; name:'mysql_free_result'; weak:false),
-    (pvar:@mysql_get_client_info; name:'mysql_get_client_info'; weak:false),
-    (pvar:@mysql_get_client_version; name:'mysql_get_client_version'; weak:false),
-    (pvar:@mysql_get_host_info; name:'mysql_get_host_info'; weak:false),
-    (pvar:@mysql_get_server_version; name:'mysql_get_server_version'; weak:false),
-    (pvar:@mysql_get_proto_info; name:'mysql_get_proto_info'; weak:false),
-    (pvar:@mysql_get_server_info; name:'mysql_get_server_info'; weak:false),
-    (pvar:@mysql_info; name:'mysql_info'; weak:false),
-    (pvar:@mysql_init; name:'mysql_init'; weak:false),
-    (pvar:@mysql_insert_id; name:'mysql_insert_id'; weak:false),
-    (pvar:@mysql_kill; name:'mysql_kill'; weak:false),
-    (pvar:@mysql_library_end; name:'mysql_server_end'; weak:false),
-    (pvar:@mysql_library_init; name:'mysql_server_init'; weak:false),
-    (pvar:@mysql_list_dbs; name:'mysql_list_dbs'; weak:false),
-    (pvar:@mysql_list_fields; name:'mysql_list_fields'; weak:false),
-    (pvar:@mysql_list_processes; name:'mysql_list_processes'; weak:false),
-    (pvar:@mysql_list_tables; name:'mysql_list_tables'; weak:false),
-    (pvar:@mysql_more_results; name:'mysql_more_results'; weak:false),
-    (pvar:@mysql_next_result; name:'mysql_next_result'; weak:false),
-    (pvar:@mysql_num_fields; name:'mysql_num_fields'; weak:false),
-    (pvar:@mysql_num_rows; name:'mysql_num_rows'; weak:false),
-    (pvar:@mysql_options; name:'mysql_options'; weak:false),
-    (pvar:@mysql_ping; name:'mysql_ping'; weak:false),
-    (pvar:@mysql_query; name:'mysql_query'; weak:false),
-    (pvar:@mysql_real_connect; name:'mysql_real_connect'; weak:false),
-    (pvar:@mysql_real_escape_string; name:'mysql_real_escape_string'; weak:false),
-    (pvar:@mysql_real_query; name:'mysql_real_query'; weak:false),
-    (pvar:@mysql_refresh; name:'mysql_refresh'; weak:false),
-  //    (pvar:@mysql_reload; name:'mysql_reload'; weak:false),
-    (pvar:@mysql_rollback; name:'mysql_rollback'; weak:false),
-    (pvar:@mysql_row_seek; name:'mysql_row_seek'; weak:false),
-    (pvar:@mysql_row_tell; name:'mysql_row_tell'; weak:false),
-    (pvar:@mysql_select_db; name:'mysql_select_db'; weak:false),
-    (pvar:@mysql_server_end; name:'mysql_server_end'; weak:false),
-    (pvar:@mysql_server_init; name:'mysql_server_init'; weak:false),
-    (pvar:@mysql_set_server_option; name:'mysql_set_server_option'; weak:false),
-    (pvar:@mysql_sqlstate; name:'mysql_sqlstate'; weak:false),
-    (pvar:@mysql_shutdown; name:'mysql_shutdown'; weak:false),
-    (pvar:@mysql_stat; name:'mysql_stat'; weak:false),
-    (pvar:@mysql_store_result; name:'mysql_store_result'; weak:false),
-    (pvar:@mysql_thread_id; name:'mysql_thread_id'; weak:false),
-  //    (pvar:@mysql_thread_save; name:'mysql_thread_save'; weak:false),
-    (pvar:@mysql_use_result; name:'mysql_use_result'; weak:false),
-    (pvar:@mysql_warning_count; name:'mysql_warning_count'; weak:false),
-    (pvar:@mysql_stmt_init; name:'mysql_stmt_init'; weak:false),
-    (pvar:@mysql_stmt_prepare; name:'mysql_stmt_prepare'; weak:false),
-    (pvar:@mysql_stmt_execute; name:'mysql_stmt_execute'; weak:false),
-    (pvar:@mysql_stmt_fetch; name:'mysql_stmt_fetch'; weak:false),
-    (pvar:@mysql_stmt_fetch_column; name:'mysql_stmt_fetch_column'; weak:false),
-    (pvar:@mysql_stmt_store_result; name:'mysql_stmt_store_result'; weak:false),
-    (pvar:@mysql_stmt_param_count; name:'mysql_stmt_param_count'; weak:false),
-    (pvar:@mysql_stmt_attr_set; name:'mysql_stmt_attr_set'; weak:false),
-    (pvar:@mysql_stmt_attr_get; name:'mysql_stmt_attr_get'; weak:false),
-    (pvar:@mysql_stmt_bind_param; name:'mysql_stmt_bind_param'; weak:false),
-    (pvar:@mysql_stmt_bind_result; name:'mysql_stmt_bind_result'; weak:false),
-    (pvar:@mysql_stmt_close; name:'mysql_stmt_close'; weak:false),
-    (pvar:@mysql_stmt_reset; name:'mysql_stmt_reset'; weak:false),
-    (pvar:@mysql_stmt_free_result; name:'mysql_stmt_free_result'; weak:false),
-    (pvar:@mysql_stmt_send_long_data; name:'mysql_stmt_send_long_data'; weak:false),
-    (pvar:@mysql_stmt_result_metadata; name:'mysql_stmt_result_metadata'; weak:false),
-    (pvar:@mysql_stmt_param_metadata; name:'mysql_stmt_param_metadata'; weak:false),
-    (pvar:@mysql_stmt_errno; name:'mysql_stmt_errno'; weak:false),
-    (pvar:@mysql_stmt_error; name:'mysql_stmt_error'; weak:false),
-    (pvar:@mysql_stmt_sqlstate; name:'mysql_stmt_sqlstate'; weak:false),
-    (pvar:@mysql_stmt_row_seek; name:'mysql_stmt_row_seek'; weak:false),
-    (pvar:@mysql_stmt_row_tell; name:'mysql_stmt_row_tell'; weak:false),
-    (pvar:@mysql_stmt_data_seek; name:'mysql_stmt_data_seek'; weak:false),
-    (pvar:@mysql_stmt_num_rows; name:'mysql_stmt_num_rows'; weak:false),
-    (pvar:@mysql_stmt_affected_rows; name:'mysql_stmt_affected_rows'; weak:false),
-    (pvar:@mysql_stmt_insert_id; name:'mysql_stmt_insert_id'; weak:false),
-    (pvar:@mysql_stmt_field_count; name:'mysql_stmt_field_count'; weak:false)
-  );
-
-type
-  PMysqlArgs = ^TMysqlArgs;
-  TMysqlArgs = record
-    argc: cint;
-    argv: PPchar;
-    groups: PPchar;
-  end;
-
-function mysql_initialize(User: Pointer; Handler: PLibHandler): Boolean;
-var
-  args: PMysqlArgs absolute User;
 begin
-  if Assigned(args) then
-    Result := mysql_library_init(args^.argc, args^.argv, args^.groups) = 0
-  else
-    Result := mysql_library_init(0, nil, nil) = 0;
-
-  if not Result then
-    AppendLibraryError(Handler^, 'mysql_library_init failed');
+  Result := TryInitialiseMysql(LibraryName,argc,argv,groups);
+  If Result = 0 then
+    Raise EInOutError.CreateFmt(SErrLoadFailed,[LibraryName])
+  else If (LibraryName<>LoadedLibrary) then
+    begin
+    Dec(RefCount);
+    Result := RefCount;
+    Raise EInOUtError.CreateFmt(SErrAlreadyLoaded,[LoadedLibrary]);
+    end;
 end;
 
-procedure mysql_finalize(Handler: PLibHandler);
-begin
-  mysql_library_end();
-end;
+Procedure ReleaseMysql;
 
-function TryInitializeMysql(Const LibraryName: String; argc: cint; argv: PPchar; groups: PPchar): Integer;
-var
-  args: TMysqlArgs;
 begin
-  args.argc := argc;
-  args.argv := argv;
-  args.groups := groups;
-  Result := TryInitializeLibrary(MysqlLibrary, LibraryName, @args);
+  if RefCount> 1 then
+    Dec(RefCount)
+  else if RefCount = 1 then
+    begin
+    mysql_library_end;
+    if UnloadLibrary(MysqlLibraryHandle) then
+      begin
+      Dec(RefCount);
+      MysqlLibraryHandle := NilHandle;
+      LoadedLibrary:='';
+      end
+    end
 end;
 
-function InitializeMysql(const LibraryName: String; argc: cint; argv: PPchar; groups: PPchar): Integer;
-var
-  args: TMysqlArgs;
-begin
-  args.argc := argc;
-  args.argv := argv;
-  args.groups := groups;
-  Result := InitializeLibrary(MysqlLibrary, LibraryName, @args);
-end;
+{$ENDIF}
+    function net_new_transaction(net : st_net) : st_net;
+    begin
+      net.pkt_nr := 0;
+      result := net;
+    end;
 
-function ReleaseMysql: Integer;
-begin
-  Result := ReleaseLibrary(MysqlLibrary);
-end;
+    function IS_PRI_KEY(n : longint) : boolean;
+    begin
+      IS_PRI_KEY:=(n and PRI_KEY_FLAG)<>0;
+    end;
 
-function InitialiseMysql(argc: cint; argv: PPchar; groups: PPchar): Integer;
-begin
-  Result := InitializeMysql('', argc, argv, groups);
-end;
+    function IS_NOT_NULL(n : longint) : boolean;
+    begin
+     IS_NOT_NULL:=(n and NOT_NULL_FLAG)<>0;
+    end;
 
-function InitialiseMysql(const LibraryName: String; argc: cint; argv: PPchar; groups: PPchar): Integer;
-begin
-  Result := InitializeMysql(LibraryName, argc, argv, groups);
-end;
+    function IS_BLOB(n : longint) : boolean;
+    begin
+     IS_BLOB:=(n and BLOB_FLAG)<>0;
+    end;
 
-function TryInitialiseMysql(const LibraryName: string; argc: cint; argv: PPchar; groups: PPchar): Integer;
-begin
-  Result := TryInitializeMysql(LibraryName, argc, argv, groups);
-end;
+    function IS_NUM_FIELD(f : pst_mysql_field) : boolean;
+    begin
+       IS_NUM_FIELD:=((f^.flags) and NUM_FLAG)<>0;
+    end;
 
-initialization
-  MysqlLibrary := LibraryHandler('mysql', [mysqllib,mysqlvlib], @mysql_symbols, Length(mysql_symbols), @mysql_initialize, @mysql_finalize);
+    function IS_NUM(t : enum_field_types) : boolean;
+    begin
+{$IF DEFINED(mysql50) or DEFINED(mysql51)}
+      IS_NUM := (t <= FIELD_TYPE_INT24) or (t=FIELD_TYPE_YEAR) or (t=FIELD_TYPE_NEWDECIMAL);
+{$ELSE}
+      IS_NUM := (t <= FIELD_TYPE_INT24) or (t=FIELD_TYPE_YEAR);
 {$ENDIF}
+    end;
 
+    function INTERNAL_NUM_FIELD(f : Pst_mysql_field) : boolean;
+    begin
+      INTERNAL_NUM_FIELD := (f^.ftype <= FIELD_TYPE_INT24) and ((f^.ftype <> FIELD_TYPE_TIMESTAMP)
+      or (f^.length = 14) or (f^.length=8)) or (f^.ftype=FIELD_TYPE_YEAR);
+    end;
+
+    function mysql_reload(mysql : PMySQL) : cint;
+    begin
+      mysql_reload:=mysql_refresh(mysql,REFRESH_GRANT);
+    end;
+
+    function simple_command(mysql,command,arg,length,skip_check : longint) : longint;
+    begin
+      //simple_command:=mysql^.(methods^.advanced_command)(mysqlcommandNullS0arglengthskip_check);
+      result := -1;
+    end;
+
+{$IFDEF LinkDynamically}
+initialization
+  Refcount := 0;
+{$ENDIF}
 end.

+ 1 - 1
packages/mysql/src/mysql40dyn.pp

@@ -4,7 +4,7 @@
 
 unit mysql40dyn;
 
-{$DEFINE LOAD_DYNAMICALLY}
+{$DEFINE LinkDynamically}
 {$UNDEF MYSQL41}
 
 {$i mysql.inc}

+ 1 - 1
packages/mysql/src/mysql41dyn.pp

@@ -4,7 +4,7 @@
 
 unit mysql41dyn;
 
-{$DEFINE LOAD_DYNAMICALLY}
+{$DEFINE LinkDynamically}
 {$DEFINE MYSQL41}
 
 {$i mysql.inc}

+ 1 - 1
packages/mysql/src/mysql4_comtypes.inc

@@ -8,7 +8,7 @@ type
     My_socket = longint;
     my_bool = byte;
     gptr = Pointer;
-    pppchar = ^ppchar;
+
   {
      Common definition between mysql server & client
    }

+ 1 - 1
packages/mysql/src/mysql50dyn.pp

@@ -4,7 +4,7 @@
 
 unit mysql50dyn;
 
-{$DEFINE LOAD_DYNAMICALLY}
+{$DEFINE LinkDynamically}
 {$DEFINE MYSQL50}
 
 {$i mysql.inc}

File diff suppressed because it is too large
+ 161 - 158
packages/sqlite/src/sqlite3.inc


+ 50 - 20
packages/zorba/src/zorba.inc

@@ -21,7 +21,7 @@
 interface
 
 uses
-  ctypes, dynlibs, xqc;
+  Sysutils,ctypes, dynlibs, xqc;
 
 {$IFDEF UNIX}
   {$DEFINE extdecl:=cdecl}
@@ -74,40 +74,70 @@ function TryInitializeZorba(const LibraryName: string = ''): Integer;
 function ReleaseZorba: Integer;
 
 var
-  ZorbaLibrary: TLibHandler;
+  ZorbaLibraryHandle: TLibHandle;
 {$ENDIF LOAD_DYNAMICALLY}
 
 implementation
 
 {$IFDEF LOAD_DYNAMICALLY}
-const
-  zorba_symbols: array[0..6] of TLibSymbol = (
-    (pvar:@create_simple_store; name:'create_simple_store'; weak:false),
-    (pvar:@shutdown_simple_store; name:'shutdown_simple_store'; weak:false),
-    (pvar:@zorba_implementation; name:'zorba_implementation'; weak:false),
-    (pvar:@Zorba_CompilerHints_default; name:'Zorba_CompilerHints_default'; weak:false),
-    (pvar:@Zorba_SerializerOptions_default; name:'Zorba_SerializerOptions_default'; weak:false),
-    (pvar:@Zorba_SerializerOptions_free; name:'Zorba_SerializerOptions_free'; weak:false),
-    (pvar:@Zorba_SerializerOptions_set; name:'Zorba_SerializerOptions_set'; weak:false)
-  );
-
-function TryInitializeZorba(const LibraryName: string): Integer;
+
+ResourceString
+  SErrDefaultsFailed = 'Can not load default Zorba clients ("%s" or "%s"). Check your installation.';
+  SErrLoadFailed     = 'Can not load Zorba client library "%s". Check your installation.';
+  SErrAlreadyLoaded  = 'Zorba interface already initialized from library %s.';
+
+var
+  RefCount : integer;
+  LoadedLibrary : String;
+
+Function TryInitializeZorba(Const LibraryName : String) : integer;
+
 begin
-  Result := TryInitializeLibrary(ZorbaLibrary, LibraryName);
+  Result := 0;
+  if (RefCount=0) then
+    begin
+    ZorbaLibraryHandle:=LoadLibrary(LibraryName);
+    if (ZorbaLibraryHandle=nilhandle) then
+      Exit;
+    inc(RefCount);
+    LoadedLibrary:=LibraryName;    
+    pointer(create_simple_store)   :=GetProcedureAddress(ZorbaLibraryHandle,'create_simple_store');
+    pointer(shutdown_simple_store) :=GetProcedureAddress(ZorbaLibraryHandle,'shutdown_simple_store');
+    pointer(zorba_implementation)  :=GetProcedureAddress(ZorbaLibraryHandle,'zorba_implementation');
+    pointer(Zorba_CompilerHints_default)    :=GetProcedureAddress(ZorbaLibraryHandle,'Zorba_CompilerHints_default');
+    pointer(Zorba_SerializerOptions_default):=GetProcedureAddress(ZorbaLibraryHandle,'Zorba_SerializerOptions_default');
+    pointer(Zorba_SerializerOptions_free)   :=GetProcedureAddress(ZorbaLibraryHandle,'Zorba_SerializerOptions_free');
+    pointer(Zorba_SerializerOptions_set)    :=GetProcedureAddress(ZorbaLibraryHandle,'Zorba_SerializerOptions_set');
+   end
+  else
+    inc(RefCount);
+  Result := RefCount;
 end;
 
 function InitializeZorba(const LibraryName: String): Integer;
 begin
-  Result := InitializeLibrary(ZorbaLibrary, LibraryName);
+  Result := TryInitializeZorba( LibraryName);
+  If Result = 0 then
+    Raise EInOutError.CreateFmt(SErrLoadFailed,[LibraryName])
+  else If (LibraryName<>LoadedLibrary) then
+    begin
+      Dec(RefCount);
+      Result := RefCount;
+      Raise EInOUtError.CreateFmt(SErrAlreadyLoaded,[LoadedLibrary]);
+    end;
 end;
 
 function ReleaseZorba: Integer;
 begin
-  Result := ReleaseLibrary(ZorbaLibrary);
+ if RefCount>1 then
+    Dec(RefCount)
+  else if UnloadLibrary(ZorbaLibraryHandle) then
+    begin
+      Dec(RefCount);
+      ZorbaLibraryHandle := NilHandle;
+      LoadedLibrary:='';
+    end;
 end;
 
-initialization
-  ZorbaLibrary := LibraryHandler('zorba', [zorbalib,zorbavlib], @zorba_symbols, Length(zorba_symbols));
 {$ENDIF}
-
 end.

+ 3 - 306
rtl/inc/dynlibs.pas

@@ -20,9 +20,6 @@ unit dynlibs;
 
 interface
 
-uses
-  SysUtils, RtlConsts, SysConst;
-
 { ---------------------------------------------------------------------
   Read OS-dependent interface declarations.
   ---------------------------------------------------------------------}
@@ -41,86 +38,13 @@ Function LoadLibrary(const Name : AnsiString) : TLibHandle;
 Function GetProcedureAddress(Lib : TlibHandle; const ProcName : AnsiString) : Pointer;
 Function UnloadLibrary(Lib : TLibHandle) : Boolean;
 
-
 // Kylix/Delphi compability
 
-Type
-  HModule = TLibHandle;
-
 Function FreeLibrary(Lib : TLibHandle) : Boolean;
 Function GetProcAddress(Lib : TlibHandle; const ProcName : AnsiString) : Pointer;
 
-
-// Dynamic Library Manager
-
-{ Note: If you look for some code that uses this library handler, take a look at
-    sqlite3.inc of sqlite package (simple) or
-    mysql.inc of mysql package (advanced)
-}
-
-type
-  PLibHandler = ^TLibHandler;
-
-  TLibEventLoading = function(User: Pointer; Handler: PLibHandler): Boolean;
-  TLibEventUnloading = procedure(Handler: PLibHandler);
-
-  TLibIdent = QWord;
-  TLibIdentGetter = function(const Filename: String): TLibIdent;
-
-  PPLibSymbol = ^PLibSymbol;
-  PLibSymbol = ^TLibSymbol;
-  TLibSymbol = record
-    pvar: PPointer;  { pointer to Symbol variable }
-    name: String;    { name of the Symbol }
-    weak: Boolean;   { weak }
-  end;
-
-  PLibSymbolPtrArray = ^TLibSymbolPtrArray;
-  TLibSymbolPtrArray = array of PLibSymbol;
-
-  TLibHandler = record
-    InterfaceName: String;                { abstract name of the library }
-    Defaults     : array of String;       { list of default library filenames }
-    Filename     : String;                { filename of the current loaded library }
-    Handle       : TLibHandle;            { handle of the current loaded library }
-    Loading      : TLibEventLoading;      { loading event, called after the unit is loaded }
-    Unloading    : TLibEventUnloading;    { unloading event, called before the unit is unloaded }
-    IdentGetter  : TLibIdentGetter;       { identifier getter event }
-    Ident        : TLibIdent;             { identifier of the current loaded library }
-    SymCount     : Integer;               { number of symbols }
-    Symbols      : PLibSymbol;            { symbol address- and namelist }
-    ErrorMsg     : String;                { last error message }
-    RefCount     : Integer;               { reference counter }
-  end;
-
-
-{ handler definition }
-function LibraryHandler(const InterfaceName: String; const DefaultLibraries: array of String;
-  const Symbols: PLibSymbol; const SymCount: Integer; const AfterLoading: TLibEventLoading = nil;
-  const BeforeUnloading: TLibEventUnloading = nil; const IdentGetter: TLibIdentGetter = nil): TLibHandler;
-
-{ initialization/finalization }
-function TryInitializeLibrary(var Handler: TLibHandler; const LibraryNames: array of String;
-  const User: Pointer = nil; const NoSymbolErrors: Boolean = True): Integer;
-function TryInitializeLibrary(var Handler: TLibHandler; const LibraryName: String = '';
-  const User: Pointer = nil; const NoSymbolErrors: Boolean = True): Integer;
-function InitializeLibrary(var Handler: TLibHandler; const LibraryNames: array of String;
-  const User: Pointer = nil; const NoSymbolErrors: Boolean = True): Integer;
-function InitializeLibrary(var Handler: TLibHandler; const LibraryName: String = '';
-  const User: Pointer = nil; const NoSymbolErrors: Boolean = True): Integer;
-function ReleaseLibrary(var Handler: TLibHandler): Integer;
-
-{ errors }
-procedure AppendLibraryError(var Handler: TLibHandler; const Msg: String);
-function GetLastLibraryError(var Handler: TLibHandler): String;
-procedure RaiseLibraryException(var Handler: TLibHandler);
-
-{ symbol load/clear }
-function LoadLibrarySymbols(const Lib: TLibHandle; const Symbols: PLibSymbol; const Count: Integer;
-  const ErrorSymbols: PLibSymbolPtrArray = nil): Boolean;
-procedure ClearLibrarySymbols(const Symbols: PLibSymbol; const Count: Integer);
-
-
+Type
+  HModule = TLibHandle; 
 
 Implementation
 
@@ -148,6 +72,7 @@ Function SafeLoadLibrary(const Name : AnsiString) : TLibHandle;
  var w : word;
 {$endif}
 
+
 Begin
 {$ifdef i386}
   w:=get8087cw;
@@ -159,232 +84,4 @@ Begin
 {$endif}
 End;
 
-function LibraryHandler(const InterfaceName: String; const DefaultLibraries: array of String;
-  const Symbols: PLibSymbol; const SymCount: Integer; const AfterLoading: TLibEventLoading;
-  const BeforeUnloading: TLibEventUnloading; const IdentGetter: TLibIdentGetter): TLibHandler;
-var
-  I: Integer;
-begin
-  Result.InterfaceName := InterfaceName;
-  Result.Filename      := '';
-  Result.Handle        := NilHandle;
-  Result.Loading       := AfterLoading;
-  Result.Unloading     := BeforeUnloading;
-  Result.IdentGetter   := IdentGetter;
-  Result.Ident         := 0;
-  Result.SymCount      := SymCount;
-  Result.Symbols       := Symbols;
-  Result.ErrorMsg      := '';
-  Result.RefCount      := 0;
-
-  SetLength(Result.Defaults, Length(DefaultLibraries));
-  for I := 0 to High(DefaultLibraries) do
-    Result.Defaults[I] := DefaultLibraries[I];
-end;
-
-function TryInitializeLibraryInternal(var Handler: TLibHandler; const LibraryName: String;
-  const User: Pointer; const NoSymbolErrors: Boolean): Integer;
-var
-  ErrSyms: TLibSymbolPtrArray;
-  NewIdent: TLibIdent;
-  I: Integer;
-begin
-  if Handler.Filename <> '' then
-  begin
-    if Assigned(Handler.IdentGetter) then
-    begin
-      NewIdent := Handler.IdentGetter(LibraryName);
-      if NewIdent <> Handler.Ident then
-      begin
-        AppendLibraryError(Handler, Format(SLibraryAlreadyLoaded, [Handler.InterfaceName, Handler.Filename]));
-        Result := -1;
-        Exit;
-      end;
-    end;
-  end;
-
-  Result := InterlockedIncrement(Handler.RefCount);
-  if Result = 1 then
-  begin
-    Handler.Handle := LoadLibrary(LibraryName);
-    if Handler.Handle = NilHandle then
-    begin
-      AppendLibraryError(Handler, Format(SLibraryNotLoaded, [Handler.InterfaceName, LibraryName]));
-      Handler.RefCount := 0;
-      Result := -1;
-      Exit;
-    end;
-
-    Handler.Filename := LibraryName;
-
-    if not LoadLibrarySymbols(Handler.Handle, Handler.Symbols, Handler.SymCount, @ErrSyms) and not NoSymbolErrors then
-    begin
-      for I := 0 to Length(ErrSyms) - 1 do
-        AppendLibraryError(Handler, Format(SLibraryUnknownSym, [ErrSyms[I]^.name, Handler.InterfaceName, LibraryName]));
-      UnloadLibrary(Handler.Handle);
-      Handler.Handle := NilHandle;
-      Handler.Filename := '';
-      Handler.RefCount := 0;
-      Result := -1;
-      Exit;
-    end;
-
-    if Assigned(Handler.Loading) and not Handler.Loading(User, @Handler) then
-    begin
-      UnloadLibrary(Handler.Handle);
-      Handler.Handle := NilHandle;
-      Handler.Filename := '';
-      Handler.RefCount := 0;
-      Result := -1;
-      Exit;
-    end;
-
-    if Assigned(Handler.IdentGetter) then
-      Handler.Ident := Handler.IdentGetter(Handler.Filename)
-    else
-      Handler.Ident := 0;
-  end;
-end;
-
-function TryInitializeLibrary(var Handler: TLibHandler; const LibraryName: String;
-  const User: Pointer; const NoSymbolErrors: Boolean): Integer;
-begin
-  if LibraryName <> '' then
-  begin
-    Handler.ErrorMsg := '';
-    Result := TryInitializeLibraryInternal(Handler, LibraryName, User, NoSymbolErrors);
-  end else
-    Result := TryInitializeLibrary(Handler, Handler.Defaults, User, NoSymbolErrors);
-end;
-
-function TryInitializeLibrary(var Handler: TLibHandler; const LibraryNames: array of String;
-  const User: Pointer; const NoSymbolErrors: Boolean): Integer;
-var
-  I: Integer;
-begin
-  Handler.ErrorMsg := '';
-
-  if Length(LibraryNames) <= 0 then
-  begin
-    if Length(Handler.Defaults) > 0 then
-    begin
-      Result := TryInitializeLibrary(Handler, Handler.Defaults, User, NoSymbolErrors);
-      Exit;
-    end;
-
-    AppendLibraryError(Handler, SVarInvalid);
-    Result := -1;
-    Exit;
-  end;
-
-  for I := 0 to High(LibraryNames) do
-  begin
-    Result := TryInitializeLibraryInternal(Handler, LibraryNames[I], User, NoSymbolErrors);
-    if Result > 0 then
-    begin
-      Handler.ErrorMsg := '';
-      Exit;
-    end;
-  end;
-end;
-
-function InitializeLibrary(var Handler: TLibHandler; const LibraryNames: array of String;
-  const User: Pointer; const NoSymbolErrors: Boolean): Integer;
-begin
-  Result := TryInitializeLibrary(Handler, LibraryNames, User, NoSymbolErrors);
-  if Result < 0 then
-    RaiseLibraryException(Handler);
-end;
-
-function InitializeLibrary(var Handler: TLibHandler; const LibraryName: String;
-  const User: Pointer; const NoSymbolErrors: Boolean): Integer;
-begin
-  Result := TryInitializeLibrary(Handler, LibraryName, User, NoSymbolErrors);
-  if Result < 0 then
-    RaiseLibraryException(Handler);
-end;
-
-function ReleaseLibrary(var Handler: TLibHandler): Integer;
-begin
-  Handler.ErrorMsg := '';
-
-  Result := InterlockedDecrement(Handler.RefCount);
-  if Result = 0 then
-  begin
-    if Assigned(Handler.Unloading) then
-      Handler.Unloading(@Handler);
-    ClearLibrarySymbols(Handler.Symbols, Handler.SymCount);
-    UnloadLibrary(Handler.Handle);
-    Handler.Handle := NilHandle;
-    Handler.Filename := '';
-    Handler.Ident := 0;
-  end else
-    if Result < 0 then
-      Handler.RefCount := 0;
-end;
-
-procedure AppendLibraryError(var Handler: TLibHandler; const Msg: String);
-begin
-  if Handler.ErrorMsg <> '' then
-    Handler.ErrorMsg := Handler.ErrorMsg + LineEnding + Msg
-  else
-    Handler.ErrorMsg := Msg;
-end;
-
-function GetLastLibraryError(var Handler: TLibHandler): String;
-begin
-  Result := Handler.ErrorMsg;
-  Handler.ErrorMsg := '';
-end;
-
-procedure RaiseLibraryException(var Handler: TLibHandler);
-var
-  Msg: String;
-begin
-  Msg := GetLastLibraryError(Handler);
-  if Msg <> '' then
-    raise EInOutError.Create(Msg)
-  else
-    raise EInOutError.Create(SUnknown);
-end;
-
-function LoadLibrarySymbols(const Lib: TLibHandle; const Symbols: PLibSymbol; const Count: Integer;
-  const ErrorSymbols: PLibSymbolPtrArray): Boolean;
-var
-  P,L: PLibSymbol;
-  Len: Integer;
-begin
-  P := Symbols;
-  L := @Symbols[Count];
-  while P < L do
-  begin
-    P^.pvar^ := GetProcedureAddress(Lib, P^.name);
-    if not Assigned(P^.pvar^) and not P^.weak then
-    begin
-      if Assigned(ErrorSymbols) then
-      begin
-        Len := Length(ErrorSymbols^);
-        SetLength(ErrorSymbols^, Len+1);
-        ErrorSymbols^[Len] := P;
-      end;
-      Result := False;
-    end;
-    Inc(P);
-  end;
-  Result := True;
-end;
-
-procedure ClearLibrarySymbols(const Symbols: PLibSymbol; const Count: Integer);
-var
-  P,L: PLibSymbol;
-begin
-  P := Symbols;
-  L := @Symbols[Count];
-  while P < L do
-  begin
-    P^.pvar^ := nil;
-    Inc(P);
-  end;
-end;
-
 end.

Some files were not shown because too many files changed in this diff