Bläddra i källkod

Merged revisions 1780-1783,1800 via svnmerge from
svn+ssh://www.freepascal.org/FPC/svn/fpc/trunk

........
r1780 | joost | 2005-11-18 15:28:42 +0100 (Fri, 18 Nov 2005) | 1 line

+ initial implementation of mysql40[dyn].pp and mysql41[dyn].pp
........
r1781 | joost | 2005-11-18 17:50:08 +0100 (Fri, 18 Nov 2005) | 1 line

+ added SQLDB support for MySQL v4.0 and v4.1
........
r1782 | joost | 2005-11-18 17:51:42 +0100 (Fri, 18 Nov 2005) | 1 line

+ added mysql40conn.pas and mysql41conn.pas, needed for revision 1781
........
r1783 | joost | 2005-11-18 21:21:48 +0100 (Fri, 18 Nov 2005) | 1 line

+ added mysql4conn for backwards-compatibility
........
r1800 | joost | 2005-11-22 01:52:58 +0100 (Tue, 22 Nov 2005) | 2 lines

+ added support for MySQL 5.0
+ added mysql_stmt_* calls to dyn. loaded mysql-library
........

git-svn-id: branches/fixes_2_0@1879 -

joost 20 år sedan
förälder
incheckning
ecc8ef0c5f

+ 11 - 0
.gitattributes

@@ -639,7 +639,11 @@ fcl/db/sqldb/interbase/Makefile.fpc svneol=native#text/plain
 fcl/db/sqldb/interbase/ibconnection.pp svneol=native#text/plain
 fcl/db/sqldb/mysql/Makefile svneol=native#text/plain
 fcl/db/sqldb/mysql/Makefile.fpc svneol=native#text/plain
+fcl/db/sqldb/mysql/mysql40conn.pas svneol=native#text/plain
+fcl/db/sqldb/mysql/mysql41conn.pas svneol=native#text/plain
 fcl/db/sqldb/mysql/mysql4conn.pas svneol=native#text/plain
+fcl/db/sqldb/mysql/mysql50conn.pas svneol=native#text/plain
+fcl/db/sqldb/mysql/mysqlconn.inc svneol=native#text/plain
 fcl/db/sqldb/odbc/Makefile svneol=native#text/plain
 fcl/db/sqldb/odbc/Makefile.fpc svneol=native#text/plain
 fcl/db/sqldb/odbc/odbcconn.pas svneol=native#text/plain
@@ -1388,6 +1392,7 @@ packages/base/mysql/Makefile.fpc svneol=native#text/plain
 packages/base/mysql/README -text
 packages/base/mysql/mkdb -text
 packages/base/mysql/my4_sys.pp svneol=native#text/plain
+packages/base/mysql/mysql.inc svneol=native#text/plain
 packages/base/mysql/mysql3.pp svneol=native#text/plain
 packages/base/mysql/mysql3_com.pp svneol=native#text/plain
 packages/base/mysql/mysql3_comdyn.pp svneol=native#text/plain
@@ -1397,6 +1402,10 @@ packages/base/mysql/mysql3dyn.pp svneol=native#text/plain
 packages/base/mysql/mysql3impl.inc svneol=native#text/plain
 packages/base/mysql/mysql3types.inc svneol=native#text/plain
 packages/base/mysql/mysql4.pp svneol=native#text/plain
+packages/base/mysql/mysql40.pp svneol=native#text/plain
+packages/base/mysql/mysql40dyn.pp svneol=native#text/plain
+packages/base/mysql/mysql41.pp svneol=native#text/plain
+packages/base/mysql/mysql41dyn.pp svneol=native#text/plain
 packages/base/mysql/mysql4_com.pp svneol=native#text/plain
 packages/base/mysql/mysql4_comdyn.pp svneol=native#text/plain
 packages/base/mysql/mysql4_comtypes.inc svneol=native#text/plain
@@ -1404,6 +1413,8 @@ packages/base/mysql/mysql4_version.pp svneol=native#text/plain
 packages/base/mysql/mysql4dyn.pp svneol=native#text/plain
 packages/base/mysql/mysql4impl.inc svneol=native#text/plain
 packages/base/mysql/mysql4types.inc svneol=native#text/plain
+packages/base/mysql/mysql50.pp svneol=native#text/plain
+packages/base/mysql/mysql50dyn.pp svneol=native#text/plain
 packages/base/mysql/mysqls.c -text
 packages/base/mysql/mysqls.pp svneol=native#text/plain
 packages/base/mysql/rmdb -text

+ 4 - 2
fcl/db/sqldb/examples/alisttables.pp

@@ -15,7 +15,7 @@ program aListTables;
 
 uses
   Classes,
-  sqldb, pqconnection, mysql4conn, IBConnection, ODBCConn,
+  sqldb, pqconnection, mysql40conn, mysql41conn, mysql50conn, IBConnection, ODBCConn,
   SqldbExampleUnit;
 
 var Tables : TStringList;
@@ -25,7 +25,9 @@ begin
   ReadIniFile;
 
 // create FConnection
-  if dbtype = 'mysql' then Fconnection := tMySQLConnection.Create(nil);
+  if dbtype = 'mysql40' then Fconnection := tMySQL40Connection.Create(nil);
+  if dbtype = 'mysql41' then Fconnection := tMySQL41Connection.Create(nil);
+  if dbtype = 'mysql50' then Fconnection := tMySQL50Connection.Create(nil);
   if dbtype = 'postgresql' then Fconnection := tpqConnection.Create(nil);
   if dbtype = 'interbase' then Fconnection := tIBConnection.Create(nil);
   if dbtype = 'odbc' then Fconnection := tODBCConnection.Create(nil);

+ 1 - 1
fcl/db/sqldb/examples/bcreatetable.pp

@@ -15,7 +15,7 @@ program bCreateTable;
 
 uses
   Classes,
-  sqldb, pqconnection, mysql4conn, IBConnection,
+  sqldb,
   SqldbExampleUnit;
 
 begin

+ 1 - 1
fcl/db/sqldb/examples/cfilltable.pp

@@ -15,7 +15,7 @@ program CFillTable;
 
 uses
   Classes,
-  sqldb, pqconnection, mysql4conn, IBConnection,
+  sqldb,
   SqldbExampleUnit;
 
 begin

+ 4 - 1
fcl/db/sqldb/examples/database.ini

@@ -3,7 +3,10 @@
 # type
 # gives the type of the database-engine. Valid values are:
 # * interbase
-# * mysql
+# * mysql40
+# * mysql41
+# * mysql50
+# * odbc
 # * postgresql
 
 type=interbase

+ 2 - 3
fcl/db/sqldb/examples/dshowtable.pp

@@ -15,8 +15,7 @@ program dShowTable;
 
 uses
   Classes,
-  sqldb, pqconnection, mysql4conn, IBConnection,
-  SqldbExampleUnit;
+  sqldb, SqldbExampleUnit;
 
 begin
   ReadIniFile;
@@ -31,7 +30,7 @@ begin
     ReadOnly := True;
 
     SQL.Clear;
-    SQL.Add('select * from fpdev');
+    SQL.Add('select * from FPDEV');
 
     Writeln('Id;Name;Email;birthdate');
 

+ 1 - 1
fcl/db/sqldb/examples/efilltableparams.pp

@@ -15,7 +15,7 @@ program eFillTableParams;
 
 uses
   Classes, sysutils,
-  sqldb, pqconnection, mysql4conn, IBConnection,
+  sqldb,
   SqldbExampleUnit;
   
 var i : integer;

+ 1 - 1
fcl/db/sqldb/examples/fedittable.pp

@@ -15,7 +15,7 @@ program fEditTable;
 
 uses
   Classes, sysutils,
-  sqldb, pqconnection, mysql4conn, IBConnection,
+  sqldb,
   SqldbExampleUnit;
   
 

+ 1 - 1
fcl/db/sqldb/examples/gfiltertable.pp

@@ -15,7 +15,7 @@ program gFilterTable;
 
 uses
   Classes,
-  sqldb, pqconnection, mysql4conn, IBConnection,
+  sqldb,
   SqldbExampleUnit;
 
 begin

+ 5 - 2
fcl/db/sqldb/examples/sqldbexampleunit.pp

@@ -16,7 +16,8 @@ interface
 
 uses
   Classes,
-  sqldb, pqconnection, mysql4conn, IBConnection, ODBCConn;
+  sqldb, pqconnection, IBConnection, ODBCConn,
+  mysql40conn, mysql41conn, mysql50conn;
 
 var dbtype,
     dbname,
@@ -79,7 +80,9 @@ end;
 procedure CreateFConnection;
 
 begin
-  if dbtype = 'mysql' then Fconnection := tMySQLConnection.Create(nil);
+  if dbtype = 'mysql40' then Fconnection := tMySQL40Connection.Create(nil);
+  if dbtype = 'mysql41' then Fconnection := tMySQL41Connection.Create(nil);
+  if dbtype = 'mysql50' then Fconnection := tMySQL50Connection.Create(nil);
   if dbtype = 'postgresql' then Fconnection := tpqConnection.Create(nil);
   if dbtype = 'interbase' then Fconnection := tIBConnection.Create(nil);
   if dbtype = 'odbc' then Fconnection := tODBCConnection.Create(nil);

+ 37 - 37
fcl/db/sqldb/mysql/Makefile

@@ -233,115 +233,115 @@ PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages/base $(FPCDIR)/packages/ext
 override PACKAGE_NAME=fcl
 PACKAGEDIR_MAIN:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /fcl/Makefile.fpc,$(PACKAGESDIR))))))
 ifeq ($(FULL_TARGET),i386-linux)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 ifeq ($(FULL_TARGET),i386-go32v2)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 ifeq ($(FULL_TARGET),i386-win32)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 ifeq ($(FULL_TARGET),i386-os2)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 ifeq ($(FULL_TARGET),i386-freebsd)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 ifeq ($(FULL_TARGET),i386-beos)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 ifeq ($(FULL_TARGET),i386-netbsd)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 ifeq ($(FULL_TARGET),i386-solaris)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 ifeq ($(FULL_TARGET),i386-qnx)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 ifeq ($(FULL_TARGET),i386-netware)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 ifeq ($(FULL_TARGET),i386-openbsd)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 ifeq ($(FULL_TARGET),i386-wdosx)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 ifeq ($(FULL_TARGET),i386-emx)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 ifeq ($(FULL_TARGET),i386-watcom)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 ifeq ($(FULL_TARGET),i386-netwlibc)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 ifeq ($(FULL_TARGET),i386-wince)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 ifeq ($(FULL_TARGET),m68k-linux)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 ifeq ($(FULL_TARGET),m68k-freebsd)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 ifeq ($(FULL_TARGET),m68k-amiga)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 ifeq ($(FULL_TARGET),m68k-atari)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 ifeq ($(FULL_TARGET),m68k-openbsd)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 ifeq ($(FULL_TARGET),m68k-palmos)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 ifeq ($(FULL_TARGET),powerpc-linux)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 ifeq ($(FULL_TARGET),powerpc-netbsd)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 ifeq ($(FULL_TARGET),powerpc-macos)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 ifeq ($(FULL_TARGET),powerpc-darwin)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 ifeq ($(FULL_TARGET),powerpc-morphos)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 ifeq ($(FULL_TARGET),sparc-linux)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 ifeq ($(FULL_TARGET),sparc-netbsd)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 ifeq ($(FULL_TARGET),sparc-solaris)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 ifeq ($(FULL_TARGET),x86_64-linux)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 ifeq ($(FULL_TARGET),x86_64-win64)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 ifeq ($(FULL_TARGET),arm-linux)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 ifeq ($(FULL_TARGET),arm-wince)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
-override TARGET_UNITS+=mysql4conn
+override TARGET_UNITS+=mysql40conn mysql41conn mysql50conn mysql4conn
 endif
 override INSTALL_FPCPACKAGE=y
 ifeq ($(FULL_TARGET),i386-linux)

+ 1 - 1
fcl/db/sqldb/mysql/Makefile.fpc

@@ -6,7 +6,7 @@
 main=fcl
 
 [target]
-units=mysql4conn
+units=mysql40conn mysql41conn mysql50conn mysql4conn
 
 [require]
 packages=mysql

+ 11 - 0
fcl/db/sqldb/mysql/mysql40conn.pas

@@ -0,0 +1,11 @@
+{
+  Contains the TMysqlConnection for MySQL 4.0
+}
+
+unit mysql40conn;
+
+{$UNDEF MYSQL41}
+
+{$i mysqlconn.inc}
+
+end.

+ 11 - 0
fcl/db/sqldb/mysql/mysql41conn.pas

@@ -0,0 +1,11 @@
+{
+  Contains the TMysqlConnection for MySQL 4.1
+}
+
+unit mysql41conn;
+
+{$DEFINE MYSQL41}
+
+{$i mysqlconn.inc}
+
+end.

+ 8 - 640
fcl/db/sqldb/mysql/mysql4conn.pas

@@ -1,645 +1,13 @@
-unit mysql4conn;
-
-{$mode objfpc}{$H+}
-
-{$Define LinkDynamically}
-
-interface
-
-uses
-  Classes, SysUtils,sqldb,db,
-{$IfDef LinkDynamically}
-  mysql4dyn,mysql4_comdyn;
-{$Else}
-  mysql4,mysql4_com;
-{$EndIf}
-
-Type
-  TMySQLTransaction = Class(TSQLHandle)
-  protected
-  end;
-
-  TMySQLCursor = Class(TSQLCursor)
-  protected
-    FQMySQL : PMySQL;
-    FRes: PMYSQL_RES;                   { Record pointer }
-    FNeedData : Boolean;
-    FStatement : String;
-    Row : TMYSQL_ROW;
-    RowsAffected : QWord;
-    LastInsertID : QWord;
-  end;
-
-  TMySQLConnection = class (TSQLConnection)
-  private
-    FDialect: integer;
-    FHostInfo: String;
-    FServerInfo: String;
-    FMySQL : PMySQL;
-    function GetClientInfo: string;
-    function GetServerStatus: String;
-    procedure ConnectMySQL(var HMySQL : PMySQL;H,U,P : pchar);
-  protected
-    function StrToStatementType(s : string) : TStatementType; override;
-    Procedure ConnectToServer; virtual;
-    Procedure SelectDatabase; virtual;
-    function MySQLDataType(AType: enum_field_types; ASize: Integer; var NewType: TFieldType; var NewSize: Integer): Boolean;
-    function MySQLWriteData(AType: enum_field_types; ASize: Integer; Source, Dest: PChar): Integer;
-    // SQLConnection methods
-    procedure DoInternalConnect; override;
-    procedure DoInternalDisconnect; override;
-    function GetHandle : pointer; override;
-
-    Function AllocateCursorHandle : TSQLCursor; override;
-    Procedure DeAllocateCursorHandle(var cursor : TSQLCursor); override;
-    Function AllocateTransactionHandle : TSQLHandle; override;
-
-    procedure PrepareStatement(cursor: TSQLCursor;ATransaction : TSQLTransaction;buf : string; AParams : TParams); override;
-    procedure UnPrepareStatement(cursor:TSQLCursor); override;
-    procedure FreeFldBuffers(cursor : TSQLCursor); override;
-    procedure Execute(cursor: TSQLCursor;atransaction:tSQLtransaction;AParams : TParams); override;
-    procedure AddFieldDefs(cursor: TSQLCursor; FieldDefs : TfieldDefs); override;
-    function Fetch(cursor : TSQLCursor) : boolean; override;
-    function LoadField(cursor : TSQLCursor;FieldDef : TfieldDef;buffer : pointer) : boolean; override;
-    function GetTransactionHandle(trans : TSQLHandle): pointer; override;
-    function Commit(trans : TSQLHandle) : boolean; override;
-    function RollBack(trans : TSQLHandle) : boolean; override;
-    function StartdbTransaction(trans : TSQLHandle; AParams : string) : boolean; override;
-    procedure CommitRetaining(trans : TSQLHandle); override;
-    procedure RollBackRetaining(trans : TSQLHandle); override;
-    procedure UpdateIndexDefs(var IndexDefs : TIndexDefs;TableName : string); override;
-
-  Public
-    Property ServerInfo : String Read FServerInfo;
-    Property HostInfo : String Read FHostInfo;
-    property ClientInfo: string read GetClientInfo;
-    property ServerStatus : String read GetServerStatus;
-  published
-    property Dialect  : integer read FDialect write FDialect;
-    property DatabaseName;
-    property HostName;
-    property KeepConnection;
-    property LoginPrompt;
-    property Params;
-    property OnLogin;
-  end;
-
-  EMySQLError = Class(Exception);
-
-implementation
-
-uses dbconst;
-
-{ TMySQLConnection }
-
-Resourcestring
-  SErrServerConnectFailed = 'Server connect failed.';
-  SErrDatabaseSelectFailed = 'failed to select database: %s';
-  SErrDatabaseCreate = 'Failed to create database: %s';
-  SErrDatabaseDrop = 'Failed to drop database: %s';
-  SErrNoData = 'No data for record';
-  SErrExecuting = 'Error executing query: %s';
-  SErrFetchingdata = 'Error fetching row data: %s';
-  SErrGettingResult = 'Error getting result set: %s';
-  SErrNoQueryResult = 'No result from query.';
-
-Procedure MySQlError(R : PMySQL;Msg: String;Comp : TComponent);
-
-Var
-  MySQLMsg : String;
-
-begin
- If (R<>Nil) then
-   begin
-   MySQLMsg:=Strpas(mysql_error(R));
-   DatabaseErrorFmt(Msg,[MySQLMsg],Comp);
-   end
- else
-   DatabaseError(Msg,Comp);
-end;
-
-function TMySQLConnection.StrToStatementType(s : string) : TStatementType;
-
-begin
-  S:=Lowercase(s);
-  if s = 'show' then exit(stSelect);
-  result := inherited StrToStatementType(s);
-end;
-
-
-function TMySQLConnection.GetClientInfo: string;
-
-begin
-{$IfDef LinkDynamically}
-  // To make it possible to call this if there's no connection yet
-  InitialiseMysql4;
-{$EndIf}
-  Result:=strpas(mysql_get_client_info());
-{$IfDef LinkDynamically}
-  ReleaseMysql4;
-{$EndIf}
-
-end;
-
-function TMySQLConnection.GetServerStatus: String;
-begin
-  CheckConnected;
-  Result := mysql_stat(FMYSQL);
-end;
-
-procedure TMySQLConnection.ConnectMySQL(var HMySQL : PMySQL;H,U,P : pchar);
-
-begin
-  HMySQL := mysql_init(HMySQL);
-  HMySQL:=mysql_real_connect(HMySQL,PChar(H),PChar(U),Pchar(P),Nil,0,Nil,0);
-  If (HMySQL=Nil) then
-    MySQlError(Nil,SErrServerConnectFailed,Self);
-end;
-
-procedure TMySQLConnection.ConnectToServer;
-
-Var
-  H,U,P : String;
-
-begin
-  H:=HostName;
-  U:=UserName;
-  P:=Password;
-  ConnectMySQL(FMySQL,pchar(H),pchar(U),pchar(P));
-  FServerInfo := strpas(mysql_get_server_info(FMYSQL));
-  FHostInfo := strpas(mysql_get_host_info(FMYSQL));
-end;
-
-procedure TMySQLConnection.SelectDatabase;
-begin
-  if mysql_select_db(FMySQL,pchar(DatabaseName))<>0 then
-    MySQLError(FMySQL,SErrDatabaseSelectFailed,Self);
-end;
-
-procedure TMySQLConnection.DoInternalConnect;
-begin
-{$IfDef LinkDynamically}
-  InitialiseMysql4;
-{$EndIf}
-  inherited DoInternalConnect;
-  ConnectToServer;
-  SelectDatabase;
-end;
-
-procedure TMySQLConnection.DoInternalDisconnect;
-begin
-  inherited DoInternalDisconnect;
-  mysql_close(FMySQL);
-  FMySQL:=Nil;
-{$IfDef LinkDynamically}
-  ReleaseMysql4;
-{$EndIf}
-
-end;
-
-function TMySQLConnection.GetHandle: pointer;
-begin
-  Result:=FMySQL;
-end;
-
-function TMySQLConnection.AllocateCursorHandle: TSQLCursor;
-begin
-  Result:=TMySQLCursor.Create;
-end;
-
-Procedure TMySQLConnection.DeAllocateCursorHandle(var cursor : TSQLCursor);
-
-begin
-  FreeAndNil(cursor);
-end;
-
-function TMySQLConnection.AllocateTransactionHandle: TSQLHandle;
-begin
-  Result:=TMySQLTransaction.Create;
-end;
-
-procedure TMySQLConnection.PrepareStatement(cursor: TSQLCursor;
-  ATransaction: TSQLTransaction; buf: string;AParams : TParams);
-begin
-  if assigned(AParams) and (AParams.count > 0) then
-    DatabaseError('Parameters (not) yet supported for the MySQL SqlDB connection.',self);
-  With Cursor as TMysqlCursor do
-    begin
-    FStatement:=Buf;
-    if FStatementType=stSelect then
-      FNeedData:=True;
-    ConnectMySQL(FQMySQL,FMySQL^.host,FMySQL^.user,FMySQL^.passwd);
-    if mysql_select_db(FQMySQL,pchar(DatabaseName))<>0 then
-      MySQLError(FQMySQL,SErrDatabaseSelectFailed,Self);
-    end
-end;
-
-procedure TMySQLConnection.UnPrepareStatement(cursor: TSQLCursor);
-begin
-  // not necessary
-end;
-
-procedure TMySQLConnection.FreeFldBuffers(cursor: TSQLCursor);
-
-Var
-  C : TMySQLCursor;
-
-begin
-  C:=Cursor as TMysqlCursor;
-  if c.FStatementType=stSelect then
-    c.FNeedData:=False;
-  If (C.FRes<>Nil) then
-    begin
-    C.FRes:=Nil;
-    end;
-  if (c.FQMySQL <> Nil) then
-    begin
-    mysql_close(c.FQMySQL);
-    c.FQMySQL:=Nil;
-    end;
-  If (C.FRes<>Nil) then
-    begin
-    Mysql_free_result(C.FRes);
-    C.FRes:=Nil;
-    end;
-end;
+{
+  Contains the TMysqlConnection for MySQL 4.0
+  
+  temporary backwards compatibility for Lazarus
+}
 
