Browse Source

- reverted merge of 13975-13983,13985,13995,13996 (new dynlib loading system
that causes errors if a symbol has not been found)
* manually applied fix for bug in r13362 for sqlite3.inc (it wrongly changed
sqlite3_value_int into sqlite3_value_cint and sqlite3_value_int64 into
sqlite3_value_cint64; the fix was however not documented in any svn
commit message)

git-svn-id: branches/fixes_2_4@16182 -

Jonas Maebe 15 years ago
parent
commit
700500cf1c

+ 404 - 357
packages/ibase/src/ibase60.inc

@@ -1,11 +1,20 @@
+{
+}
+
 {$MODE objfpc}
 {$MODE objfpc}
 {$MACRO on}
 {$MACRO on}
-{$PACKRECORDS C}
 
 
 interface
 interface
 
 
-uses
-  Dynlibs, ctypes;
+{$IFDEF LinkDynamically}
+uses Dynlibs, sysutils,ctypes;
+
+Var
+  UseEmbeddedFirebird : Boolean = False;
+
+{$ELSE}
+uses Dynlibs,ctypes;
+{$ENDIF}
 
 
 {$IFDEF Unix}
 {$IFDEF Unix}
   {$DEFINE extdecl:=cdecl}
   {$DEFINE extdecl:=cdecl}
