diff options
author | unknown <msvensson@pilot.mysql.com> | 2008-01-09 19:13:07 +0100 |
---|---|---|
committer | unknown <msvensson@pilot.mysql.com> | 2008-01-09 19:13:07 +0100 |
commit | 11391111b7e642a6f5c9542258a25ff2898b3940 (patch) | |
tree | 20aba9f49f060061de692909af623bd022d3ebb1 /mysys | |
parent | cd7ab06e082333386e8c806299b41e789600c68f (diff) | |
download | mariadb-git-11391111b7e642a6f5c9542258a25ff2898b3940.tar.gz |
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
mysys/my_init.c:
- Change check of return value from 'QueryPerformanceFrequency', it
returns 0 on error
- Don't return from 'my_win_init' if the registry
key "HKEY_LOCAL_MACHINE\SOFTWARE\MySQL" doesn't exist. This caused
the initialization of "query_performance_counter" to be bypassed unless there
was at lest such a key.
- Cleanup the "registry -> environment variables" from Italian comments,
remove redundant variables and fix style.
- Remove function 'setEnvString' and replace it with oneliner 'strxmov'
Diffstat (limited to 'mysys')
-rw-r--r-- | mysys/my_init.c | 119 |
1 files changed, 50 insertions, 69 deletions
diff --git a/mysys/my_init.c b/mysys/my_init.c index 6d1b9ec04be..5afc1e377ac 100644 --- a/mysys/my_init.c +++ b/mysys/my_init.c @@ -30,7 +30,6 @@ #endif my_bool have_tcpip=0; static void my_win_init(void); -static my_bool win32_have_tcpip(void); static my_bool win32_init_tcp_ip(); #else #define my_win_init() @@ -233,29 +232,6 @@ Voluntary context switches %ld, Involuntary context switches %ld\n", #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 @@ -305,17 +281,6 @@ int handle_rtc_failure(int err_type, const char *file, int line, 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"); setlocale(LC_CTYPE, ""); /* To get right sortorder */ @@ -343,43 +308,58 @@ static void my_win_init(void) _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 */ - setEnvString(EnvString, NameValueBuffer, DataValueBuffer) ; - - /* Inserisce i dati come variabili d'ambiente */ - my_env=strdup(EnvString); /* variable for putenv must be allocated ! */ - putenv(my_env) ; - - dimNameValueBuffer = dimName ; - dimDataValueBuffer = dimData ; + /* + Open HKEY_LOCAL_MACHINE\SOFTWARE\MySQL and set any strings found + 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; + + while ((ret= RegEnumValue(key_handle, index++, + key_name, &key_name_len, + NULL, &type, (LPBYTE)&key_data, + &key_data_len)) != ERROR_NO_MORE_ITEMS) + { + char env_string[sizeof(key_name) + sizeof(key_data) + 2]; + + if (ret == ERROR_MORE_DATA) + { + /* 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); + + /* variable for putenv must be allocated ! */ + putenv(strdup(env_string)) ; + } + } + else + { + /* Unhandled error, break out of loop */ + break; + } + + key_name_len= sizeof(key_name) - 1; + key_data_len= sizeof(key_data) - 1; + } - retCodeEnumValue = RegEnumValue(hSoftMysql, indexValue++, - NameValueBuffer, &dimNameValueBuffer, - NULL, NULL, (LPBYTE)DataValueBuffer, - &dimDataValueBuffer) ; + RegCloseKey(key_handle) ; + } } - /* chiude la chiave */ - RegCloseKey(hSoftMysql) ; - /* The following is used by time functions */ #define OFFSET_TO_EPOC ((__int64) 134774 * 24 * 60 * 60 * 1000 * 1000 * 10) #define MS 10000000 @@ -387,7 +367,8 @@ static void my_win_init(void) FILETIME ft; LARGE_INTEGER li, t_cnt; 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; else { |