Browse Source

* modified mysql to use library handler functions of dynlibs.pas (no interface changes)

git-svn-id: trunk@13977 -
ivost 16 years ago
parent
commit
68fd458a8d

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

@@ -22,7 +22,7 @@
 interface
 interface
 
 
 uses
 uses
-{$IFDEF LinkDynamically}
+{$IFDEF LOAD_DYNAMICALLY}
       sysutils,
       sysutils,
 {$ENDIF}
 {$ENDIF}
      dynlibs,ctypes;
      dynlibs,ctypes;
@@ -55,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  }
@@ -81,7 +81,7 @@ uses
 
 
        Pmy_socket = ^my_socket;
        Pmy_socket = ^my_socket;
        my_socket = cint;
        my_socket = cint;
-       
+
        pppchar = ^ppchar;
        pppchar = ^ppchar;
        PPByte     = ^PByte;
        PPByte     = ^PByte;
 
 
@@ -402,7 +402,7 @@ uses
 
 
     function net_new_transaction(net : st_net) : st_net;
     function net_new_transaction(net : st_net) : st_net;
 
 
-{$IFNDEF LinkDynamically}
+{$IFNDEF LOAD_DYNAMICALLY}
     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';
@@ -423,7 +423,7 @@ uses
        sockaddr = record
        sockaddr = record
            // undefined structure
            // undefined structure
          end;
          end;
-{$IFNDEF LinkDynamically}
+{$IFNDEF LOAD_DYNAMICALLY}
     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}
 
 
@@ -483,7 +483,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 LinkDynamically}
+{$IFNDEF LOAD_DYNAMICALLY}
     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';
@@ -523,7 +523,7 @@ uses
 {$ENDIF}
 {$ENDIF}
 
 
 {$ifdef _global_h}
 {$ifdef _global_h}
-{$IFNDEF LinkDynamically}
+{$IFNDEF LOAD_DYNAMICALLY}
     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';
@@ -569,7 +569,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 LinkDynamically}
+{$IFNDEF LOAD_DYNAMICALLY}
       var
       var
          mysql_port : cuint;cvar;external;
          mysql_port : cuint;cvar;external;
          mysql_unix_port : Pchar;cvar;external;
          mysql_unix_port : Pchar;cvar;external;
@@ -578,7 +578,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}
@@ -709,7 +709,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,
@@ -1026,7 +1026,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
@@ -1188,7 +1188,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 LinkDynamically}
+{$IFNDEF LOAD_DYNAMICALLY}
     { 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.     }
@@ -1286,7 +1286,7 @@ uses
       mysql_use_result: function (mysql:PMYSQL):PMYSQL_RES;extdecl;
       mysql_use_result: function (mysql:PMYSQL):PMYSQL_RES;extdecl;
 {$ENDIF}
 {$ENDIF}
 
 