@@ -22,41 +31,58 @@ uses
     fbembedlib = 'fbembed.dll';
     fbembedlib = 'fbembed.dll';
 {$ENDIF}
 {$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;
+
+  { Signed types }
+
+  Int                  = LongInt;
+  Long                 = LongInt;
+  Short                = SmallInt;
+  Float                = Single;
+
+  { Pointers to basic types }
+
+  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
 Type
-   ISC_SCHAR     = char;
-   ISC_UCHAR     = cuchar;
-   ISC_SHORT     = cshort;
-   ISC_USHORT    = cushort;
+   ISC_USHORT    = word;
    ISC_STATUS    = clong;
    ISC_STATUS    = clong;
-   ISC_INT64     = clonglong;
-   ISC_UINT64    = culonglong;
-{$IFDEF CPU64}
-   ISC_LONG      = cint;
-   ISC_ULONG     = cuint;
-{$ELSE}
-   ISC_LONG      = clong;
-   ISC_ULONG     = culong;
-{$ENDIF}
+   ISC_INT64     = int64;
+   ISC_UINT64    = qword;
+   ISC_LONG      = Longint;
 
 
-   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;
+   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;
+  const
+     DSQL_close = 1;
+     DSQL_drop = 2;
 
 
   {!!MVC
   {!!MVC
     Removed all ISC_FAR, ISC_EXPORT_VARARG and ISC_EXPORT
     Removed all ISC_FAR, ISC_EXPORT_VARARG and ISC_EXPORT
@@ -70,8 +96,8 @@ const
 
 
   type
   type
 
 
-     ISC_DATE = cint;
-     ISC_TIME = cuint;
+     ISC_DATE = longint;
+     ISC_TIME = dword;
      ISC_TIMESTAMP = record
      ISC_TIMESTAMP = record
           timestamp_date : ISC_DATE;
           timestamp_date : ISC_DATE;
           timestamp_time : ISC_TIME;
           timestamp_time : ISC_TIME;
@@ -93,57 +119,19 @@ const
   { Blob id structure                                                }
   { 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;
-
-  ISC_QUAD = GDS_QUAD;
-  TISC_QUAD = ISC_QUAD;
-  PISC_QUAD = ^ISC_QUAD;
-
-  {                               }
-  { InterBase Handle Definitions  }
-  {                               }
+Type
 
 
-  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 !!
 { !!field redefinitions !!
      isc_quad_high = gds_quad_high;
      isc_quad_high = gds_quad_high;
@@ -153,31 +141,31 @@ type
 type
 type
 
 
      ISC_ARRAY_BOUND = record
      ISC_ARRAY_BOUND = record
-          array_bound_lower : cshort;
-          array_bound_upper : cshort;
+          array_bound_lower : smallint;
+          array_bound_upper : smallint;
        end;
        end;
      TISC_ARRAY_BOUND = ISC_ARRAY_BOUND;
      TISC_ARRAY_BOUND = ISC_ARRAY_BOUND;
      PISC_ARRAY_BOUND = ^ISC_ARRAY_BOUND;
      PISC_ARRAY_BOUND = ^ISC_ARRAY_BOUND;
 
 
      ISC_ARRAY_DESC = record
      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;
           array_desc_bounds : array[0..15] of ISC_ARRAY_BOUND;
        end;
        end;
      TISC_ARRAY_DESC = ISC_ARRAY_DESC;
      TISC_ARRAY_DESC = ISC_ARRAY_DESC;
      PISC_ARRAY_DESC = ^ISC_ARRAY_DESC;
      PISC_ARRAY_DESC = ^ISC_ARRAY_DESC;
 
 
      ISC_BLOB_DESC = record
      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;
        end;
      TISC_BLOB_DESC = ISC_BLOB_DESC;
      TISC_BLOB_DESC = ISC_BLOB_DESC;
      PISC_BLOB_DESC = ^ISC_BLOB_DESC ;
      PISC_BLOB_DESC = ^ISC_BLOB_DESC ;
@@ -205,24 +193,24 @@ type
   { Total length of blob  }
   { Total length of blob  }
   { Address of status vector  }
   { Address of status vector  }
   { Application specific data  }
   { Application specific data  }
-  TCTLSourceFunction  = function : ISC_STATUS;
+  TCTLSourceFunction  = function : isc_long;
 
 
      PISC_BLOB_CTL = ^ISC_BLOB_CTL ;
      PISC_BLOB_CTL = ^ISC_BLOB_CTL ;
      ISC_BLOB_CTL = record
      ISC_BLOB_CTL = record
           ctl_source : TCTLSourceFunction;     //  was ISC_STATUS ( *ctl_source)();
           ctl_source : TCTLSourceFunction;     //  was ISC_STATUS ( *ctl_source)();
           ctl_source_handle : pisc_blob_ctl  ; // was struct isc_blob_ctl  * ctl_source_handle;
           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_max_segment : ISC_LONG;
           ctl_number_segments : ISC_LONG;
           ctl_number_segments : ISC_LONG;
           ctl_total_length : ISC_LONG;
           ctl_total_length : ISC_LONG;
           ctl_status : PISC_STATUS;
           ctl_status : PISC_STATUS;
-          ctl_data : array[0..7] of clong;
+          ctl_data : array[0..7] of longint;
        end;
        end;
      TISC_BLOB_CTL = ISC_BLOB_CTL;
      TISC_BLOB_CTL = ISC_BLOB_CTL;
 
 
@@ -237,12 +225,12 @@ type
   { (mode) ? OUTPUT : INPUT  }
   { (mode) ? OUTPUT : INPUT  }
 
 
      BSTREAM = record
      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;
        end;
      TBSTREAM = BSTREAM;
      TBSTREAM = BSTREAM;
      PBstream = ^BSTREAM;
      PBstream = ^BSTREAM;
@@ -280,20 +268,20 @@ type
   { NULL  }
   { NULL  }
 
 
      XSQLVAR = record
      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;
        end;
      TXSQLVAR = XSQLVAR;
      TXSQLVAR = XSQLVAR;
      PXSQLVAR =^XSQLVAR;
      PXSQLVAR =^XSQLVAR;
@@ -305,11 +293,11 @@ type
   { first field address  }
   { first field address  }
 
 
      XSQLDA = record
      XSQLDA = record
-          version : ISC_SHORT;
-          sqldaid : array[0..7] of ISC_SCHAR;
+          version : smallint;
+          sqldaid : array[0..7] of char;
           sqldabc : ISC_LONG;
           sqldabc : ISC_LONG;
-          sqln : ISC_SHORT;
-          sqld : ISC_SHORT;
+          sqln : smallint;
+          sqld : smallint;
           sqlvar : array[0..0] of XSQLVAR;
           sqlvar : array[0..0] of XSQLVAR;
        end;
        end;
      TXSQLDA = XSQLDA;
      TXSQLDA = XSQLDA;
@@ -334,6 +322,44 @@ type
      SQL_DIALECT_V6 = 3;
      SQL_DIALECT_V6 = 3;
   { latest IB DIALECT  }
   { latest IB DIALECT  }
      SQL_DIALECT_CURRENT = SQL_DIALECT_V6;
      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
   type
 
 
      USER_SEC_DATA = record
      USER_SEC_DATA = record
-          sec_flags : cshort;
-          uid : cint;
-          gid : cint;
-          protocol : cint;
+          sec_flags : smallint;
+          uid : longint;
+          gid : longint;
+          protocol : longint;
           server : Pchar;
           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;
        end;
      TUSER_SEC_DATA = USER_SEC_DATA;
      TUSER_SEC_DATA = USER_SEC_DATA;
      PUSER_SEC_DATA = ^USER_SEC_DATA;
      PUSER_SEC_DATA = ^USER_SEC_DATA;
@@ -1599,7 +1625,7 @@ type
      isc_blob_dbase_ole = 23;
      isc_blob_dbase_ole = 23;
      isc_blob_typed_binary = 24;
      isc_blob_typed_binary = 24;
 
 
-{$IFNDEF LOAD_DYNAMICALLY}
+{$IFNDEF LinkDynamically}
 
 
   {                          }
   {                          }
   { OSRI database functions  }
   { 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;
   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;
   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;
   function Bopen2:PBSTREAM; extdecl; external gdslib;
 {$ENDIF}
 {$ENDIF}
 
 
-{$ELSE} // LOAD_DYNAMICALLY
+{$ELSE} // LinkDynamically
 
 
 var
 var
 
 
@@ -2250,7 +2276,7 @@ var
   isc_encode_sql_time : procedure (_para1:pointer; _para2:PISC_TIME); extdecl;
   isc_encode_sql_time : procedure (_para1:pointer; _para2:PISC_TIME); extdecl;
   isc_encode_timestamp : procedure (_para1:pointer; _para2:PISC_TIMESTAMP); 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_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_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_modify_dpb : function (_para1:PPchar; _para2:Psmallint; _para3:word; _para4:Pchar; _para5:smallint):longint; extdecl;
   isc_free : function (_para1:Pchar):ISC_LONG; extdecl;
   isc_free : function (_para1:Pchar):ISC_LONG; extdecl;
@@ -2404,242 +2430,263 @@ var
   isc_suspend_window : function (_para1:PISC_STATUS; _para2:Pisc_win_handle):ISC_STATUS; extdecl;
   isc_suspend_window : function (_para1:PISC_STATUS; _para2:Pisc_win_handle):ISC_STATUS; extdecl;
 {$ENDIF}
 {$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;
+function InitialiseIBase60 : integer;
+procedure ReleaseIBase60;
 
 
-function InitialiseIBase60(Const LibraryName : String) : integer; deprecated;
-function InitialiseIBase60 : integer; deprecated;
-procedure ReleaseIBase60; deprecated;
-
-Var
-  UseEmbeddedFirebird: Boolean = False deprecated;
+var IBaseLibraryHandle : TLibHandle;
 
 
 {$ENDIF}
 {$ENDIF}
 
 
 implementation
 implementation
 
 
-function XSQLDA_LENGTH(n: Integer): Integer;
-begin
-  Result := SizeOf(XSQLDA) + (n - 1) * SizeOf(XSQLVAR);
-end;
+{$IFDEF LinkDynamically}
+
+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;
 
 
-{$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),
+Function TryInitialiseIBase60(Const LibraryName : String) : integer;
+
+begin
+  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}
 {$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),
+    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}
 {$IFDEF Unix}
-    (pvar:@isc_reset_fpe; name:'isc_reset_fpe'; weak:false),
+    pointer(isc_reset_fpe) := GetProcedureAddress(IBaseLibraryHandle,'isc_reset_fpe');
 {$ENDIF}
 {$ENDIF}
-    (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_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)
+    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}
 {$ENDIF}
-  );
-
-function InitializeIBase(UseEmbeddedFirebird: Boolean): Integer;
-begin
-  if UseEmbeddedFirebird then
-    Result := InitializeLibrary(IBaseLibrary, fbembedlib)
+    end
   else
   else
-    Result := InitializeLibrary(IBaseLibrary);
+    inc(RefCount);
+  Result := RefCount;
 end;
 end;
 
 
-function InitializeIBase(const LibraryName: String): Integer;
-begin
-  Result := InitializeLibrary(IBaseLibrary, LibraryName);
-end;
-
-function TryInitializeIBase(const LibraryName: string): Integer;
-begin
-  Result := TryInitializeLibrary(IBaseLibrary, LibraryName);
-end;
+function InitialiseIBase60 : integer;
 
 
-function ReleaseIBase: Integer;
 begin
 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;
 end;
 
 
 function InitialiseIBase60(Const LibraryName : String) : integer;
 function InitialiseIBase60(Const LibraryName : String) : integer;
-begin
-  Result := InitializeIBase(LibraryName);
-end;
 
 
-function InitialiseIBase60: integer;
 begin
 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;
 end;
 
 
-procedure ReleaseIBase60;
+
+Procedure ReleaseIBase60;
+
 begin
 begin
-  ReleaseIBase;
+  if RefCount>1 then
+    Dec(RefCount)
+  else if UnloadLibrary(IBaseLibraryHandle) then 
+    begin
+    Dec(RefCount);
+    IBaseLibraryHandle := NilHandle;
+    LoadedLibrary:='';
+    end;
 end;
 end;
 
 
-initialization
-  IBaseLibrary := LibraryHandler('Interbase', [gdslib,fbclib], @ibsymbols, length(ibsymbols));
 {$ENDIF}
 {$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;
 unit ibase60;
 
 
-{$UNDEF LOAD_DYNAMICALLY}
+{$UNDEF LinkDynamically}
 
 
 {$i ibase60.inc}
 {$i ibase60.inc}
 
 

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

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

+ 237 - 236
packages/mysql/src/mysql.inc

@@ -22,25 +22,30 @@
 interface
 interface
 
 
 uses
 uses
-  dynlibs, ctypes;
+{$IFDEF LinkDynamically}
+      sysutils,
+{$ENDIF}
+     dynlibs,ctypes;
 
 
-{$IFDEF UNIX}
+{$IFDEF Unix}
   {$DEFINE extdecl:=cdecl}
   {$DEFINE extdecl:=cdecl}
   const
   const
     mysqllib = 'libmysqlclient.'+sharedsuffix;
     mysqllib = 'libmysqlclient.'+sharedsuffix;
+
   {$IF DEFINED(mysql50)}
   {$IF DEFINED(mysql50)}
-    mysqlvlib = mysqllib+'.15';
+    mysqlvlib = 'libmysqlclient.'+sharedsuffix+'.15';
   {$ELSEIF DEFINED(mysql41)}
   {$ELSEIF DEFINED(mysql41)}
-    mysqlvlib = mysqllib+'.14';
+    mysqlvlib = 'libmysqlclient.'+sharedsuffix+'.14';
   {$ELSE}
   {$ELSE}
-    mysqlvlib = mysqllib+'.12';
+    mysqlvlib = 'libmysqlclient.'+sharedsuffix+'.12';
   {$ENDIF}
   {$ENDIF}
+
 {$ENDIF}
 {$ENDIF}
-{$IFDEF WINDOWS}
+{$IFDEF Windows}
   {$DEFINE extdecl:=stdcall}
   {$DEFINE extdecl:=stdcall}
   const
   const
     mysqllib = 'libmysql.dll';
     mysqllib = 'libmysql.dll';
-    mysqlvlib = mysqllib;
+    mysqlvlib = 'libmysql.dll';
 {$ENDIF}
 {$ENDIF}
 
 
 {$IFDEF mysql50}
 {$IFDEF mysql50}
@@ -50,17 +55,17 @@ uses
 {$PACKRECORDS C}
 {$PACKRECORDS C}
 
 
   { Copyright (C) 2000-2003 MySQL AB
   { Copyright (C) 2000-2003 MySQL AB
-
+  
      This program is free software; you can redistribute it and/or modify
      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
      it under the terms of the GNU General Public License as published by
      the Free Software Foundation; either version 2 of the License, or
      the Free Software Foundation; either version 2 of the License, or
      (at your option) any later version.
      (at your option) any later version.
-
+  
      This program is distributed in the hope that it will be useful,
      This program is distributed in the hope that it will be useful,
      but WITHOUT ANY WARRANTY; without even the implied warranty of
      but WITHOUT ANY WARRANTY; without even the implied warranty of
      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      GNU General Public License for more details.
      GNU General Public License for more details.
-
+  
      You should have received a copy of the GNU General Public License
      You should have received a copy of the GNU General Public License
      along with this program; if not, write to the Free Software
      along with this program; if not, write to the Free Software
      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA  }
      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA  }
@@ -78,7 +83,7 @@ uses
 
 
        Pmy_socket = ^my_socket;
        Pmy_socket = ^my_socket;
        my_socket = cint;
        my_socket = cint;
-
+       
 {  ------------ Start of declaration in "mysql_com.h"   ---------------------  }
 {  ------------ Start of declaration in "mysql_com.h"   ---------------------  }
 
 
   {
   {
@@ -396,7 +401,7 @@ uses
 
 
     function net_new_transaction(net : st_net) : st_net;
     function net_new_transaction(net : st_net) : st_net;
 
 
-{$IFNDEF LOAD_DYNAMICALLY}
+{$IFNDEF LinkDynamically}
     function my_net_init(net:PNET; vio:PVio):my_bool;cdecl;external mysqllib name 'my_net_init';
     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 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_end(net:PNET);cdecl;external mysqllib name 'net_end';
@@ -417,7 +422,7 @@ uses
        sockaddr = record
        sockaddr = record
            // undefined structure
            // undefined structure
          end;
          end;
-{$IFNDEF LOAD_DYNAMICALLY}
+{$IFNDEF LinkDynamically}
     function my_connect(s:my_socket; name:Psockaddr; namelen:cuint; timeout:cuint):cint;cdecl;external mysqllib name 'my_connect';
     function my_connect(s:my_socket; name:Psockaddr; namelen:cuint; timeout:cuint):cint;cdecl;external mysqllib name 'my_connect';
 {$ENDIF}
 {$ENDIF}
 
 
@@ -477,7 +482,7 @@ uses
 
 
     { These functions are used for authentication by client and server and
     { These functions are used for authentication by client and server and
       implemented in sql/password.c     }
       implemented in sql/password.c     }
-{$IFNDEF LOAD_DYNAMICALLY}
+{$IFNDEF LinkDynamically}
     procedure randominit(_para1:Prand_struct; seed1:culong; seed2:culong);cdecl;external mysqllib name 'randominit';
     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';
     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 create_random_string(fto:Pchar; length:cuint; rand_st:Prand_struct);cdecl;external mysqllib name 'create_random_string';
@@ -517,7 +522,7 @@ uses
 {$ENDIF}
 {$ENDIF}
 
 
 {$ifdef _global_h}
 {$ifdef _global_h}
-{$IFNDEF LOAD_DYNAMICALLY}
+{$IFNDEF LinkDynamically}
     function net_field_length(packet:PPuchar):culong;extdecl;external mysqllib name 'net_field_length_ll';
     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_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';
     function net_store_length(pkg:Pchar; length:ulonglong):Pchar;cdecl;external mysqllib name 'net_store_length';
@@ -563,7 +568,7 @@ uses
 { $include "typelib.h"}
 { $include "typelib.h"}
 { $include "my_list.h" /* for LISTs used in 'MYSQL' and 'MYSQL_STMT' */}
 { $include "my_list.h" /* for LISTs used in 'MYSQL' and 'MYSQL_STMT' */}
 
 
-{$IFNDEF LOAD_DYNAMICALLY}
+{$IFNDEF LinkDynamically}
       var
       var
          mysql_port : cuint;cvar;external;
          mysql_port : cuint;cvar;external;
          mysql_unix_port : Pchar;cvar;external;
          mysql_unix_port : Pchar;cvar;external;
@@ -572,7 +577,7 @@ uses
       const
       const
          CLIENT_NET_READ_TIMEOUT = 365*24*3600;     // Timeout on read
          CLIENT_NET_READ_TIMEOUT = 365*24*3600;     // Timeout on read
          CLIENT_NET_WRITE_TIMEOUT = 365*24*3600;    // Timeout on write
          CLIENT_NET_WRITE_TIMEOUT = 365*24*3600;    // Timeout on write
-
+      
 {$ifdef NETWARE}
 {$ifdef NETWARE}
 (** unsupported pragma#pragma pack(push, 8)		/* 8 byte alignment */*)
 (** unsupported pragma#pragma pack(push, 8)		/* 8 byte alignment */*)
 {$endif}
 {$endif}
@@ -703,7 +708,7 @@ uses
 {$ENDIF}
 {$ENDIF}
 { $endif}
 { $endif}
          end;
          end;
-
+         
        MYSQL_DATA = st_mysql_data;
        MYSQL_DATA = st_mysql_data;
        PMYSQL_DATA = ^MYSQL_DATA;
        PMYSQL_DATA = ^MYSQL_DATA;
        mysql_option = (MYSQL_OPT_CONNECT_TIMEOUT,MYSQL_OPT_COMPRESS,
        mysql_option = (MYSQL_OPT_CONNECT_TIMEOUT,MYSQL_OPT_COMPRESS,
@@ -1020,7 +1025,7 @@ uses
 
 
     {
     {
       Note: this info is from the mysql-5.0 version:
       Note: this info is from the mysql-5.0 version:
-
+    
       This structure is used to define bind information, and
       This structure is used to define bind information, and
       internally by the client library.
       internally by the client library.
       Public members with their descriptions are listed below
       Public members with their descriptions are listed below
@@ -1182,7 +1187,7 @@ uses
 //#define max_allowed_packet (*mysql_get_parameters()->p_max_allowed_packet)
 //#define max_allowed_packet (*mysql_get_parameters()->p_max_allowed_packet)
 //#define net_buffer_length (*mysql_get_parameters()->p_net_buffer_length)
 //#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
     { Set up and bring down the server; to ensure that applications will
       work when linked against either the standard client library or the
       work when linked against either the standard client library or the
       embedded server library, these functions should be called.     }
       embedded server library, these functions should be called.     }
@@ -1280,7 +1285,7 @@ uses
       mysql_use_result: function (mysql:PMYSQL):PMYSQL_RES;extdecl;
       mysql_use_result: function (mysql:PMYSQL):PMYSQL_RES;extdecl;
 {$ENDIF}
 {$ENDIF}
 
 
-{$IFNDEF LOAD_DYNAMICALLY}
+{$IFNDEF LinkDynamically}
     { perform query on master  }
     { perform query on master  }
     function mysql_master_query(mysql:PMYSQL; q:Pchar; length:culong):my_bool;extdecl;external mysqllib name 'mysql_master_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';
     function mysql_master_send_query(mysql:PMYSQL; q:Pchar; length:culong):my_bool;extdecl;external mysqllib name 'mysql_master_send_query';
@@ -1298,7 +1303,7 @@ uses
     const
     const
        LOCAL_INFILE_ERROR_LEN = 512;
        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
 {    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 mysqllib name 'mysql_set_local_infile_handler';}
                 _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';
     procedure mysql_set_local_infile_default(mysql:PMYSQL);cdecl;external mysqllib name 'mysql_set_local_infile_default';
@@ -1482,7 +1487,7 @@ uses
 
 
     function mysql_reload(mysql : PMySQL) : cint;
     function mysql_reload(mysql : PMySQL) : cint;
 
 
-{$IFNDEF LOAD_DYNAMICALLY}
+{$IFNDEF LinkDynamically}
 {$ifdef USE_OLD_FUNCTIONS}
 {$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_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';
     function mysql_create_db(mysql:PMYSQL; DB:Pchar):cint;extdecl;external External_library name 'mysql_create_db';
@@ -1491,12 +1496,12 @@ uses
 {$endif}
 {$endif}
 {$endif}
 {$endif}
 
 
-{$define HAVE_MYSQL_REAL_CONNECT}
+{$define HAVE_MYSQL_REAL_CONNECT}    
     { The following functions are mainly exported because of mysqlbinlog;
     { The following functions are mainly exported because of mysqlbinlog;
       They are not for general usage     }
       They are not for general usage     }
 
 
     function simple_command(mysql,command,arg,length,skip_check : cint) : cint;
     function simple_command(mysql,command,arg,length,skip_check : cint) : cint;
-{$IFNDEF LOAD_DYNAMICALLY}
+{$IFNDEF LinkDynamically}
     function net_safe_read(mysql:PMYSQL):cuint;cdecl;external mysqllib name 'net_safe_read';
     function net_safe_read(mysql:PMYSQL):cuint;cdecl;external mysqllib name 'net_safe_read';
 {$ENDIF}
 {$ENDIF}
 
 
@@ -1504,249 +1509,245 @@ uses
 (** unsupported pragma#pragma pack(pop)		/* restore alignment */*)
 (** unsupported pragma#pragma pack(pop)		/* restore alignment */*)
 {$endif}
 {$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}
 {$ENDIF}
 
 
 implementation
 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
 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;
 end;
 
 
-function IS_NUM(t : enum_field_types) : boolean;
-begin
-{$IFDEF mysql50}
-  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 InitialiseMysql(argc: cint; argv: PPchar; groups: PPchar) : Integer;
 
 
-function INTERNAL_NUM_FIELD(f : Pst_mysql_field) : boolean;
 begin
 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);
+  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;
 end;
 
 
-function mysql_reload(mysql : PMySQL) : cint;
-begin
-  mysql_reload:=mysql_refresh(mysql,REFRESH_GRANT);
-end;
+Function InitialiseMysql(Const LibraryName: String; argc: cint; argv: PPchar; groups:PPchar) : Integer;
 
 
-function simple_command(mysql,command,arg,length,skip_check : longint) : longint;
 begin
 begin
-  //simple_command:=mysql^.(methods^.advanced_command)(mysqlcommandNullS0arglengthskip_check);
-  result := -1;
+  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;
 end;
 
 
+Procedure ReleaseMysql;
 
 
-{$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:false),
-    (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
 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');
+  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;
 end;
 
 
-procedure mysql_finalize(Handler: PLibHandler);
-begin
-  mysql_library_end();
-end;
+{$ENDIF}
+    function net_new_transaction(net : st_net) : st_net;
+    begin
+      net.pkt_nr := 0;
+      result := net;
+    end;
 
 
-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);
-end;
+    function IS_PRI_KEY(n : longint) : boolean;
+    begin
+      IS_PRI_KEY:=(n and PRI_KEY_FLAG)<>0;
+    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;
+    function IS_NOT_NULL(n : longint) : boolean;
+    begin
+     IS_NOT_NULL:=(n and NOT_NULL_FLAG)<>0;
+    end;
 
 
-function ReleaseMysql: Integer;
-begin
-  Result := ReleaseLibrary(MysqlLibrary);
-end;
+    function IS_BLOB(n : longint) : boolean;
+    begin
+     IS_BLOB:=(n and BLOB_FLAG)<>0;
+    end;
 
 
-function InitialiseMysql(argc: cint; argv: PPchar; groups: PPchar): Integer;
-begin
-  Result := InitializeMysql('', argc, argv, groups);
-end;
+    function IS_NUM_FIELD(f : pst_mysql_field) : boolean;
+    begin
+       IS_NUM_FIELD:=((f^.flags) and NUM_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_NUM(t : enum_field_types) : boolean;
+    begin
+{$IFDEF mysql50}
+      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 TryInitialiseMysql(const LibraryName: string; argc: cint; argv: PPchar; groups: PPchar): Integer;
-begin
-  Result := TryInitializeMysql(LibraryName, argc, argv, groups);
-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
 initialization
-  MysqlLibrary := LibraryHandler('mysql', [mysqllib,mysqlvlib], @mysql_symbols, Length(mysql_symbols), @mysql_initialize, @mysql_finalize);
+  Refcount := 0;
 {$ENDIF}
 {$ENDIF}
-
 end.
 end.

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

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

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

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

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

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

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


+ 115 - 25
packages/zorba/examples/simple/simple.lpi

@@ -35,8 +35,8 @@
         <Filename Value="simple.lpr"/>
         <Filename Value="simple.lpr"/>
         <IsPartOfProject Value="True"/>
         <IsPartOfProject Value="True"/>
         <UnitName Value="simple"/>
         <UnitName Value="simple"/>
-        <CursorPos X="24" Y="19"/>
-        <TopLine Value="17"/>
+        <CursorPos X="4" Y="69"/>
+        <TopLine Value="60"/>
         <EditorIndex Value="0"/>
         <EditorIndex Value="0"/>
         <UsageCount Value="20"/>
         <UsageCount Value="20"/>
         <Loaded Value="True"/>
         <Loaded Value="True"/>
@@ -46,13 +46,17 @@
         <UnitName Value="zorba"/>
         <UnitName Value="zorba"/>
         <CursorPos X="7" Y="3"/>
         <CursorPos X="7" Y="3"/>
         <TopLine Value="1"/>
         <TopLine Value="1"/>
+        <EditorIndex Value="4"/>
         <UsageCount Value="10"/>
         <UsageCount Value="10"/>
+        <Loaded Value="True"/>
       </Unit1>
       </Unit1>
       <Unit2>
       <Unit2>
         <Filename Value="../../src/zorba.inc"/>
         <Filename Value="../../src/zorba.inc"/>
         <CursorPos X="5" Y="937"/>
         <CursorPos X="5" Y="937"/>
         <TopLine Value="915"/>
         <TopLine Value="915"/>
+        <EditorIndex Value="5"/>
         <UsageCount Value="10"/>
         <UsageCount Value="10"/>
+        <Loaded Value="True"/>
       </Unit2>
       </Unit2>
       <Unit3>
       <Unit3>
         <Filename Value="../../../../../zorba/zorba/include/simplestore/simplestorec.h"/>
         <Filename Value="../../../../../zorba/zorba/include/simplestore/simplestorec.h"/>
@@ -64,14 +68,16 @@
       <Unit4>
       <Unit4>
         <Filename Value="../../src/zorba_error.inc"/>
         <Filename Value="../../src/zorba_error.inc"/>
         <CursorPos X="5" Y="28"/>
         <CursorPos X="5" Y="28"/>
-        <TopLine Value="1"/>
+        <TopLine Value="6"/>
+        <EditorIndex Value="3"/>
         <UsageCount Value="10"/>
         <UsageCount Value="10"/>
+        <Loaded Value="True"/>
       </Unit4>
       </Unit4>
       <Unit5>
       <Unit5>
         <Filename Value="../../../../../zorba/zorba/include/zorba/zorbac.h"/>
         <Filename Value="../../../../../zorba/zorba/include/zorba/zorbac.h"/>
         <CursorPos X="17" Y="262"/>
         <CursorPos X="17" Y="262"/>
-        <TopLine Value="262"/>
-        <EditorIndex Value="4"/>
+        <TopLine Value="312"/>
+        <EditorIndex Value="7"/>
         <UsageCount Value="10"/>
         <UsageCount Value="10"/>
         <Loaded Value="True"/>
         <Loaded Value="True"/>
         <SyntaxHighlighter Value="C++"/>
         <SyntaxHighlighter Value="C++"/>
@@ -80,7 +86,7 @@
         <Filename Value="../../src/zorba_options.inc"/>
         <Filename Value="../../src/zorba_options.inc"/>
         <CursorPos X="3" Y="104"/>
         <CursorPos X="3" Y="104"/>
         <TopLine Value="82"/>
         <TopLine Value="82"/>
-        <EditorIndex Value="3"/>
+        <EditorIndex Value="6"/>
         <UsageCount Value="10"/>
         <UsageCount Value="10"/>
         <Loaded Value="True"/>
         <Loaded Value="True"/>
       </Unit6>
       </Unit6>
@@ -102,43 +108,127 @@
         <Loaded Value="True"/>
         <Loaded Value="True"/>
       </Unit8>
       </Unit8>
     </Units>
     </Units>
-    <JumpHistory Count="9" HistoryIndex="8">
+    <JumpHistory Count="30" HistoryIndex="29">
       <Position1>
       <Position1>
-        <Filename Value="simple.lpr"/>
-        <Caret Line="16" Column="23" TopLine="2"/>
+        <Filename Value="../../src/zorba.inc"/>
+        <Caret Line="13" Column="53" TopLine="1"/>
       </Position1>
       </Position1>
       <Position2>
       <Position2>
-        <Filename Value="simple.lpr"/>
-        <Caret Line="22" Column="11" TopLine="1"/>
+        <Filename Value="../../src/zorba.inc"/>
+        <Caret Line="81" Column="39" TopLine="59"/>
       </Position2>
       </Position2>
       <Position3>
       <Position3>
-        <Filename Value="simple.lpr"/>
-        <Caret Line="21" Column="20" TopLine="1"/>
+        <Filename Value="../../src/zorba.inc"/>
+        <Caret Line="322" Column="45" TopLine="300"/>
       </Position3>
       </Position3>
       <Position4>
       <Position4>
-        <Filename Value="simple.lpr"/>
-        <Caret Line="20" Column="4" TopLine="1"/>
+        <Filename Value="../../src/zorba.inc"/>
+        <Caret Line="327" Column="39" TopLine="300"/>
       </Position4>
       </Position4>
       <Position5>
       <Position5>
-        <Filename Value="simple.lpr"/>
-        <Caret Line="79" Column="30" TopLine="52"/>
+        <Filename Value="../../src/zorba.inc"/>
+        <Caret Line="333" Column="111" TopLine="300"/>
       </Position5>
       </Position5>
       <Position6>
       <Position6>
-        <Filename Value="simple.lpr"/>
-        <Caret Line="92" Column="5" TopLine="59"/>
+        <Filename Value="../../src/zorba.inc"/>
+        <Caret Line="1953" Column="26" TopLine="1931"/>
       </Position6>
       </Position6>
       <Position7>
       <Position7>
-        <Filename Value="simple.lpr"/>
-        <Caret Line="83" Column="18" TopLine="59"/>
+        <Filename Value="../../src/zorba.inc"/>
+        <Caret Line="1956" Column="19" TopLine="1931"/>
       </Position7>
       </Position7>
       <Position8>
       <Position8>
-        <Filename Value="simple.lpr"/>
-        <Caret Line="62" Column="1" TopLine="25"/>
+        <Filename Value="../../src/zorba.inc"/>
+        <Caret Line="1961" Column="42" TopLine="1931"/>
       </Position8>
       </Position8>
       <Position9>
       <Position9>
-        <Filename Value="simple.lpr"/>
-        <Caret Line="84" Column="18" TopLine="60"/>
+        <Filename Value="../../src/zorba.inc"/>
+        <Caret Line="1965" Column="46" TopLine="1931"/>
       </Position9>
       </Position9>
+      <Position10>
+        <Filename Value="../../src/zorba.inc"/>
+        <Caret Line="1969" Column="73" TopLine="1931"/>
+      </Position10>
+      <Position11>
+        <Filename Value="../../src/zorba.inc"/>
+        <Caret Line="1972" Column="42" TopLine="1943"/>
+      </Position11>
+      <Position12>
+        <Filename Value="../../src/zorba.inc"/>
+        <Caret Line="6" Column="1" TopLine="1"/>
+      </Position12>
+      <Position13>
+        <Filename Value="../../src/zorba.inc"/>
+        <Caret Line="81" Column="39" TopLine="59"/>
+      </Position13>
+      <Position14>
+        <Filename Value="../../src/zorba.inc"/>
+        <Caret Line="322" Column="45" TopLine="300"/>
+      </Position14>
+      <Position15>
+        <Filename Value="../../src/zorba.inc"/>
+        <Caret Line="327" Column="39" TopLine="300"/>
+      </Position15>
+      <Position16>
+        <Filename Value="../../src/zorba.inc"/>
+        <Caret Line="333" Column="111" TopLine="300"/>
+      </Position16>
+      <Position17>
+        <Filename Value="../../src/zorba.inc"/>
+        <Caret Line="1953" Column="26" TopLine="1931"/>
+      </Position17>
+      <Position18>
+        <Filename Value="../../src/zorba.inc"/>
+        <Caret Line="1956" Column="19" TopLine="1931"/>
+      </Position18>
+      <Position19>
+        <Filename Value="../../src/zorba.inc"/>
+        <Caret Line="1961" Column="42" TopLine="1931"/>
+      </Position19>
+      <Position20>
+        <Filename Value="../../src/zorba.inc"/>
+        <Caret Line="1965" Column="46" TopLine="1931"/>
+      </Position20>
+      <Position21>
+        <Filename Value="../../src/zorba.inc"/>
+        <Caret Line="1969" Column="73" TopLine="1931"/>
+      </Position21>
+      <Position22>
+        <Filename Value="../../src/zorba.inc"/>
+        <Caret Line="1972" Column="42" TopLine="1931"/>
+      </Position22>
+      <Position23>
+        <Filename Value="simple.lpr"/>
+        <Caret Line="16" Column="23" TopLine="2"/>
+      </Position23>
+      <Position24>
+        <Filename Value="simple.lpr"/>
+        <Caret Line="22" Column="11" TopLine="1"/>
+      </Position24>
+      <Position25>
+        <Filename Value="simple.lpr"/>
+        <Caret Line="21" Column="20" TopLine="1"/>
+      </Position25>
+      <Position26>
+        <Filename Value="simple.lpr"/>
+        <Caret Line="20" Column="4" TopLine="1"/>
+      </Position26>
+      <Position27>
+        <Filename Value="simple.lpr"/>
+        <Caret Line="79" Column="30" TopLine="52"/>
+      </Position27>
+      <Position28>
+        <Filename Value="simple.lpr"/>
+        <Caret Line="92" Column="5" TopLine="59"/>
+      </Position28>
+      <Position29>
+        <Filename Value="simple.lpr"/>
+        <Caret Line="83" Column="18" TopLine="59"/>
+      </Position29>
+      <Position30>
+        <Filename Value="simple.lpr"/>
+        <Caret Line="62" Column="1" TopLine="25"/>
+      </Position30>
     </JumpHistory>
     </JumpHistory>
   </ProjectOptions>
   </ProjectOptions>
   <CompilerOptions>
   <CompilerOptions>

+ 6 - 278
rtl/inc/dynlibs.pas

@@ -20,9 +20,6 @@ unit dynlibs;
 
 
 interface
 interface
 
 
-uses
-  SysUtils, RtlConsts, SysConst;
-
 { ---------------------------------------------------------------------
 { ---------------------------------------------------------------------
   Read OS-dependent interface declarations.
   Read OS-dependent interface declarations.
   ---------------------------------------------------------------------}
   ---------------------------------------------------------------------}
@@ -41,77 +38,13 @@ Function LoadLibrary(Name : AnsiString) : TLibHandle;
 Function GetProcedureAddress(Lib : TlibHandle; ProcName : AnsiString) : Pointer;
 Function GetProcedureAddress(Lib : TlibHandle; ProcName : AnsiString) : Pointer;
 Function UnloadLibrary(Lib : TLibHandle) : Boolean;
 Function UnloadLibrary(Lib : TLibHandle) : Boolean;
 
 
-
 // Kylix/Delphi compability
 // Kylix/Delphi compability
 
 
-Type
-  HModule = TLibHandle;
-
 Function FreeLibrary(Lib : TLibHandle) : Boolean;
 Function FreeLibrary(Lib : TLibHandle) : Boolean;
 Function GetProcAddress(Lib : TlibHandle; ProcName : AnsiString) : Pointer;
 Function GetProcAddress(Lib : TlibHandle; 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);
-
-  PPLibSymbol = ^PLibSymbol;
-  PLibSymbol = ^TLibSymbol;
-  TLibSymbol = record
-    pvar: PPointer;  { pointer to Symbol variable }
-    name: String;    { name of the Symbol }
-    weak: Boolean;   { weak }
-  end;
-
-  TLibHandler = record
-    InterfaceName: String;                { abstract name of the library }
-    Defaults     : array of String;       { list of default library filenames }
-    Filename     : String;                { handle of the current loaded library }
-    Handle       : TLibHandle;            { filename 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 }
-    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): TLibHandler;
-
-{ initialization/finalization }
-function TryInitializeLibrary(var Handler: TLibHandler; const LibraryNames: array of String;
-  const User: Pointer = nil; const NoSymbolErrors: Boolean = False): Integer;
-function TryInitializeLibrary(var Handler: TLibHandler; const LibraryName: String = '';
-  const User: Pointer = nil; const NoSymbolErrors: Boolean = False): Integer;
-function InitializeLibrary(var Handler: TLibHandler; const LibraryNames: array of String;
-  const User: Pointer = nil; const NoSymbolErrors: Boolean = False): Integer;
-function InitializeLibrary(var Handler: TLibHandler; const LibraryName: String = '';
-  const User: Pointer = nil; const NoSymbolErrors: Boolean = False): 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 ErrorSym: PPLibSymbol = nil): Boolean;
-procedure ClearLibrarySymbols(const Symbols: PLibSymbol; const Count: Integer);
-
+Type
+  HModule = TLibHandle; 
 
 
 // these are for easier crossplatform construction of dll names in dynloading libs.
 // these are for easier crossplatform construction of dll names in dynloading libs.
 Const
 Const
@@ -124,11 +57,11 @@ Const
      {$ifdef OS2}
      {$ifdef OS2}
        SharedSuffix = 'dll';
        SharedSuffix = 'dll';
      {$else}
      {$else}
-       SharedSuffix = 'so';
+       SharedSuffix = 'so';  
      {$endif}
      {$endif}
    {$endif}
    {$endif}
- {$endif}
-
+ {$endif}      
+      
 Implementation
 Implementation
 
 
 { ---------------------------------------------------------------------
 { ---------------------------------------------------------------------
@@ -155,6 +88,7 @@ Function SafeLoadLibrary(Name : AnsiString) : TLibHandle;
  var w : word;
  var w : word;
 {$endif}
 {$endif}
 
 
+
 Begin
 Begin
 {$ifdef i386}
 {$ifdef i386}
   w:=get8087cw;
   w:=get8087cw;
@@ -166,210 +100,4 @@ Begin
 {$endif}
 {$endif}
 End;
 End;
 
 
-function LibraryHandler(const InterfaceName: String; const DefaultLibraries: array of String;
-  const Symbols: PLibSymbol; const SymCount: Integer; const AfterLoading: TLibEventLoading;
-  const BeforeUnloading: TLibEventUnloading): TLibHandler;
-var
-  I: Integer;
-begin
-  Result.InterfaceName := InterfaceName;
-  Result.Filename      := '';
-  Result.Handle        := NilHandle;
-  Result.Loading       := AfterLoading;
-  Result.Unloading     := BeforeUnloading;
-  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
-  ErrSym: PLibSymbol;
-begin
-  if (Handler.Filename <> '') and (Handler.Filename <> LibraryName) then
-  begin
-    AppendLibraryError(Handler, Format(SLibraryAlreadyLoaded, [Handler.InterfaceName, Handler.Filename]));
-    Result := -1;
-    Exit;
-  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, @ErrSym) and not NoSymbolErrors then
-    begin
-      AppendLibraryError(Handler, Format(SLibraryUnknownSym, [ErrSym^.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;
-  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 := '';
-  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 ErrorSym: PPLibSymbol): Boolean;
-var
-  P,L: PLibSymbol;
-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(ErrorSym) then
-        ErrorSym^ := P;
-      Result := False;
-      Exit;
-    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.
 end.

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