List:Commits« Previous MessageNext Message »
From:msvensson Date:January 9 2008 6:13pm
Subject:bk commit into 5.1 tree (msvensson:1.2686) BUG#33748
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of msvensson. When msvensson does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet@stripped, 2008-01-09 19:13:07+01:00, msvensson@stripped +1 -0
  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@stripped, 2008-01-09 19:13:04+01:00, msvensson@stripped +51 -70
    - 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'

diff -Nrup a/mysys/my_init.c b/mysys/my_init.c
--- a/mysys/my_init.c	2007-10-09 21:50:46 +02:00
+++ b/mysys/my_init.c	2008-01-09 19:13:04 +01:00
@@ -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, Involunt
 
 #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, con
 
 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,42 +308,57 @@ 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 ;
-
-    retCodeEnumValue = RegEnumValue(hSoftMysql, indexValue++,
-				    NameValueBuffer, &dimNameValueBuffer,
-				    NULL, NULL, (LPBYTE)DataValueBuffer,
-				    &dimDataValueBuffer) ;
-  }
+    /*
+      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;
+      }
 
-  /* chiude la chiave */
-  RegCloseKey(hSoftMysql) ;
+      RegCloseKey(key_handle) ;
+    }
+  }
 
   /* The following is used by time functions */
 #define OFFSET_TO_EPOC ((__int64) 134774 * 24 * 60 * 60 * 1000 * 1000 * 10)
@@ -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
     {
Thread
bk commit into 5.1 tree (msvensson:1.2686) BUG#33748msvensson9 Jan