mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Bug#33748 my_getsystime, my_micro_time and my_micro_time_and_time broken on windows
- Fix 'my_win_init' code that handles initialization of "query_performance_counter" and conversion from registry values to environment strings
This commit is contained in:
115
mysys/my_init.c
115
mysys/my_init.c
@ -30,7 +30,6 @@
|
|||||||
#endif
|
#endif
|
||||||
my_bool have_tcpip=0;
|
my_bool have_tcpip=0;
|
||||||
static void my_win_init(void);
|
static void my_win_init(void);
|
||||||
static my_bool win32_have_tcpip(void);
|
|
||||||
static my_bool win32_init_tcp_ip();
|
static my_bool win32_init_tcp_ip();
|
||||||
#else
|
#else
|
||||||
#define my_win_init()
|
#define my_win_init()
|
||||||
@ -233,29 +232,6 @@ Voluntary context switches %ld, Involuntary context switches %ld\n",
|
|||||||
|
|
||||||
#ifdef __WIN__
|
#ifdef __WIN__
|
||||||
|
|
||||||
/*
|
|
||||||
This code is specially for running MySQL, but it should work in
|
|
||||||
other cases too.
|
|
||||||
|
|
||||||
Inizializzazione delle variabili d'ambiente per Win a 32 bit.
|
|
||||||
|
|
||||||
Vengono inserite nelle variabili d'ambiente (utilizzando cosi'
|
|
||||||
le funzioni getenv e putenv) i valori presenti nelle chiavi
|
|
||||||
del file di registro:
|
|
||||||
|
|
||||||
HKEY_LOCAL_MACHINE\software\MySQL
|
|
||||||
|
|
||||||
Se la kiave non esiste nonn inserisce nessun valore
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Crea la stringa d'ambiente */
|
|
||||||
|
|
||||||
void setEnvString(char *ret, const char *name, const char *value)
|
|
||||||
{
|
|
||||||
DBUG_ENTER("setEnvString");
|
|
||||||
strxmov(ret, name,"=",value,NullS);
|
|
||||||
DBUG_VOID_RETURN ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
my_parameter_handler
|
my_parameter_handler
|
||||||
@ -305,17 +281,6 @@ int handle_rtc_failure(int err_type, const char *file, int line,
|
|||||||
|
|
||||||
static void my_win_init(void)
|
static void my_win_init(void)
|
||||||
{
|
{
|
||||||
HKEY hSoftMysql ;
|
|
||||||
DWORD dimName = 256 ;
|
|
||||||
DWORD dimData = 1024 ;
|
|
||||||
DWORD dimNameValueBuffer = 256 ;
|
|
||||||
DWORD dimDataValueBuffer = 1024 ;
|
|
||||||
DWORD indexValue = 0 ;
|
|
||||||
long retCodeEnumValue ;
|
|
||||||
char NameValueBuffer[256] ;
|
|
||||||
char DataValueBuffer[1024] ;
|
|
||||||
char EnvString[1271] ;
|
|
||||||
const char *targetKey = "Software\\MySQL" ;
|
|
||||||
DBUG_ENTER("my_win_init");
|
DBUG_ENTER("my_win_init");
|
||||||
|
|
||||||
setlocale(LC_CTYPE, ""); /* To get right sortorder */
|
setlocale(LC_CTYPE, ""); /* To get right sortorder */
|
||||||
@ -343,43 +308,58 @@ static void my_win_init(void)
|
|||||||
|
|
||||||
_tzset();
|
_tzset();
|
||||||
|
|
||||||
/* apre la chiave HKEY_LOCAL_MACHINES\software\MySQL */
|
|
||||||
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,(LPCTSTR)targetKey,0,
|
|
||||||
KEY_READ,&hSoftMysql) != ERROR_SUCCESS)
|
|
||||||
DBUG_VOID_RETURN;
|
|
||||||
|
|
||||||
/*
|
|
||||||
** Ne legge i valori e li inserisce nell'ambiente
|
|
||||||
** suppone che tutti i valori letti siano di tipo stringa + '\0'
|
|
||||||
** Legge il valore con indice 0 e lo scarta
|
|
||||||
*/
|
|
||||||
retCodeEnumValue = RegEnumValue(hSoftMysql, indexValue++,
|
|
||||||
(LPTSTR)NameValueBuffer, &dimNameValueBuffer,
|
|
||||||
NULL, NULL, (LPBYTE)DataValueBuffer,
|
|
||||||
&dimDataValueBuffer) ;
|
|
||||||
|
|
||||||
while (retCodeEnumValue != ERROR_NO_MORE_ITEMS)
|
|
||||||
{
|
{
|
||||||
char *my_env;
|
/*
|
||||||
/* Crea la stringa d'ambiente */
|
Open HKEY_LOCAL_MACHINE\SOFTWARE\MySQL and set any strings found
|
||||||
setEnvString(EnvString, NameValueBuffer, DataValueBuffer) ;
|
there as environment variables
|
||||||
|
*/
|
||||||
|
HKEY key_handle;
|
||||||
|
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPCTSTR)"SOFTWARE\\MySQL",
|
||||||
|
0, KEY_READ, &key_handle) == ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
LONG ret;
|
||||||
|
DWORD index= 0;
|
||||||
|
DWORD type;
|
||||||
|
char key_name[256], key_data[1024];
|
||||||
|
size_t key_name_len= sizeof(key_name) - 1;
|
||||||
|
size_t key_data_len= sizeof(key_data) - 1;
|
||||||
|
|
||||||
/* Inserisce i dati come variabili d'ambiente */
|
while ((ret= RegEnumValue(key_handle, index++,
|
||||||
my_env=strdup(EnvString); /* variable for putenv must be allocated ! */
|
key_name, &key_name_len,
|
||||||
putenv(my_env) ;
|
NULL, &type, (LPBYTE)&key_data,
|
||||||
|
&key_data_len)) != ERROR_NO_MORE_ITEMS)
|
||||||
|
{
|
||||||
|
char env_string[sizeof(key_name) + sizeof(key_data) + 2];
|
||||||
|
|
||||||
dimNameValueBuffer = dimName ;
|
if (ret == ERROR_MORE_DATA)
|
||||||
dimDataValueBuffer = dimData ;
|
{
|
||||||
|
/* Registry value larger than 'key_data', skip it */
|
||||||
|
DBUG_PRINT("error", ("Skipped registry value that was too large"));
|
||||||
|
}
|
||||||
|
else if (ret == ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
if (type == REG_SZ)
|
||||||
|
{
|
||||||
|
strxmov(env_string, key_name, "=", key_data, NullS);
|
||||||
|
|
||||||
retCodeEnumValue = RegEnumValue(hSoftMysql, indexValue++,
|
/* variable for putenv must be allocated ! */
|
||||||
NameValueBuffer, &dimNameValueBuffer,
|
putenv(strdup(env_string)) ;
|
||||||
NULL, NULL, (LPBYTE)DataValueBuffer,
|
}
|
||||||
&dimDataValueBuffer) ;
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Unhandled error, break out of loop */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
key_name_len= sizeof(key_name) - 1;
|
||||||
|
key_data_len= sizeof(key_data) - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
RegCloseKey(key_handle) ;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* chiude la chiave */
|
|
||||||
RegCloseKey(hSoftMysql) ;
|
|
||||||
|
|
||||||
/* The following is used by time functions */
|
/* The following is used by time functions */
|
||||||
#define OFFSET_TO_EPOC ((__int64) 134774 * 24 * 60 * 60 * 1000 * 1000 * 10)
|
#define OFFSET_TO_EPOC ((__int64) 134774 * 24 * 60 * 60 * 1000 * 1000 * 10)
|
||||||
#define MS 10000000
|
#define MS 10000000
|
||||||
@ -387,7 +367,8 @@ static void my_win_init(void)
|
|||||||
FILETIME ft;
|
FILETIME ft;
|
||||||
LARGE_INTEGER li, t_cnt;
|
LARGE_INTEGER li, t_cnt;
|
||||||
DBUG_ASSERT(sizeof(LARGE_INTEGER) == sizeof(query_performance_frequency));
|
DBUG_ASSERT(sizeof(LARGE_INTEGER) == sizeof(query_performance_frequency));
|
||||||
if (QueryPerformanceFrequency((LARGE_INTEGER *)&query_performance_frequency))
|
if (QueryPerformanceFrequency((LARGE_INTEGER *)
|
||||||
|
&query_performance_frequency) == 0)
|
||||||
query_performance_frequency= 0;
|
query_performance_frequency= 0;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user