-{$IFNDEF LinkDynamically}
+{$IFNDEF LOAD_DYNAMICALLY}
     { 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';
@@ -1304,7 +1304,7 @@ uses
     const
     const
        LOCAL_INFILE_ERROR_LEN = 512;
        LOCAL_INFILE_ERROR_LEN = 512;
 
 
-{$IFNDEF LinkDynamically}
+{$IFNDEF LOAD_DYNAMICALLY}
 {    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';
@@ -1488,7 +1488,7 @@ uses
 
 
     function mysql_reload(mysql : PMySQL) : cint;
     function mysql_reload(mysql : PMySQL) : cint;
 
 
-{$IFNDEF LinkDynamically}
+{$IFNDEF LOAD_DYNAMICALLY}
 {$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';
@@ -1497,12 +1497,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 LinkDynamically}
+{$IFNDEF LOAD_DYNAMICALLY}
     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}
 
 
@@ -1510,245 +1510,259 @@ uses
 (** unsupported pragma#pragma pack(pop)		/* restore alignment */*)
 (** unsupported pragma#pragma pack(pop)		/* restore alignment */*)
 {$endif}
 {$endif}
 
 
-{$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;
+{$IFDEF LOAD_DYNAMICALLY}
+function InitializeMysql(argc: cint = -1; argv: PPchar = nil; groups: PPchar = nil): Integer;
+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;
+
+var
+  MysqlLibrary: TLibHandler;
 
 
-var MysqlLibraryHandle : TLibHandle;
+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;
 {$ENDIF}
 {$ENDIF}
 
 
 implementation
 implementation
 
 
-{$IFDEF LinkDynamically}
-
-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.';
-
-var 
-  RefCount : integer;
-  LoadedLibrary : String;
+{$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; out ErrorMsg: String): Boolean;
+var
+  args: PMysqlArgs absolute User;
+begin
+  Result := mysql_library_init(args^.argc, args^.argv, args^.groups) = 0;
+  if not Result then
+    ErrorMsg := 'mysql_library_init failed';
+end;
 
 
-Function TryInitialiseMysql(Const LibraryName: String; argc: cint; argv: PPchar; groups: PPchar) : Integer;
+procedure mysql_finalize(User: Pointer; Handler: PLibHandler);
+begin
+  mysql_library_end();
+end;
 
 
+function TryInitializeMysql(Const LibraryName: String; argc: cint; argv: PPchar; groups: PPchar): Integer;
+var
+  args: TMysqlArgs;
 begin
 begin
-  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);
-
-  Result:=RefCount;
+  args.argc := argc;
+  args.argv := argv;
+  args.groups := groups;
+  Result := TryInitializeLibrary(MysqlLibrary, LibraryName, @args);
 end;
 end;
 
 
-Function InitialiseMysql(argc: cint; argv: PPchar; groups: PPchar) : Integer;
+function InitializeMysql(argc: cint; argv: PPchar; groups: PPchar): Integer;
+var
+  args: TMysqlArgs;
+begin
+  args.argc := argc;
+  args.argv := argv;
+  args.groups := groups;
+  Result := InitializeLibrary(MysqlLibrary, [mysqllib,mysqlvlib], @args);
+end;
 
 
+function InitializeMysql(const LibraryName: String; argc: cint; argv: PPchar; groups: PPchar): Integer;
+var
+  args: TMysqlArgs;
 begin
 begin
-  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;
+  args.argc := argc;
+  args.argv := argv;
+  args.groups := groups;
+  Result := InitializeLibrary(MysqlLibrary, LibraryName, @args);
 end;
 end;
 
 
-Function InitialiseMysql(Const LibraryName: String; argc: cint; argv: PPchar; groups:PPchar) : Integer;
+function ReleaseMysql: Integer;
+begin
+  Result := ReleaseLibrary(MysqlLibrary);
+end;
 
 
+function InitialiseMysql(argc: cint; argv: PPchar; groups: PPchar): Integer;
 begin
 begin
-  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;
+  Result := InitializeMysql(argc, argv, groups);
 end;
 end;
 
 
-Procedure ReleaseMysql;
+function InitialiseMysql(const LibraryName: String; argc: cint; argv: PPchar; groups: PPchar): Integer;
+begin
+  Result := InitializeMysql(LibraryName, argc, argv, groups);
+end;
 
 
+function TryInitialiseMysql(const LibraryName: string; argc: cint; argv: PPchar; groups: PPchar): Integer;
 begin
 begin
-  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
+  Result := TryInitializeMysql(LibraryName, argc, argv, groups);
 end;
 end;
 
 
 {$ENDIF}
 {$ENDIF}
-    function net_new_transaction(net : st_net) : st_net;
-    begin
-      net.pkt_nr := 0;
-      result := net;
-    end;
 
 
-    function IS_PRI_KEY(n : longint) : boolean;
-    begin
-      IS_PRI_KEY:=(n and PRI_KEY_FLAG)<>0;
-    end;
 
 
-    function IS_NOT_NULL(n : longint) : boolean;
-    begin
-     IS_NOT_NULL:=(n and NOT_NULL_FLAG)<>0;
-    end;
+function net_new_transaction(net : st_net) : st_net;
+begin
+  net.pkt_nr := 0;
+  result := net;
+end;
 
 
-    function IS_BLOB(n : longint) : boolean;
-    begin
-     IS_BLOB:=(n and BLOB_FLAG)<>0;
-    end;
+function IS_PRI_KEY(n : longint) : boolean;
+begin
+  IS_PRI_KEY:=(n and PRI_KEY_FLAG)<>0;
+end;
+
+function IS_NOT_NULL(n : longint) : boolean;
+begin
+ IS_NOT_NULL:=(n and NOT_NULL_FLAG)<>0;
+end;
 
 
-    function IS_NUM_FIELD(f : pst_mysql_field) : boolean;
-    begin
-       IS_NUM_FIELD:=((f^.flags) and NUM_FLAG)<>0;
-    end;
+function IS_BLOB(n : longint) : boolean;
+begin
+ IS_BLOB:=(n and BLOB_FLAG)<>0;
+end;
 
 
-    function IS_NUM(t : enum_field_types) : boolean;
-    begin
+function IS_NUM_FIELD(f : pst_mysql_field) : boolean;
+begin
+   IS_NUM_FIELD:=((f^.flags) and NUM_FLAG)<>0;
+end;
+
+function IS_NUM(t : enum_field_types) : boolean;
+begin
 {$IFDEF mysql50}
 {$IFDEF mysql50}
-      IS_NUM := (t <= FIELD_TYPE_INT24) or (t=FIELD_TYPE_YEAR) or (t=FIELD_TYPE_NEWDECIMAL);
+  IS_NUM := (t <= FIELD_TYPE_INT24) or (t=FIELD_TYPE_YEAR) or (t=FIELD_TYPE_NEWDECIMAL);
 {$ELSE}
 {$ELSE}
-      IS_NUM := (t <= FIELD_TYPE_INT24) or (t=FIELD_TYPE_YEAR);
+  IS_NUM := (t <= FIELD_TYPE_INT24) or (t=FIELD_TYPE_YEAR);
 {$ENDIF}
 {$ENDIF}
-    end;
+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 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 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;
+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}
+{$IFDEF LOAD_DYNAMICALLY}
 initialization
 initialization
-  Refcount := 0;
+  MysqlLibrary := LibraryHandler('mysql', @mysql_symbols, Length(mysql_symbols), @mysql_initialize, @mysql_finalize);
 {$ENDIF}
 {$ENDIF}
+
 end.
 end.

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

@@ -4,7 +4,7 @@
 
 
 unit mysql40dyn;
 unit mysql40dyn;
 
 
-{$DEFINE LinkDynamically}
+{$DEFINE LOAD_DYNAMICALLY}
 {$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 LinkDynamically}
+{$DEFINE LOAD_DYNAMICALLY}
 {$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 LinkDynamically}
+{$DEFINE LOAD_DYNAMICALLY}
 {$DEFINE MYSQL50}
 {$DEFINE MYSQL50}
 
 
 {$i mysql.inc}
 {$i mysql.inc}