-procedure TMySQLConnection.Execute(cursor: TSQLCursor;
-  atransaction: tSQLtransaction;AParams : TParams);
-
-Var
-  C : TMySQLCursor;
-
-begin
-  C:=Cursor as TMysqlCursor;
-  If (C.FRes=Nil) then
-    begin
-    if mysql_query(c.FQMySQL,Pchar(C.FStatement))<>0 then
-      MySQLError(c.FQMYSQL,Format(SErrExecuting,[StrPas(mysql_error(c.FQMySQL))]),Self)
-    else
-      begin
-      C.RowsAffected := mysql_affected_rows(c.FQMYSQL);
-      C.LastInsertID := mysql_insert_id(c.FQMYSQL);
-      if C.FNeedData then
-        C.FRes:=mysql_use_result(c.FQMySQL);
-      end;
-    end;
-end;
-
-function TMySQLConnection.MySQLDataType(AType: enum_field_types; ASize: Integer;
-   var NewType: TFieldType; var NewSize: Integer): Boolean;
-begin
-  Result := True;
-  case AType of
-    FIELD_TYPE_TINY, FIELD_TYPE_SHORT, FIELD_TYPE_LONG, FIELD_TYPE_LONGLONG,
-    FIELD_TYPE_INT24:
-      begin
-      NewType := ftInteger;
-      NewSize := 0;
-      end;
-    FIELD_TYPE_DECIMAL, FIELD_TYPE_FLOAT, FIELD_TYPE_DOUBLE:
-      begin
-      NewType := ftFloat;
-      NewSize := 0;
-      end;
-    FIELD_TYPE_TIMESTAMP, FIELD_TYPE_DATETIME:
-      begin
-      NewType := ftDateTime;
-      NewSize := 0;
-      end;
-    FIELD_TYPE_DATE:
-      begin
-      NewType := ftDate;
-      NewSize := 0;
-      end;
-    FIELD_TYPE_TIME:
-      begin
-      NewType := ftTime;
-      NewSize := 0;
-      end;
-    FIELD_TYPE_VAR_STRING, FIELD_TYPE_STRING, FIELD_TYPE_ENUM, FIELD_TYPE_SET:
-      begin
-      NewType := ftString;
-      NewSize := ASize;
-      end;
-  else
-    Result := False;
-  end;
-end;
-
-procedure TMySQLConnection.AddFieldDefs(cursor: TSQLCursor;
-  FieldDefs: TfieldDefs);
-
-var
-  C : TMySQLCursor;
-  I, FC: Integer;
-  field: PMYSQL_FIELD;
-  DFT: TFieldType;
-  DFS: Integer;
-
-begin
-//  Writeln('MySQL: Adding fielddefs');
-  C:=(Cursor as TMySQLCursor);
-  If (C.FRes=Nil) then
-    begin
-//    Writeln('res is nil');
-    MySQLError(c.FQMySQL,SErrNoQueryResult,Self);
-    end;
-//  Writeln('MySQL: have result');
-  FC:=mysql_num_fields(C.FRes);
-  For I:= 0 to FC-1 do
-    begin
-    field := mysql_fetch_field_direct(C.FRES, I);
-//    Writeln('MySQL: creating fielddef ',I+1);
-
-    if MySQLDataType(field^.ftype, field^.length, DFT, DFS) then
-      TFieldDef.Create(FieldDefs, field^.name, DFT, DFS, False, I+1);
-    end;
-//  Writeln('MySQL: Finished adding fielddefs');
-end;
-
-function TMySQLConnection.Fetch(cursor: TSQLCursor): boolean;
-
-Var
-  C : TMySQLCursor;
-
-begin
-  C:=Cursor as TMySQLCursor;
-  C.Row:=MySQL_Fetch_row(C.FRes);
-  Result:=(C.Row<>Nil);
-end;
-
-function TMySQLConnection.LoadField(cursor : TSQLCursor;
-  FieldDef : TfieldDef;buffer : pointer) : boolean;
-
-var
-  I, FC, CT: Integer;
-  field: PMYSQL_FIELD;
-  row : TMYSQL_ROW;
-  C : TMySQLCursor;
-
-begin
-//  Writeln('LoadFieldsFromBuffer');
-  C:=Cursor as TMySQLCursor;
-  if C.Row=nil then
-     begin
-  //   Writeln('LoadFieldsFromBuffer: row=nil');
-     MySQLError(c.FQMySQL,SErrFetchingData,Self);
-     end;
-  Row:=C.Row;
-  FC := mysql_num_fields(C.FRES);
-
-  for I := 0 to FC-1 do
-    begin
-    field := mysql_fetch_field_direct(C.FRES, I);
-    if field^.name=FieldDef.name then break;
-    Inc(Row);
-    end;
-
-  CT := MySQLWriteData(field^.ftype, field^.length, Row^, Buffer);
-  result := true;
-end;
-
-function InternalStrToFloat(S: string): Extended;
-
-var
-  I: Integer;
-  Tmp: string;
-
-begin
-  Tmp := '';
-  for I := 1 to Length(S) do
-    begin
-    if not (S[I] in ['0'..'9', '+', '-', 'E', 'e']) then
-      Tmp := Tmp + DecimalSeparator
-    else
-      Tmp := Tmp + S[I];
-    end;
-  Result := StrToFloat(Tmp);
-end;
-
-function InternalStrToDate(S: string): TDateTime;
-
-var
-  EY, EM, ED: Word;
-
-begin
-  EY := StrToInt(Copy(S,1,4));
-  EM := StrToInt(Copy(S,6,2));
-  ED := StrToInt(Copy(S,9,2));
-  if (EY = 0) or (EM = 0) or (ED = 0) then
-    Result:=0
-  else
-    Result:=EncodeDate(EY, EM, ED);
-end;
-
-function InternalStrToDateTime(S: string): TDateTime;
-
-var
-  EY, EM, ED: Word;
-  EH, EN, ES: Word;
-
-begin
-  EY := StrToInt(Copy(S, 1, 4));
-  EM := StrToInt(Copy(S, 6, 2));
-  ED := StrToInt(Copy(S, 9, 2));
-  EH := StrToInt(Copy(S, 11, 2));
-  EN := StrToInt(Copy(S, 14, 2));
-  ES := StrToInt(Copy(S, 17, 2));
-  if (EY = 0) or (EM = 0) or (ED = 0) then
-    Result := 0
-  else
-    Result := EncodeDate(EY, EM, ED);
-  Result := Result + EncodeTime(EH, EN, ES, 0);
-end;
-
-function InternalStrToTime(S: string): TDateTime;
-
-var
-  EH, EM, ES: Word;
-
-begin
-  EH := StrToInt(Copy(S, 1, 2));
-  EM := StrToInt(Copy(S, 4, 2));
-  ES := StrToInt(Copy(S, 7, 2));
-  Result := EncodeTime(EH, EM, ES, 0);
-end;
-
-function InternalStrToTimeStamp(S: string): TDateTime;
-
-var
-  EY, EM, ED: Word;
-  EH, EN, ES: Word;
-
-begin
-  EY := StrToInt(Copy(S, 1, 4));
-  EM := StrToInt(Copy(S, 5, 2));
-  ED := StrToInt(Copy(S, 7, 2));
-  EH := StrToInt(Copy(S, 9, 2));
-  EN := StrToInt(Copy(S, 11, 2));
-  ES := StrToInt(Copy(S, 13, 2));
-  if (EY = 0) or (EM = 0) or (ED = 0) then
-    Result := 0
-  else
-    Result := EncodeDate(EY, EM, ED);
-  Result := Result + EncodeTime(EH, EN, ES, 0);;
-end;
-
-function TMySQLConnection.MySQLWriteData(AType: enum_field_types;ASize: Integer; Source, Dest: PChar): Integer;
-
-var
-  VI: Integer;
-  VF: Double;
-  VD: TDateTime;
-  Src : String;
-
-begin
-  Result := 0;
-  If (Source<>Nil) Then
-    Src:=StrPas(Source)
-  else
-    Src:='';
-  case AType of
-    FIELD_TYPE_TINY, FIELD_TYPE_SHORT, FIELD_TYPE_LONG, FIELD_TYPE_LONGLONG,
-    FIELD_TYPE_INT24:
-      begin
-      Result:=SizeOf(Integer);
-      if (Src<>'') then
-        VI := StrToInt(Src)
-      else
-        VI := 0;
-      Move(VI, Dest^, Result);
-      end;
-    FIELD_TYPE_DECIMAL, FIELD_TYPE_FLOAT, FIELD_TYPE_DOUBLE:
-      begin
-      Result := SizeOf(Double);
-      if Src <> '' then
-        VF := InternalStrToFloat(Src)
-      else
-        VF := 0;
-      Move(VF, Dest^, Result);
-      end;
-    FIELD_TYPE_TIMESTAMP:
-      begin
-      Result := SizeOf(TDateTime);
-      if Src <> '' then
-        VD := InternalStrToTimeStamp(Src)
-      else
-        VD := 0;
-      Move(VD, Dest^, Result);
-      end;
-    FIELD_TYPE_DATETIME:
-      begin
-      Result := SizeOf(TDateTime);
-      if Src <> '' then
-        VD := InternalStrToDateTime(Src)
-      else
-        VD := 0;
-      Move(VD, Dest^, Result);
-      end;
-    FIELD_TYPE_DATE:
-      begin
-      Result := SizeOf(TDateTime);
-      if Src <> '' then
-        VD := InternalStrToDate(Src)
-      else
-        VD := 0;
-      Move(VD, Dest^, Result);
-      end;
-    FIELD_TYPE_TIME:
-      begin
-      Result := SizeOf(TDateTime);
-      if Src <> '' then
-        VD := InternalStrToTime(Src)
-      else
-        VD := 0;
-      Move(VD, Dest^, Result);
-      end;
-    FIELD_TYPE_VAR_STRING, FIELD_TYPE_STRING, FIELD_TYPE_ENUM, FIELD_TYPE_SET:
-      begin
-      Result := ASize;
-{      Write('Moving string of size ',asize,' : ');
-      P:=Source;
-      If (P<>nil) then
-        While P[0]<>#0 do
-          begin
-          Write(p[0]);
-          inc(p);
-          end;
-      Writeln;
-}      if Src<> '' then
-        Move(Source^, Dest^, Result)
-      else
-        Dest^ := #0;
-      end;
-  end;
-end;
-
-procedure TMySQLConnection.UpdateIndexDefs(var IndexDefs : TIndexDefs;TableName : string);
-
-var qry : TSQLQuery;
-
-begin
-  if not assigned(Transaction) then
-    DatabaseError(SErrConnTransactionnSet);
-
-  qry := tsqlquery.Create(nil);
-  qry.transaction := Transaction;
-  qry.database := Self;
-  with qry do
-    begin
-    ReadOnly := True;
-    sql.clear;
-    sql.add('show index from ' +  TableName);
-    open;
-    end;
-
-  while not qry.eof do with IndexDefs.AddIndexDef do
-    begin
-    Name := trim(qry.fieldbyname('Key_name').asstring);
-    Fields := trim(qry.fieldbyname('Column_name').asstring);
-    If Name = 'PRIMARY' then options := options + [ixPrimary];
-    If qry.fieldbyname('Non_unique').asinteger = 0 then options := options + [ixUnique];
-    qry.next;
-{    while (name = qry.fields[0].asstring) and (not qry.eof) do
-      begin
-      Fields := Fields + ';' + trim(qry.Fields[2].asstring);
-      qry.next;
-      end;}
-    end;
-  qry.close;
-  qry.free;
-end;
-
-
-function TMySQLConnection.GetTransactionHandle(trans: TSQLHandle): pointer;
-begin
-  Result:=Nil;
-end;
-
-function TMySQLConnection.Commit(trans: TSQLHandle): boolean;
-begin
-  // Do nothing.
-end;
-
-function TMySQLConnection.RollBack(trans: TSQLHandle): boolean;
-begin
-  // Do nothing
-end;
-
-function TMySQLConnection.StartdbTransaction(trans: TSQLHandle; AParams : string): boolean;
-begin
-  // Do nothing
-end;
+unit mysql4conn;
 
-procedure TMySQLConnection.CommitRetaining(trans: TSQLHandle);
-begin
-  // Do nothing
-end;
+{$DEFINE MYSQL4}
 
-procedure TMySQLConnection.RollBackRetaining(trans: TSQLHandle);
-begin
-  // Do nothing
-end;
+{$i mysqlconn.inc}
 
 end.

+ 11 - 0
fcl/db/sqldb/mysql/mysql50conn.pas

@@ -0,0 +1,11 @@
+{
+  Contains the TMysqlConnection for MySQL 5.0
+}
+
+unit mysql50conn;
+
+{$DEFINE MYSQL50}
+
+{$i mysqlconn.inc}
+
+end.

+ 669 - 0
fcl/db/sqldb/mysql/mysqlconn.inc

@@ -0,0 +1,669 @@
+
+{$mode objfpc}{$H+}
+{$MACRO on}
+
+interface
+
+uses
+  Classes, SysUtils,sqldb,db,
+{$IfDef mysql50}
+  mysql50dyn;
+  {$DEFINE TConnectionName:=TMySQL50Connection}
+  {$DEFINE TTransactionName:=TMySQL50Transaction}
+  {$DEFINE TCursorName:=TMySQL50Cursor}
+{$ELSE}
+  {$IfDef mysql41}
+    mysql41dyn;
+    {$DEFINE TConnectionName:=TMySQL41Connection}
+    {$DEFINE TTransactionName:=TMySQL41Transaction}
+    {$DEFINE TCursorName:=TMySQL41Cursor}
+  {$ELSE}
+    {$IFDEF mysql4} // temporary backwards compatibility for Lazarus
+      mysql40dyn;
+      {$DEFINE TConnectionName:=TMySQLConnection}
+      {$DEFINE TTransactionName:=TMySQLTransaction}
+      {$DEFINE TCursorName:=TMySQLCursor}
+    {$ELSE}
+      mysql40dyn;
+      {$DEFINE TConnectionName:=TMySQL40Connection}
+      {$DEFINE TTransactionName:=TMySQL40Transaction}
+      {$DEFINE TCursorName:=TMySQL40Cursor}
+    {$EndIf}
+  {$EndIf}
+{$EndIf}
+
+Type
+  TTransactionName = Class(TSQLHandle)
+  protected
+  end;
+
+  TCursorName = Class(TSQLCursor)
+  protected
+    FQMySQL : PMySQL;
+    FRes: PMYSQL_RES;                   { Record pointer }
+    FNeedData : Boolean;
+    FStatement : String;
+    Row : MYSQL_ROW;
+    RowsAffected : QWord;
+    LastInsertID : QWord;
+  end;
+
+  TConnectionName = class (TSQLConnection)
+  private
+    FDialect: integer;
+    FHostInfo: String;
+    FServerInfo: String;
+    FMySQL : PMySQL;
+    function GetClientInfo: string;
+    function GetServerStatus: String;
+    procedure ConnectMySQL(var HMySQL : PMySQL;H,U,P : pchar);
+  protected
+    function StrToStatementType(s : string) : TStatementType; override;
+    Procedure ConnectToServer; virtual;
+    Procedure SelectDatabase; virtual;
+    function MySQLDataType(AType: enum_field_types; ASize: Integer; var NewType: TFieldType; var NewSize: Integer): Boolean;
+    function MySQLWriteData(AType: enum_field_types; ASize: Integer; Source, Dest: PChar): Integer;
+    // SQLConnection methods
+    procedure DoInternalConnect; override;
+    procedure DoInternalDisconnect; override;
+    function GetHandle : pointer; override;
+
+    Function AllocateCursorHandle : TSQLCursor; override;
+    Procedure DeAllocateCursorHandle(var cursor : TSQLCursor); override;
+    Function AllocateTransactionHandle : TSQLHandle; override;
+
+    procedure PrepareStatement(cursor: TSQLCursor;ATransaction : TSQLTransaction;buf : string; AParams : TParams); override;
+    procedure UnPrepareStatement(cursor:TSQLCursor); override;
+    procedure FreeFldBuffers(cursor : TSQLCursor); override;
+    procedure Execute(cursor: TSQLCursor;atransaction:tSQLtransaction;AParams : TParams); override;
+    procedure AddFieldDefs(cursor: TSQLCursor; FieldDefs : TfieldDefs); override;
+    function Fetch(cursor : TSQLCursor) : boolean; override;
+    function LoadField(cursor : TSQLCursor;FieldDef : TfieldDef;buffer : pointer) : boolean; override;
+    function GetTransactionHandle(trans : TSQLHandle): pointer; override;
+    function Commit(trans : TSQLHandle) : boolean; override;
+    function RollBack(trans : TSQLHandle) : boolean; override;
+    function StartdbTransaction(trans : TSQLHandle; AParams : string) : boolean; override;
+    procedure CommitRetaining(trans : TSQLHandle); override;
+    procedure RollBackRetaining(trans : TSQLHandle); override;
+    procedure UpdateIndexDefs(var IndexDefs : TIndexDefs;TableName : string); override;
+
+  Public
+    Property ServerInfo : String Read FServerInfo;
+    Property HostInfo : String Read FHostInfo;
+    property ClientInfo: string read GetClientInfo;
+    property ServerStatus : String read GetServerStatus;
+  published
+    property Dialect  : integer read FDialect write FDialect;
+    property DatabaseName;
+    property HostName;
+    property KeepConnection;
+    property LoginPrompt;
+    property Params;
+    property OnLogin;
+  end;
+
+  EMySQLError = Class(Exception);
+
+implementation
+
+uses dbconst;
+
+{ TConnectionName }
+
+Resourcestring
+  SErrServerConnectFailed = 'Server connect failed.';
+  SErrDatabaseSelectFailed = 'failed to select database: %s';
+  SErrDatabaseCreate = 'Failed to create database: %s';
+  SErrDatabaseDrop = 'Failed to drop database: %s';
+  SErrNoData = 'No data for record';
+  SErrExecuting = 'Error executing query: %s';
+  SErrFetchingdata = 'Error fetching row data: %s';
+  SErrGettingResult = 'Error getting result set: %s';
+  SErrNoQueryResult = 'No result from query.';
+  SErrNotversion50 = 'TMySQL50Connection can not work with the installed MySQL client version (%s).';
+  SErrNotversion41 = 'TMySQL41Connection can not work with the installed MySQL client version (%s).';
+  SErrNotversion40 = 'TMySQL40Connection can not work with the installed MySQL client version (%s).';
+
+Procedure MySQlError(R : PMySQL;Msg: String;Comp : TComponent);
+
+Var
+  MySQLMsg : String;
+
+begin
+ If (R<>Nil) then
+   begin
+   MySQLMsg:=Strpas(mysql_error(R));
+   DatabaseErrorFmt(Msg,[MySQLMsg],Comp);
+   end
+ else
+   DatabaseError(Msg,Comp);
+end;
+
+function TConnectionName.StrToStatementType(s : string) : TStatementType;
+
+begin
+  S:=Lowercase(s);
+  if s = 'show' then exit(stSelect);
+  result := inherited StrToStatementType(s);
+end;
+
+
+function TConnectionName.GetClientInfo: string;
+
+begin
+  // To make it possible to call this if there's no connection yet
+  InitialiseMysql;
+  Result:=strpas(mysql_get_client_info());
+  ReleaseMysql;
+end;
+
+function TConnectionName.GetServerStatus: String;
+begin
+  CheckConnected;
+  Result := mysql_stat(FMYSQL);
+end;
+
+procedure TConnectionName.ConnectMySQL(var HMySQL : PMySQL;H,U,P : pchar);
+
+begin
+  HMySQL := mysql_init(HMySQL);
+  HMySQL:=mysql_real_connect(HMySQL,PChar(H),PChar(U),Pchar(P),Nil,0,Nil,0);
+  If (HMySQL=Nil) then
+    MySQlError(Nil,SErrServerConnectFailed,Self);
+end;
+
+procedure TConnectionName.ConnectToServer;
+
+Var
+  H,U,P : String;
+
+begin
+  H:=HostName;
+  U:=UserName;
+  P:=Password;
+  ConnectMySQL(FMySQL,pchar(H),pchar(U),pchar(P));
+  FServerInfo := strpas(mysql_get_server_info(FMYSQL));
+  FHostInfo := strpas(mysql_get_host_info(FMYSQL));
+end;
+
+procedure TConnectionName.SelectDatabase;
+begin
+  if mysql_select_db(FMySQL,pchar(DatabaseName))<>0 then
+    MySQLError(FMySQL,SErrDatabaseSelectFailed,Self);
+end;
+
+procedure TConnectionName.DoInternalConnect;
+begin
+  InitialiseMysql;
+{$IFDEF mysql50}
+  if copy(strpas(mysql_get_client_info()),1,3)<>'5.0' then
+    Raise EInOutError.CreateFmt(SErrNotversion50,[strpas(mysql_get_client_info())]);
+{$ELSE}
+  {$IFDEF mysql41}
+  if copy(strpas(mysql_get_client_info()),1,3)<>'4.1' then
+    Raise EInOutError.CreateFmt(SErrNotversion41,[strpas(mysql_get_client_info())]);
+  {$ELSE}
+  if copy(strpas(mysql_get_client_info()),1,3)<>'4.0' then
+    Raise EInOutError.CreateFmt(SErrNotversion40,[strpas(mysql_get_client_info())]);
+  {$ENDIF}
+{$ENDIF}
+  inherited DoInternalConnect;
+  ConnectToServer;
+  SelectDatabase;
+end;
+
+procedure TConnectionName.DoInternalDisconnect;
+begin
+  inherited DoInternalDisconnect;
+  mysql_close(FMySQL);
+  FMySQL:=Nil;
+  ReleaseMysql;
+end;
+
+function TConnectionName.GetHandle: pointer;
+begin
+  Result:=FMySQL;
+end;
+
+function TConnectionName.AllocateCursorHandle: TSQLCursor;
+begin
+  Result:=TCursorName.Create;
+end;
+
+Procedure TConnectionName.DeAllocateCursorHandle(var cursor : TSQLCursor);
+
+begin
+  FreeAndNil(cursor);
+end;
+
+function TConnectionName.AllocateTransactionHandle: TSQLHandle;
+begin
+//  Result:=TTransactionName.Create;
+  Result := nil;
+end;
+
+procedure TConnectionName.PrepareStatement(cursor: TSQLCursor;
+  ATransaction: TSQLTransaction; buf: string;AParams : TParams);
+begin
+  if assigned(AParams) and (AParams.count > 0) then
+    DatabaseError('Parameters (not) yet supported for the MySQL SqlDB connection.',self);
+  With Cursor as TCursorName do
+    begin
+    FStatement:=Buf;
+    if FStatementType=stSelect then
+      FNeedData:=True;
+    ConnectMySQL(FQMySQL,FMySQL^.host,FMySQL^.user,FMySQL^.passwd);
+    if mysql_select_db(FQMySQL,pchar(DatabaseName))<>0 then
+      MySQLError(FQMySQL,SErrDatabaseSelectFailed,Self);
+    end
+end;
+
+procedure TConnectionName.UnPrepareStatement(cursor: TSQLCursor);
+begin
+  // not necessary
+end;
+
+procedure TConnectionName.FreeFldBuffers(cursor: TSQLCursor);
+
+Var
+  C : TCursorName;
+
+begin
+  C:=Cursor as TCursorName;
+  if c.FStatementType=stSelect then
+    c.FNeedData:=False;
+  If (C.FRes<>Nil) then
+    begin
+    C.FRes:=Nil;
+    end;
+  if (c.FQMySQL <> Nil) then
+    begin
+    mysql_close(c.FQMySQL);
+    c.FQMySQL:=Nil;
+    end;
+  If (C.FRes<>Nil) then
+    begin
+    Mysql_free_result(C.FRes);
+    C.FRes:=Nil;
+    end;
+end;
+
+procedure TConnectionName.Execute(cursor: TSQLCursor;
+  atransaction: tSQLtransaction;AParams : TParams);
+
+Var
+  C : TCursorName;
+
+begin
+  C:=Cursor as TCursorName;
+  If (C.FRes=Nil) then
+    begin
+    if mysql_query(c.FQMySQL,Pchar(C.FStatement))<>0 then
+      MySQLError(c.FQMYSQL,Format(SErrExecuting,[StrPas(mysql_error(c.FQMySQL))]),Self)
+    else
+      begin
+      C.RowsAffected := mysql_affected_rows(c.FQMYSQL);
+      C.LastInsertID := mysql_insert_id(c.FQMYSQL);
+      if C.FNeedData then
+        C.FRes:=mysql_use_result(c.FQMySQL);
+      end;
+    end;
+end;
+
+function TConnectionName.MySQLDataType(AType: enum_field_types; ASize: Integer;
+   var NewType: TFieldType; var NewSize: Integer): Boolean;
+begin
+  Result := True;
+  case AType of
+    FIELD_TYPE_TINY, FIELD_TYPE_SHORT, FIELD_TYPE_LONG, FIELD_TYPE_LONGLONG,
+    FIELD_TYPE_INT24:
+      begin
+      NewType := ftInteger;
+      NewSize := 0;
+      end;
+    FIELD_TYPE_DECIMAL, FIELD_TYPE_FLOAT, FIELD_TYPE_DOUBLE:
+      begin
+      NewType := ftFloat;
+      NewSize := 0;
+      end;
+    FIELD_TYPE_TIMESTAMP, FIELD_TYPE_DATETIME:
+      begin
+      NewType := ftDateTime;
+      NewSize := 0;
+      end;
+    FIELD_TYPE_DATE:
+      begin
+      NewType := ftDate;
+      NewSize := 0;
+      end;
+    FIELD_TYPE_TIME:
+      begin
+      NewType := ftTime;
+      NewSize := 0;
+      end;
+    FIELD_TYPE_VAR_STRING, FIELD_TYPE_STRING, FIELD_TYPE_ENUM, FIELD_TYPE_SET:
+      begin
+      NewType := ftString;
+      NewSize := ASize;
+      end;
+  else
+    Result := False;
+  end;
+end;
+
+procedure TConnectionName.AddFieldDefs(cursor: TSQLCursor;
+  FieldDefs: TfieldDefs);
+
+var
+  C : TCursorName;
+  I, FC: Integer;
+  field: PMYSQL_FIELD;
+  DFT: TFieldType;
+  DFS: Integer;
+
+begin
+//  Writeln('MySQL: Adding fielddefs');
+  C:=(Cursor as TCursorName);
+  If (C.FRes=Nil) then
+    begin
+//    Writeln('res is nil');
+    MySQLError(c.FQMySQL,SErrNoQueryResult,Self);
+    end;
+//  Writeln('MySQL: have result');
+  FC:=mysql_num_fields(C.FRes);
+  For I:= 0 to FC-1 do
+    begin
+    field := mysql_fetch_field_direct(C.FRES, I);
+//    Writeln('MySQL: creating fielddef ',I+1);
+
+    if MySQLDataType(field^.ftype, field^.length, DFT, DFS) then
+      TFieldDef.Create(FieldDefs, field^.name, DFT, DFS, False, I+1);
+    end;
+//  Writeln('MySQL: Finished adding fielddefs');
+end;
+
+function TConnectionName.Fetch(cursor: TSQLCursor): boolean;
+
+Var
+  C : TCursorName;
+
+begin
+  C:=Cursor as TCursorName;
+  C.Row:=MySQL_Fetch_row(C.FRes);
+  Result:=(C.Row<>Nil);
+end;
+
+function TConnectionName.LoadField(cursor : TSQLCursor;
+  FieldDef : TfieldDef;buffer : pointer) : boolean;
+
+var
+  I, FC, CT: Integer;
+  field: PMYSQL_FIELD;
+  row : MYSQL_ROW;
+  C : TCursorName;
+
+begin
+//  Writeln('LoadFieldsFromBuffer');
+  C:=Cursor as TCursorName;
+  if C.Row=nil then
+     begin
+  //   Writeln('LoadFieldsFromBuffer: row=nil');
+     MySQLError(c.FQMySQL,SErrFetchingData,Self);
+     end;
+  Row:=C.Row;
+  FC := mysql_num_fields(C.FRES);
+
+  for I := 0 to FC-1 do
+    begin
+    field := mysql_fetch_field_direct(C.FRES, I);
+    if field^.name=FieldDef.name then break;
+    Inc(Row);
+    end;
+
+  CT := MySQLWriteData(field^.ftype, field^.length, Row^, Buffer);
+  result := true;
+end;
+
+function InternalStrToFloat(S: string): Extended;
+
+var
+  I: Integer;
+  Tmp: string;
+
+begin
+  Tmp := '';
+  for I := 1 to Length(S) do
+    begin
+    if not (S[I] in ['0'..'9', '+', '-', 'E', 'e']) then
+      Tmp := Tmp + DecimalSeparator
+    else
+      Tmp := Tmp + S[I];
+    end;
+  Result := StrToFloat(Tmp);
+end;
+
+function InternalStrToDate(S: string): TDateTime;
+
+var
+  EY, EM, ED: Word;
+
+begin
+  EY := StrToInt(Copy(S,1,4));
+  EM := StrToInt(Copy(S,6,2));
+  ED := StrToInt(Copy(S,9,2));
+  if (EY = 0) or (EM = 0) or (ED = 0) then
+    Result:=0
+  else
+    Result:=EncodeDate(EY, EM, ED);
+end;
+
+function InternalStrToDateTime(S: string): TDateTime;
+
+var
+  EY, EM, ED: Word;
+  EH, EN, ES: Word;
+
+begin
+  EY := StrToInt(Copy(S, 1, 4));
+  EM := StrToInt(Copy(S, 6, 2));
+  ED := StrToInt(Copy(S, 9, 2));
+  EH := StrToInt(Copy(S, 11, 2));
+  EN := StrToInt(Copy(S, 14, 2));
+  ES := StrToInt(Copy(S, 17, 2));
+  if (EY = 0) or (EM = 0) or (ED = 0) then
+    Result := 0
+  else
+    Result := EncodeDate(EY, EM, ED);
+  Result := Result + EncodeTime(EH, EN, ES, 0);
+end;
+
+function InternalStrToTime(S: string): TDateTime;
+
+var
+  EH, EM, ES: Word;
+
+begin
+  EH := StrToInt(Copy(S, 1, 2));
+  EM := StrToInt(Copy(S, 4, 2));
+  ES := StrToInt(Copy(S, 7, 2));
+  Result := EncodeTime(EH, EM, ES, 0);
+end;
+
+function InternalStrToTimeStamp(S: string): TDateTime;
+
+var
+  EY, EM, ED: Word;
+  EH, EN, ES: Word;
+
+begin
+  EY := StrToInt(Copy(S, 1, 4));
+  EM := StrToInt(Copy(S, 5, 2));
+  ED := StrToInt(Copy(S, 7, 2));
+  EH := StrToInt(Copy(S, 9, 2));
+  EN := StrToInt(Copy(S, 11, 2));
+  ES := StrToInt(Copy(S, 13, 2));
+  if (EY = 0) or (EM = 0) or (ED = 0) then
+    Result := 0
+  else
+    Result := EncodeDate(EY, EM, ED);
+  Result := Result + EncodeTime(EH, EN, ES, 0);;
+end;
+
+function TConnectionName.MySQLWriteData(AType: enum_field_types;ASize: Integer; Source, Dest: PChar): Integer;
+
+var
+  VI: Integer;
+  VF: Double;
+  VD: TDateTime;
+  Src : String;
+
+begin
+  Result := 0;
+  If (Source<>Nil) Then
+    Src:=StrPas(Source)
+  else
+    Src:='';
+  case AType of
+    FIELD_TYPE_TINY, FIELD_TYPE_SHORT, FIELD_TYPE_LONG, FIELD_TYPE_LONGLONG,
+    FIELD_TYPE_INT24:
+      begin
+      Result:=SizeOf(Integer);
+      if (Src<>'') then
+        VI := StrToInt(Src)
+      else
+        VI := 0;
+      Move(VI, Dest^, Result);
+      end;
+    FIELD_TYPE_DECIMAL, FIELD_TYPE_FLOAT, FIELD_TYPE_DOUBLE:
+      begin
+      Result := SizeOf(Double);
+      if Src <> '' then
+        VF := InternalStrToFloat(Src)
+      else
+        VF := 0;
+      Move(VF, Dest^, Result);
+      end;
+    FIELD_TYPE_TIMESTAMP:
+      begin
+      Result := SizeOf(TDateTime);
+      if Src <> '' then
+        VD := InternalStrToTimeStamp(Src)
+      else
+        VD := 0;
+      Move(VD, Dest^, Result);
+      end;
+    FIELD_TYPE_DATETIME:
+      begin
+      Result := SizeOf(TDateTime);
+      if Src <> '' then
+        VD := InternalStrToDateTime(Src)
+      else
+        VD := 0;
+      Move(VD, Dest^, Result);
+      end;
+    FIELD_TYPE_DATE:
+      begin
+      Result := SizeOf(TDateTime);
+      if Src <> '' then
+        VD := InternalStrToDate(Src)
+      else
+        VD := 0;
+      Move(VD, Dest^, Result);
+      end;
+    FIELD_TYPE_TIME:
+      begin
+      Result := SizeOf(TDateTime);
+      if Src <> '' then
+        VD := InternalStrToTime(Src)
+      else
+        VD := 0;
+      Move(VD, Dest^, Result);
+      end;
+    FIELD_TYPE_VAR_STRING, FIELD_TYPE_STRING, FIELD_TYPE_ENUM, FIELD_TYPE_SET:
+      begin
+      Result := ASize;
+{      Write('Moving string of size ',asize,' : ');
+      P:=Source;
+      If (P<>nil) then
+        While P[0]<>#0 do
+          begin
+          Write(p[0]);
+          inc(p);
+          end;
+      Writeln;
+}      if Src<> '' then
+        Move(Source^, Dest^, Result)
+      else
+        Dest^ := #0;
+      end;
+  end;
+end;
+
+procedure TConnectionName.UpdateIndexDefs(var IndexDefs : TIndexDefs;TableName : string);
+
+var qry : TSQLQuery;
+
+begin
+  if not assigned(Transaction) then
+    DatabaseError(SErrConnTransactionnSet);
+
+  qry := tsqlquery.Create(nil);
+  qry.transaction := Transaction;
+  qry.database := Self;
+  with qry do
+    begin
+    ReadOnly := True;
+    sql.clear;
+    sql.add('show index from ' +  TableName);
+    open;
+    end;
+
+  while not qry.eof do with IndexDefs.AddIndexDef do
+    begin
+    Name := trim(qry.fieldbyname('Key_name').asstring);
+    Fields := trim(qry.fieldbyname('Column_name').asstring);
+    If Name = 'PRIMARY' then options := options + [ixPrimary];
+    If qry.fieldbyname('Non_unique').asinteger = 0 then options := options + [ixUnique];
+    qry.next;
+{    while (name = qry.fields[0].asstring) and (not qry.eof) do
+      begin
+      Fields := Fields + ';' + trim(qry.Fields[2].asstring);
+      qry.next;
+      end;}
+    end;
+  qry.close;
+  qry.free;
+end;
+
+
+function TConnectionName.GetTransactionHandle(trans: TSQLHandle): pointer;
+begin
+  Result:=Nil;
+end;
+
+function TConnectionName.Commit(trans: TSQLHandle): boolean;
+begin
+  // Do nothing.
+end;
+
+function TConnectionName.RollBack(trans: TSQLHandle): boolean;
+begin
+  // Do nothing
+end;
+
+function TConnectionName.StartdbTransaction(trans: TSQLHandle; AParams : string): boolean;
+begin
+  // Do nothing
+end;
+
+procedure TConnectionName.CommitRetaining(trans: TSQLHandle);
+begin
+  // Do nothing
+end;
+
+procedure TConnectionName.RollBackRetaining(trans: TSQLHandle);
+begin
+  // Do nothing
+end;
+
+end.

