===============================================
Bug report -- MySQL v4.04b, source distribution
===============================================
----------------------------------------------------------------
Machine specs (build machine and test machine are same machine):
----------------------------------------------------------------
Compaq Presario desktop
Windows XP Professional SP1
.NET Framework SP2
------------------
Build description:
------------------
libmysqld.dll was built using Microsoft Visual C++ 6.0 SP5 and Microsoft
Visual C++ Processor Pack SP5 (used for ASM files). We build our own
version because we need to make a change so that the DLL will work with
C# clients (see below for more info).
--------------------
Problem description:
--------------------
A C# client was built using Microsoft Visual Studio.NET. The client
calls mysql_server_init(), passing in the command-line argument
"--datadir=<path>", then attempts to open a connection using
mysql_init() and mysql_real_connect(). A database that is known to
exist is passed in to the mysql_real_connect() function. The function
call fails and mysql_error() returns "Unknown database '<name>'."
Behavior is identical using debug and release builds of libmysqld.dll.
The problem does not occur using a C++ client.
---------------
Possible cause:
---------------
Stepping into MySQL, I find that the variable "mysql_data_home" is set
to the correct value when mysql_server_init() returns. However, when
mysql_init() is entered, the value has become corrupted.
--------
C# code:
--------
/**************************************************************/
/* you will need to customize the datadir and database name */
/**************************************************************/
using System;
using System.Security;
using System.Runtime.InteropServices;
namespace ConsoleApplication1
{
class Test
{
[STAThread]
static void Main(string[] args)
{
TestDirectToDLL();
}
private static void TestDirectToDLL()
{
string[] args = new string[] {"thisappname",
"--datadir=c:/iter/source/ADCData"};
MySqlAPI.ServerInit(args.Length, args, null);
IntPtr cnn = MySqlAPI.Init(IntPtr.Zero);
IntPtr result = MySqlAPI.Connect(cnn, null, null, null,
"iteration", 0, null, 0);
if (result == IntPtr.Zero)
throw new Exception(MySqlAPI.Error(cnn));
MySqlAPI.Close(cnn);
MySqlAPI.ServerEnd();
}
}
class MySqlAPI
{
[SuppressUnmanagedCodeSecurity]
[DllImport("libmysqld.dll",
CharSet=System.Runtime.InteropServices.CharSet.Ansi,
EntryPoint="mysql_server_init", ExactSpelling=true)]
public static extern int ServerInit(int icArgs, string [] strArgs,
string [] strGroups);
[DllImport("libmysqld.dll",
EntryPoint="mysql_server_end", ExactSpelling=true)]
public static extern void ServerEnd();
[SuppressUnmanagedCodeSecurity]
[DllImport("libmysqld.dll", EntryPoint="mysql_init",
ExactSpelling=true)]
public static extern IntPtr Init(IntPtr ihConnection);
[SuppressUnmanagedCodeSecurity]
[DllImport("libmysqld.dll",
CharSet=System.Runtime.InteropServices.CharSet.Ansi,
EntryPoint="mysql_real_connect", ExactSpelling=true)]
public static extern IntPtr Connect(IntPtr ihConnection,
[In] string strHost, [In] string strUser, [In] string strPassword,
[In] string strDatabaseName,
uint iPort, [In] string strSocketName, uint iFlags
);
[SuppressUnmanagedCodeSecurity]
[DllImport("libmysqld.dll", EntryPoint="mysql_close",
ExactSpelling=true)]
public static extern void Close(IntPtr ihConnection);
[DllImport("libmysqld.dll",
EntryPoint="mysql_errno", ExactSpelling=true)]
public static extern uint ErrNo(IntPtr ihConnection);
[DllImport("libmysqld.dll",
CharSet=System.Runtime.InteropServices.CharSet.Ansi,
EntryPoint="mysql_error", ExactSpelling=true)]
public static extern string Error(IntPtr ihConnection);
}
}
---------
C++ code:
---------
/**************************************************************/
/* plug this into the file test_dll.cpp that ships with MySQL */
/**************************************************************/
/**************************************************************/
/* you will need to customize the datadir and database name */
/**************************************************************/
int main(int argc, char* argv[])
{
MYSQL *one;
const char *simulatedArgs[] = {"thisappname",
"--datadir=c:/iter/source/ADCData"};
const int simulatedArgCount = 2;
mysql_server_init(simulatedArgCount, (char**)simulatedArgs, NULL);
one = db_connect("iteration");
db_do_query(one, "show tables");
mysql_close(one);
mysql_server_end();
return 0;
}
---------------
MySQL binaries:
---------------
Upon request, I can supply our debug and release builds of
libmysqld.dll.
-------------------------------
Source code change description:
-------------------------------
There is only one change we make to the MySQL 4.04b source distribution.
We define USE_TLS for the "mysys" project. The reason is that it's
required for clients that use LoadLibrary(), which includes all C#
clients. More information can be found in the VC++ documentation
article "Rules and Limitations for TLS".
-----------------------
My contact information:
-----------------------
Matt Solnit <[EMAIL PROTECTED]>
---------------------------------------------------------------------
Before posting, please check:
http://www.mysql.com/manual.php (the manual)
http://lists.mysql.com/ (the list archive)
To request this thread, e-mail <[EMAIL PROTECTED]>
To unsubscribe, e-mail <[EMAIL PROTECTED]>
Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php