+ 37 - 37
packages/base/mysql/Makefile

@@ -233,115 +233,115 @@ PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages/base $(FPCDIR)/packages/ext
 override PACKAGE_NAME=mysql
 override PACKAGE_VERSION=2.0.3
 ifeq ($(FULL_TARGET),i386-linux)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),i386-go32v2)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),i386-win32)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),i386-os2)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),i386-freebsd)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),i386-beos)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),i386-netbsd)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),i386-solaris)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),i386-qnx)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),i386-netware)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),i386-openbsd)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),i386-wdosx)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),i386-emx)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),i386-watcom)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),i386-netwlibc)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),i386-wince)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),m68k-linux)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),m68k-freebsd)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),m68k-amiga)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),m68k-atari)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),m68k-openbsd)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),m68k-palmos)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),powerpc-linux)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),powerpc-netbsd)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),powerpc-macos)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),powerpc-darwin)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),powerpc-morphos)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),sparc-linux)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),sparc-netbsd)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),sparc-solaris)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),x86_64-linux)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),x86_64-win64)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),arm-linux)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),arm-wince)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
-override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+override TARGET_UNITS+=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 endif
 ifeq ($(FULL_TARGET),i386-linux)
 override TARGET_EXAMPLES+=testdb4 testdb3

+ 1 - 1
packages/base/mysql/Makefile.fpc

@@ -7,7 +7,7 @@ name=mysql
 version=2.0.3
 
 [target]
-units=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn
+units=my4_sys mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3 mysql3_comdyn mysql3dyn mysql40 mysql40dyn mysql41 mysql41dyn mysql50 mysql50dyn
 examples=testdb4 testdb3
 
 [require]

+ 1668 - 0
packages/base/mysql/mysql.inc

@@ -0,0 +1,1668 @@
+{
+  This file is created by H2Pas, and thereafter heavily edited to make it
+  readable and dynamically loadable.
+
+  The goal was not to be complete, but to make it work and maintainable.
+
+  The mysql_com.h, mysql.h and some other files are merged together into this
+  one file.
+
+  Automatically converted by H2Pas 1.0.0 from mysql_com.h / mysql.h
+  The following command line parameters were used:
+    -p
+    -D
+    -l
+    mysqlclient
+    mysql_com.h / mysql.h
+
+}
+{$MODE objfpc}
+{$MACRO on}
+
+interface
+
+uses
+{$IFDEF LinkDynamically}
+     Dynlibs, sysutils,
+{$ENDIF}
+     ctypes;
+
+{$IFDEF Unix}
+  {$DEFINE extdecl:=cdecl}
+  const
+    mysqllib = 'libmysqlclient.so';
+{$ENDIF}
+{$IFDEF Win32}
+  {$DEFINE extdecl:=stdcall}
+  const
+    mysqllib = 'libmysql.dll';
+{$ENDIF}
+
+{$IFDEF mysql50}
+  {$DEFINE mysql41}
+{$ENDIF mysql50}
+
+{$PACKRECORDS C}
+
+  { Copyright (C) 2000-2003 MySQL AB
+  
+     This program is free software; you can redistribute it and/or modify
+     it under the terms of the GNU General Public License as published by
+     the Free Software Foundation; either version 2 of the License, or
+     (at your option) any later version.
+  
+     This program is distributed in the hope that it will be useful,
+     but WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+     GNU General Public License for more details.
+  
+     You should have received a copy of the GNU General Public License
+     along with this program; if not, write to the Free Software
+     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA  }
+
+    type
+       my_bool = byte;
+       Pmy_bool  = ^my_bool;
+
+       PVIO = Pointer;
+
+       Pgptr = ^gptr;
+       gptr = ^char;
+
+       Pmy_socket = ^my_socket;
+       my_socket = longint;
+       
+       pppchar = ^ppchar;
+       PPByte     = ^PByte;
+
+{  ------------ Start of declaration in "mysql_com.h"   ---------------------  }
+
+  {
+  ** Common definition between mysql server & client
+   }
+
+  { Field/table name length  }
+
+  const
+     NAME_LEN = 64;
+     HOSTNAME_LENGTH = 60;
+     USERNAME_LENGTH = 16;
+     SERVER_VERSION_LENGTH = 60;
+     SQLSTATE_LENGTH = 5;
+     LOCAL_HOST = 'localhost';
+     LOCAL_HOST_NAMEDPIPE = '.';
+
+  const
+     MYSQL_NAMEDPIPE = 'MySQL';
+     MYSQL_SERVICENAME = 'MySQL';
+
+  type
+     enum_server_command = (COM_SLEEP,COM_QUIT,COM_INIT_DB,COM_QUERY,
+       COM_FIELD_LIST,COM_CREATE_DB,COM_DROP_DB,
+       COM_REFRESH,COM_SHUTDOWN,COM_STATISTICS,
+       COM_PROCESS_INFO,COM_CONNECT,COM_PROCESS_KILL,
+       COM_DEBUG,COM_PING,COM_TIME,COM_DELAYED_INSERT,
+       COM_CHANGE_USER,COM_BINLOG_DUMP,COM_TABLE_DUMP,
+       COM_CONNECT_OUT,COM_REGISTER_SLAVE,
+{$IFDEF mysql50}
+       COM_STMT_PREPARE, COM_STMT_EXECUTE, COM_STMT_SEND_LONG_DATA, COM_STMT_CLOSE,
+       COM_STMT_RESET, COM_SET_OPTION, COM_STMT_FETCH,
+{$ELSE}
+  {$IFDEF mysql41}
+       COM_PREPARE,COM_EXECUTE,COM_LONG_DATA,COM_CLOSE_STMT,
+       COM_RESET_STMT,COM_SET_OPTION,
+  {$ENDIF}
+{$ENDIF}
+       COM_END
+       );
+
+  {
+    Length of random string sent by server on handshake; this is also length of
+    obfuscated password, recieved from client
+   }
+
+  const
+     SCRAMBLE_LENGTH = 20;
+     SCRAMBLE_LENGTH_323 = 8;
+
+  { length of password stored in the db: new passwords are preceeded with '*'  }
+
+     SCRAMBLED_PASSWORD_CHAR_LENGTH = SCRAMBLE_LENGTH*2+1;
+     SCRAMBLED_PASSWORD_CHAR_LENGTH_323 = SCRAMBLE_LENGTH_323*2;
+
+
+       NOT_NULL_FLAG = 1;       //  Field can't be NULL
+       PRI_KEY_FLAG = 2;        //  Field is part of a primary key
+       UNIQUE_KEY_FLAG = 4;     //  Field is part of a unique key
+       MULTIPLE_KEY_FLAG = 8;   //  Field is part of a key
+       BLOB_FLAG = 16;          //  Field is a blob
+       UNSIGNED_FLAG = 32;      //  Field is unsigned
+       ZEROFILL_FLAG = 64;      //  Field is zerofill
+       BINARY_FLAG = 128;       //  Field is binary
+
+    { The following are only sent to new clients  }
+
+       ENUM_FLAG = 256;            // field is an enum
+       AUTO_INCREMENT_FLAG = 512;  // field is a autoincrement field
+       TIMESTAMP_FLAG = 1024;      // Field is a timestamp
+       SET_FLAG = 2048;            // field is a set
+{$IFDEF mysql50}
+       NO_DEFAULT_VALUE_FLAG=4096; // Field doesn't have default value
+{$ENDIF}
+       NUM_FLAG = 32768;           // Field is num (for clients)
+       PART_KEY_FLAG = 16384;      // Intern; Part of some key
+       GROUP_FLAG = 32768;         // Intern: Group field
+       UNIQUE_FLAG = 65536;        // Intern: Used by sql_yacc
+       BINCMP_FLAG = 131072;       // Intern: Used by sql_yacc
+
+       REFRESH_GRANT = 1;          // Refresh grant tables
+       REFRESH_LOG = 2;            // Start on new log file
+       REFRESH_TABLES = 4;         // close all tables
+       REFRESH_HOSTS = 8;          // Flush host cache
+       REFRESH_STATUS = 16;        // Flush status variables
+       REFRESH_THREADS = 32;       // Flush thread cache
+       REFRESH_SLAVE = 64;         // Reset master info and restart slave thread
+       REFRESH_MASTER = 128;       // Remove all bin logs in the index and truncate the index
+
+    { The following can't be set with mysql_refresh()  }
+       REFRESH_READ_LOCK = 16384;          // Lock tables for read
+       REFRESH_FAST = 32768;               // Intern flag
+       REFRESH_QUERY_CACHE = 65536;        // RESET (remove all queries) from query cache
+       REFRESH_QUERY_CACHE_FREE = $20000;  // pack query cache
+
+       REFRESH_DES_KEY_FILE = $40000;
+       REFRESH_USER_RESOURCES = $80000;
+
+       CLIENT_LONG_PASSWORD = 1;           // new more secure passwords
+       CLIENT_FOUND_ROWS = 2;              // Found instead of affected rows
+       CLIENT_LONG_FLAG = 4;               // Get all column flags
+       CLIENT_CONNECT_WITH_DB = 8;         // One can specify db on connect
+       CLIENT_NO_SCHEMA = 16;              // Don't allow database.table.column
+       CLIENT_COMPRESS = 32;               // Can use compression protocol
+       CLIENT_ODBC = 64;                   // Odbc client
+       CLIENT_LOCAL_FILES = 128;           // Can use LOAD DATA LOCAL
+       CLIENT_IGNORE_SPACE = 256;          // Ignore spaces before '('
+       CLIENT_PROTOCOL_41 = 512;           // New 4.1 protocol
+       CLIENT_INTERACTIVE = 1024;          // This is an interactive client
+       CLIENT_SSL = 2048;                  // Switch to SSL after handshake
+       CLIENT_IGNORE_SIGPIPE = 4096;       // IGNORE sigpipes
+       CLIENT_TRANSACTIONS = 8192;         // Client knows about transactions
+       CLIENT_RESERVED = 16384;            // Old flag for 4.1 protocol
+       CLIENT_SECURE_CONNECTION = 32768;   // New 4.1 authentication
+       CLIENT_MULTI_STATEMENTS = 65536;    // Enable/disable multi-stmt support
+       CLIENT_MULTI_RESULTS = 131072;      // Enable/disable multi-results
+       CLIENT_REMEMBER_OPTIONS : cardinal = 1 shl 31;
+
+
+       SERVER_STATUS_IN_TRANS = 1;         // Transaction has started
+       SERVER_STATUS_AUTOCOMMIT = 2;       // Server in auto_commit mode
+       SERVER_STATUS_MORE_RESULTS = 4;     // More results on server
+       SERVER_MORE_RESULTS_EXISTS = 8;     // Multi query - next query exists
+       SERVER_QUERY_NO_GOOD_INDEX_USED = 16;
+       SERVER_QUERY_NO_INDEX_USED = 32;
+{$IFDEF mysql50}
+    { The server was able to fulfill the clients request and opened a
+      read-only non-scrollable cursor for a query. This flag comes
+      in reply to COM_STMT_EXECUTE and COM_STMT_FETCH commands. }
+       SERVER_STATUS_CURSOR_EXISTS = 64;
+    { This flag is sent when a read-only cursor is exhausted, in reply to
+      COM_STMT_FETCH command. }
+       SERVER_STATUS_LAST_ROW_SENT = 128;
+{$ENDIF}
+       SERVER_STATUS_DB_DROPPED = 256;     // A database was dropped
+{$IFDEF mysql50}
+       SERVER_STATUS_NO_BACKSLASH_ESCAPES = 512;
+{$ENDIF}
+
+{$IFDEF mysql41}
+       MYSQL_ERRMSG_SIZE = 512;
+{$ELSE}
+       MYSQL_ERRMSG_SIZE = 200;
+{$ENDIF}
+       NET_READ_TIMEOUT = 30;              // Timeout on read
+       NET_WRITE_TIMEOUT = 60;             // Timeout on write
+       NET_WAIT_TIMEOUT	= 8*60*60;         // Wait for new query
+{$IFDEF mysql50}
+       ONLY_KILL_QUERY = 1;
+{$ENDIF}
+
+
+    const
+       MAX_TINYINT_WIDTH = 3;           // Max width for a TINY w.o. sign
+       MAX_SMALLINT_WIDTH = 5;          // Max width for a SHORT w.o. sign
+       MAX_MEDIUMINT_WIDTH = 8;         // Max width for a INT24 w.o. sign
+       MAX_INT_WIDTH = 10;              // Max width for a LONG w.o. sign
+       MAX_BIGINT_WIDTH = 20;           // Max width for a LONGLONG
+       MAX_CHAR_WIDTH = 255;            // Max length for a CHAR colum
+       MAX_BLOB_WIDTH = 8192;           // Default width for blob
+
+    type
+       Pst_net = ^st_net;
+       st_net = record
+{ $if !defined(CHECK_EMBEDDED_DIFFERENCES) || !defined(EMBEDDED_LIBRARY)}
+            vio : PVio;
+            buff : Pbyte;
+            buff_end : Pbyte;
+            write_pos : Pbyte;
+            read_pos : Pbyte;
+            fd : my_socket;     // For Perl DBI/dbd
+            max_packet : dword;
+            max_packet_size : dword;
+{$IFNDEF mysql41}
+            last_errno : dword;
+{$ENDIF}
+            pkt_nr : dword;
+            compress_pkt_nr : dword;
+            write_timeout : dword;
+            read_timeout : dword;
+            retry_count : dword;
+            fcntl : longint;
+{$IFNDEF mysql41}
+            last_error : array[0..(MYSQL_ERRMSG_SIZE)-1] of char;
+            error : byte;
+            return_errno : my_bool;
+{$ENDIF}
+            compress : my_bool;
+    {   The following variable is set if we are doing several queries in one
+        command ( as in LOAD TABLE ... FROM MASTER ),
+        and do not want to confuse the client with OK at the wrong time }
+            remain_in_buf : dword;
+            length : dword;
+            buf_length : dword;
+            where_b : dword;
+            return_status : Pdword;
+            reading_or_writing : byte;
+            save_char : char;
+            no_send_ok : my_bool;     // For SPs and other things that do multiple stmts
+{$IFDEF mysql50}
+            no_send_eof : my_bool;    // For SPs' first version read-only cursors
+            no_send_error : my_bool;  // Set if OK packet is already sent, and
+                                      // we do not need to send error messages
+{$ENDIF}
+    {   Pointer to query object in query cache, do not equal NULL (0) for
+        queries in cache that have not stored its results yet }
+{ $endif}
+{$IFDEF mysql41}
+            last_error : array[0..(MYSQL_ERRMSG_SIZE)-1] of char;
+            sqlstate : array[0..(SQLSTATE_LENGTH+1)-1] of char;
+            last_errno : dword;
+            error : byte;
+{$ENDIF}
+            query_cache_query : gptr;
+{$IFDEF mysql41}
+            report_error : my_bool;   // We should report error (we have unreported error)
+            return_errno : my_bool;
+{$ENDIF}
+         end;
+       NET = st_net;
+       PNET = ^NET;
+
+    const
+       packet_error : culong = not(0);
+
+    type
+       enum_field_types = (MYSQL_TYPE_DECIMAL,MYSQL_TYPE_TINY,
+         MYSQL_TYPE_SHORT,MYSQL_TYPE_LONG,MYSQL_TYPE_FLOAT,
+         MYSQL_TYPE_DOUBLE,MYSQL_TYPE_NULL,
+         MYSQL_TYPE_TIMESTAMP,MYSQL_TYPE_LONGLONG,
+         MYSQL_TYPE_INT24,MYSQL_TYPE_DATE,MYSQL_TYPE_TIME,
+         MYSQL_TYPE_DATETIME,MYSQL_TYPE_YEAR,
+         MYSQL_TYPE_NEWDATE,
+{$IFDEF mysql50}
+         MYSQL_TYPE_VARCHAR, MYSQL_TYPE_BIT, MYSQL_TYPE_NEWDECIMAL=246,
+{$ENDIF}
+         MYSQL_TYPE_ENUM := 247,
+         MYSQL_TYPE_SET := 248,MYSQL_TYPE_TINY_BLOB := 249,
+         MYSQL_TYPE_MEDIUM_BLOB := 250,MYSQL_TYPE_LONG_BLOB := 251,
+         MYSQL_TYPE_BLOB := 252,MYSQL_TYPE_VAR_STRING := 253,
+         MYSQL_TYPE_STRING := 254,MYSQL_TYPE_GEOMETRY := 255
+         );
+
+    { For backward compatibility  }
+
+    const
+       CLIENT_MULTI_QUERIES = CLIENT_MULTI_STATEMENTS;
+       FIELD_TYPE_DECIMAL = MYSQL_TYPE_DECIMAL;
+{$IFDEF mysql50}
+       FIELD_TYPE_NEWDECIMAL = MYSQL_TYPE_NEWDECIMAL;
+{$ENDIF}
+       FIELD_TYPE_TINY = MYSQL_TYPE_TINY;
+       FIELD_TYPE_SHORT = MYSQL_TYPE_SHORT;
+       FIELD_TYPE_LONG = MYSQL_TYPE_LONG;
+       FIELD_TYPE_FLOAT = MYSQL_TYPE_FLOAT;
+       FIELD_TYPE_DOUBLE = MYSQL_TYPE_DOUBLE;
+       FIELD_TYPE_NULL = MYSQL_TYPE_NULL;
+       FIELD_TYPE_TIMESTAMP = MYSQL_TYPE_TIMESTAMP;
+       FIELD_TYPE_LONGLONG = MYSQL_TYPE_LONGLONG;
+       FIELD_TYPE_INT24 = MYSQL_TYPE_INT24;
+       FIELD_TYPE_DATE = MYSQL_TYPE_DATE;
+       FIELD_TYPE_TIME = MYSQL_TYPE_TIME;
+       FIELD_TYPE_DATETIME = MYSQL_TYPE_DATETIME;
+       FIELD_TYPE_YEAR = MYSQL_TYPE_YEAR;
+       FIELD_TYPE_NEWDATE = MYSQL_TYPE_NEWDATE;
+       FIELD_TYPE_ENUM = MYSQL_TYPE_ENUM;
+       FIELD_TYPE_SET = MYSQL_TYPE_SET;
+       FIELD_TYPE_TINY_BLOB = MYSQL_TYPE_TINY_BLOB;
+       FIELD_TYPE_MEDIUM_BLOB = MYSQL_TYPE_MEDIUM_BLOB;
+       FIELD_TYPE_LONG_BLOB = MYSQL_TYPE_LONG_BLOB;
+       FIELD_TYPE_BLOB = MYSQL_TYPE_BLOB;
+       FIELD_TYPE_VAR_STRING = MYSQL_TYPE_VAR_STRING;
+       FIELD_TYPE_STRING = MYSQL_TYPE_STRING;
+       FIELD_TYPE_CHAR = MYSQL_TYPE_TINY;
+       FIELD_TYPE_INTERVAL = MYSQL_TYPE_ENUM;
+       FIELD_TYPE_GEOMETRY = MYSQL_TYPE_GEOMETRY;
+{$IFDEF mysql50}
+       FIELD_TYPE_BIT = MYSQL_TYPE_BIT;
+{$ENDIF}
+    { Shutdown/kill enums and constants  }
+    { Bits for THD::killable.  }
+       MYSQL_SHUTDOWN_KILLABLE_CONNECT    : byte = 1 shl 0;
+       MYSQL_SHUTDOWN_KILLABLE_TRANS      : byte = 1 shl 1;
+       MYSQL_SHUTDOWN_KILLABLE_LOCK_TABLE : byte = 1 shl 2;
+       MYSQL_SHUTDOWN_KILLABLE_UPDATE     : byte = 1 shl 3;
+
+
+    {   We want levels to be in growing order of hardness (because we use number
+        comparisons). Note that DEFAULT does not respect the growing property, but
+        it's ok.  }
+    type
+       mysql_enum_shutdown_level = (SHUTDOWN_DEFAULT := 0,
+         SHUTDOWN_WAIT_CONNECTIONS := 1, //MYSQL_SHUTDOWN_KILLABLE_CONNECT,     // wait for existing connections to finish
+         SHUTDOWN_WAIT_TRANSACTIONS := 2, //MYSQL_SHUTDOWN_KILLABLE_TRANS,      // wait for existing trans to finish
+         SHUTDOWN_WAIT_UPDATES := 8, //MYSQL_SHUTDOWN_KILLABLE_UPDATE,          // wait for existing updates to finish (=> no partial MyISAM update)
+         SHUTDOWN_WAIT_ALL_BUFFERS := 16, //MYSQL_SHUTDOWN_KILLABLE_UPDATE shl 1,// flush InnoDB buffers and other storage engines' buffers
+         SHUTDOWN_WAIT_CRITICAL_BUFFERS := 17, //(MYSQL_SHUTDOWN_KILLABLE_UPDATE shl 1)+1, // don't flush InnoDB buffers, flush other storage engines' buffers
+    { Now the 2 levels of the KILL command  }
+{ $if MYSQL_VERSION_ID >= 50000}
+         KILL_QUERY := 254,
+{ $endif}
+         KILL_CONNECTION := 255
+         );
+
+{$IFDEF mysql50}
+       enum_cursor_type = (CURSOR_TYPE_NO_CURSOR := 0,CURSOR_TYPE_READ_ONLY := 1,
+         CURSOR_TYPE_FOR_UPDATE := 2,CURSOR_TYPE_SCROLLABLE := 4
+         );
+{$ENDIF}
+
+    { options for mysql_set_option  }
+       enum_mysql_set_option = (MYSQL_OPTION_MULTI_STATEMENTS_ON,
+         MYSQL_OPTION_MULTI_STATEMENTS_OFF
+         );
+
+    function net_new_transaction(net : st_net) : st_net;
+
+{$IFNDEF LinkDynamically}
+    function my_net_init(net:PNET; vio:PVio):my_bool;cdecl;external mysqllib name 'my_net_init';
+    procedure my_net_local_init(net:PNET);cdecl;external mysqllib name 'my_net_local_init';
+    procedure net_end(net:PNET);cdecl;external mysqllib name 'net_end';
+    procedure net_clear(net:PNET);cdecl;external mysqllib name 'net_clear';
+    function net_realloc(net:PNET; length:dword):my_bool;cdecl;external mysqllib name 'net_realloc';
+    function net_flush(net:PNET):my_bool;cdecl;external mysqllib name 'net_flush';
+    function my_net_write(net:PNET; packet:Pchar; len:dword):my_bool;cdecl;external mysqllib name 'my_net_write';
+    function net_write_command(net:PNET; command:byte; header:Pchar; head_len:dword; packet:Pchar;
+               len:dword):my_bool;cdecl;external mysqllib name 'net_write_command';
+    function net_real_write(net:PNET; packet:Pchar; len:dword):longint;cdecl;external mysqllib name 'net_real_write';
+    function my_net_read(net:PNET):dword;cdecl;external mysqllib name 'my_net_read';
+{$ENDIF}
+    { The following function is not meant for normal usage
+      Currently it's used internally by manager.c  }
+
+    type
+       Psockaddr = ^sockaddr;
+       sockaddr = record
+           // undefined structure
+         end;
+{$IFNDEF LinkDynamically}
+    function my_connect(s:my_socket; name:Psockaddr; namelen:dword; timeout:dword):longint;cdecl;external mysqllib name 'my_connect';
+{$ENDIF}
+
+    type
+       Prand_struct = ^rand_struct;
+       rand_struct = record
+            seed1 : dword;
+            seed2 : dword;
+            max_value : dword;
+            max_value_dbl : double;
+         end;
+
+    { The following is for user defined functions  }
+{$IFDEF mysql50}
+       Item_result = (STRING_RESULT,REAL_RESULT,INT_RESULT,
+         ROW_RESULT);
+{$ELSE}
+       Item_result = (STRING_RESULT := 0,REAL_RESULT,INT_RESULT,
+         ROW_RESULT,DECIMAL_RESULT);
+{$ENDIF}
+       PItem_result = ^Item_result;
+
+       Pst_udf_args = ^st_udf_args;
+       st_udf_args = record
+            arg_count : dword;           // Number of arguments
+            arg_type : PItem_result;     // Pointer to item_results
+            args : ^Pchar;               // Pointer to item_results
+            lengths : Pdword;            // Length of string arguments
+            maybe_null : Pchar;          // Length of string arguments
+{$IFDEF mysql50}
+            attributes : ^pchar;         // Pointer to attribute name
+            attribute_lengths : ^dword;  // Length of attribute arguments
+{$ENDIF}
+         end;
+       UDF_ARGS = st_udf_args;
+       PUDF_ARGS = ^UDF_ARGS;
+
+    { This holds information about the result  }
+
+       Pst_udf_init = ^st_udf_init;
+       st_udf_init = record
+            maybe_null : my_bool;        // 1 if function can return NULL
+            decimals : dword;            // for real functions
+            max_length : dword;          // For string functions
+            ptr : Pchar;                 // free pointer for function data
+            const_item : my_bool;        // free pointer for function data
+         end;
+       UDF_INIT = st_udf_init;
+       PUDF_INIT = ^UDF_INIT;
+
+    { Constants when using compression  }
+    const
+       NET_HEADER_SIZE = 4;              // standard header size
+       COMP_HEADER_SIZE = 3;             // compression header extra size
+
+    { Prototypes to password functions  }
+
+    { These functions are used for authentication by client and server and
+      implemented in sql/password.c     }
+{$IFNDEF LinkDynamically}
+    procedure randominit(_para1:Prand_struct; seed1:dword; seed2:dword);cdecl;external mysqllib name 'randominit';
+    function my_rnd(_para1:Prand_struct):double;cdecl;external mysqllib name 'my_rnd';
+    procedure create_random_string(fto:Pchar; length:dword; rand_st:Prand_struct);cdecl;external mysqllib name 'create_random_string';
+    procedure hash_password(fto:Pdword; password:Pchar; password_len:dword);cdecl;external mysqllib name 'hash_password';
+    procedure make_scrambled_password_323(fto:Pchar; password:Pchar);cdecl;external mysqllib name 'make_scrambled_password_323';
+    procedure scramble_323(fto:Pchar; message:Pchar; password:Pchar);cdecl;external mysqllib name 'scramble_323';
+    function check_scramble_323(_para1:Pchar; message:Pchar; salt:Pdword):my_bool;cdecl;external mysqllib name 'check_scramble_323';
+    procedure get_salt_from_password_323(res:Pdword; password:Pchar);cdecl;external mysqllib name 'get_salt_from_password_323';
+    procedure make_password_from_salt_323(fto:Pchar; salt:Pdword);cdecl;external mysqllib name 'make_password_from_salt_323';
+{$IFDEF mysql50}
+    function octet2hex(fto:Pchar; str:Pchar; len:dword):pchar;cdecl;external mysqllib name 'octet2hex';
+{$ENDIF}
+    procedure make_scrambled_password(fto:Pchar; password:Pchar);cdecl;external mysqllib name 'make_scrambled_password';
+    procedure scramble(fto:Pchar; message:Pchar; password:Pchar);cdecl;external mysqllib name 'scramble';
+    function check_scramble(reply:Pchar; message:Pchar; hash_stage2:Pbyte):my_bool;cdecl;external mysqllib name 'check_scramble';
+    procedure get_salt_from_password(res:Pbyte; password:Pchar);cdecl;external mysqllib name 'get_salt_from_password';
+    procedure make_password_from_salt(fto:Pchar; hash_stage2:Pbyte);cdecl;external mysqllib name 'make_password_from_salt';
+    { end of password.c  }
+
+    function get_tty_password(opt_message:Pchar):Pchar;cdecl;external mysqllib name 'get_tty_password';
+    function mysql_errno_to_sqlstate(mysql_errno:dword):Pchar;cdecl;external mysqllib name 'mysql_errno_to_sqlstate';
+{$ENDIF}
+
+    { Some other useful functions  }
+{$IFDEF mysql50}
+    function modify_defaults_file(file_location:Pchar; option:Pchar; option_value:Pchar; section_name:Pchar; remove_option:longint):longint;cdecl;external mysqllib name 'load_defaults';
+{$ENDIF}
+
+{$IFNDEF LinkDynamically}
+    function load_defaults(conf_file:Pchar; groups:PPchar; argc:Plongint; argv:PPPchar):longint;cdecl;external mysqllib name 'load_defaults';
+    function my_init:my_bool;cdecl;external mysqllib name 'my_init';
+    function my_thread_init:my_bool;cdecl;external mysqllib name 'my_thread_init';
+    procedure my_thread_end;cdecl;external mysqllib name 'my_thread_end';
+{$ELSE}
+    var
+      my_init : function :my_bool;cdecl;
+      my_thread_init : function :my_bool;cdecl;
+      my_thread_end : procedure ;cdecl;
+{$ENDIF}
+
+{$ifdef _global_h}
+{$IFNDEF LinkDynamically}
+    function net_field_length(packet:PPuchar):culong;extdecl;external mysqllib name 'net_field_length_ll';
+    function net_field_length_ll(packet:PPuchar):my_ulonglong;cdecl;external mysqllib name 'net_field_length_ll';
+    function net_store_length(pkg:Pchar; length:ulonglong):Pchar;cdecl;external mysqllib name 'net_store_length';
+{$ENDIF}
+{$endif}
+
+    const
+       NULL_LENGTH : dword = not(0); // For net_store_length
+
+    const
+       MYSQL_STMT_HEADER = 4;
+       MYSQL_LONG_DATA_HEADER = 6;
+
+{  ------------ Stop of declaration in "mysql_com.h"   -----------------------  }
+
+{ $include "mysql_time.h"}
+{ $include "mysql_version.h"}
+{ $include "typelib.h"}
+{ $include "my_list.h" /* for LISTs used in 'MYSQL' and 'MYSQL_STMT' */}
+
+{$IFNDEF LinkDynamically}
+      var
+         mysql_port : dword;cvar;external;
+         mysql_unix_port : Pchar;cvar;external;
+{$ENDIF}
+
+      const
+         CLIENT_NET_READ_TIMEOUT = 365*24*3600;     // Timeout on read
+         CLIENT_NET_WRITE_TIMEOUT = 365*24*3600;    // Timeout on write
+      
+{$ifdef NETWARE}
+(** unsupported pragma#pragma pack(push, 8)		/* 8 byte alignment */*)
+{$endif}
+
+    type
+       Pst_mysql_field = ^st_mysql_field;
+       st_mysql_field = record
+            name : Pchar;             // Name of column
+{$IFDEF mysql41}
+            org_name : Pchar;         // Original column name, if an alias
+{$ENDIF}
+            table : Pchar;            // Table of column if column was a field
+            org_table : Pchar;        // Org table name, if table was an alias
+            db : Pchar;               // Database for table
+{$IFDEF mysql41}
+            catalog : Pchar;          // Catalog for table
+{$ENDIF}
+            def : Pchar;              // Default value (set by mysql_list_fields)
+            length : dword;           // Width of column (create length)
+            max_length : dword;       // Max width for selected set
+{$IFDEF mysql41}
+            name_length : dword;
+            org_name_length : dword;
+            table_length : dword;
+            org_table_length : dword;
+            db_length : dword;
+            catalog_length : dword;
+            def_length : dword;
+{$ENDIF}
+            flags : dword;            // Div flags
+            decimals : dword;         // Number of decimals in field
+{$IFDEF mysql41}
+            charsetnr : dword;        // Character set
+{$ENDIF}
+            ftype : enum_field_types; // Type of field. See mysql_com.h for types
+         end;
+       MYSQL_FIELD = st_mysql_field;
+       PMYSQL_FIELD = ^MYSQL_FIELD;
+
+       PMYSQL_ROW = ^MYSQL_ROW;       // return data as array of strings
+       MYSQL_ROW = ppchar;
+
+       PMYSQL_FIELD_OFFSET = ^MYSQL_FIELD_OFFSET;     // offset to current field
+       MYSQL_FIELD_OFFSET = dword;
+
+    function IS_PRI_KEY(n : longint) : boolean;
+    function IS_NOT_NULL(n : longint) : boolean;
+    function IS_BLOB(n : longint) : boolean;
+    function IS_NUM(t : enum_field_types) : boolean;
+    function INTERNAL_NUM_FIELD(f : Pst_mysql_field) : boolean;
+    function IS_NUM_FIELD(f : Pst_mysql_field) : boolean;
+
+    type
+{$if defined(NO_CLIENT_LONG_LONG)}
+       my_ulonglong = dword;
+{$elseif defined(mswindows)}
+       my_ulonglong = int64;
+{$else}
+       my_ulonglong = qword;
+{$endif}
+       Pmy_ulonglong = ^my_ulonglong;
+
+    const
+       MYSQL_COUNT_ERROR = not (my_ulonglong(0));
+
+    type
+       Pst_mysql_rows = ^st_mysql_rows;
+       st_mysql_rows = record
+            next : Pst_mysql_rows;                    // list of rows
+            data : MYSQL_ROW;
+{$IFDEF mysql41}
+            length : dword;
+{$ENDIF}
+         end;
+       MYSQL_ROWS = st_mysql_rows;
+       PMYSQL_ROWS = ^MYSQL_ROWS;
+
+       PMYSQL_ROW_OFFSET = ^MYSQL_ROW_OFFSET;         // offset to current row
+       MYSQL_ROW_OFFSET = MYSQL_ROWS;
+
+{  ------------ Start of declaration in "my_alloc.h"     --------------------  }
+{ $include "my_alloc.h"}
+
+  const
+     ALLOC_MAX_BLOCK_TO_DROP = 4096;
+     ALLOC_MAX_BLOCK_USAGE_BEFORE_DROP = 10;
+
+ { struct for once_alloc (block)  }
+  type
+     Pst_used_mem = ^st_used_mem;
+     st_used_mem = record
+          next : Pst_used_mem;   // Next block in use
+          left : dword;          // memory left in block
+          size : dword;          // size of block
+       end;
+     USED_MEM = st_used_mem;
+     PUSED_MEM = ^USED_MEM;
+
+
+     Pst_mem_root = ^st_mem_root;
+     st_mem_root = record
+          free : PUSED_MEM;      // blocks with free memory in it
+          used : PUSED_MEM;      // blocks almost without free memory
+          pre_alloc : PUSED_MEM; // preallocated block
+          min_malloc : dword;    // if block have less memory it will be put in 'used' list
+          block_size : dword;    // initial block size
+          block_num : dword;     // allocated blocks counter
+  {    first free block in queue test counter (if it exceed
+       MAX_BLOCK_USAGE_BEFORE_DROP block will be dropped in 'used' list)     }
+          first_block_usage : dword;
+          error_handler : procedure ;cdecl;
+       end;
+     MEM_ROOT = st_mem_root;
+     PMEM_ROOT = ^MEM_ROOT;
+
+{  ------------ Stop of declaration in "my_alloc.h"    ----------------------  }
+
+    type
+       Pst_mysql_data = ^st_mysql_data;
+       st_mysql_data = record
+            rows : my_ulonglong;
+            fields : dword;
+            data : PMYSQL_ROWS;
+            alloc : MEM_ROOT;
+{ $if !defined(CHECK_EMBEDDED_DIFFERENCES) || defined(EMBEDDED_LIBRARY)}
+{$IFDEF mysql41}
+            prev_ptr : ^PMYSQL_ROWS;
+{$ENDIF}
+{ $endif}
+         end;
+         
+       MYSQL_DATA = st_mysql_data;
+       PMYSQL_DATA = ^MYSQL_DATA;
+       mysql_option = (MYSQL_OPT_CONNECT_TIMEOUT,MYSQL_OPT_COMPRESS,
+         MYSQL_OPT_NAMED_PIPE,MYSQL_INIT_COMMAND,
+         MYSQL_READ_DEFAULT_FILE,MYSQL_READ_DEFAULT_GROUP,
+         MYSQL_SET_CHARSET_DIR,MYSQL_SET_CHARSET_NAME,
+         MYSQL_OPT_LOCAL_INFILE,MYSQL_OPT_PROTOCOL,
+         MYSQL_SHARED_MEMORY_BASE_NAME,MYSQL_OPT_READ_TIMEOUT,
+         MYSQL_OPT_WRITE_TIMEOUT,MYSQL_OPT_USE_RESULT,
+         MYSQL_OPT_USE_REMOTE_CONNECTION,MYSQL_OPT_USE_EMBEDDED_CONNECTION,
+         MYSQL_OPT_GUESS_CONNECTION,MYSQL_SET_CLIENT_IP,
+         MYSQL_SECURE_AUTH
+{$IFDEF MYSQL50}
+         ,MYSQL_REPORT_DATA_TRUNCATION, MYSQL_OPT_RECONNECT
+{$ENDIF}
+         );
+
+    const
+       MAX_MYSQL_MANAGER_ERR = 256;
+       MAX_MYSQL_MANAGER_MSG = 256;
+       MANAGER_OK = 200;
+       MANAGER_INFO = 250;
+       MANAGER_ACCESS = 401;
+       MANAGER_CLIENT_ERR = 450;
+       MANAGER_INTERNAL_ERR = 500;
+
+    type
+       st_dynamic_array = record
+            buffer : ^char;
+            elements : cuint;
+            max_element : cuint;
+            alloc_increment : cuint;
+            size_of_element : cuint;
+         end;
+       DYNAMIC_ARRAY = st_dynamic_array;
+       Pst_dynamic_array = ^st_dynamic_array;
+
+       Pst_mysql_options = ^st_mysql_options;
+       st_mysql_options = record
+            connect_timeout : dword;
+{$IFNDEF mysql41}
+            client_flag : dword;
+            port : dword;
+{$ELSE}
+            read_timeout : dword;
+            write_timeout : dword;
+{$ENDIF}
+{$IFDEF mysql41}
+            port : dword;
+            protocol : dword;
+            client_flag : dword;
+{$ENDIF}
+            host : Pchar;
+{$IFNDEF mysql41}
+            init_command: Pchar;
+{$ENDIF}
+            user : Pchar;
+            password : Pchar;
+            unix_socket : Pchar;
+            db : Pchar;
+{$IFDEF mysql41}
+            init_commands : Pst_dynamic_array;
+{$ENDIF}
+            my_cnf_file : Pchar;
+            my_cnf_group : Pchar;
+            charset_dir : Pchar;
+            charset_name : Pchar;
+            ssl_key : Pchar;                 // PEM key file
+            ssl_cert : Pchar;                // PEM cert file
+            ssl_ca : Pchar;                  // PEM CA file
+            ssl_capath : Pchar;              // PEM directory of CA-s?
+            ssl_cipher : Pchar;              // cipher to use
+{$IFDEF mysql41}
+            shared_memory_base_name : Pchar;
+{$ENDIF}
+            max_allowed_packet : dword;
+            use_ssl : my_bool;               // if to use SSL or not
+            compress : my_bool;
+            named_pipe : my_bool;
+    {  On connect, find out the replication role of the server, and
+       establish connections to all the peers  }
+            rpl_probe : my_bool;
+    {  Each call to mysql_real_query() will parse it to tell if it is a read
+       or a write, and direct it to the slave or the master      }
+            rpl_parse : my_bool;
+    {  If set, never read from a master, only from slave, when doing
+       a read that is replication-aware    }
+            no_master_reads : my_bool;
+{ $if !defined(CHECK_EMBEDDED_DIFFERENCES) || defined(EMBEDDED_LIBRARY)}
+{$IFDEF mysql41}
+            separate_thread : my_bool;
+{ $endif}
+            methods_to_use : mysql_option;
+            client_ip : Pchar;
+            secure_auth : my_bool;           // Refuse client connecting to server if it uses old (pre-4.1.1) protocol
+{$IFDEF mysql50}
+            report_data_truncation : my_bool;// 0 - never report, 1 - always report (default)
+{$ENDIF}
+    { function pointers for local infile support  }
+            local_infile_init : function (_para1:Ppointer; _para2:Pchar; _para3:pointer):longint;cdecl;
+            local_infile_read : function (_para1:pointer; _para2:Pchar; _para3:dword):longint;
+            local_infile_end : procedure (_para1:pointer);
+            local_infile_error : function (_para1:pointer; _para2:Pchar; _para3:dword):longint;
+            local_infile_userdata : pointer;
+{$ENDIF}
+         end;
+
+       mysql_status = (MYSQL_STATUS_READY,MYSQL_STATUS_GET_RESULT,
+         MYSQL_STATUS_USE_RESULT);
+
+       mysql_protocol_type = (MYSQL_PROTOCOL_DEFAULT,MYSQL_PROTOCOL_TCP,
+         MYSQL_PROTOCOL_SOCKET,MYSQL_PROTOCOL_PIPE,
+         MYSQL_PROTOCOL_MEMORY);
+
+    { There are three types of queries - the ones that have to go to
+      the master, the ones that go to a slave, and the adminstrative
+      type which must happen on the pivot connectioin     }
+       mysql_rpl_type = (MYSQL_RPL_MASTER,MYSQL_RPL_SLAVE,MYSQL_RPL_ADMIN
+         );
+
+       charset_info_st = record
+            number : cuint;
+            primary_number : cuint;
+            binary_number : cuint;
+            state : cuint;
+            csname : ^char;
+            name : ^char;
+            comment : ^char;
+            tailoring : ^char;
+            ftype : ^cuchar;
+            to_lower : ^cuchar;
+            to_upper : ^cuchar;
+            sort_order : ^cuchar;
+            contractions : ^cuint16;
+            sort_order_big : ^pword;
+            tab_to_uni : ^cuint16;
+            tab_from_uni : pointer; // was ^MY_UNI_IDX
+            state_map : ^cuchar;
+            ident_map : ^cuchar;
+            strxfrm_multiply : cuint;
+            mbminlen : cuint;
+            mbmaxlen : cuint;
+            min_sort_char : cuint16;
+            max_sort_char : cuint16;
+            escape_with_backslash_is_dangerous : my_bool;
+            cset : pointer; // was ^MY_CHARSET_HANDLER
+            coll : pointer; // was ^MY_COLLATION_HANDLER;
+         end;
+       CHARSET_INFO = charset_info_st;
+       Pcharset_info_st = ^charset_info_st;
+
+{$IFDEF mysql50}
+       Pcharacter_set = ^character_set;
+       character_set = record
+            number : dword;
+            state : dword;
+            csname : Pchar;
+            name : Pchar;
+            comment : Pchar;
+            dir : Pchar;
+            mbminlen : dword;
+            mbmaxlen : dword;
+         end;
+       MY_CHARSET_INFO = character_set;
+       PMY_CHARSET_INFO = ^MY_CHARSET_INFO;
+{$ENDIF}
+
+       Pst_mysql_methods = ^st_mysql_methods;
+
+       Pst_mysql = ^st_mysql;
+       st_mysql = record
+            net : NET;                   // Communication parameters
+            connector_fd : gptr;         // ConnectorFd for SSL
+            host : Pchar;
+            user : Pchar;
+            passwd : Pchar;
+            unix_socket : Pchar;
+            server_version : Pchar;
+            host_info : Pchar;
+            info : Pchar;
+            db : Pchar;
+            charset : Pcharset_info_st;
+            fields : PMYSQL_FIELD;
+            field_alloc : MEM_ROOT;
+            affected_rows : my_ulonglong;
+            insert_id : my_ulonglong;    // id if insert on table with NEXTNR
+            extra_info : my_ulonglong;   // Used by mysqlshow, not used by mysql 5.0 and up
+            thread_id : dword;           // Id for connection in server
+            packet_length : dword;
+            port : dword;
+            client_flag : dword;
+            server_capabilities : dword;
+            protocol_version : dword;
+            field_count : dword;
+            server_status : dword;
+            server_language : dword;
+            warning_count : dword;
+            options : st_mysql_options;
+            status : mysql_status;
+            free_me : my_bool;           // If free in mysql_close
+            reconnect : my_bool;         // set to 1 if automatic reconnect
+            scramble : array[0..(SCRAMBLE_LENGTH+1)-1] of char;  // session-wide random string
+    {  Set if this is the original connection, not a master or a slave we have
+       added though mysql_rpl_probe() or mysql_set_master()/ mysql_add_slave()      }
+            rpl_pivot : my_bool;
+    {   Pointers to the master, and the next slave connections, points to
+        itself if lone connection.       }
+            master : Pst_mysql;
+            next_slave : Pst_mysql;
+            last_used_slave : Pst_mysql; // needed for round-robin slave pick
+            last_used_con : Pst_mysql;   // needed for send/read/store/use result to work correctly with replication
+{$IFDEF mysql41}
+            stmts : Pointer;             // was PList, list of all statements
+            methods : Pst_mysql_methods;
+            thd : pointer;
+    {   Points to boolean flag in MYSQL_RES  or MYSQL_STMT. We set this flag
+        from mysql_stmt_close if close had to cancel result set of this object.       }
+            unbuffered_fetch_owner : Pmy_bool;
+{$ENDIF}
+         end;
+       MYSQL = st_mysql;
+       PMYSQL = ^MYSQL;
+
+
+       Pst_mysql_res = ^st_mysql_res;
+       st_mysql_res = record
+            row_count : my_ulonglong;
+            fields : PMYSQL_FIELD;
+            data : PMYSQL_DATA;
+            data_cursor : PMYSQL_ROWS;
+            lengths : Pdword;            // column lengths of current row
+            handle : PMYSQL;             // for unbuffered reads
+            field_alloc : MEM_ROOT;
+            field_count : dword;
+            current_field : dword;
+            row : MYSQL_ROW;             // If unbuffered read
+            current_row : MYSQL_ROW;     // buffer to current row
+            eof : my_bool;               // Used by mysql_fetch_row
+{$IFDEF mysql41}
+            unbuffered_fetch_cancelled : my_bool;  // mysql_stmt_close() had to cancel this result
+
+            methods : Pst_mysql_methods;
+{$ENDIF}
+         end;
+       MYSQL_RES = st_mysql_res;
+       PMYSQL_RES = ^MYSQL_RES;
+
+       Pst_mysql_stmt = ^st_mysql_stmt;
+       PMYSQL_STMT = ^MYSQL_STMT;
+
+       st_mysql_methods = record
+            read_query_result : function (mysql:PMYSQL):my_bool;cdecl;
+            advanced_command : function (mysql:PMYSQL; command:enum_server_command; header:Pchar; header_length:dword; arg:Pchar;
+                         arg_length:dword; skip_check:my_bool):my_bool;
+            read_rows : function (mysql:PMYSQL; mysql_fields:PMYSQL_FIELD; fields:dword):PMYSQL_DATA;
+            use_result : function (mysql:PMYSQL):PMYSQL_RES;
+            fetch_lengths : procedure (fto:Pdword; column:MYSQL_ROW; field_count:dword);
+            flush_use_result : procedure (mysql:PMYSQL);
+{ $if !defined(MYSQL_SERVER) || defined(EMBEDDED_LIBRARY)}
+            list_fields : function (mysql:PMYSQL):PMYSQL_FIELD;
+            read_prepare_result : function (mysql:PMYSQL; stmt:PMYSQL_STMT):my_bool;
+            stmt_execute : function (stmt:PMYSQL_STMT):longint;
+            read_binary_rows : function (stmt:PMYSQL_STMT):longint;
+            unbuffered_fetch : function (mysql:PMYSQL; row:PPchar):longint;
+            free_embedded_thd : procedure (mysql:PMYSQL);
+            read_statistics : function (mysql:PMYSQL):Pchar;
+            next_result : function (mysql:PMYSQL):my_bool;
+            read_change_user_result : function (mysql:PMYSQL; buff:Pchar; passwd:Pchar):longint;
+{ $endif}
+         end;
+       MYSQL_METHODS = st_mysql_methods;
+       PMYSQL_METHODS = ^MYSQL_METHODS;
+
+
+       Pst_mysql_manager = ^st_mysql_manager;
+       st_mysql_manager = record
+            net : NET;
+            host : Pchar;
+            user : Pchar;
+            passwd : Pchar;
+            port : dword;
+            free_me : my_bool;
+            eof : my_bool;
+            cmd_status : longint;
+            last_errno : longint;
+            net_buf : Pchar;
+            net_buf_pos : Pchar;
+            net_data_end : Pchar;
+            net_buf_size : longint;
+            last_error : array[0..(MAX_MYSQL_MANAGER_ERR)-1] of char;
+         end;
+       MYSQL_MANAGER = st_mysql_manager;
+       PMYSQL_MANAGER = ^MYSQL_MANAGER;
+
+       Pst_mysql_parameters = ^st_mysql_parameters;
+       st_mysql_parameters = record
+            p_max_allowed_packet : Pdword;
+            p_net_buffer_length : Pdword;
+         end;
+       MYSQL_PARAMETERS = st_mysql_parameters;
+       PMYSQL_PARAMETERS = ^MYSQL_PARAMETERS;
+
+    { The following definitions are added for the enhanced
+      client-server protocol }
+
+    { statement state  }
+
+       enum_mysql_stmt_state = (MYSQL_STMT_INIT_DONE := 1,MYSQL_STMT_PREPARE_DONE,
+         MYSQL_STMT_EXECUTE_DONE,MYSQL_STMT_FETCH_DONE
+         );
+
+    {
+      Note: this info is from the mysql-5.0 version:
+    
+      This structure is used to define bind information, and
+      internally by the client library.
+      Public members with their descriptions are listed below
+      (conventionally `On input' refers to the binds given to
+      mysql_stmt_bind_param, `On output' refers to the binds given
+      to mysql_stmt_bind_result):
+
+      buffer_type    - One of the MYSQL_* types, used to describe
+                       the host language type of buffer.
+                       On output: if column type is different from
+                       buffer_type, column value is automatically converted
+                       to buffer_type before it is stored in the buffer.
+      buffer         - On input: points to the buffer with input data.
+                       On output: points to the buffer capable to store
+                       output data.
+                       The type of memory pointed by buffer must correspond
+                       to buffer_type. See the correspondence table in
+                       the comment to mysql_stmt_bind_param.
+
+      The two above members are mandatory for any kind of bind.
+
+      buffer_length  - the length of the buffer. You don't have to set
+                       it for any fixed length buffer: float, double,
+                       int, etc. It must be set however for variable-length
+                       types, such as BLOBs or STRINGs.
+
+      length         - On input: in case when lengths of input values
+                       are different for each execute, you can set this to
+                       point at a variable containining value length. This
+                       way the value length can be different in each execute.
+                       If length is not NULL, buffer_length is not used.
+                       Note, length can even point at buffer_length if
+                       you keep bind structures around while fetching:
+                       this way you can change buffer_length before
+                       each execution, everything will work ok.
+                       On output: if length is set, mysql_stmt_fetch will
+                       write column length into it.
+
+      is_null        - On input: points to a boolean variable that should
+                       be set to TRUE for NULL values.
+                       This member is useful only if your data may be
+                       NULL in some but not all cases.
+                       If your data is never NULL, is_null should be set to 0.
+                       If your data is always NULL, set buffer_type
+                       to MYSQL_TYPE_NULL, and is_null will not be used.
+
+      is_unsigned    - On input: used to signify that values provided for one
+                       of numeric types are unsigned.
+                       On output describes signedness of the output buffer.
+                       If, taking into account is_unsigned flag, column data
+                       is out of range of the output buffer, data for this column
+                       is regarded truncated. Note that this has no correspondence
+                       to the sign of result set column, if you need to find it out
+                       use mysql_stmt_result_metadata.
+      error          - where to write a truncation error if it is present.
+                       possible error value is:
+                       0  no truncation
+                       1  value is out of range or buffer is too small
+
+      Please note that MYSQL_BIND also has internals members.
+    }
+       Pst_mysql_bind = ^st_mysql_bind;
+       st_mysql_bind = record
+            length : Pdword;                // output length pointer
+            is_null : Pmy_bool;             // Pointer to null indicator
+            buffer : pointer;               // buffer to get/put data
+{$IFDEF mysql50}
+            error: pmy_bool;                // set this if you want to track data truncations happened during fetch
+{$ENDIF}
+            buffer_type : enum_field_types; // buffer type
+            buffer_length : dword;          // buffer length, must be set for str/binary
+    { Following are for internal use. Set by mysql_stmt_bind_param  }
+{$IFNDEF mysql50}
+            inter_buffer : Pbyte;           // for the current data position
+{$ELSE}
+            row_ptr : PByte;                // for the current data position
+{$ENDIF}
+            offset : dword;                 // offset position for char/binary fetch
+{$IFNDEF mysql50}
+            internal_length : dword;        //  Used if length is 0
+{$ELSE}
+            length_value : dword;           //  Used if length is 0
+{$ENDIF}
+            param_number : dword;           // For null count and error messages
+            pack_length : dword;            // Internal length for packed data
+{$IFDEF mysql50}
+            error_value : pmy_bool;         // used if error is 0
+{$ENDIF}
+            is_unsigned : my_bool;          // set if integer type is unsigned
+            long_data_used : my_bool;       // If used with mysql_send_long_data
+{$IFNDEF mysql50}
+            internal_is_null : my_bool;     // Used if is_null is 0
+{$ELSE}
+            is_null_value : my_bool;        // Used if is_null is 0
+{$ENDIF}
+            store_param_func : procedure (net:PNET; param:Pst_mysql_bind);cdecl;
+            fetch_result : procedure (_para1:Pst_mysql_bind; _para2:PMYSQL_FIELD; row:PPbyte);
+            skip_result : procedure (_para1:Pst_mysql_bind; _para2:PMYSQL_FIELD; row:PPbyte);
+         end;
+       MYSQL_BIND = st_mysql_bind;
+       PMYSQL_BIND = ^MYSQL_BIND;
+
+    { statement handler  }
+       st_mysql_stmt = record
+            mem_root : MEM_ROOT;            // root allocations
+//            list : LIST;                    // list to keep track of all stmts
+            mysql : PMYSQL;                 // connection handle
+            params : PMYSQL_BIND;           // input parameters
+            bind : PMYSQL_BIND;             // input parameters
+            fields : PMYSQL_FIELD;          // result set metadata
+            result : MYSQL_DATA;            // cached result set
+            data_cursor : PMYSQL_ROWS;      // current row in cached result
+            affected_rows : my_ulonglong;   // copy of mysql->affected_rows after statement execution
+            insert_id : my_ulonglong;       // copy of mysql->insert_id
+    {   mysql_stmt_fetch() calls this function to fetch one row (it's different
+        for buffered, unbuffered and cursor fetch).       }
+            read_row_func : function (stmt:Pst_mysql_stmt; row:PPbyte):longint;cdecl;
+            stmt_id : dword;                // Id for prepared statement
+{$IFDEF mysql50}
+            flags : dword;                  // i.e. type of cursor to open
+            prefetch_rows : dword;          // number of rows per one COM_FETCH
+            server_status : dword;          // Copied from mysql->server_status after execute/fetch to know
+                                            // server-side cursor status for this statement.
+{$ENDIF}
+            last_errno : dword;             // error code
+            param_count : dword;            // input parameter count
+            field_count : dword;            // number of columns in result set
+            state : enum_mysql_stmt_state;  // statement state
+            last_error : array[0..(MYSQL_ERRMSG_SIZE)-1] of char;  // error message
+            sqlstate : array[0..(SQLSTATE_LENGTH+1)-1] of char;
+            send_types_to_server : my_bool; // Types of input parameters should be sent to server
+            bind_param_done : my_bool;      // input buffers were supplied
+{$IFNDEF mysql50}
+            bind_result_done : my_bool;     // output buffers were supplied
+{$ELSE}
+            bind_result_done : byte;        // output buffers were supplied
+{$ENDIF}
+
+            unbuffered_fetch_cancelled : my_bool;   // mysql_stmt_close() had to cancel this result
+    {   Is set to true if we need to calculate field->max_length for
+        metadata fields when doing mysql_stmt_store_result.       }
+            update_max_length : my_bool;
+         end;
+       MYSQL_STMT = st_mysql_stmt;
+    {   When doing mysql_stmt_store_result calculate max_length attribute
+        of statement metadata. This is to be consistent with the old API,
+        where this was done automatically.
+        In the new API we do that only by request because it slows down
+        mysql_stmt_store_result sufficiently.       }
+       enum_stmt_attr_type = (STMT_ATTR_UPDATE_MAX_LENGTH
+{$IFDEF mysql50}
+                              ,STMT_ATTR_CURSOR_TYPE,  // unsigned long with combination of cursor flags (read only, for update, etc)
+                              STMT_ATTR_PREFETCH_ROWS // Amount of rows to retrieve from server per one fetch if using cursors.
+                                                      // Accepts unsigned long attribute in the range 1 - ulong_max
+{$ENDIF}
+                             );
+
+
+//#define max_allowed_packet (*mysql_get_parameters()->p_max_allowed_packet)
+//#define net_buffer_length (*mysql_get_parameters()->p_net_buffer_length)
+
+{$IFNDEF LinkDynamically}
+    { Set up and bring down the server; to ensure that applications will
+      work when linked against either the standard client library or the
+      embedded server library, these functions should be called.     }
+    function mysql_server_init(argc:longint; argv:PPchar; groups:PPchar):longint;cdecl;external mysqllib name 'mysql_server_init';
+    procedure mysql_server_end;cdecl;external mysqllib name 'mysql_server_end';
+
+    { mysql_server_init/end need to be called when using libmysqld or
+      libmysqlclient (exactly, mysql_server_init() is called by mysql_init() so
+      you don't need to call it explicitely; but you need to call
+      mysql_server_end() to free memory). The names are a bit misleading
+      (mysql_SERVER* to be used when using libmysqlCLIENT). So we add more general
+      names which suit well whether you're using libmysqld or libmysqlclient. We
+      intend to promote these aliases over the mysql_server* ones.     }
+
+    function mysql_library_init(argc:longint; argv:PPchar; groups:PPchar):longint;cdecl;external mysqllib name 'mysql_server_init';
+    procedure mysql_library_end;cdecl;external mysqllib name 'mysql_server_end';
+
+    function mysql_get_parameters:PMYSQL_PARAMETERS;extdecl;external mysqllib name 'mysql_get_parameters';
+
+    { Set up and bring down a thread; these function should be called
+      for each thread in an application which opens at least one MySQL
+      connection.  All uses of the connection(s) should be between these
+      function calls.     }
+    function mysql_thread_init:my_bool;extdecl;external mysqllib name 'mysql_thread_init';
+    procedure mysql_thread_end;extdecl;external mysqllib name 'mysql_thread_end';
+    { Functions to get information from the MYSQL and MYSQL_RES structures
+      Should definitely be used if one uses shared libraries.     }
+    function mysql_num_rows(res:PMYSQL_RES):my_ulonglong;extdecl;external mysqllib name 'mysql_num_rows';
+    function mysql_num_fields(res:PMYSQL_RES):dword;extdecl;external mysqllib name 'mysql_num_fields';
+    function mysql_eof(res:PMYSQL_RES):my_bool;extdecl;external mysqllib name 'mysql_eof';
+    function mysql_fetch_field_direct(res:PMYSQL_RES; fieldnr:dword):PMYSQL_FIELD;extdecl;external mysqllib name 'mysql_fetch_field_direct';
+    function mysql_fetch_fields(res:PMYSQL_RES):PMYSQL_FIELD;extdecl;external mysqllib name 'mysql_fetch_fields';
+    function mysql_row_tell(res:PMYSQL_RES):MYSQL_ROW_OFFSET;extdecl;external mysqllib name 'mysql_row_tell';
+    function mysql_field_tell(res:PMYSQL_RES):MYSQL_FIELD_OFFSET;extdecl;external mysqllib name 'mysql_field_tell';
+    function mysql_field_count(mysql:PMYSQL):dword;extdecl;external mysqllib name 'mysql_field_count';
+    function mysql_affected_rows(mysql:PMYSQL):my_ulonglong;extdecl;external mysqllib name 'mysql_affected_rows';
+    function mysql_insert_id(mysql:PMYSQL):my_ulonglong;extdecl;external mysqllib name 'mysql_insert_id';
+    function mysql_errno(mysql:PMYSQL):dword;extdecl;external mysqllib name 'mysql_errno';
+    function mysql_error(mysql:PMYSQL):Pchar;extdecl;external mysqllib name 'mysql_error';
+    function mysql_sqlstate(mysql:PMYSQL):Pchar;extdecl;external mysqllib name 'mysql_sqlstate';
+    function mysql_warning_count(mysql:PMYSQL):dword;extdecl;external mysqllib name 'mysql_warning_count';
+    function mysql_info(mysql:PMYSQL):Pchar;extdecl;external mysqllib name 'mysql_info';
+    function mysql_thread_id(mysql:PMYSQL):dword;extdecl;external mysqllib name 'mysql_thread_id';
+    function mysql_character_set_name(mysql:PMYSQL):Pchar;extdecl;external mysqllib name 'mysql_character_set_name';
+    function mysql_set_character_set(mysql:PMYSQL; csname:Pchar):longint;extdecl;external mysqllib name 'mysql_set_character_set';
+    function mysql_init(mysql:PMYSQL):PMYSQL;extdecl;external mysqllib name 'mysql_init';
+    function mysql_ssl_set(mysql:PMYSQL; key:Pchar; cert:Pchar; ca:Pchar; capath:Pchar;
+               cipher:Pchar):my_bool;extdecl;external mysqllib name 'mysql_ssl_set';
+    function mysql_change_user(mysql:PMYSQL; user:Pchar; passwd:Pchar; db:Pchar):my_bool;extdecl;external mysqllib name 'mysql_change_user';
+    function mysql_real_connect(mysql:PMYSQL; host:Pchar; user:Pchar; passwd:Pchar; db:Pchar;
+               port:dword; unix_socket:Pchar; clientflag:dword):PMYSQL;extdecl;external mysqllib name 'mysql_real_connect';
+    function mysql_select_db(mysql:PMYSQL; db:Pchar):longint;extdecl;external mysqllib name 'mysql_select_db';
+    function mysql_query(mysql:PMYSQL; q:Pchar):longint;extdecl;external mysqllib name 'mysql_query';
+    function mysql_send_query(mysql:PMYSQL; q:Pchar; length:dword):longint;extdecl;external mysqllib name 'mysql_send_query';
+    function mysql_real_query(mysql:PMYSQL; q:Pchar; length:dword):longint;extdecl;external mysqllib name 'mysql_real_query';
+    function mysql_store_result(mysql:PMYSQL):PMYSQL_RES;extdecl;external mysqllib name 'mysql_store_result';
+    function mysql_use_result(mysql:PMYSQL):PMYSQL_RES;extdecl;external mysqllib name 'mysql_use_result';
+
+{$ELSE}
+
+    var
+      mysql_server_init: function (argc:longint; argv:PPchar; groups:PPchar):longint;cdecl;
+      mysql_server_end: procedure ;cdecl;
+      mysql_library_init: function (argc:longint; argv:PPchar; groups:PPchar):longint;cdecl;
+      mysql_library_end: procedure ;cdecl;
+      mysql_num_rows: function (res:PMYSQL_RES):my_ulonglong;extdecl;
+      mysql_num_fields: function (res:PMYSQL_RES):dword;extdecl;
+      mysql_eof: function (res:PMYSQL_RES):my_bool;extdecl;
+      mysql_fetch_field_direct: function (res:PMYSQL_RES; fieldnr:dword):PMYSQL_FIELD;extdecl;
+      mysql_fetch_fields: function (res:PMYSQL_RES):PMYSQL_FIELD;extdecl;
+      mysql_row_tell: function (res:PMYSQL_RES):MYSQL_ROW_OFFSET;extdecl;
+      mysql_field_tell: function (res:PMYSQL_RES):MYSQL_FIELD_OFFSET;extdecl;
+      mysql_field_count: function (mysql:PMYSQL):dword;extdecl;
+      mysql_affected_rows: function (mysql:PMYSQL):my_ulonglong;extdecl;
+      mysql_insert_id: function (mysql:PMYSQL):my_ulonglong;extdecl;
+      mysql_errno: function (mysql:PMYSQL):dword;extdecl;
+      mysql_error: function (mysql:PMYSQL):Pchar;extdecl;
+      mysql_sqlstate: function (mysql:PMYSQL):Pchar;extdecl;
+      mysql_warning_count: function (mysql:PMYSQL):dword;extdecl;
+      mysql_info: function (mysql:PMYSQL):Pchar;extdecl;
+      mysql_thread_id: function (mysql:PMYSQL):dword;extdecl;
+      mysql_character_set_name: function (mysql:PMYSQL):Pchar;extdecl;
+      mysql_set_character_set: function (mysql:PMYSQL; csname:Pchar):longint;extdecl;
+      mysql_init: function (mysql:PMYSQL):PMYSQL;extdecl;
+      mysql_ssl_set: function (mysql:PMYSQL; key:Pchar; cert:Pchar; ca:Pchar; capath:Pchar;
+                 cipher:Pchar):my_bool;extdecl;
+      mysql_change_user: function (mysql:PMYSQL; user:Pchar; passwd:Pchar; db:Pchar):my_bool;extdecl;
+      mysql_real_connect: function (mysql:PMYSQL; host:Pchar; user:Pchar; passwd:Pchar; db:Pchar;
+                 port:dword; unix_socket:Pchar; clientflag:dword):PMYSQL;extdecl;
+      mysql_select_db: function (mysql:PMYSQL; db:Pchar):longint;extdecl;
+      mysql_query: function (mysql:PMYSQL; q:Pchar):longint;extdecl;
+      mysql_send_query: function (mysql:PMYSQL; q:Pchar; length:dword):longint;extdecl;
+      mysql_real_query: function (mysql:PMYSQL; q:Pchar; length:dword):longint;extdecl;
+      mysql_store_result: function (mysql:PMYSQL):PMYSQL_RES;extdecl;
+      mysql_use_result: function (mysql:PMYSQL):PMYSQL_RES;extdecl;
+{$ENDIF}
+
+{$IFNDEF LinkDynamically}
+    { perform query on master  }
+    function mysql_master_query(mysql:PMYSQL; q:Pchar; length:dword):my_bool;extdecl;external mysqllib name 'mysql_master_query';
+    function mysql_master_send_query(mysql:PMYSQL; q:Pchar; length:dword):my_bool;extdecl;external mysqllib name 'mysql_master_send_query';
+
+    { perform query on slave  }
+    function mysql_slave_query(mysql:PMYSQL; q:Pchar; length:dword):my_bool;extdecl;external mysqllib name 'mysql_slave_query';
+    function mysql_slave_send_query(mysql:PMYSQL; q:Pchar; length:dword):my_bool;extdecl;external mysqllib name 'mysql_slave_send_query';
+{$IFDEF mysql50}
+    procedure mysql_get_character_set_info(mysql : PMYSQL; charset : PMY_CHARSET_INFO);extdecl;external mysqllib name 'mysql_get_character_set_info';
+{$ENDIF}
+{$ENDIF}
+
+    { local infile support  }
+
+    const
+       LOCAL_INFILE_ERROR_LEN = 512;
+
+{$IFNDEF LinkDynamically}
+{    procedure mysql_set_local_infile_handler(mysql:PMYSQL; local_infile_init:function (_para1:Ppointer; _para2:Pchar; _para3:pointer):longint; local_infile_read:function (_para1:pointer; _para2:Pchar; _para3:dword):longint; local_infile_end:procedure (_pa
+                _para6:pointer);cdecl;external mysqllib name 'mysql_set_local_infile_handler';}
+    procedure mysql_set_local_infile_default(mysql:PMYSQL);cdecl;external mysqllib name 'mysql_set_local_infile_default';
+
+    { enable/disable parsing of all queries to decide if they go on master or
+      slave     }
+    procedure mysql_enable_rpl_parse(mysql:PMYSQL);extdecl;external mysqllib name 'mysql_enable_rpl_parse';
+    procedure mysql_disable_rpl_parse(mysql:PMYSQL);extdecl;external mysqllib name 'mysql_disable_rpl_parse';
+
+    { get the value of the parse flag  }
+    function mysql_rpl_parse_enabled(mysql:PMYSQL):longint;extdecl;external mysqllib name 'mysql_rpl_parse_enabled';
+
+    {  enable/disable reads from master  }
+    procedure mysql_enable_reads_from_master(mysql:PMYSQL);extdecl;external mysqllib name 'mysql_enable_reads_from_master';
+    procedure mysql_disable_reads_from_master(mysql:PMYSQL);extdecl;external mysqllib name 'mysql_disable_reads_from_master';
+
+    { get the value of the master read flag  }
+    function mysql_reads_from_master_enabled(mysql:PMYSQL):my_bool;extdecl;external mysqllib name 'mysql_reads_from_master_enabled';
+
+    function mysql_rpl_query_type(q : pchar;len : longint):mysql_rpl_type;extdecl;external mysqllib name 'mysql_rpl_query_type';
+
+    { discover the master and its slaves  }
+    function mysql_rpl_probe(mysql:PMYSQL):my_bool;extdecl;external mysqllib name 'mysql_rpl_probe';
+
+    { set the master, close/free the old one, if it is not a pivot  }
+    function mysql_set_master(mysql:PMYSQL; host:Pchar; port:dword; user:Pchar; passwd:Pchar):longint;extdecl;external mysqllib name 'mysql_set_master';
+    function mysql_add_slave(mysql:PMYSQL; host:Pchar; port:dword; user:Pchar; passwd:Pchar):longint;extdecl;external mysqllib name 'mysql_add_slave';
+    function mysql_shutdown(mysql:PMYSQL; shutdown_level:mysql_enum_shutdown_level):longint;extdecl;external mysqllib name 'mysql_shutdown';
+    function mysql_dump_debug_info(mysql:PMYSQL):longint;extdecl;external mysqllib name 'mysql_dump_debug_info';
+    function mysql_refresh(mysql:PMYSQL; refresh_options:dword):longint;extdecl;external mysqllib name 'mysql_refresh';
+    function mysql_kill(mysql:PMYSQL; pid:dword):longint;extdecl;external mysqllib name 'mysql_kill';
+    function mysql_set_server_option(mysql:PMYSQL; option:enum_mysql_set_option):longint;extdecl;external mysqllib name 'mysql_set_server_option';
+    function mysql_ping(mysql:PMYSQL):longint;extdecl;external mysqllib name 'mysql_ping';
+    function mysql_stat(mysql:PMYSQL):Pchar;extdecl;external mysqllib name 'mysql_stat';
+    function mysql_get_server_info(mysql:PMYSQL):Pchar;extdecl;external mysqllib name 'mysql_get_server_info';
+    function mysql_get_client_info:Pchar;extdecl;external mysqllib name 'mysql_get_client_info';
+    function mysql_get_client_version:dword;extdecl;external mysqllib name 'mysql_get_client_version';
+    function mysql_get_host_info(mysql:PMYSQL):Pchar;extdecl;external mysqllib name 'mysql_get_host_info';
+    function mysql_get_server_version(mysql:PMYSQL):dword;extdecl;external mysqllib name 'mysql_get_server_version';
+    function mysql_get_proto_info(mysql:PMYSQL):dword;extdecl;external mysqllib name 'mysql_get_proto_info';
+    function mysql_list_dbs(mysql:PMYSQL; wild:Pchar):PMYSQL_RES;extdecl;external mysqllib name 'mysql_list_dbs';
+
+    function mysql_list_tables(mysql:PMYSQL; wild:Pchar):PMYSQL_RES;extdecl;external mysqllib name 'mysql_list_tables';
+    function mysql_list_processes(mysql:PMYSQL):PMYSQL_RES;extdecl;external mysqllib name 'mysql_list_processes';
+    function mysql_options(mysql:PMYSQL; option:mysql_option; arg:Pchar):longint;extdecl;external mysqllib name 'mysql_options';
+    procedure mysql_free_result(result:PMYSQL_RES);extdecl;external mysqllib name 'mysql_free_result';
+    procedure mysql_data_seek(result:PMYSQL_RES; offset:my_ulonglong);extdecl;external mysqllib name 'mysql_data_seek';
+    function mysql_row_seek(result:PMYSQL_RES; offset:MYSQL_ROW_OFFSET):MYSQL_ROW_OFFSET;extdecl;external mysqllib name 'mysql_row_seek';
+    function mysql_field_seek(result:PMYSQL_RES; offset:MYSQL_FIELD_OFFSET):MYSQL_FIELD_OFFSET;extdecl;external mysqllib name 'mysql_field_seek';
+    function mysql_fetch_row(result:PMYSQL_RES):MYSQL_ROW;extdecl;external mysqllib name 'mysql_fetch_row';
+    function mysql_fetch_lengths(result:PMYSQL_RES):Pdword;extdecl;external mysqllib name 'mysql_fetch_lengths';
+    function mysql_fetch_field(result:PMYSQL_RES):PMYSQL_FIELD;extdecl;external mysqllib name 'mysql_fetch_field';
+    function mysql_list_fields(mysql:PMYSQL; table:Pchar; wild:Pchar):PMYSQL_RES;extdecl;external mysqllib name 'mysql_list_fields';
+    function mysql_escape_string(fto:Pchar; from:Pchar; from_length:dword):dword;extdecl;external mysqllib name 'mysql_escape_string';
+    function mysql_hex_string(fto:Pchar; from:Pchar; from_length:dword):dword;extdecl;external mysqllib name 'mysql_hex_string';
+    function mysql_real_escape_string(mysql:PMYSQL; fto:Pchar; from:Pchar; length:dword):dword;extdecl;external mysqllib name 'mysql_real_escape_string';
+    procedure mysql_debug(debug:Pchar);extdecl;external mysqllib name 'mysql_debug';
+{    function mysql_odbc_escape_string(mysql:PMYSQL; fto:Pchar; to_length:dword; from:Pchar; from_length:dword;
+               param:pointer; extend_buffer:function (_para1:pointer; to:Pchar; length:Pdword):Pchar):Pchar;extdecl;external mysqllib name 'mysql_odbc_escape_string';}
+    procedure myodbc_remove_escape(mysql:PMYSQL; name:Pchar);extdecl;external mysqllib name 'myodbc_remove_escape';
+    function mysql_thread_safe:dword;extdecl;external mysqllib name 'mysql_thread_safe';
+    function mysql_embedded:my_bool;extdecl;external mysqllib name 'mysql_embedded';
+    function mysql_manager_init(con:PMYSQL_MANAGER):PMYSQL_MANAGER;extdecl;external mysqllib name 'mysql_manager_init';
+    function mysql_manager_connect(con:PMYSQL_MANAGER; host:Pchar; user:Pchar; passwd:Pchar; port:dword):PMYSQL_MANAGER;extdecl;external mysqllib name 'mysql_manager_connect';
+    procedure mysql_manager_close(con:PMYSQL_MANAGER);extdecl;external mysqllib name 'mysql_manager_close';
+    function mysql_manager_command(con:PMYSQL_MANAGER; cmd:Pchar; cmd_len:longint):longint;extdecl;external mysqllib name 'mysql_manager_command';
+    function mysql_manager_fetch_line(con:PMYSQL_MANAGER; res_buf:Pchar; res_buf_size:longint):longint;extdecl;external mysqllib name 'mysql_manager_fetch_line';
+    function mysql_read_query_result(mysql:PMYSQL):my_bool;extdecl;external mysqllib name 'mysql_read_query_result';
+
+    function mysql_stmt_init(mysql:PMYSQL):PMYSQL_STMT;extdecl;external mysqllib name 'mysql_stmt_init';
+    function mysql_stmt_prepare(stmt:PMYSQL_STMT; query:Pchar; length:dword):longint;extdecl;external mysqllib name 'mysql_stmt_prepare';
+    function mysql_stmt_execute(stmt:PMYSQL_STMT):longint;extdecl;external mysqllib name 'mysql_stmt_execute';
+    function mysql_stmt_fetch(stmt:PMYSQL_STMT):longint;extdecl;external mysqllib name 'mysql_stmt_fetch';
+    function mysql_stmt_fetch_column(stmt:PMYSQL_STMT; bind:PMYSQL_BIND; column:dword; offset:dword):longint;extdecl;external mysqllib name 'mysql_stmt_fetch_column';
+    function mysql_stmt_store_result(stmt:PMYSQL_STMT):longint;extdecl;external mysqllib name 'mysql_stmt_store_result';
+    function mysql_stmt_param_count(stmt:PMYSQL_STMT):dword;extdecl;external mysqllib name 'mysql_stmt_param_count';
+    function mysql_stmt_attr_set(stmt:PMYSQL_STMT; attr_type:enum_stmt_attr_type; attr:pointer):my_bool;extdecl;external mysqllib name 'mysql_stmt_attr_set';
+    function mysql_stmt_attr_get(stmt:PMYSQL_STMT; attr_type:enum_stmt_attr_type; attr:pointer):my_bool;extdecl;external mysqllib name 'mysql_stmt_attr_get';
+    function mysql_stmt_bind_param(stmt:PMYSQL_STMT; bnd:PMYSQL_BIND):my_bool;extdecl;external mysqllib name 'mysql_stmt_bind_param';
+    function mysql_stmt_bind_result(stmt:PMYSQL_STMT; bnd:PMYSQL_BIND):my_bool;extdecl;external mysqllib name 'mysql_stmt_bind_result';
+    function mysql_stmt_close(stmt:PMYSQL_STMT):my_bool;extdecl;external mysqllib name 'mysql_stmt_close';
+    function mysql_stmt_reset(stmt:PMYSQL_STMT):my_bool;extdecl;external mysqllib name 'mysql_stmt_reset';
+    function mysql_stmt_free_result(stmt:PMYSQL_STMT):my_bool;extdecl;external mysqllib name 'mysql_stmt_free_result';
+    function mysql_stmt_send_long_data(stmt:PMYSQL_STMT; param_number:dword; data:Pchar; length:dword):my_bool;extdecl;external mysqllib name 'mysql_stmt_send_long_data';
+    function mysql_stmt_result_metadata(stmt:PMYSQL_STMT):PMYSQL_RES;extdecl;external mysqllib name 'mysql_stmt_result_metadata';
+    function mysql_stmt_param_metadata(stmt:PMYSQL_STMT):PMYSQL_RES;extdecl;external mysqllib name 'mysql_stmt_param_metadata';
+    function mysql_stmt_errno(stmt:PMYSQL_STMT):dword;extdecl;external mysqllib name 'mysql_stmt_errno';
+    function mysql_stmt_error(stmt:PMYSQL_STMT):Pchar;extdecl;external mysqllib name 'mysql_stmt_error';
+    function mysql_stmt_sqlstate(stmt:PMYSQL_STMT):Pchar;extdecl;external mysqllib name 'mysql_stmt_sqlstate';
+    function mysql_stmt_row_seek(stmt:PMYSQL_STMT; offset:MYSQL_ROW_OFFSET):MYSQL_ROW_OFFSET;extdecl;external mysqllib name 'mysql_stmt_row_seek';
+    function mysql_stmt_row_tell(stmt:PMYSQL_STMT):MYSQL_ROW_OFFSET;extdecl;external mysqllib name 'mysql_stmt_row_tell';
+    procedure mysql_stmt_data_seek(stmt:PMYSQL_STMT; offset:my_ulonglong);extdecl;external mysqllib name 'mysql_stmt_data_seek';
+    function mysql_stmt_num_rows(stmt:PMYSQL_STMT):my_ulonglong;extdecl;external mysqllib name 'mysql_stmt_num_rows';
+    function mysql_stmt_affected_rows(stmt:PMYSQL_STMT):my_ulonglong;extdecl;external mysqllib name 'mysql_stmt_affected_rows';
+    function mysql_stmt_insert_id(stmt:PMYSQL_STMT):my_ulonglong;extdecl;external mysqllib name 'mysql_stmt_insert_id';
+    function mysql_stmt_field_count(stmt:PMYSQL_STMT):dword;extdecl;external mysqllib name 'mysql_stmt_field_count';
+
+    function mysql_commit(mysql:PMYSQL):my_bool;extdecl;external mysqllib name 'mysql_commit';
+    function mysql_rollback(mysql:PMYSQL):my_bool;extdecl;external mysqllib name 'mysql_rollback';
+    function mysql_autocommit(mysql:PMYSQL; auto_mode:my_bool):my_bool;extdecl;external mysqllib name 'mysql_autocommit';
+    function mysql_more_results(mysql:PMYSQL):my_bool;extdecl;external mysqllib name 'mysql_more_results';
+    function mysql_next_result(mysql:PMYSQL):longint;extdecl;external mysqllib name 'mysql_next_result';
+    procedure mysql_close(sock:PMYSQL);extdecl;external mysqllib name 'mysql_close';
+
+{$ELSE}
+    var
+      mysql_shutdown: function (mysql:PMYSQL; shutdown_level:mysql_enum_shutdown_level):longint;extdecl;
+      mysql_dump_debug_info: function (mysql:PMYSQL):longint;extdecl;
+      mysql_refresh: function (mysql:PMYSQL; refresh_options:dword):longint;extdecl;
+      mysql_kill: function (mysql:PMYSQL; pid:dword):longint;extdecl;
+      mysql_set_server_option: function (mysql:PMYSQL; option:enum_mysql_set_option):longint;extdecl;
+      mysql_ping: function (mysql:PMYSQL):longint;extdecl;
+      mysql_stat: function (mysql:PMYSQL):Pchar;extdecl;
+      mysql_get_server_info: function (mysql:PMYSQL):Pchar;extdecl;
+      mysql_get_client_info: function :Pchar;extdecl;
+      mysql_get_client_version: function :dword;extdecl;
+      mysql_get_host_info: function (mysql:PMYSQL):Pchar;extdecl;
+      mysql_get_server_version: function (mysql:PMYSQL):dword;extdecl;
+      mysql_get_proto_info: function (mysql:PMYSQL):dword;extdecl;
+      mysql_list_dbs: function (mysql:PMYSQL; wild:Pchar):PMYSQL_RES;extdecl;
+
+      mysql_list_tables: function (mysql:PMYSQL; wild:Pchar):PMYSQL_RES;extdecl;
+      mysql_list_processes: function (mysql:PMYSQL):PMYSQL_RES;extdecl;
+      mysql_options: function (mysql:PMYSQL; option:mysql_option; arg:Pchar):longint;extdecl;
+      mysql_free_result: procedure (result:PMYSQL_RES);extdecl;
+      mysql_data_seek: procedure (result:PMYSQL_RES; offset:my_ulonglong);extdecl;
+      mysql_row_seek: function (result:PMYSQL_RES; offset:MYSQL_ROW_OFFSET):MYSQL_ROW_OFFSET;extdecl;
+      mysql_field_seek: function (result:PMYSQL_RES; offset:MYSQL_FIELD_OFFSET):MYSQL_FIELD_OFFSET;extdecl;
+      mysql_fetch_row: function (result:PMYSQL_RES):MYSQL_ROW;extdecl;
+      mysql_fetch_lengths: function (result:PMYSQL_RES):Pdword;extdecl;
+      mysql_fetch_field: function (result:PMYSQL_RES):PMYSQL_FIELD;extdecl;
+      mysql_list_fields: function (mysql:PMYSQL; table:Pchar; wild:Pchar):PMYSQL_RES;extdecl;
+      mysql_escape_string: function (fto:Pchar; from:Pchar; from_length:dword):dword;extdecl;
+      mysql_hex_string: function (fto:Pchar; from:Pchar; from_length:dword):dword;extdecl;
+      mysql_real_escape_string: function (mysql:PMYSQL; fto:Pchar; from:Pchar; length:dword):dword;extdecl;
+      mysql_debug: procedure (debug:Pchar);extdecl;
+
+      mysql_rollback: function (mysql:PMYSQL):my_bool;extdecl;
+      mysql_autocommit: function (mysql:PMYSQL; auto_mode:my_bool):my_bool;extdecl;
+      mysql_commit: function (mysql:PMYSQL):my_bool;extdecl;
+      mysql_more_results: function (mysql:PMYSQL):my_bool;extdecl;
+      mysql_next_result: function (mysql:PMYSQL):longint;extdecl;
+      mysql_close: procedure (sock:PMYSQL);extdecl;
+
+      mysql_stmt_init: function (mysql:PMYSQL):PMYSQL_STMT;extdecl;
+      mysql_stmt_prepare: function (stmt:PMYSQL_STMT; query:Pchar; length:dword):longint;extdecl;
+      mysql_stmt_execute: function (stmt:PMYSQL_STMT):longint;extdecl;
+      mysql_stmt_fetch: function (stmt:PMYSQL_STMT):longint;extdecl;
+      mysql_stmt_fetch_column: function (stmt:PMYSQL_STMT; bind:PMYSQL_BIND; column:dword; offset:dword):longint;extdecl;
+      mysql_stmt_store_result: function (stmt:PMYSQL_STMT):longint;extdecl;
+      mysql_stmt_param_count: function (stmt:PMYSQL_STMT):dword;extdecl;
+      mysql_stmt_attr_set: function (stmt:PMYSQL_STMT; attr_type:enum_stmt_attr_type; attr:pointer):my_bool;extdecl;
+      mysql_stmt_attr_get: function (stmt:PMYSQL_STMT; attr_type:enum_stmt_attr_type; attr:pointer):my_bool;extdecl;
+      mysql_stmt_bind_param: function (stmt:PMYSQL_STMT; bnd:PMYSQL_BIND):my_bool;extdecl;
+      mysql_stmt_bind_result: function (stmt:PMYSQL_STMT; bnd:PMYSQL_BIND):my_bool;extdecl;
+      mysql_stmt_close: function (stmt:PMYSQL_STMT):my_bool;extdecl;
+      mysql_stmt_reset: function (stmt:PMYSQL_STMT):my_bool;extdecl;
+      mysql_stmt_free_result: function (stmt:PMYSQL_STMT):my_bool;extdecl;
+      mysql_stmt_send_long_data: function (stmt:PMYSQL_STMT; param_number:dword; data:Pchar; length:dword):my_bool;extdecl;
+      mysql_stmt_result_metadata: function (stmt:PMYSQL_STMT):PMYSQL_RES;extdecl;
+      mysql_stmt_param_metadata: function (stmt:PMYSQL_STMT):PMYSQL_RES;extdecl;
+      mysql_stmt_errno: function (stmt:PMYSQL_STMT):dword;extdecl;
+      mysql_stmt_error: function (stmt:PMYSQL_STMT):Pchar;extdecl;
+      mysql_stmt_sqlstate: function (stmt:PMYSQL_STMT):Pchar;extdecl;
+      mysql_stmt_row_seek: function (stmt:PMYSQL_STMT; offset:MYSQL_ROW_OFFSET):MYSQL_ROW_OFFSET;extdecl;
+      mysql_stmt_row_tell: function (stmt:PMYSQL_STMT):MYSQL_ROW_OFFSET;extdecl;
+      mysql_stmt_data_seek: procedure (stmt:PMYSQL_STMT; offset:my_ulonglong);extdecl;
+      mysql_stmt_num_rows: function (stmt:PMYSQL_STMT):my_ulonglong;extdecl;
+      mysql_stmt_affected_rows: function (stmt:PMYSQL_STMT):my_ulonglong;extdecl;
+      mysql_stmt_insert_id: function (stmt:PMYSQL_STMT):my_ulonglong;extdecl;
+      mysql_stmt_field_count: function (stmt:PMYSQL_STMT):dword;extdecl;
+
+{$ENDIF}
+
+
+    { status return codes  }
+
+    const
+       MYSQL_NO_DATA = 100;
+       MYSQL_DATA_TRUNCATED  = 101;
+
+    function mysql_reload(mysql : PMySQL) : longint;
+
+{$ifdef USE_OLD_FUNCTIONS}
+    function mysql_connect(mysql:PMYSQL; host:Pchar; user:Pchar; passwd:Pchar):PMYSQL;extdecl;external External_library name 'mysql_connect';
+    function mysql_create_db(mysql:PMYSQL; DB:Pchar):longint;extdecl;external External_library name 'mysql_create_db';
+    function mysql_drop_db(mysql:PMYSQL; DB:Pchar):longint;extdecl;external External_library name 'mysql_drop_db';
+    function mysql_reload(mysql : PMySQL) : longint;
+{$endif}
+
+{$define HAVE_MYSQL_REAL_CONNECT}    
+    { The following functions are mainly exported because of mysqlbinlog;
+      They are not for general usage     }
+
+    function simple_command(mysql,command,arg,length,skip_check : longint) : longint;
+{$IFNDEF LinkDynamically}
+    function net_safe_read(mysql:PMYSQL):dword;cdecl;external mysqllib name 'net_safe_read';
+{$ENDIF}
+
+{$ifdef NETWARE}
+(** unsupported pragma#pragma pack(pop)		/* restore alignment */*)
+{$endif}
+
+{$IFDEF LinkDynamically}
+Procedure InitialiseMysql;
+Procedure ReleaseMysql;
+
+var Mysql4LibraryHandle : TLibHandle;
+{$ENDIF}
+
+implementation
+
+{$IFDEF LinkDynamically}
+
+var RefCount : integer;
+
+Procedure InitialiseMysql;
+
+begin
+  inc(RefCount);
+  if RefCount = 1 then
+    begin
+    Mysql4LibraryHandle := loadlibrary(Mysqllib);
+    if Mysql4LibraryHandle = nilhandle then
+      begin
+      RefCount := 0;
+      Raise EInOutError.Create('Can not load MySQL client. Is it installed? ('+Mysqllib+')');
+      end;
+// Only the procedure that are given in the c-library documentation are loaded, to
+// avoid problems with 'incomplete' libraries
+    pointer(my_init) := GetProcedureAddress(Mysql4LibraryHandle,'my_init');
+    pointer(my_thread_init) := GetProcedureAddress(Mysql4LibraryHandle,'my_thread_init');
+    pointer(my_thread_end) := GetProcedureAddress(Mysql4LibraryHandle,'my_thread_end');
+
+    pointer(mysql_affected_rows) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_affected_rows');
+    pointer(mysql_autocommit) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_autocommit');
+    pointer(mysql_change_user) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_change_user');
+//    pointer(mysql_charset_name) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_charset_name');
+    pointer(mysql_close) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_close');
+    pointer(mysql_commit) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_commit');
+//    pointer(mysql_connect) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_connect');
+//    pointer(mysql_create_db) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_create_db');
+    pointer(mysql_data_seek) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_data_seek');
+//    pointer(mysql_drop_db) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_drop_db');
+    pointer(mysql_debug) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_debug');
+    pointer(mysql_dump_debug_info) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_dump_debug_info');
+    pointer(mysql_eof) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_eof');
+    pointer(mysql_errno) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_errno');
+    pointer(mysql_escape_string) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_escape_string');
+    pointer(mysql_fetch_field) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_fetch_field');
+    pointer(mysql_fetch_field_direct) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_fetch_field_direct');
+    pointer(mysql_fetch_fields) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_fetch_fields');
+    pointer(mysql_fetch_lengths) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_fetch_lengths');
+    pointer(mysql_fetch_row) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_fetch_row');
+    pointer(mysql_field_seek) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_field_seek');
+    pointer(mysql_field_count) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_field_count');
+    pointer(mysql_field_tell) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_field_tell');
+    pointer(mysql_free_result) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_free_result');
+    pointer(mysql_get_client_info) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_get_client_info');
+    pointer(mysql_get_client_version) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_get_client_version');
+    pointer(mysql_get_host_info) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_get_host_info');
+    pointer(mysql_get_server_version) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_get_server_version');
+    pointer(mysql_get_proto_info) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_get_proto_info');
+    pointer(mysql_get_server_info) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_get_server_info');
+    pointer(mysql_info) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_info');
+    pointer(mysql_init) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_init');
+    pointer(mysql_insert_id) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_insert_id');
+    pointer(mysql_kill) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_kill');
+    pointer(mysql_library_end) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_server_end');
+    pointer(mysql_library_init) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_server_init');
+    pointer(mysql_list_dbs) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_list_dbs');
+    pointer(mysql_list_fields) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_list_fields');
+    pointer(mysql_list_processes) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_list_processes');
+    pointer(mysql_list_tables) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_list_tables');
+    pointer(mysql_more_results) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_more_results');
+    pointer(mysql_next_result) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_next_result');
+    pointer(mysql_num_fields) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_num_fields');
+    pointer(mysql_num_rows) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_num_rows');
+    pointer(mysql_options) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_options');
+    pointer(mysql_ping) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_ping');
+    pointer(mysql_query) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_query');
+    pointer(mysql_real_connect) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_real_connect');
+    pointer(mysql_real_escape_string) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_real_escape_String');
+    pointer(mysql_real_query) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_real_query');
+    pointer(mysql_refresh) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_refresh');
+//    pointer(mysql_reload) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_reload');
+    pointer(mysql_rollback) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_rollback');
+    pointer(mysql_row_seek) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_row_seek');
+    pointer(mysql_row_tell) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_row_tell');
+    pointer(mysql_select_db) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_select_db');
+    pointer(mysql_server_end) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_server_end');
+    pointer(mysql_server_init) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_server_init');
+    pointer(mysql_set_server_option) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_set_server_option');
+    pointer(mysql_sqlstate) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_sqlstate');
+    pointer(mysql_shutdown) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_shutdown');
+    pointer(mysql_stat) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_stat');
+    pointer(mysql_store_result) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_store_result');
+    pointer(mysql_thread_id) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_thread_id');
+//    pointer(mysql_thread_save) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_thread_save');
+    pointer(mysql_use_result) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_use_result');
+    pointer(mysql_warning_count) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_warning_count');
+
+    pointer(mysql_stmt_init) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_stmt_init');
+    pointer(mysql_stmt_prepare) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_stmt_prepare');
+    pointer(mysql_stmt_execute) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_stmt_execute');
+    pointer(mysql_stmt_fetch) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_stmt_fetch');
+    pointer(mysql_stmt_fetch_column) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_stmt_fetch_column');
+    pointer(mysql_stmt_store_result) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_stmt_store_result');
+    pointer(mysql_stmt_param_count) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_stmt_param_count');
+    pointer(mysql_stmt_attr_set) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_stmt_attr_set');
+    pointer(mysql_stmt_attr_get) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_stmt_attr_get');
+    pointer(mysql_stmt_bind_param) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_stmt_bind_param');
+    pointer(mysql_stmt_bind_result) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_stmt_bind_result');
+    pointer(mysql_stmt_close) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_stmt_close');
+    pointer(mysql_stmt_reset) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_stmt_reset');
+    pointer(mysql_stmt_free_result) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_stmt_free_result');
+    pointer(mysql_stmt_send_long_data) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_stmt_send_long_data');
+    pointer(mysql_stmt_result_metadata) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_stmt_result_metadata');
+    pointer(mysql_stmt_param_metadata) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_stmt_param_metadata');
+    pointer(mysql_stmt_errno) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_stmt_errno');
+    pointer(mysql_stmt_error) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_stmt_error');
+    pointer(mysql_stmt_sqlstate) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_stmt_sqlstate');
+    pointer(mysql_stmt_row_seek) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_stmt_row_seek');
+    pointer(mysql_stmt_row_tell) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_stmt_row_tell');
+    pointer(mysql_stmt_data_seek) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_stmt_data_seek');
+    pointer(mysql_stmt_num_rows) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_stmt_num_rows');
+    pointer(mysql_stmt_affected_rows) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_stmt_affected_rows');
+    pointer(mysql_stmt_insert_id) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_stmt_insert_id');
+    pointer(mysql_stmt_field_count) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_stmt_field_count');
+    end;
+end;
+
+Procedure ReleaseMysql;
+
+begin
+  if RefCount > 0 then dec(RefCount);
+  if RefCount = 0 then
+    begin
+    if not UnloadLibrary(Mysql4LibraryHandle) then inc(RefCount);
+    end;
+end;
+
+{$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 IS_BLOB(n : longint) : boolean;
+    begin
+     IS_BLOB:=(n and BLOB_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_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 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) : longint;
+    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;
+
+
+end.

+ 12 - 0
packages/base/mysql/mysql40.pp

@@ -0,0 +1,12 @@
+{
+  Contains the mysql calls for MySQL 4.0
+}
+
+unit mysql40;
+
+{$UNDEF LinkDynamically}
+{$UNDEF MYSQL41}
+
+{$i mysql.inc}
+
+end.

+ 12 - 0
packages/base/mysql/mysql40dyn.pp

@@ -0,0 +1,12 @@
+{
+  Contains the mysql calls for MySQL 4.0
+}
+
+unit mysql40dyn;
+
+{$DEFINE LinkDynamically}
+{$UNDEF MYSQL41}
+
+{$i mysql.inc}
+
+end.

+ 12 - 0
packages/base/mysql/mysql41.pp

@@ -0,0 +1,12 @@
+{
+  Contains the mysql calls for MySQL 4.1
+}
+
+unit mysql41;
+
+{$UNDEF LinkDynamically}
+{$DEFINE MYSQL41}
+
+{$i mysql.inc}
+
+end.

+ 12 - 0
packages/base/mysql/mysql41dyn.pp

@@ -0,0 +1,12 @@
+{
+  Contains the mysql calls for MySQL 4.1
+}
+
+unit mysql41dyn;
+
+{$DEFINE LinkDynamically}
+{$DEFINE MYSQL41}
+
+{$i mysql.inc}
+
+end.

+ 12 - 0
packages/base/mysql/mysql50.pp

@@ -0,0 +1,12 @@
+{
+  Contains the mysql calls for MySQL 5.0
+}
+
+unit mysql50;
+
+{$UNDEF LinkDynamically}
+{$DEFINE MYSQL50}
+
+{$i mysql.inc}
+
+end.

+ 12 - 0
packages/base/mysql/mysql50dyn.pp

@@ -0,0 +1,12 @@
+{
+  Contains the mysql calls for MySQL 5.0
+}
+
+unit mysql50dyn;
+
+{$DEFINE LinkDynamically}
+{$DEFINE MYSQL50}
+
+{$i mysql.inc}
+
+end.

+ 143 - 131
utils/fpcm/fpcmake.inc

@@ -1,7 +1,7 @@
 {$ifdef Delphi}
-const fpcmakeini : array[0..205] of string[240]=(
+const fpcmakeini : array[0..206] of string[240]=(
 {$else Delphi}
-const fpcmakeini : array[0..205,1..240] of char=(
+const fpcmakeini : array[0..206,1..240] of char=(
 {$endif Delphi}
   ';'#010+
   '; Templates used by fpcmake to create a Makefile from Makefile.fpc'#010+
@@ -1434,10 +1434,21 @@ const fpcmakeini : array[0..205,1..240] of char=(
   'export FPCEXTCMD'#010+
   'endif'#010+
   #010+
+  'override AFULL_TARGET=$(CPU_TARGET)-$(OS_TARGET)'#010+
+  'override AFULL_SOURCE=$(CPU_SOURCE)-$(','OS_SOURCE)'#010+
+  #010+
+  'ifneq ($(AFULL_TARGET),$(AFULL_SOURCE))'#010+
+  'override ACROSSCOMPILE=1'#010+
+  'endif'#010+
+  #010+
+  'ifdef ACROSSCOMPILE'#010+
+  'override FPCOPT+=$(CROSSOPT)'#010+
+  'endif'#010+
+  #010+
   '# Compiler commandline'#010+
   'override COMPILER:=$(FPC) $(FPCOPT)'#010+
   #010+
-  '# also call ppas if with co','mmand option -s'#010+
+  '# also call ppas if with command option ','-s'#010+
   '# but only if the FULL_SOURCE and FULL_TARGET are equal'#010+
   'ifeq (,$(findstring -s ,$(COMPILER)))'#010+
   'EXECPPAS='#010+
@@ -1449,7 +1460,7 @@ const fpcmakeini : array[0..205,1..240] of char=(
   #010+
   #010+
   '[loaderrules]'#010+
-  '###############################','#####################################'+
+  '############################################','########################'+
   '#'#010+
   '# Loaders'#010+
   '#####################################################################'#010+
@@ -1458,8 +1469,8 @@ const fpcmakeini : array[0..205,1..240] of char=(
   #010+
   'ifneq ($(TARGET_LOADERS),)'#010+
   'override ALLTARGET+=fpc_loaders'#010+
-  'override CLEANTARGET+=fpc_loaders_clean'#010,
-  'override INSTALLTARGET+=fpc_loaders_install'#010+
+  'override CLEANTARGET+=fpc_loaders_clean'#010+
+  'override INST','ALLTARGET+=fpc_loaders_install'#010+
   #010+
   'override LOADEROFILES:=$(addsuffix $(OEXT),$(TARGET_LOADERS))'#010+
   'endif'#010+
@@ -1468,7 +1479,7 @@ const fpcmakeini : array[0..205,1..240] of char=(
   'ifdef COMPILER_UNITTARGETDIR'#010+
   '        $(AS) -o $(COMPILER_UNITTARGETDIR)/$*$(OEXT) $<'#010+
   'else'#010+
-  '        $(AS',') -o $*$(OEXT) $<'#010+
+  '        $(AS) -o $*$(OEXT',') $<'#010+
   'endif'#010+
   #010+
   'fpc_loaders: $(COMPILER_UNITTARGETDIR) $(LOADEROFILES)'#010+
@@ -1479,19 +1490,19 @@ const fpcmakeini : array[0..205,1..240] of char=(
   ')'#010+
   'else'#010+
   '        -$(DEL) $(LOADEROFILES)'#010+
-  'en','dif'#010+
+  'endif'#010+
   #010+
-  'fpc_loaders_install:'#010+
+  'fpc_load','ers_install:'#010+
   '        $(MKDIR) $(INSTALL_UNITDIR)'#010+
   'ifdef COMPILER_UNITTARGETDIR'#010+
   '        $(INSTALL) $(addprefix $(COMPILER_UNITTARGETDIR)/,$(LOADEROFIL'+
   'ES)) $(INSTALL_UNITDIR)'#010+
   'else'#010+
-  '        $(INSTALL) $(LOADEROFILES) $(INSTALL_UNITD','IR)'#010+
+  '        $(INSTALL) $(LOADEROFILES) $(INSTALL_UNITDIR)'#010+
   'endif'#010+
   #010+
   #010+
-  '[unitrules]'#010+
+  '[','unitrules]'#010+
   '#####################################################################'#010+
   '# Units'#010+
   '#####################################################################'#010+
@@ -1499,13 +1510,13 @@ const fpcmakeini : array[0..205,1..240] of char=(
   '.PHONY: fpc_units'#010+
   #010+
   'ifneq ($(TARGET_UNITS),)'#010+
-  'override ALLTARGET+=fpc','_units'#010+
+  'override ALLTARGET+=fpc_units'#010+
   #010+
-  'override UNITPPUFILES=$(addsuffix $(PPUEXT),$(TARGET_UNITS))'#010+
+  'overr','ide UNITPPUFILES=$(addsuffix $(PPUEXT),$(TARGET_UNITS))'#010+
   'override IMPLICITUNITPPUFILES=$(addsuffix $(PPUEXT),$(TARGET_IMPLICITU'+
   'NITS))'#010+
   'override INSTALLPPUFILES+=$(UNITPPUFILES) $(IMPLICITUNITPPUFILES)'#010+
-  'override CLEANPPUFILES+=$(UN','ITPPUFILES) $(IMPLICITUNITPPUFILES)'#010+
+  'override CLEANPPUFILES+=$(UNITPPUFILES) $','(IMPLICITUNITPPUFILES)'#010+
   'endif'#010+
   #010+
   'fpc_units: $(COMPILER_UNITTARGETDIR) $(UNITPPUFILES)'#010+
@@ -1514,7 +1525,7 @@ const fpcmakeini : array[0..205,1..240] of char=(
   '[exerules]'#010+
   '#####################################################################'#010+
   '# Exes'#010+
-  '######################################################','##############'+
+  '###################################################################','#'+
   '#'#010+
   #010+
   '.PHONY: fpc_exes'#010+
@@ -1523,7 +1534,7 @@ const fpcmakeini : array[0..205,1..240] of char=(
   'ifndef CROSSINSTALL'#010+
   'ifneq ($(TARGET_PROGRAMS),)'#010+
   'override EXEFILES=$(addsuffix $(EXEEXT),$(TARGET_PROGRAMS))'#010+
-  'override EXEOFILES:=$(addsuffix $(OEXT),$(TARG','ET_PROGRAMS)) $(addpre'+
+  'override EXEOFILES:=$(addsuffix $(OEXT),$(TARGET_PROGRAMS))',' $(addpre'+
   'fix $(STATICLIBPREFIX),$(addsuffix $(STATICLIBEXT),$(TARGET_PROGRAMS))'+
   ')'#010+
   #010+
@@ -1531,7 +1542,7 @@ const fpcmakeini : array[0..205,1..240] of char=(
   'override INSTALLEXEFILES+=$(EXEFILES)'#010+
   'override CLEANEXEFILES+=$(EXEFILES) $(EXEOFILES)'#010+
   'ifeq ($(OS_TARGET),os2)'#010+
-  'overr','ide CLEANEXEFILES+=$(addsuffix $(AOUTEXT),$(TARGET_PROGRAMS))'#010+
+  'override CLEANEXEF','ILES+=$(addsuffix $(AOUTEXT),$(TARGET_PROGRAMS))'#010+
   'endif'#010+
   'ifeq ($(OS_TARGET),emx)'#010+
   'override CLEANEXEFILES+=$(addsuffix $(AOUTEXT),$(TARGET_PROGRAMS))'#010+
@@ -1539,17 +1550,16 @@ const fpcmakeini : array[0..205,1..240] of char=(
   'endif'#010+
   'endif'#010+
   #010+
-  'fpc_exes: $(COMPILER_TARGETDIR) $(COMPILER_UNITTARGETDIR) $(EX','EFILES'+
-  ')'#010+
+  'fpc_exes: $(COMPILER_TARGETDIR) $(COMPILER_UNITTARGETDIR) $(EXEFILES)'#010+
   #010+
   #010+
-  '[rstrules]'#010+
+  '[rs','trules]'#010+
   '#####################################################################'#010+
   '# Resource strings'#010+
   '#####################################################################'#010+
   #010+
   'ifdef TARGET_RSTS'#010+
-  'override RSTFILES=$(addsuffix $(RSTEXT),$','(TARGET_RSTS))'#010+
+  'override RSTFILES=$(addsuffix $(RSTEXT),$(TARGET_RSTS)',')'#010+
   #010+
   'override CLEANRSTFILES+=$(RSTFILES)'#010+
   'endif'#010+
@@ -1560,19 +1570,19 @@ const fpcmakeini : array[0..205,1..240] of char=(
   '# Examples'#010+
   '#####################################################################'#010+
   #010+
-  '.PHONY: fpc_e','xamples'#010+
+  '.PHONY: fpc_examples'#010+
   #010+
-  'ifneq ($(TARGET_EXAMPLES),)'#010+
+  'ifne','q ($(TARGET_EXAMPLES),)'#010+
   'HASEXAMPLES=1'#010+
   'override EXAMPLESOURCEFILES:=$(wildcard $(addsuffix .pp,$(TARGET_EXAMP'+
   'LES)) $(addsuffix .pas,$(TARGET_EXAMPLES)) $(addsuffix .lpr,$(TARGET_E'+
   'XAMPLES)) $(addsuffix .dpr,$(TARGET_EXAMPLES)))'#010+
-  'o','verride EXAMPLEFILES:=$(addsuffix $(EXEEXT),$(TARGET_EXAMPLES))'#010+
+  'override EXAMP','LEFILES:=$(addsuffix $(EXEEXT),$(TARGET_EXAMPLES))'#010+
   'override EXAMPLEOFILES:=$(addsuffix $(OEXT),$(TARGET_EXAMPLES)) $(addp'+
   'refix $(STATICLIBPREFIX),$(addsuffix $(STATICLIBEXT),$(TARGET_EXAMPLES'+
   ')))'#010+
   #010+
-  'override CLEANEXEFILES+=$(EXAMP','LEFILES) $(EXAMPLEOFILES)'#010+
+  'override CLEANEXEFILES+=$(EXAMPLEFILES) $(EX','AMPLEOFILES)'#010+
   'ifeq ($(OS_TARGET),os2)'#010+
   'override CLEANEXEFILES+=$(addsuffix $(AOUTEXT),$(TARGET_EXAMPLES))'#010+
   'endif'#010+
@@ -1580,7 +1590,7 @@ const fpcmakeini : array[0..205,1..240] of char=(
   'override CLEANEXEFILES+=$(addsuffix $(AOUTEXT),$(TARGET_EXAMPLES))'#010+
   'endif'#010+
   'endif'#010+
-  'ifneq ($(TARGE','T_EXAMPLEDIRS),)'#010+
+  'ifneq ($(TARGET_EXAMPLEDIRS','),)'#010+
   'HASEXAMPLES=1'#010+
   'endif'#010+
   #010+
@@ -1591,7 +1601,7 @@ const fpcmakeini : array[0..205,1..240] of char=(
   '[compilerules]'#010+
   '#####################################################################'#010+
   '# General compile rules'#010+
-  '#################','###################################################'+
+  '##############################','######################################'+
   '#'#010+
   #010+
   '.PHONY: fpc_all fpc_smart fpc_debug fpc_release'#010+
@@ -1602,7 +1612,7 @@ const fpcmakeini : array[0..205,1..240] of char=(
   'fpc_all: $(FPCMADE)'#010+
   #010+
   'fpc_smart:'#010+
-  '        $(MAKE) ','all LINKSMART=1 CREATESMART=1'#010+
+  '        $(MAKE) all LINKSMART','=1 CREATESMART=1'#010+
   #010+
   'fpc_debug:'#010+
   '        $(MAKE) all DEBUG=1'#010+
@@ -1613,7 +1623,7 @@ const fpcmakeini : array[0..205,1..240] of char=(
   '# General compile rules, available for both possible .pp and .pas exte'+
   'nsions'#010+
   #010+
-  '.SUFFIXES: $(EXEEXT) $(PPUEXT) $(OEXT) .pas .lp','r .dpr .pp .rc .res'#010+
+  '.SUFFIXES: $(EXEEXT) $(PPUEXT) $(OEXT) .pas .lpr .dpr .pp .r','c .res'#010+
   #010+
   '$(COMPILER_UNITTARGETDIR):'#010+
   '        $(MKDIRTREE) $(COMPILER_UNITTARGETDIR)'#010+
@@ -1625,8 +1635,8 @@ const fpcmakeini : array[0..205,1..240] of char=(
   '        $(COMPILER) $<'#010+
   '        $(EXECPPAS)'#010+
   #010+
-  '%$(PPUEXT): %.pa','s'#010+
-  '        $(COMPILER) $<'#010+
+  '%$(PPUEXT): %.pas'#010+
+  '        $(C','OMPILER) $<'#010+
   '        $(EXECPPAS)'#010+
   #010+
   '%$(EXEEXT): %.pp'#010+
@@ -1641,8 +1651,8 @@ const fpcmakeini : array[0..205,1..240] of char=(
   '        $(COMPILER) $<'#010+
   '        $(EXECPPAS)'#010+
   #010+
-  '%$(EXEEXT','): %.dpr'#010+
-  '        $(COMPILER) $<'#010+
+  '%$(EXEEXT): %.dpr'#010+
+  '    ','    $(COMPILER) $<'#010+
   '        $(EXECPPAS)'#010+
   #010+
   '%.res: %.rc'#010+
@@ -1650,14 +1660,14 @@ const fpcmakeini : array[0..205,1..240] of char=(
   #010+
   '# Search paths for .ppu, .pp, .pas, .lpr, .dpr'#010+
   'vpath %.pp $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)'#010+
-  'vpath %.pas $(COMPILER_SOURCEDIR) $(COMPILE','R_INCLUDEDIR)'#010+
+  'vpath %.pas $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)',#010+
   'vpath %.lpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)'#010+
   'vpath %.dpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)'#010+
   'vpath %$(OEXT) $(COMPILER_UNITTARGETDIR)'#010+
   'vpath %$(PPUEXT) $(COMPILER_UNITTARGETDIR)'#010+
   #010+
   '[libraryrules]'#010+
-  '############','########################################################'+
+  '#########################','###########################################'+
   '#'#010+
   '# Library'#010+
   '#####################################################################'#010+
@@ -1667,8 +1677,8 @@ const fpcmakeini : array[0..205,1..240] of char=(
   'ifndef LIB_FULLNAME'#010+
   'ifdef LIB_VERSION'#010+
   'LIB_FULLNAME=$(LIB_NAME).$(LIB_VERSION)'#010+
-  'els','e'#010+
-  'LIB_FULLNAME=$(LIB_NAME)'#010+
+  'else'#010+
+  'LIB_FULLNAM','E=$(LIB_NAME)'#010+
   'endif'#010+
   'endif'#010+
   #010+
@@ -1679,9 +1689,9 @@ const fpcmakeini : array[0..205,1..240] of char=(
   #010+
   'fpc_shared: all'#010+
   'ifdef HASSHAREDLIB'#010+
-  '        $(PPUMOVE) $(LIB_SHAREDUNITS) -o$(LIB_FULLNAME)',#010+
+  '        $(PPUMOVE) $(LIB_SHAREDUNITS) -o$(LIB_FULLNAME)'#010+
   'else'#010+
-  '        @$(ECHO) Shared Libraries not supported'#010+
+  '       ',' @$(ECHO) Shared Libraries not supported'#010+
   'endif'#010+
   #010+
   #010+
@@ -1690,7 +1700,7 @@ const fpcmakeini : array[0..205,1..240] of char=(
   '# Install rules'#010+
   '#####################################################################'#010+
   #010+
-  '.PHONY',': fpc_install fpc_sourceinstall fpc_exampleinstall'#010+
+  '.PHONY: fpc_install',' fpc_sourceinstall fpc_exampleinstall'#010+
   #010+
   'ifdef INSTALL_UNITS'#010+
   'override INSTALLPPUFILES+=$(addsuffix $(PPUEXT),$(INSTALL_UNITS))'#010+
@@ -1698,21 +1708,21 @@ const fpcmakeini : array[0..205,1..240] of char=(
   #010+
   'ifdef INSTALL_BUILDUNIT'#010+
   'override INSTALLPPUFILES:=$(filter-out $(INSTALL_BUILDUNIT)$(PPUEXT),$'+
-  '(','INSTALLPPUFILES))'#010+
+  '(INSTALLPPUFIL','ES))'#010+
   'endif'#010+
   #010+
   'ifdef INSTALLPPUFILES'#010+
   'override INSTALLPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(INSTALLPPUFI'+
   'LES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT)'+
   ',$(INSTALLPPUFILES)))'#010+
-  'ifneq ($(UNITTARGETDIRPREFIX),)',#010+
-  'override INSTALLPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(notdir '+
-  '$(INSTALLPPUFILES)))'#010+
+  'ifneq ($(UNITTARGETDIRPREFIX),)'#010+
+  'override INS','TALLPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(notdi'+
+  'r $(INSTALLPPUFILES)))'#010+
   'override INSTALLPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPR'+
   'EFIX),$(notdir $(INSTALLPPULINKFILES))))'#010+
   'endif'#010+
-  '# Implicitly install Package.fp','c'#010+
-  'override INSTALL_CREATEPACKAGEFPC=1'#010+
+  '# Implicitly install Package.fpc'#010+
+  'override IN','STALL_CREATEPACKAGEFPC=1'#010+
   'endif'#010+
   #010+
   'ifdef INSTALLEXEFILES'#010+
@@ -1723,8 +1733,8 @@ const fpcmakeini : array[0..205,1..240] of char=(
   'endif'#010+
   #010+
   'fpc_install: all $(INSTALLTARGET)'#010+
-  'ifdef INSTA','LLEXEFILES'#010+
-  '        $(MKDIR) $(INSTALL_BINDIR)'#010+
+  'ifdef INSTALLEXEFILES'#010+
+  '  ','      $(MKDIR) $(INSTALL_BINDIR)'#010+
   '# Compress the exes if upx is defined'#010+
   'ifdef UPXPROG'#010+
   '        -$(UPXPROG) $(INSTALLEXEFILES)'#010+
@@ -1732,13 +1742,13 @@ const fpcmakeini : array[0..205,1..240] of char=(
   '        $(INSTALLEXE) $(INSTALLEXEFILES) $(INSTALL_BINDIR)'#010+
   'endif'#010+
   'ifdef INSTALL_CREATEPACKAGEFPC'#010+
-  'i','fdef FPCMAKE'#010+
+  'ifdef FPCMAKE'#010,
   '# If the fpcpackage variable is set then create and install Package.fp'+
   'c,'#010+
   '# a safety check is done if Makefile.fpc is available'#010+
   'ifdef PACKAGE_VERSION'#010+
   'ifneq ($(wildcard Makefile.fpc),)'#010+
-  '        $(FPCMAKE) -p -T$(CPU_TARGET)-$(OS_T','ARGET) Makefile.fpc'#010+
+  '        $(FPCMAKE) -p -T$(CPU_TARGET)-$(OS_TARGET) Makefi','le.fpc'#010+
   '        $(MKDIR) $(INSTALL_UNITDIR)'#010+
   '        $(INSTALL) Package.fpc $(INSTALL_UNITDIR)'#010+
   'endif'#010+
@@ -1747,15 +1757,15 @@ const fpcmakeini : array[0..205,1..240] of char=(
   'endif'#010+
   'ifdef INSTALLPPUFILES'#010+
   '        $(MKDIR) $(INSTALL_UNITDIR)'#010+
-  '        $(INSTALL) $(INSTALLPPUFILES) $(INSTALL_UNIT','DIR)'#010+
-  'ifneq ($(INSTALLPPULINKFILES),)'#010+
+  '        $(INSTALL) $(INSTALLPPUFILES) $(INSTALL_UNITDIR)'#010+
+  'ifneq ($','(INSTALLPPULINKFILES),)'#010+
   '        $(INSTALL) $(INSTALLPPULINKFILES) $(INSTALL_UNITDIR)'#010+
   'endif'#010+
   'ifneq ($(wildcard $(LIB_FULLNAME)),)'#010+
   '        $(MKDIR) $(INSTALL_LIBDIR)'#010+
   '        $(INSTALL) $(LIB_FULLNAME) $(INSTALL_LIBDIR)'#010+
-  'ifdef inUni','x'#010+
-  '        ln -sf $(LIB_FULLNAME) $(INSTALL_LIBDIR)/$(LIB_NAME)'#010+
+  'ifdef inUnix'#010+
+  '        ln ','-sf $(LIB_FULLNAME) $(INSTALL_LIBDIR)/$(LIB_NAME)'#010+
   'endif'#010+
   'endif'#010+
   'endif'#010+
@@ -1765,7 +1775,7 @@ const fpcmakeini : array[0..205,1..240] of char=(
   'endif'#010+
   #010+
   'fpc_sourceinstall: distclean'#010+
-  '        $(MK','DIR) $(INSTALL_SOURCEDIR)'#010+
+  '        $(MKDIR) $(INSTAL','L_SOURCEDIR)'#010+
   '        $(COPYTREE) $(BASEDIR)/* $(INSTALL_SOURCEDIR)'#010+
   #010+
   'fpc_exampleinstall: $(addsuffix _distclean,$(TARGET_EXAMPLEDIRS))'#010+
@@ -1773,7 +1783,7 @@ const fpcmakeini : array[0..205,1..240] of char=(
   '        $(MKDIR) $(INSTALL_EXAMPLEDIR)'#010+
   'endif'#010+
   'ifdef EXAMPLESOURCEFILES'#010+
-  '     ','   $(COPY) $(EXAMPLESOURCEFILES) $(INSTALL_EXAMPLEDIR)'#010+
+  '        $(COPY) $(','EXAMPLESOURCEFILES) $(INSTALL_EXAMPLEDIR)'#010+
   'endif'#010+
   'ifdef TARGET_EXAMPLEDIRS'#010+
   '        $(COPYTREE) $(addsuffix /*,$(TARGET_EXAMPLEDIRS)) $(INSTALL_EX'+
@@ -1781,7 +1791,7 @@ const fpcmakeini : array[0..205,1..240] of char=(
   'endif'#010+
   #010+
   '[distinstallrules]'#010+
-  '################################################','####################'+
+  '#############################################################','#######'+
   '#'#010+
   '# Dist Install'#010+
   '#####################################################################'#010+
@@ -1792,7 +1802,7 @@ const fpcmakeini : array[0..205,1..240] of char=(
   #010+
   #010+
   '[zipinstallrules]'#010+
-  '###############################################','#####################'+
+  '############################################################','########'+
   '#'#010+
   '# Zip'#010+
   '#####################################################################'#010+
@@ -1800,7 +1810,7 @@ const fpcmakeini : array[0..205,1..240] of char=(
   '.PHONY: fpc_zipinstall fpc_zipsourceinstall fpc_zipexampleinstall'#010+
   #010+
   '# Temporary path to pack a file, can only use a single deep'#010+
-  '# subdir, bec','ause the deltree can'#039't see the whole tree to remove'+
+  '# subdir, because the delt','ree can'#039't see the whole tree to remove'+
   #010+
   'ifndef PACKDIR'#010+
   'ifndef inUnix'#010+
@@ -1813,7 +1823,7 @@ const fpcmakeini : array[0..205,1..240] of char=(
   '# Maybe create default zipname from packagename'#010+
   'ifndef ZIPNAME'#010+
   'ifdef DIST_ZIPNAME'#010+
-  'ZIPNAM','E=$(DIST_ZIPNAME)'#010+
+  'ZIPNAME=$(DIST_ZIPN','AME)'#010+
   'else'#010+
   'ZIPNAME=$(PACKAGE_NAME)'#010+
   'endif'#010+
@@ -1828,8 +1838,8 @@ const fpcmakeini : array[0..205,1..240] of char=(
   'ifdef DIST_ZIPTARGET'#010+
   'ZIPTARGET=DIST_ZIPTARGET'#010+
   'else'#010+
-  'ZIPTARGET=','install'#010+
-  'endif'#010+
+  'ZIPTARGET=install'#010+
+  'endif',#010+
   'endif'#010+
   #010+
   '# Use tar by default under linux'#010+
@@ -1845,7 +1855,7 @@ const fpcmakeini : array[0..205,1..240] of char=(
   'endif'#010+
   #010+
   '# We need to be able to run in the current OS so fix'#010+
-  '# th','e path separator'#010+
+  '# the path separa','tor'#010+
   'ifdef USEZIPWRAPPER'#010+
   'ZIPPATHSEP=$(PATHSEP)'#010+
   'ZIPWRAPPER=$(subst /,$(PATHSEP),$(DIST_DESTDIR)/fpczip$(SRCBATCHEXT))'#010+
@@ -1854,37 +1864,37 @@ const fpcmakeini : array[0..205,1..240] of char=(
   'endif'#010+
   #010+
   '# Create commands to create the zip/tar file'#010+
-  'ZIPCMD_CDPACK:=cd $(subst /,$(ZIPPATHSEP)',',$(PACKDIR))'#010+
+  'ZIPCMD_CDPACK:=cd $(subst /,$(ZIPPATHSEP),$(PACKDIR))'#010,
   'ZIPCMD_CDBASE:=cd $(subst /,$(ZIPPATHSEP),$(BASEDIR))'#010+
   'ifdef USETAR'#010+
   'ZIPDESTFILE:=$(DIST_DESTDIR)/$(FULLZIPNAME)$(TAREXT)'#010+
   'ZIPCMD_ZIP:=$(TARPROG) cf$(TAROPT) $(ZIPDESTFILE) *'#010+
   'else'#010+
-  'ZIPDESTFILE:=$(DIST_DESTDIR)/$(FULLZIPNAME)$(ZIPEX','T)'#010+
-  'ZIPCMD_ZIP:=$(subst /,$(ZIPPATHSEP),$(ZIPPROG)) -Dr $(ZIPOPT) $(ZIPDES'+
-  'TFILE) *'#010+
+  'ZIPDESTFILE:=$(DIST_DESTDIR)/$(FULLZIPNAME)$(ZIPEXT)'#010+
+  'ZIPCMD_ZIP',':=$(subst /,$(ZIPPATHSEP),$(ZIPPROG)) -Dr $(ZIPOPT) $(ZIPD'+
+  'ESTFILE) *'#010+
   'endif'#010+
   #010+
   'fpc_zipinstall:'#010+
   '        $(MAKE) $(ZIPTARGET) INSTALL_PREFIX=$(PACKDIR) ZIPINSTALL=1'#010+
   '        $(MKDIR) $(DIST_DESTDIR)'#010+
   '        $(DEL) $(ZIPDESTFILE)'#010+
-  'ifde','f USEZIPWRAPPER'#010+
+  'ifdef USEZIPWRAPP','ER'#010+
   '# Handle gecho separate as we need to espace \ with \\'#010+
   'ifneq ($(ECHOREDIR),echo)'#010+
   '        $(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_CDPACK))" > $(ZIPWRAPPE'+
   'R)'#010+
-  '        $(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_ZIP))" >> $(ZIPWRAPPER)',
+  '        $(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_ZIP))" >> $(ZIPWRAPPER)'+
   #010+
-  '        $(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_CDBASE))" >> $(ZIPWRAPP'+
-  'ER)'#010+
+  '        $(EC','HOREDIR) -e "$(subst \,\\,$(ZIPCMD_CDBASE))" >> $(ZIPWRA'+
+  'PPER)'#010+
   'else'#010+
   '        echo $(ZIPCMD_CDPACK) > $(ZIPWRAPPER)'#010+
   '        echo $(ZIPCMD_ZIP) >> $(ZIPWRAPPER)'#010+
   '        echo $(ZIPCMD_CDBASE) >> $(ZIPWRAPPER)'#010+
   'endif'#010+
   'ifdef inUnix'#010+
-  '    ','    /bin/sh $(ZIPWRAPPER)'#010+
+  '        /bin/sh $','(ZIPWRAPPER)'#010+
   'else'#010+
   '        $(ZIPWRAPPER)'#010+
   'endif'#010+
@@ -1895,7 +1905,7 @@ const fpcmakeini : array[0..205,1..240] of char=(
   '        $(DELTREE) $(PACKDIR)'#010+
   #010+
   'fpc_zipsourceinstall:'#010+
-  '        $(MAKE) fpc_zipinsta','ll ZIPTARGET=sourceinstall ZIPSUFFIX=$(Z'+
+  '        $(MAKE) fpc_zipinstall ZIPTARGET=','sourceinstall ZIPSUFFIX=$(Z'+
   'IPSOURCESUFFIX)'#010+
   #010+
   'fpc_zipexampleinstall:'#010+
@@ -1905,7 +1915,7 @@ const fpcmakeini : array[0..205,1..240] of char=(
   'endif'#010+
   #010+
   'fpc_zipdistinstall:'#010+
-  '        $(MAKE) fpc_zipinstal','l ZIPTARGET=distinstall'#010+
+  '        $(MAKE) fpc_zipinstall ZIPTARGET=d','istinstall'#010+
   #010+
   #010+
   '[cleanrules]'#010+
@@ -1914,8 +1924,8 @@ const fpcmakeini : array[0..205,1..240] of char=(
   '#####################################################################'#010+
   #010+
   '.PHONY: fpc_clean fpc_cleanall fpc_distclean'#010+
-  #010,
-  'ifdef EXEFILES'#010+
+  #010+
+  'ifdef EXEFILE','S'#010+
   'override CLEANEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANEXEFILES'+
   '))'#010+
   'endif'#010+
@@ -1925,14 +1935,14 @@ const fpcmakeini : array[0..205,1..240] of char=(
   'endif'#010+
   #010+
   'ifdef CLEANPPUFILES'#010+
-  'override CLEANPPULINKFILES:=$(subst $(','PPUEXT),$(OEXT),$(CLEANPPUFILE'+
+  'override CLEANPPULINKFILES:=$(subst $(PPUEXT),$(OEX','T),$(CLEANPPUFILE'+
   'S)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$'+
   '(CLEANPPUFILES)))'#010+
   'ifdef DEBUGSYMEXT'#010+
   'override CLEANPPULINKFILES+=$(subst $(PPUEXT),$(DEBUGSYMEXT),$(CLEANPP'+
   'UFILES))'#010+
   'endif'#010+
-  'override CLEANPPUFI','LES:=$(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPP'+
+  'override CLEANPPUFILES:=$(addpre','fix $(UNITTARGETDIRPREFIX),$(CLEANPP'+
   'UFILES))'#010+
   'override CLEANPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREF'+
   'IX),$(CLEANPPULINKFILES)))'#010+
@@ -1940,9 +1950,9 @@ const fpcmakeini : array[0..205,1..240] of char=(
   #010+
   'fpc_clean: $(CLEANTARGET)'#010+
   'ifdef CLEANEXEFILES'#010+
-  '        -$(DEL) $(CLEANEXEFILES)',#010+
+  '        -$(DEL) $(CLEANEXEFILES)'#010+
   'endif'#010+
-  'ifdef CLEANPPUFILES'#010+
+  'ifdef ','CLEANPPUFILES'#010+
   '        -$(DEL) $(CLEANPPUFILES)'#010+
   'endif'#010+
   'ifneq ($(CLEANPPULINKFILES),)'#010+
@@ -1951,15 +1961,15 @@ const fpcmakeini : array[0..205,1..240] of char=(
   'ifdef CLEANRSTFILES'#010+
   '        -$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))'#010+
   'endif'#010+
-  'ifdef ','CLEAN_FILES'#010+
-  '        -$(DEL) $(CLEAN_FILES)'#010+
+  'ifdef CLEAN_FILES'#010+
+  ' ','       -$(DEL) $(CLEAN_FILES)'#010+
   'endif'#010+
   'ifdef LIB_NAME'#010+
   '        -$(DEL) $(LIB_NAME) $(LIB_FULLNAME)'#010+
   'endif'#010+
   '        -$(DEL) $(FPCMADE) Package.fpc $(PPAS) script.res link.res $(F'+
   'PCEXTFILE) $(REDIRFILE)'#010+
-  '        -$(DEL) *$(ASMEXT) *_ppa','s$(BATCHEXT)'#010+
+  '        -$(DEL) *$(ASMEXT) *_ppas$(BATCHEXT)'#010,
   #010+
   'fpc_cleanall: $(CLEANTARGET)'#010+
   'ifdef CLEANEXEFILES'#010+
@@ -1970,7 +1980,7 @@ const fpcmakeini : array[0..205,1..240] of char=(
   '        -$(DEL) $(CLEANPPUFILES)'#010+
   'endif'#010+
   'ifneq ($(CLEANPPULINKFILES),)'#010+
-  '        -$(DEL) $(CL','EANPPULINKFILES)'#010+
+  '        -$(DEL) $(CLEANPPULINKFIL','ES)'#010+
   'endif'#010+
   'ifdef CLEANRSTFILES'#010+
   '        -$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))'#010+
@@ -1978,7 +1988,7 @@ const fpcmakeini : array[0..205,1..240] of char=(
   'endif'#010+
   '        -$(DELTREE) units'#010+
   '        -$(DEL) *$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIB'+
-  'EXT) *$(SHAREDLIBEXT',') *$(PPLEXT)'#010+
+  'EXT) *$(SHAREDLIBEXT) *$(PPLEXT)'#010,
   'ifneq ($(PPUEXT),.ppu)'#010+
   '        -$(DEL) *.o *.ppu *.a'#010+
   'endif'#010+
@@ -1986,8 +1996,8 @@ const fpcmakeini : array[0..205,1..240] of char=(
   '        -$(DEL) fpcmade.* Package.fpc $(PPAS) script.res link.res $(FP'+
   'CEXTFILE) $(REDIRFILE)'#010+
   '        -$(DEL) *_ppas$(BATCHEXT)'#010+
-  'ifdef AO','UTEXT'#010+
-  '        -$(DEL) *$(AOUTEXT)'#010+
+  'ifdef AOUTEXT'#010+
+  '       ',' -$(DEL) *$(AOUTEXT)'#010+
   'endif'#010+
   'ifdef DEBUGSYMEXT'#010+
   '        -$(DEL) *$(DEBUGSYMEXT)'#010+
@@ -1999,7 +2009,7 @@ const fpcmakeini : array[0..205,1..240] of char=(
   '[baseinforules]'#010+
   '#####################################################################'#010+
   '# Base info rules'#010+
-  '#############','#######################################################'+
+  '##########################','##########################################'+
   '#'#010+
   #010+
   '.PHONY: fpc_baseinfo'#010+
@@ -2010,94 +2020,94 @@ const fpcmakeini : array[0..205,1..240] of char=(
   '        @$(ECHO)'#010+
   '        @$(ECHO)  == Package info =='#010+
   '        @$(ECHO)  Package Name..... $(PACKAGE_NAME)'#010+
-  '      ','  @$(ECHO)  Package Version.. $(PACKAGE_VERSION)'#010+
+  '        @$(ECHO)  P','ackage Version.. $(PACKAGE_VERSION)'#010+
   '        @$(ECHO)'#010+
   '        @$(ECHO)  == Configuration info =='#010+
   '        @$(ECHO)'#010+
   '        @$(ECHO)  FPC.......... $(FPC)'#010+
   '        @$(ECHO)  FPC Version.. $(FPC_VERSION)'#010+
-  '        @$(ECHO)  Source CPU','... $(CPU_SOURCE)'#010+
+  '        @$(ECHO)  Source CPU... $(CPU_SOU','RCE)'#010+
   '        @$(ECHO)  Target CPU... $(CPU_TARGET)'#010+
   '        @$(ECHO)  Source OS.... $(OS_SOURCE)'#010+
   '        @$(ECHO)  Target OS.... $(OS_TARGET)'#010+
   '        @$(ECHO)  Full Source.. $(FULL_SOURCE)'#010+
-  '        @$(ECHO)  Full Target.. $(FULL_','TARGET)'#010+
-  '        @$(ECHO)  SourceSuffix. $(SOURCESUFFIX)'#010+
+  '        @$(ECHO)  Full Target.. $(FULL_TARGET)'#010+
+  '     ','   @$(ECHO)  SourceSuffix. $(SOURCESUFFIX)'#010+
   '        @$(ECHO)  TargetSuffix. $(TARGETSUFFIX)'#010+
   '        @$(ECHO)'#010+
   '        @$(ECHO)  == Directory info =='#010+
   '        @$(ECHO)'#010+
   '        @$(ECHO)  Required pkgs... $(REQUIRE_PACKAGES)'#010+
-  '        ','@$(ECHO)'#010+
-  '        @$(ECHO)  Basedir......... $(BASEDIR)'#010+
+  '        @$(ECHO)'#010+
+  '    ','    @$(ECHO)  Basedir......... $(BASEDIR)'#010+
   '        @$(ECHO)  FPCDir.......... $(FPCDIR)'#010+
   '        @$(ECHO)  CrossBinDir..... $(CROSSBINDIR)'#010+
   '        @$(ECHO)  UnitsDir........ $(UNITSDIR)'#010+
-  '        @$(ECHO)  PackagesDir..... $(PACKAG','ESDIR)'#010+
-  '        @$(ECHO)'#010+
+  '        @$(ECHO)  PackagesDir..... $(PACKAGESDIR)'#010+
+  '      ','  @$(ECHO)'#010+
   '        @$(ECHO)  GCC library..... $(GCCLIBDIR)'#010+
   '        @$(ECHO)  Other library... $(OTHERLIBDIR)'#010+
   '        @$(ECHO)'#010+
   '        @$(ECHO)  == Tools info =='#010+
   '        @$(ECHO)'#010+
   '        @$(ECHO)  As........ $(AS)'#010+
-  '        @$(ECH','O)  Ld........ $(LD)'#010+
+  '        @$(ECHO)  Ld.......','. $(LD)'#010+
   '        @$(ECHO)  Ar........ $(AR)'#010+
   '        @$(ECHO)  Rc........ $(RC)'#010+
   '        @$(ECHO)'#010+
   '        @$(ECHO)  Mv........ $(MVPROG)'#010+
   '        @$(ECHO)  Cp........ $(CPPROG)'#010+
   '        @$(ECHO)  Rm........ $(RMPROG)'#010+
-  '        @$(ECHO',')  GInstall.. $(GINSTALL)'#010+
+  '        @$(ECHO)  GInstall..',' $(GINSTALL)'#010+
   '        @$(ECHO)  Echo...... $(ECHO)'#010+
   '        @$(ECHO)  Shell..... $(SHELL)'#010+
   '        @$(ECHO)  Date...... $(DATE)'#010+
   '        @$(ECHO)  FPCMake... $(FPCMAKE)'#010+
   '        @$(ECHO)  PPUMove... $(PPUMOVE)'#010+
-  '        @$(ECHO)  Upx.','...... $(UPXPROG)'#010+
+  '        @$(ECHO)  Upx....... $(UPXP','ROG)'#010+
   '        @$(ECHO)  Zip....... $(ZIPPROG)'#010+
   '        @$(ECHO)'#010+
   '        @$(ECHO)  == Object info =='#010+
   '        @$(ECHO)'#010+
   '        @$(ECHO)  Target Loaders........ $(TARGET_LOADERS)'#010+
-  '        @$(ECHO)  Target Units.......... $(TARGET_UNI','TS)'#010+
-  '        @$(ECHO)  Target Implicit Units. $(TARGET_IMPLICITUNITS)'#010+
+  '        @$(ECHO)  Target Units.......... $(TARGET_UNITS)'#010+
+  '        @','$(ECHO)  Target Implicit Units. $(TARGET_IMPLICITUNITS)'#010+
   '        @$(ECHO)  Target Programs....... $(TARGET_PROGRAMS)'#010+
   '        @$(ECHO)  Target Dirs........... $(TARGET_DIRS)'#010+
-  '        @$(ECHO)  Target Examples....... $(TARGET_EXAMP','LES)'#010+
-  '        @$(ECHO)  Target ExampleDirs.... $(TARGET_EXAMPLEDIRS)'#010+
+  '        @$(ECHO)  Target Examples....... $(TARGET_EXAMPLES)'#010+
+  '        ','@$(ECHO)  Target ExampleDirs.... $(TARGET_EXAMPLEDIRS)'#010+
   '        @$(ECHO)'#010+
   '        @$(ECHO)  Clean Units......... $(CLEAN_UNITS)'#010+
   '        @$(ECHO)  Clean Files......... $(CLEAN_FILES)'#010+
   '        @$(ECHO)'#010+
-  '        @$(ECHO)  Install Unit','s....... $(INSTALL_UNITS)'#010+
+  '        @$(ECHO)  Install Units....... $(IN','STALL_UNITS)'#010+
   '        @$(ECHO)  Install Files....... $(INSTALL_FILES)'#010+
   '        @$(ECHO)'#010+
   '        @$(ECHO)  == Install info =='#010+
   '        @$(ECHO)'#010+
   '        @$(ECHO)  DateStr.............. $(DATESTR)'#010+
-  '        @$(ECHO)  ZipName...........','... $(ZIPNAME)'#010+
+  '        @$(ECHO)  ZipName.............. $(ZIPNAME',')'#010+
   '        @$(ECHO)  ZipPrefix............ $(ZIPPREFIX)'#010+
   '        @$(ECHO)  ZipCrossPrefix....... $(ZIPCROSSPREFIX)'#010+
   '        @$(ECHO)  ZipSuffix............ $(ZIPSUFFIX)'#010+
   '        @$(ECHO)  FullZipName.......... $(FULLZIPNAME)'#010+
-  '      ','  @$(ECHO)  Install FPC Package.. $(INSTALL_FPCPACKAGE)'#010+
+  '        @$(ECHO)  I','nstall FPC Package.. $(INSTALL_FPCPACKAGE)'#010+
   '        @$(ECHO)'#010+
   '        @$(ECHO)  Install base dir..... $(INSTALL_BASEDIR)'#010+
   '        @$(ECHO)  Install binary dir... $(INSTALL_BINDIR)'#010+
-  '        @$(ECHO)  Install library dir.. $(INSTALL_','LIBDIR)'#010+
-  '        @$(ECHO)  Install units dir.... $(INSTALL_UNITDIR)'#010+
+  '        @$(ECHO)  Install library dir.. $(INSTALL_LIBDIR)'#010+
+  '     ','   @$(ECHO)  Install units dir.... $(INSTALL_UNITDIR)'#010+
   '        @$(ECHO)  Install source dir... $(INSTALL_SOURCEDIR)'#010+
   '        @$(ECHO)  Install doc dir...... $(INSTALL_DOCDIR)'#010+
-  '        @$(ECHO)  Install example dir.. $(INSTALL_EXAM','PLEDIR)'#010+
-  '        @$(ECHO)  Install data dir..... $(INSTALL_DATADIR)'#010+
+  '        @$(ECHO)  Install example dir.. $(INSTALL_EXAMPLEDIR)'#010+
+  '     ','   @$(ECHO)  Install data dir..... $(INSTALL_DATADIR)'#010+
   '        @$(ECHO)'#010+
   '        @$(ECHO)  Dist destination dir. $(DIST_DESTDIR)'#010+
   '        @$(ECHO)  Dist zip name........ $(DIST_ZIPNAME)'#010+
   '        @$(ECHO)'#010+
   #010+
   '[inforules]'#010+
-  '##############','######################################################'+
+  '###########################','#########################################'+
   '#'#010+
   '# Info rules'#010+
   '#####################################################################'#010+
@@ -2107,7 +2117,7 @@ const fpcmakeini : array[0..205,1..240] of char=(
   'fpc_info: $(INFORULES)'#010+
   #010+
   '[makefilerules]'#010+
-  '##########################################','##########################'+
+  '#######################################################','#############'+
   '#'#010+
   '# Rebuild Makefile'#010+
   '#####################################################################'#010+
@@ -2117,7 +2127,7 @@ const fpcmakeini : array[0..205,1..240] of char=(
   '        fpc_makefile_dirs'#010+
   #010+
   'fpc_makefile:'#010+
-  '        ','$(FPCMAKE) -w -T$(OS_TARGET) Makefile.fpc'#010+
+  '        $(FPCMAKE) -w',' -T$(OS_TARGET) Makefile.fpc'#010+
   #010+
   'fpc_makefile_sub1:'#010+
   'ifdef TARGET_DIRS'#010+
@@ -2125,7 +2135,7 @@ const fpcmakeini : array[0..205,1..240] of char=(
   'T_DIRS))'#010+
   'endif'#010+
   'ifdef TARGET_EXAMPLEDIRS'#010+
-  '        $(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /','Makefile.fpc,$(TAR'+
+  '        $(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,','$(TAR'+
   'GET_EXAMPLEDIRS))'#010+
   'endif'#010+
   #010+
@@ -2136,8 +2146,9 @@ const fpcmakeini : array[0..205,1..240] of char=(
   #010+
   'fpc_makefiles: fpc_makefile fpc_makefile_dirs'#010+
   #010+
-  '[localmak','efile]'#010+
-  '#####################################################################'#010+
+  '[localmakefile]'#010+
+  '######','##############################################################'+
+  '#'#010+
   '# Local Makefile'#010+
   '#####################################################################'#010+
   #010+
@@ -2147,15 +2158,16 @@ const fpcmakeini : array[0..205,1..240] of char=(
   #010+
   #010+
   '[userrules]'#010+
-  '##','##################################################################'+
+  '###############','#####################################################'+
   '#'#010+
   '# Users rules'#010+
   '#####################################################################'#010+
   #010+
   '[lclrules]'#010+
   '#####################################################################'#010+
-  '# LCL ','Rules'#010+
-  '#####################################################################'#010+
+  '# LCL Rules'#010+
+  '#######','#############################################################'+
+  '#'#010+
   #010+
   '# LCL Platform'#010+
   'ifndef LCL_PLATFORM'#010+
@@ -2167,7 +2179,7 @@ const fpcmakeini : array[0..205,1..240] of char=(
   'endif'#010+
   'export LCL_PLATFORM'#010+
   #010+
-  '# Check if the specified LCL','DIR is correct'#010+
+  '# Check if the specified LCLDIR is correc','t'#010+
   'ifdef LCLDIR'#010+
   'override LCLDIR:=$(subst \,/,$(LCLDIR))'#010+
   'ifeq ($(wildcard $(LCLDIR)/units/$(LCL_PLATFORM)),)'#010+
@@ -2178,8 +2190,8 @@ const fpcmakeini : array[0..205,1..240] of char=(
   'endif'#010+
   #010+
   '# Check if the default LCLDIR is correct'#010+
-  'ifdef DEFAULT_LCL','DIR'#010+
-  'override LCLDIR:=$(subst \,/,$(DEFAULT_LCLDIR))'#010+
+  'ifdef DEFAULT_LCLDIR'#010+
+  'override ','LCLDIR:=$(subst \,/,$(DEFAULT_LCLDIR))'#010+
   'ifeq ($(wildcard $(LCLDIR)/units/$(LCL_PLATFORM)),)'#010+
   'override LCLDIR=wrong'#010+
   'endif'#010+
@@ -2187,7 +2199,7 @@ const fpcmakeini : array[0..205,1..240] of char=(
   #010+
   '# Check for development version'#010+
   'ifeq ($(LCLDIR),wrong)'#010+
-  'override LCLDIR=$(subst /units/$(LCL_PLATFORM)',',,$(firstword $(wildca'+
+  'override LCLDIR=$(subst /units/$(LCL_PLATFORM),,$(firstword',' $(wildca'+
   'rd $(addsuffix /units/$(LCL_PLATFORM),$(BASEDIR)/lcl $(BASEDIR)))))'#010+
   'ifeq ($(LCLDIR),)'#010+
   'override LCLDIR=wrong'#010+
@@ -2196,7 +2208,7 @@ const fpcmakeini : array[0..205,1..240] of char=(
   #010+
   '# Check for release version'#010+
   'ifeq ($(LCLDIR),wrong)'#010+
-  'override LCLDIR=$(subst /units/$(LCL_PLATFORM)',',,$(firstword $(wildca'+
+  'override LCLDIR=$(subst /units/$(LCL_PLATFORM),,$(firstword',' $(wildca'+
   'rd $(addsuffix /lib/lazarus/units/$(LCL_PLATFORM),/usr/local /usr))))'#010+
   'ifeq ($(LCLDIR),)'#010+
   'override LCLDIR=wrong'#010+
@@ -2205,14 +2217,14 @@ const fpcmakeini : array[0..205,1..240] of char=(
   #010+
   '# Generate dirs'#010+
   'override LCLUNITDIR:=$(wildcard $(LCLDIR)/units/$(LCL_PLATFORM) $(LCLD'+
-  'IR)/units',')'#010+
-  'override LCLCOMPONENTDIR:=$(wildcard $(LCLDIR)/.. $(LCLDIR)/../compone'+
-  'nts $(LCLDIR)/components)'#010+
+  'IR)/units)'#010+
+  'override LC','LCOMPONENTDIR:=$(wildcard $(LCLDIR)/.. $(LCLDIR)/../compo'+
+  'nents $(LCLDIR)/components)'#010+
   'export LCLDIR LCLUNITDIR LCLCOMPONENTDIR'#010+
   #010+
   '# Add LCL dirs to paths'#010+
   'override REQUIRE_PACKAGESDIR+=$(LCLCOMPONENTDIR)'#010+
-  'override COMPILER_UNITDIR+=','$(LCLUNITDIR)'#010+
+  'override COMPILER_UNITDIR+=$(LCLUNITDIR)',#010+
   #010+
   '[lclinforules]'#010+
   '#####################################################################'#010+
@@ -2222,12 +2234,12 @@ const fpcmakeini : array[0..205,1..240] of char=(
   #010+
   '.PHONY: lclinfo'#010+
   #010+
-  'lclinfo',':'#010+
-  '        @$(ECHO)  == LCL info =='#010+
+  'lclinfo:'#010+
+  '        @$(','ECHO)  == LCL info =='#010+
   '        @$(ECHO)'#010+
   '        @$(ECHO)  Platform............. $(LCL_PLATFORM)'#010+
   '        @$(ECHO)  LCLDIR............... $(LCLDIR)'#010+
   '        @$(ECHO)  LCL Unit dir......... $(LCLUNITDIR)'#010+
-  '        @$(ECHO)  LCL Compon','ent dir.... $(LCLCOMPONENTDIR)'#010+
+  '        @$(ECHO)  LCL Component dir.... $','(LCLCOMPONENTDIR)'#010+
   '        @$(ECHO)'#010
 );