From: Hans Leidekker hans@codeweavers.com
--- dlls/odbccp32/odbccp32.c | 45 ++++++++++++++++++++++---- dlls/odbccp32/tests/misc.c | 66 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+), 7 deletions(-)
diff --git a/dlls/odbccp32/odbccp32.c b/dlls/odbccp32/odbccp32.c index 46468765b86..f6ce4b24ae5 100644 --- a/dlls/odbccp32/odbccp32.c +++ b/dlls/odbccp32/odbccp32.c @@ -710,12 +710,12 @@ BOOL WINAPI SQLGetInstalledDrivers(char *buf, WORD size, WORD *sizeout) return TRUE; }
-static HKEY get_privateprofile_sectionkey(LPCWSTR section, LPCWSTR filename) +static HKEY get_privateprofile_sectionkey(HKEY root, const WCHAR *section, const WCHAR *filename) { HKEY hkey, hkeyfilename, hkeysection; LONG ret;
- if (RegOpenKeyW(HKEY_CURRENT_USER, odbcW, &hkey)) + if (RegOpenKeyW(root, odbcW, &hkey)) return NULL;
ret = RegOpenKeyW(hkey, filename, &hkeyfilename); @@ -750,7 +750,16 @@ int WINAPI SQLGetPrivateProfileStringW(LPCWSTR section, LPCWSTR entry, if (!defvalue || !buff) return 0;
- sectionkey = get_privateprofile_sectionkey(section, filename); + if (config_mode == ODBC_USER_DSN) + sectionkey = get_privateprofile_sectionkey(HKEY_CURRENT_USER, section, filename); + else if (config_mode == ODBC_SYSTEM_DSN) + sectionkey = get_privateprofile_sectionkey(HKEY_LOCAL_MACHINE, section, filename); + else + { + sectionkey = get_privateprofile_sectionkey(HKEY_CURRENT_USER, section, filename); + if (!sectionkey) sectionkey = get_privateprofile_sectionkey(HKEY_LOCAL_MACHINE, section, filename); + } + if (sectionkey) { DWORD type, size; @@ -823,10 +832,22 @@ int WINAPI SQLGetPrivateProfileString(LPCSTR section, LPCSTR entry, if (!section || !defvalue || !buff) return 0;
- sectionW = strdupAtoW(section); - filenameW = strdupAtoW(filename); + if (!(sectionW = strdupAtoW(section))) return 0; + if (!(filenameW = strdupAtoW(filename))) + { + free(sectionW); + return 0; + }
- sectionkey = get_privateprofile_sectionkey(sectionW, filenameW); + if (config_mode == ODBC_USER_DSN) + sectionkey = get_privateprofile_sectionkey(HKEY_CURRENT_USER, sectionW, filenameW); + else if (config_mode == ODBC_SYSTEM_DSN) + sectionkey = get_privateprofile_sectionkey(HKEY_LOCAL_MACHINE, sectionW, filenameW); + else + { + sectionkey = get_privateprofile_sectionkey(HKEY_CURRENT_USER, sectionW, filenameW); + if (!sectionkey) sectionkey = get_privateprofile_sectionkey(HKEY_LOCAL_MACHINE, sectionW, filenameW); + }
free(sectionW); free(filenameW); @@ -1814,7 +1835,17 @@ BOOL WINAPI SQLWritePrivateProfileStringW(LPCWSTR lpszSection, LPCWSTR lpszEntry return FALSE; }
- if ((ret = RegCreateKeyW(HKEY_CURRENT_USER, odbcW, &hkey)) == ERROR_SUCCESS) + if (config_mode == ODBC_USER_DSN) + ret = RegCreateKeyW(HKEY_CURRENT_USER, odbcW, &hkey); + else if (config_mode == ODBC_SYSTEM_DSN) + ret = RegCreateKeyW(HKEY_LOCAL_MACHINE, odbcW, &hkey); + else + { + ret = RegCreateKeyW(HKEY_CURRENT_USER, odbcW, &hkey); + if (ret) ret = RegCreateKeyW(HKEY_LOCAL_MACHINE, odbcW, &hkey); + } + + if (ret == ERROR_SUCCESS) { HKEY hkeyfilename;
diff --git a/dlls/odbccp32/tests/misc.c b/dlls/odbccp32/tests/misc.c index 3b812b77726..1d7228de6c0 100644 --- a/dlls/odbccp32/tests/misc.c +++ b/dlls/odbccp32/tests/misc.c @@ -324,6 +324,7 @@ static void test_SQLGetPrivateProfileStringW(void) static WCHAR def[] = {'d','e','f',0}; static WCHAR value0[] = {'v','a','l','u','e','0','1','2','3','4','5','6','7','8','9',0}; static WCHAR testingvalue[] = {'t','e','s','t','i','n','g',0,'v','a','l','u','e',0}; + UWORD orig_mode; int ret; WCHAR buffer[256] = {0}; LONG reg_ret; @@ -422,6 +423,71 @@ static void test_SQLGetPrivateProfileStringW(void) reg_ret = RegDeleteKeyW(HKEY_CURRENT_USER, abcdini_key); ok(reg_ret == ERROR_SUCCESS, "RegDeleteKeyW failed\n"); } + + ret = SQLGetConfigMode(&orig_mode); + ok(ret, "SQLGetConfigMode failed\n"); + + ret = SQLSetConfigMode(ODBC_SYSTEM_DSN); + ok(ret, "SQLSetConfigMode failed\n"); + + ret = SQLWritePrivateProfileStringW(L"wineodbc", L"testing" , L"value", L"ODBC.INI"); + if (!ret) + { + DWORD error_code; + ret = SQLInstallerErrorW(1, &error_code, NULL, 0, NULL); + if (ret && error_code == ODBC_ERROR_WRITING_SYSINFO_FAILED) + { + win_skip("not enough privileges\n"); + SQLSetConfigMode(orig_mode); + return; + } + } + ok(ret, "SQLWritePrivateProfileString failed\n"); + + ret = SQLGetPrivateProfileStringW(L"wineodbc", NULL, L"", buffer, 256, L"ODBC.INI"); + ok(ret, "SQLGetPrivateProfileStringW failed\n"); + + ret = SQLSetConfigMode(ODBC_USER_DSN); + ok(ret, "SQLSetConfigMode failed\n"); + + ret = SQLGetPrivateProfileStringW(L"wineodbc", NULL, L"", buffer, 256, L"ODBC.INI"); + ok(!ret, "SQLGetPrivateProfileStringW succeeded\n"); + + ret = SQLSetConfigMode(ODBC_BOTH_DSN); + ok(ret, "SQLSetConfigMode failed\n"); + + ret = SQLGetPrivateProfileStringW(L"wineodbc", NULL, L"", buffer, 256, L"ODBC.INI"); + ok(ret, "SQLGetPrivateProfileStringW failed\n"); + + reg_ret = RegDeleteKeyW(HKEY_LOCAL_MACHINE, L"Software\ODBC\ODBC.INI\wineodbc"); + ok(reg_ret == ERROR_SUCCESS, "RegDeleteKeyW failed %ld\n", reg_ret); + + ret = SQLSetConfigMode(ODBC_USER_DSN); + ok(ret, "SQLSetConfigMode failed\n"); + + ret = SQLWritePrivateProfileStringW(L"wineodbc", L"testing" , L"value", L"ODBC.INI"); + ok(ret, "SQLWritePrivateProfileString failed\n"); + + ret = SQLGetPrivateProfileStringW(L"wineodbc", NULL, L"", buffer, 256, L"ODBC.INI"); + ok(ret, "SQLGetPrivateProfileStringW failed\n"); + + ret = SQLSetConfigMode(ODBC_SYSTEM_DSN); + ok(ret, "SQLSetConfigMode failed\n"); + + ret = SQLGetPrivateProfileStringW(L"wineodbc", NULL, L"", buffer, 256, L"ODBC.INI"); + ok(!ret, "SQLGetPrivateProfileStringW succeeded\n"); + + ret = SQLSetConfigMode(ODBC_BOTH_DSN); + ok(ret, "SQLSetConfigMode failed\n"); + + ret = SQLGetPrivateProfileStringW(L"wineodbc", NULL, L"", buffer, 256, L"ODBC.INI"); + ok(ret, "SQLGetPrivateProfileStringW failed\n"); + + reg_ret = RegDeleteKeyW(HKEY_CURRENT_USER, L"Software\ODBC\ODBC.INI\wineodbc"); + ok(reg_ret == ERROR_SUCCESS, "RegDeleteKeyW failed %ld\n", reg_ret); + + ret = SQLSetConfigMode(orig_mode); + ok(ret, "SQLSetConfigMode failed\n"); }
static void test_SQLInstallDriverEx(void)
From: Hans Leidekker hans@codeweavers.com
--- dlls/odbccp32/odbccp32.c | 127 +++++++++++++++---------------------- dlls/odbccp32/tests/misc.c | 123 +++++++++++++++-------------------- 2 files changed, 104 insertions(+), 146 deletions(-)
diff --git a/dlls/odbccp32/odbccp32.c b/dlls/odbccp32/odbccp32.c index f6ce4b24ae5..2a57b2db456 100644 --- a/dlls/odbccp32/odbccp32.c +++ b/dlls/odbccp32/odbccp32.c @@ -36,13 +36,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(odbc);
-/* Registry key names */ -static const WCHAR drivers_key[] = {'S','o','f','t','w','a','r','e','\','O','D','B','C','\','O','D','B','C','I','N','S','T','.','I','N','I','\','O','D','B','C',' ','D','r','i','v','e','r','s',0}; -static const WCHAR odbcW[] = {'S','o','f','t','w','a','r','e','\','O','D','B','C',0}; -static const WCHAR odbcini[] = {'S','o','f','t','w','a','r','e','\','O','D','B','C','\','O','D','B','C','I','N','S','T','.','I','N','I','\',0}; -static const WCHAR odbcdrivers[] = {'O','D','B','C',' ','D','r','i','v','e','r','s',0}; -static const WCHAR odbctranslators[] = {'O','D','B','C',' ','T','r','a','n','s','l','a','t','o','r','s',0}; - /* This config mode is known to be process-wide. * MSDN documentation suggests that the value is hidden somewhere in the registry but I haven't found it yet. * Although both the registry and the ODBC.ini files appear to be maintained together they are not maintained automatically through the registry's IniFileMapping. @@ -56,16 +49,6 @@ static UWORD config_mode = ODBC_BOTH_DSN; static int num_errors; static int error_code[8]; static const WCHAR *error_msg[8]; -static const WCHAR odbc_error_general_err[] = {'G','e','n','e','r','a','l',' ','e','r','r','o','r',0}; -static const WCHAR odbc_error_invalid_buff_len[] = {'I','n','v','a','l','i','d',' ','b','u','f','f','e','r',' ','l','e','n','g','t','h',0}; -static const WCHAR odbc_error_component_not_found[] = {'C','o','m','p','o','n','e','n','t',' ','n','o','t',' ','f','o','u','n','d',0}; -static const WCHAR odbc_error_out_of_mem[] = {'O','u','t',' ','o','f',' ','m','e','m','o','r','y',0}; -static const WCHAR odbc_error_invalid_param_sequence[] = {'I','n','v','a','l','i','d',' ','p','a','r','a','m','e','t','e','r',' ','s','e','q','u','e','n','c','e',0}; -static const WCHAR odbc_error_invalid_param_string[] = {'I','n','v','a','l','i','d',' ','p','a','r','a','m','e','t','e','r',' ','s','t','r','i','n','g',0}; -static const WCHAR odbc_error_invalid_dsn[] = {'I','n','v','a','l','i','d',' ','D','S','N',0}; -static const WCHAR odbc_error_load_lib_failed[] = {'L','o','a','d',' ','L','i','b','r','a','r','y',' ','F','a','i','l','e','d',0}; -static const WCHAR odbc_error_request_failed[] = {'R','e','q','u','e','s','t',' ','F','a','i','l','e','d',0}; -static const WCHAR odbc_error_invalid_keyword[] = {'I','n','v','a','l','i','d',' ','k','e','y','w','o','r','d',' ','v','a','l','u','e',0};
static BOOL (WINAPI *pConfigDSN)(HWND hwnd, WORD request, const char *driver, const char *attr); static BOOL (WINAPI *pConfigDSNW)(HWND hwnd, WORD request, const WCHAR *driver, const WCHAR *attr); @@ -229,7 +212,7 @@ static HMODULE load_config_driver(const WCHAR *driver) DWORD size = 0, type; HKEY hkey;
- if ((ret = RegOpenKeyW(HKEY_LOCAL_MACHINE, odbcini, &hkey)) == ERROR_SUCCESS) + if ((ret = RegOpenKeyW(HKEY_LOCAL_MACHINE, L"Software\ODBC\ODBCINST.INI\", &hkey)) == ERROR_SUCCESS) { HKEY hkeydriver;
@@ -240,7 +223,7 @@ static HMODULE load_config_driver(const WCHAR *driver) { RegCloseKey(hkeydriver); RegCloseKey(hkey); - push_error(ODBC_ERROR_INVALID_DSN, odbc_error_invalid_dsn); + push_error(ODBC_ERROR_INVALID_DSN, L"Invalid DSN");
return NULL; } @@ -250,7 +233,7 @@ static HMODULE load_config_driver(const WCHAR *driver) { RegCloseKey(hkeydriver); RegCloseKey(hkey); - push_error(ODBC_ERROR_OUT_OF_MEM, odbc_error_out_of_mem); + push_error(ODBC_ERROR_OUT_OF_MEM, L"Out of memory");
return NULL; } @@ -265,7 +248,7 @@ static HMODULE load_config_driver(const WCHAR *driver) if(ret != ERROR_SUCCESS) { free(filename); - push_error(ODBC_ERROR_COMPONENT_NOT_FOUND, odbc_error_component_not_found); + push_error(ODBC_ERROR_COMPONENT_NOT_FOUND, L"Component not found"); return NULL; }
@@ -273,7 +256,7 @@ static HMODULE load_config_driver(const WCHAR *driver) free(filename);
if(!hmod) - push_error(ODBC_ERROR_LOAD_LIB_FAILED, odbc_error_load_lib_failed); + push_error(ODBC_ERROR_LOAD_LIB_FAILED, L"Load Library Failed");
return hmod; } @@ -287,7 +270,7 @@ static BOOL write_config_value(const WCHAR *driver, const WCHAR *args) if(!args) return FALSE;
- if((ret = RegOpenKeyW(HKEY_LOCAL_MACHINE, odbcini, &hkey)) == ERROR_SUCCESS) + if((ret = RegOpenKeyW(HKEY_LOCAL_MACHINE, L"Software\ODBC\ODBCINST.INI\", &hkey)) == ERROR_SUCCESS) { if((ret = RegOpenKeyW(hkey, driver, &hkeydriver)) == ERROR_SUCCESS) { @@ -296,7 +279,7 @@ static BOOL write_config_value(const WCHAR *driver, const WCHAR *args) name = malloc((wcslen(args) + 1) * sizeof(WCHAR)); if(!name) { - push_error(ODBC_ERROR_OUT_OF_MEM, odbc_error_out_of_mem); + push_error(ODBC_ERROR_OUT_OF_MEM, L"Out of memory"); goto fail; } lstrcpyW(name, args); @@ -304,7 +287,7 @@ static BOOL write_config_value(const WCHAR *driver, const WCHAR *args) divider = wcschr(name,'='); if(!divider) { - push_error(ODBC_ERROR_INVALID_KEYWORD_VALUE, odbc_error_invalid_keyword); + push_error(ODBC_ERROR_INVALID_KEYWORD_VALUE, L"Invalid keyword value"); goto fail; }
@@ -324,7 +307,7 @@ static BOOL write_config_value(const WCHAR *driver, const WCHAR *args) }
if(ret != ERROR_SUCCESS) - push_error(ODBC_ERROR_COMPONENT_NOT_FOUND, odbc_error_component_not_found); + push_error(ODBC_ERROR_COMPONENT_NOT_FOUND, L"Component not found");
return ret == ERROR_SUCCESS;
@@ -400,7 +383,7 @@ BOOL WINAPI SQLConfigDataSourceW(HWND hwnd, WORD request, LPCWSTR driver, LPCWST config_mode = config_mode_prev;
if (!ret) - push_error(ODBC_ERROR_REQUEST_FAILED, odbc_error_request_failed); + push_error(ODBC_ERROR_REQUEST_FAILED, L"Request Failed");
FreeLibrary(mod);
@@ -433,7 +416,7 @@ BOOL WINAPI SQLConfigDataSource(HWND hwnd, WORD request, LPCSTR driver, LPCSTR a driverW = strdupAtoW(driver); if (!driverW) { - push_error(ODBC_ERROR_OUT_OF_MEM, odbc_error_out_of_mem); + push_error(ODBC_ERROR_OUT_OF_MEM, L"Out of memory"); return FALSE; }
@@ -470,7 +453,7 @@ BOOL WINAPI SQLConfigDataSource(HWND hwnd, WORD request, LPCSTR driver, LPCSTR a config_mode = config_mode_prev;
if (!ret) - push_error(ODBC_ERROR_REQUEST_FAILED, odbc_error_request_failed); + push_error(ODBC_ERROR_REQUEST_FAILED, L"Request Failed");
free(driverW); FreeLibrary(mod); @@ -503,7 +486,7 @@ BOOL WINAPI SQLConfigDriverW(HWND hwnd, WORD request, LPCWSTR driver, funcret = pConfigDriverW(hwnd, request, driver, args, msg, msgmax, msgout);
if(!funcret) - push_error(ODBC_ERROR_REQUEST_FAILED, odbc_error_request_failed); + push_error(ODBC_ERROR_REQUEST_FAILED, L"Request Failed");
FreeLibrary(hmod);
@@ -525,7 +508,7 @@ BOOL WINAPI SQLConfigDriver(HWND hwnd, WORD request, LPCSTR driver, driverW = strdupAtoW(driver); if(!driverW) { - push_error(ODBC_ERROR_OUT_OF_MEM, odbc_error_out_of_mem); + push_error(ODBC_ERROR_OUT_OF_MEM, L"Out of memory"); return FALSE; } if(request == ODBC_CONFIG_DRIVER) @@ -539,7 +522,7 @@ BOOL WINAPI SQLConfigDriver(HWND hwnd, WORD request, LPCSTR driver, } else { - push_error(ODBC_ERROR_OUT_OF_MEM, odbc_error_out_of_mem); + push_error(ODBC_ERROR_OUT_OF_MEM, L"Out of memory"); }
free(driverW); @@ -557,7 +540,7 @@ BOOL WINAPI SQLConfigDriver(HWND hwnd, WORD request, LPCSTR driver, funcret = pConfigDriverA(hwnd, request, driver, args, msg, msgmax, msgout);
if(!funcret) - push_error(ODBC_ERROR_REQUEST_FAILED, odbc_error_request_failed); + push_error(ODBC_ERROR_REQUEST_FAILED, L"Request Failed");
FreeLibrary(hmod);
@@ -624,14 +607,15 @@ BOOL WINAPI SQLGetInstalledDriversW(WCHAR *buf, WORD size, WORD *sizeout)
if (!buf || !size) { - push_error(ODBC_ERROR_INVALID_BUFF_LEN, odbc_error_invalid_buff_len); + push_error(ODBC_ERROR_INVALID_BUFF_LEN, L"Invalid buffer length"); return FALSE; }
- res = RegOpenKeyExW(HKEY_LOCAL_MACHINE, drivers_key, 0, KEY_QUERY_VALUE, &drivers); + res = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"Software\ODBC\ODBCINST.INI\ODBC Drivers", 0, + KEY_QUERY_VALUE, &drivers); if (res) { - push_error(ODBC_ERROR_COMPONENT_NOT_FOUND, odbc_error_component_not_found); + push_error(ODBC_ERROR_COMPONENT_NOT_FOUND, L"Component not found"); return FALSE; }
@@ -658,7 +642,7 @@ BOOL WINAPI SQLGetInstalledDriversW(WCHAR *buf, WORD size, WORD *sizeout) break; else { - push_error(ODBC_ERROR_GENERAL_ERR, odbc_error_general_err); + push_error(ODBC_ERROR_GENERAL_ERR, L"General error"); ret = FALSE; break; } @@ -684,14 +668,14 @@ BOOL WINAPI SQLGetInstalledDrivers(char *buf, WORD size, WORD *sizeout)
if (!buf || !size) { - push_error(ODBC_ERROR_INVALID_BUFF_LEN, odbc_error_invalid_buff_len); + push_error(ODBC_ERROR_INVALID_BUFF_LEN, L"Invalid buffer length"); return FALSE; }
wbuf = malloc(size * sizeof(WCHAR)); if (!wbuf) { - push_error(ODBC_ERROR_OUT_OF_MEM, odbc_error_out_of_mem); + push_error(ODBC_ERROR_OUT_OF_MEM, L"Out of memory"); return FALSE; }
@@ -715,7 +699,7 @@ static HKEY get_privateprofile_sectionkey(HKEY root, const WCHAR *section, const HKEY hkey, hkeyfilename, hkeysection; LONG ret;
- if (RegOpenKeyW(root, odbcW, &hkey)) + if (RegOpenKeyW(root, L"Software\ODBC", &hkey)) return NULL;
ret = RegOpenKeyW(hkey, filename, &hkeyfilename); @@ -952,7 +936,7 @@ BOOL WINAPI SQLInstallDriver(LPCSTR lpszInfFile, LPCSTR lpszDriver,
if (lpszInfFile) return FALSE; - + return SQLInstallDriverEx(lpszDriver, NULL, lpszPath, cbPathMax, pcbPathOut, ODBC_INSTALL_COMPLETE, &usage); } @@ -960,18 +944,13 @@ BOOL WINAPI SQLInstallDriver(LPCSTR lpszInfFile, LPCSTR lpszDriver, static void write_registry_values(const WCHAR *regkey, const WCHAR *driver, const WCHAR *path_in, WCHAR *path, DWORD *usage_count) { - static const WCHAR installed[] = {'I','n','s','t','a','l','l','e','d',0}; - static const WCHAR slash[] = {'\', 0}; - static const WCHAR driverW[] = {'D','r','i','v','e','r',0}; - static const WCHAR setupW[] = {'S','e','t','u','p',0}; - static const WCHAR translator[] = {'T','r','a','n','s','l','a','t','o','r',0}; HKEY hkey, hkeydriver;
- if (RegCreateKeyW(HKEY_LOCAL_MACHINE, odbcini, &hkey) == ERROR_SUCCESS) + if (RegCreateKeyW(HKEY_LOCAL_MACHINE, L"Software\ODBC\ODBCINST.INI\", &hkey) == ERROR_SUCCESS) { if (RegCreateKeyW(hkey, regkey, &hkeydriver) == ERROR_SUCCESS) { - if(RegSetValueExW(hkeydriver, driver, 0, REG_SZ, (BYTE*)installed, sizeof(installed)) != ERROR_SUCCESS) + if(RegSetValueExW(hkeydriver, driver, 0, REG_SZ, (BYTE*)L"Installed", sizeof(L"Installed")) != ERROR_SUCCESS) ERR("Failed to write registry installed key\n");
RegCloseKey(hkeydriver); @@ -1014,12 +993,12 @@ static void write_registry_values(const WCHAR *regkey, const WCHAR *driver, cons TRACE("Writing pair %s,%s\n", debugstr_w(entry), debugstr_w(divider));
/* Driver, Setup, Translator entries use the system path unless a path is specified. */ - if(lstrcmpiW(driverW, entry) == 0 || lstrcmpiW(setupW, entry) == 0 || - lstrcmpiW(translator, entry) == 0) + if(lstrcmpiW(L"Driver", entry) == 0 || lstrcmpiW(L"Setup", entry) == 0 || + lstrcmpiW(L"Translator", entry) == 0) { if(GetFileAttributesW(divider) == INVALID_FILE_ATTRIBUTES) { - len = lstrlenW(path) + lstrlenW(slash) + lstrlenW(divider) + 1; + len = lstrlenW(path) + lstrlenW(L"\") + lstrlenW(divider) + 1; value = malloc(len * sizeof(WCHAR)); if(!value) { @@ -1029,7 +1008,7 @@ static void write_registry_values(const WCHAR *regkey, const WCHAR *driver, cons }
lstrcpyW(value, path); - lstrcatW(value, slash); + lstrcatW(value, L"\"); } else { @@ -1089,7 +1068,7 @@ BOOL WINAPI SQLInstallDriverExW(LPCWSTR lpszDriver, LPCWSTR lpszPathIn, debugstr_w(lpszPathIn), lpszPathOut, cbPathOutMax, pcbPathOut, fRequest, lpdwUsageCount);
- write_registry_values(odbcdrivers, lpszDriver, lpszPathIn, path, lpdwUsageCount); + write_registry_values(L"ODBC Drivers", lpszDriver, lpszPathIn, path, lpdwUsageCount);
len = lstrlenW(path);
@@ -1327,7 +1306,7 @@ BOOL WINAPI SQLInstallTranslatorExW(LPCWSTR lpszTranslator, LPCWSTR lpszPathIn, debugstr_w(lpszPathIn), lpszPathOut, cbPathOutMax, pcbPathOut, fRequest, lpdwUsageCount);
- write_registry_values(odbctranslators, lpszTranslator, lpszPathIn, path, lpdwUsageCount); + write_registry_values(L"ODBC Translators", lpszTranslator, lpszPathIn, path, lpdwUsageCount);
len = lstrlenW(path);
@@ -1482,7 +1461,7 @@ BOOL WINAPI SQLRemoveDriverW(LPCWSTR drivername, BOOL remove_dsn, LPDWORD usage_ clear_errors(); TRACE("%s %d %p\n", debugstr_w(drivername), remove_dsn, usage_count);
- if (RegOpenKeyW(HKEY_LOCAL_MACHINE, odbcini, &hkey) == ERROR_SUCCESS) + if (RegOpenKeyW(HKEY_LOCAL_MACHINE, L"Software\ODBC\ODBCINST.INI\", &hkey) == ERROR_SUCCESS) { HKEY hkeydriver;
@@ -1512,7 +1491,7 @@ BOOL WINAPI SQLRemoveDriverW(LPCWSTR drivername, BOOL remove_dsn, LPDWORD usage_ if (RegDeleteKeyW(hkey, drivername) != ERROR_SUCCESS) ERR("Failed to delete registry key: %s\n", debugstr_w(drivername));
- if (RegOpenKeyW(hkey, odbcdrivers, &hkeydriver) == ERROR_SUCCESS) + if (RegOpenKeyW(hkey, L"ODBC Drivers", &hkeydriver) == ERROR_SUCCESS) { if(RegDeleteValueW(hkeydriver, drivername) != ERROR_SUCCESS) ERR("Failed to delete registry value: %s\n", debugstr_w(drivername)); @@ -1590,7 +1569,7 @@ BOOL WINAPI SQLRemoveDSNFromIni(LPCSTR lpszDSN) if (dsn) ret = SQLRemoveDSNFromIniW(dsn); else - push_error(ODBC_ERROR_OUT_OF_MEM, odbc_error_out_of_mem); + push_error(ODBC_ERROR_OUT_OF_MEM, L"Out of memory");
free(dsn);
@@ -1606,7 +1585,7 @@ BOOL WINAPI SQLRemoveTranslatorW(const WCHAR *translator, DWORD *usage_count) clear_errors(); TRACE("%s %p\n", debugstr_w(translator), usage_count);
- if (RegOpenKeyW(HKEY_LOCAL_MACHINE, odbcini, &hkey) == ERROR_SUCCESS) + if (RegOpenKeyW(HKEY_LOCAL_MACHINE, L"Software\ODBC\ODBCINST.INI\", &hkey) == ERROR_SUCCESS) { HKEY hkeydriver;
@@ -1635,16 +1614,16 @@ BOOL WINAPI SQLRemoveTranslatorW(const WCHAR *translator, DWORD *usage_count) { if(RegDeleteKeyW(hkey, translator) != ERROR_SUCCESS) { - push_error(ODBC_ERROR_COMPONENT_NOT_FOUND, odbc_error_component_not_found); + push_error(ODBC_ERROR_COMPONENT_NOT_FOUND, L"Component not found"); WARN("Failed to delete registry key: %s\n", debugstr_w(translator)); ret = FALSE; }
- if (ret && RegOpenKeyW(hkey, odbctranslators, &hkeydriver) == ERROR_SUCCESS) + if (ret && RegOpenKeyW(hkey, L"ODBC Translators", &hkeydriver) == ERROR_SUCCESS) { if(RegDeleteValueW(hkeydriver, translator) != ERROR_SUCCESS) { - push_error(ODBC_ERROR_COMPONENT_NOT_FOUND, odbc_error_component_not_found); + push_error(ODBC_ERROR_COMPONENT_NOT_FOUND, L"Component not found"); WARN("Failed to delete registry key: %s\n", debugstr_w(translator)); ret = FALSE; } @@ -1684,7 +1663,7 @@ BOOL WINAPI SQLSetConfigMode(UWORD wConfigMode)
if (wConfigMode > ODBC_SYSTEM_DSN) { - push_error(ODBC_ERROR_INVALID_PARAM_SEQUENCE, odbc_error_invalid_param_sequence); + push_error(ODBC_ERROR_INVALID_PARAM_SEQUENCE, L"Invalid parameter sequence"); return FALSE; } else @@ -1696,11 +1675,10 @@ BOOL WINAPI SQLSetConfigMode(UWORD wConfigMode)
BOOL WINAPI SQLValidDSNW(LPCWSTR lpszDSN) { - static const WCHAR invalid[] = {'[',']','{','}','(',')',',',';','?','*','=','!','@','\',0}; clear_errors(); TRACE("%s\n", debugstr_w(lpszDSN));
- if(lstrlenW(lpszDSN) > SQL_MAX_DSN_LENGTH || wcspbrk(lpszDSN, invalid) != NULL) + if(lstrlenW(lpszDSN) > SQL_MAX_DSN_LENGTH || wcspbrk(lpszDSN, L"[]{}(),;?*=!@\") != NULL) { return FALSE; } @@ -1734,13 +1712,13 @@ BOOL WINAPI SQLWriteDSNToIniW(LPCWSTR lpszDSN, LPCWSTR lpszDriver)
if (!SQLValidDSNW(lpszDSN)) { - push_error(ODBC_ERROR_INVALID_DSN, odbc_error_invalid_dsn); + push_error(ODBC_ERROR_INVALID_DSN, L"Invalid DSN"); return FALSE; }
/* It doesn't matter if we cannot find the driver, windows just writes a blank value. */ filename[0] = 0; - if (RegOpenKeyW(HKEY_LOCAL_MACHINE, odbcini, &hkey) == ERROR_SUCCESS) + if (RegOpenKeyW(HKEY_LOCAL_MACHINE, L"Software\ODBC\ODBCINST.INI\", &hkey) == ERROR_SUCCESS) { HKEY hkeydriver;
@@ -1773,7 +1751,7 @@ BOOL WINAPI SQLWriteDSNToIniW(LPCWSTR lpszDSN, LPCWSTR lpszDriver) }
if (ret != ERROR_SUCCESS) - push_error(ODBC_ERROR_REQUEST_FAILED, odbc_error_request_failed); + push_error(ODBC_ERROR_REQUEST_FAILED, L"Request Failed");
return ret == ERROR_SUCCESS; } @@ -1790,7 +1768,7 @@ BOOL WINAPI SQLWriteDSNToIni(LPCSTR lpszDSN, LPCSTR lpszDriver) if (dsn && driver) ret = SQLWriteDSNToIniW(dsn, driver); else - push_error(ODBC_ERROR_OUT_OF_MEM, odbc_error_out_of_mem); + push_error(ODBC_ERROR_OUT_OF_MEM, L"Out of memory");
free(dsn); free(driver); @@ -1821,7 +1799,6 @@ BOOL WINAPI SQLWriteFileDSN(LPCSTR lpszFileName, LPCSTR lpszAppName, BOOL WINAPI SQLWritePrivateProfileStringW(LPCWSTR lpszSection, LPCWSTR lpszEntry, LPCWSTR lpszString, LPCWSTR lpszFilename) { - static const WCHAR empty[] = {0}; LONG ret; HKEY hkey;
@@ -1831,18 +1808,18 @@ BOOL WINAPI SQLWritePrivateProfileStringW(LPCWSTR lpszSection, LPCWSTR lpszEntry
if(!lpszFilename || !*lpszFilename) { - push_error(ODBC_ERROR_INVALID_STR, odbc_error_invalid_param_string); + push_error(ODBC_ERROR_INVALID_STR, L"Invalid parameter string"); return FALSE; }
if (config_mode == ODBC_USER_DSN) - ret = RegCreateKeyW(HKEY_CURRENT_USER, odbcW, &hkey); + ret = RegCreateKeyW(HKEY_CURRENT_USER, L"Software\ODBC", &hkey); else if (config_mode == ODBC_SYSTEM_DSN) - ret = RegCreateKeyW(HKEY_LOCAL_MACHINE, odbcW, &hkey); + ret = RegCreateKeyW(HKEY_LOCAL_MACHINE, L"Software\ODBC", &hkey); else { - ret = RegCreateKeyW(HKEY_CURRENT_USER, odbcW, &hkey); - if (ret) ret = RegCreateKeyW(HKEY_LOCAL_MACHINE, odbcW, &hkey); + ret = RegCreateKeyW(HKEY_CURRENT_USER, L"Software\ODBC", &hkey); + if (ret) ret = RegCreateKeyW(HKEY_LOCAL_MACHINE, L"Software\ODBC", &hkey); }
if (ret == ERROR_SUCCESS) @@ -1858,7 +1835,7 @@ BOOL WINAPI SQLWritePrivateProfileStringW(LPCWSTR lpszSection, LPCWSTR lpszEntry if(lpszString) ret = RegSetValueExW(hkey_section, lpszEntry, 0, REG_SZ, (BYTE*)lpszString, (lstrlenW(lpszString)+1)*sizeof(WCHAR)); else - ret = RegSetValueExW(hkey_section, lpszEntry, 0, REG_SZ, (BYTE*)empty, sizeof(empty)); + ret = RegSetValueExW(hkey_section, lpszEntry, 0, REG_SZ, (BYTE*)L"", sizeof(L"")); RegCloseKey(hkey_section); }
diff --git a/dlls/odbccp32/tests/misc.c b/dlls/odbccp32/tests/misc.c index 1d7228de6c0..d4dc5ffcb54 100644 --- a/dlls/odbccp32/tests/misc.c +++ b/dlls/odbccp32/tests/misc.c @@ -24,8 +24,8 @@ #include "winreg.h" #include "odbcinst.h"
-static const WCHAR abcd_key[] = {'S','o','f','t','w','a','r','e','\','O','D','B','C','\','a','b','c','d','.','I','N','I','\','w','i','n','e','o','d','b','c',0}; -static const WCHAR abcdini_key[] = {'S','o','f','t','w','a','r','e','\','O','D','B','C','\','a','b','c','d','.','I','N','I',0 }; +static const WCHAR abcd_key[] = L"Software\ODBC\abcd.INI\wineodbc"; +static const WCHAR abcdini_key[] = L"Software\ODBC\abcd.INI";
static void check_error_(int line, DWORD expect) { @@ -150,7 +150,7 @@ static void test_SQLInstallDriverManager(void)
static void test_SQLWritePrivateProfileString(void) { - static const WCHAR odbc_key[] = {'S','o','f','t','w','a','r','e','\','O','D','B','C','\','O','D','B','C','.','I','N','I','\','w','i','n','e','o','d','b','c',0}; + static const WCHAR odbc_key[] = L"Software\ODBC\ODBC.INI\wineodbc"; BOOL ret; LONG reg_ret; DWORD error_code; @@ -312,57 +312,45 @@ static void test_SQLGetPrivateProfileString(void)
static void test_SQLGetPrivateProfileStringW(void) { - static WCHAR testing[] = {'t','e','s','t','i','n','g',0}; - static WCHAR wineodbc[] = {'w','i','n','e','o','d','b','c',0}; - static WCHAR defaultval[] = {'d','e','f','a','u','l','t',0}; - static WCHAR odbcini[] = {'O','D','B','C','.','I','N','I',0}; - static WCHAR abcdini[] = {'a','b','c','d','.','I','N','I',0}; - static WCHAR wine[] = {'w','i','n','e',0}; - static WCHAR value[] = {'v','a','l','u','e',0}; - static WCHAR empty[] = {0}; - static WCHAR defaultX[] = {'d','e','f','a','u','l','t',0}; - static WCHAR def[] = {'d','e','f',0}; - static WCHAR value0[] = {'v','a','l','u','e','0','1','2','3','4','5','6','7','8','9',0}; - static WCHAR testingvalue[] = {'t','e','s','t','i','n','g',0,'v','a','l','u','e',0}; UWORD orig_mode; int ret; WCHAR buffer[256] = {0}; LONG reg_ret;
- lstrcpyW(buffer, wine); - ret = SQLGetPrivateProfileStringW(NULL, testing , defaultval, buffer, 256, odbcini); + lstrcpyW(buffer, L"wine"); + ret = SQLGetPrivateProfileStringW(NULL, L"testing", L"default", buffer, 256, L"ODBC.INI"); ok(ret == 0, "SQLGetPrivateProfileStringW returned %d\n", ret); - ok(!lstrcmpW(buffer, wine), "incorrect string '%s'\n", wine_dbgstr_w(buffer)); + ok(!lstrcmpW(buffer, L"wine"), "incorrect string '%s'\n", wine_dbgstr_w(buffer));
- lstrcpyW(buffer, wine); - ret = SQLGetPrivateProfileStringW(wineodbc, NULL , defaultval, buffer, 256, odbcini); + lstrcpyW(buffer, L"wine"); + ret = SQLGetPrivateProfileStringW(L"wineodbc", NULL , L"default", buffer, 256, L"ODBC.INI"); ok(ret == 0, "SQLGetPrivateProfileStringW returned %d\n", ret); - ok(!lstrcmpW(buffer, empty), "incorrect string '%s'\n", wine_dbgstr_w(buffer)); + ok(!lstrcmpW(buffer, L""), "incorrect string '%s'\n", wine_dbgstr_w(buffer));
- lstrcpyW(buffer, value); - ret = SQLGetPrivateProfileStringW(wineodbc, testing , NULL, buffer, 256, odbcini); + lstrcpyW(buffer, L"value"); + ret = SQLGetPrivateProfileStringW(L"wineodbc", L"testing", NULL, buffer, 256, L"ODBC.INI"); ok(ret == 0, "SQLGetPrivateProfileStringW returned %d\n", ret); - ok(!lstrcmpW(buffer, empty), "incorrect string '%s'\n", wine_dbgstr_w(buffer)); + ok(!lstrcmpW(buffer, L""), "incorrect string '%s'\n", wine_dbgstr_w(buffer));
- ret = SQLGetPrivateProfileStringW(wineodbc, testing , defaultX, buffer, 256, odbcini); - ok(ret == lstrlenW(defaultX), "SQLGetPrivateProfileStringW returned %d\n", ret); - ok(!lstrcmpW(buffer, defaultX), "incorrect string '%s'\n", wine_dbgstr_w(buffer)); + ret = SQLGetPrivateProfileStringW(L"wineodbc", L"testing", L"default", buffer, 256, L"ODBC.INI"); + ok(ret == lstrlenW(L"default"), "SQLGetPrivateProfileStringW returned %d\n", ret); + ok(!lstrcmpW(buffer, L"default"), "incorrect string '%s'\n", wine_dbgstr_w(buffer));
- ret = SQLGetPrivateProfileStringW(wineodbc, testing , defaultX, buffer, 4, odbcini); - ok(ret == lstrlenW(def), "SQLGetPrivateProfileStringW returned %d\n", ret); - ok(!lstrcmpW(buffer, def), "incorrect string '%s'\n", wine_dbgstr_w(buffer)); + ret = SQLGetPrivateProfileStringW(L"wineodbc", L"testing", L"default", buffer, 4, L"ODBC.INI"); + ok(ret == lstrlenW(L"def"), "SQLGetPrivateProfileStringW returned %d\n", ret); + ok(!lstrcmpW(buffer, L"def"), "incorrect string '%s'\n", wine_dbgstr_w(buffer));
- ret = SQLGetPrivateProfileStringW(wineodbc, testing , defaultX, buffer, 8, odbcini); - ok(ret == lstrlenW(defaultX), "SQLGetPrivateProfileStringW returned %d\n", ret); - ok(!lstrcmpW(buffer, defaultX), "incorrect string '%s'\n", wine_dbgstr_w(buffer)); + ret = SQLGetPrivateProfileStringW(L"wineodbc", L"testing", L"default", buffer, 8, L"ODBC.INI"); + ok(ret == lstrlenW(L"default"), "SQLGetPrivateProfileStringW returned %d\n", ret); + ok(!lstrcmpW(buffer, L"default"), "incorrect string '%s'\n", wine_dbgstr_w(buffer));
- ret = SQLGetPrivateProfileStringW(wineodbc, testing , defaultX, NULL, 256, odbcini); + ret = SQLGetPrivateProfileStringW(L"wineodbc", L"testing", L"default", NULL, 256, L"ODBC.INI"); ok(ret == 0, "SQLGetPrivateProfileStringW returned %d\n", ret);
- lstrcpyW(buffer, value); - ret = SQLGetPrivateProfileStringW(wineodbc, testing , defaultX, buffer, 0, odbcini); + lstrcpyW(buffer, L"value"); + ret = SQLGetPrivateProfileStringW(L"wineodbc", L"testing", L"default", buffer, 0, L"ODBC.INI"); ok(ret == 0, "SQLGetPrivateProfileStringW returned %d\n", ret); - ok(!lstrcmpW(buffer, value), "incorrect string '%s'\n", wine_dbgstr_w(buffer)); + ok(!lstrcmpW(buffer, L"value"), "incorrect string '%s'\n", wine_dbgstr_w(buffer));
ret = SQLWritePrivateProfileString("wineodbc", "testing" , "value0123456789", "abcd.ini"); ok(ret, "SQLWritePrivateProfileString failed\n"); @@ -370,43 +358,43 @@ static void test_SQLGetPrivateProfileStringW(void) { HKEY hkey;
- ret = SQLGetPrivateProfileStringW(wineodbc, testing , defaultX, buffer, 256, abcdini); - ok(ret == lstrlenW(value0), "SQLGetPrivateProfileStringW returned %d\n", ret); - ok(!lstrcmpW(buffer, value0), "incorrect string '%s'\n", wine_dbgstr_w(buffer)); + ret = SQLGetPrivateProfileStringW(L"wineodbc", L"testing", L"default", buffer, 256, L"abcd.INI"); + ok(ret == lstrlenW(L"value0123456789"), "SQLGetPrivateProfileStringW returned %d\n", ret); + ok(!lstrcmpW(buffer, L"value0123456789"), "incorrect string '%s'\n", wine_dbgstr_w(buffer));
- ret = SQLGetPrivateProfileStringW(wineodbc, testing , defaultX, NULL, 0, abcdini); + ret = SQLGetPrivateProfileStringW(L"wineodbc", L"testing", L"default", NULL, 0, L"abcd.INI"); ok(ret == 0, "SQLGetPrivateProfileStringW returned %d\n", ret);
- ret = SQLGetPrivateProfileStringW(wineodbc, testing , defaultX, buffer, 7, abcdini); + ret = SQLGetPrivateProfileStringW(L"wineodbc", L"testing", L"default", buffer, 7, L"abcd.INI"); ok(ret == 6, "SQLGetPrivateProfileStringW returned %d\n", ret);
- lstrcpyW(buffer, wine); - ret = SQLGetPrivateProfileStringW(wineodbc, NULL , empty, buffer, 10, abcdini); - ok(ret == lstrlenW(testing)+1, "SQLGetPrivateProfileStringW returned %d\n", ret); - ok(!lstrcmpW(buffer, testing), "incorrect string '%s'\n", wine_dbgstr_w(buffer)); + lstrcpyW(buffer, L"wine"); + ret = SQLGetPrivateProfileStringW(L"wineodbc", NULL , L"", buffer, 10, L"abcd.INI"); + ok(ret == lstrlenW(L"testing") + 1, "SQLGetPrivateProfileStringW returned %d\n", ret); + ok(!lstrcmpW(buffer, L"testing"), "incorrect string '%s'\n", wine_dbgstr_w(buffer));
ret = SQLWritePrivateProfileString("wineodbc", "value" , "0", "abcd.ini"); ok(ret, "SQLWritePrivateProfileString failed\n");
- lstrcpyW(buffer, wine); - ret = SQLGetPrivateProfileStringW(wineodbc, NULL , empty, buffer, 256, abcdini); - ok(ret == (lstrlenW(testing) + lstrlenW(value)+2), "SQLGetPrivateProfileStringW returned %d\n", ret); - if(ret == (lstrlenW(testing) + lstrlenW(value)+2)) + lstrcpyW(buffer, L"wine"); + ret = SQLGetPrivateProfileStringW(L"wineodbc", NULL , L"", buffer, 256, L"abcd.INI"); + ok(ret == (lstrlenW(L"testing") + lstrlenW(L"value") + 2), "SQLGetPrivateProfileStringW returned %d\n", ret); + if(ret == (lstrlenW(L"testing") + lstrlenW(L"value") + 2)) { - ok(!memcmp(buffer, testingvalue, sizeof(testingvalue)), + ok(!memcmp(buffer, L"testing\0value", sizeof(L"testing\0value")), "incorrect string '%s'\n", wine_dbgstr_wn(buffer, ret)); }
- lstrcpyW(buffer, value); - ret = SQLGetPrivateProfileStringW(wineodbc, NULL , empty, buffer, 10, abcdini); - ok(ret == lstrlenW(testing)+1, "SQLGetPrivateProfileStringW returned %d\n", ret); - if(ret >= lstrlenW(testing)+1) + lstrcpyW(buffer, L"value"); + ret = SQLGetPrivateProfileStringW(L"wineodbc", NULL , L"", buffer, 10, L"abcd.INI"); + ok(ret == lstrlenW(L"testing") + 1, "SQLGetPrivateProfileStringW returned %d\n", ret); + if(ret >= lstrlenW(L"testing") + 1) { - ok(!lstrcmpW(buffer, testing), "incorrect string '%s'\n", wine_dbgstr_w(buffer)); + ok(!lstrcmpW(buffer, L"testing"), "incorrect string '%s'\n", wine_dbgstr_w(buffer)); }
- lstrcpyW(buffer, value); - ret = SQLGetPrivateProfileStringW(wineodbc, NULL , empty, buffer, 2, abcdini); + lstrcpyW(buffer, L"value"); + ret = SQLGetPrivateProfileStringW(L"wineodbc", NULL , L"", buffer, 2, L"abcd.INI"); ok(ret == 0, "SQLGetPrivateProfileStringW returned %d\n", ret);
reg_ret = RegOpenKeyExW(HKEY_CURRENT_USER, abcd_key, 0, KEY_READ, &hkey); @@ -783,32 +771,25 @@ static void test_SQLValidDSN(void)
static void test_SQLValidDSNW(void) { - static const WCHAR invalid[] = {'[',']','{','}','(',')',',',';','?','*','=','!','@','\',0}; - static const WCHAR value[] = { 'w','i','n','e','1','0',0}; - static const WCHAR too_large[] = { 'W','i','n','e','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5', - '6','7','8','9','0','1','2','3','4','5','6','7','8','9','0', 0}; - static const WCHAR with_space[] = { 'W','i','n','e',' ','V','i','n','e','g','a','r', 0}; - static const WCHAR max_dsn[] = { '1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0', - '1','2','3','4','5','6','7','8','9','0','1','2', 0}; WCHAR str[10]; int i; BOOL ret;
- lstrcpyW(str, value); - for(i = 0; i < lstrlenW(invalid); i++) + lstrcpyW(str, L"wine10"); + for (i = 0; i < lstrlenW(L"[]{}(),;?*=!@\"); i++) { - str[4] = invalid[i]; + str[4] = L"[]{}(),;?*=!@\"[i]; ret = SQLValidDSNW(str); ok(!ret, "got %d\n", ret); }
- ret = SQLValidDSNW(too_large); + ret = SQLValidDSNW(L"Wine123456789012345678901234567890"); ok(!ret, "got %d\n", ret);
- ret = SQLValidDSNW(with_space); + ret = SQLValidDSNW(L"Wine Vinegar"); ok(ret, "got %d\n", ret);
- ret = SQLValidDSNW(max_dsn); + ret = SQLValidDSNW(L"12345678901234567890123456789012"); ok(ret, "got %d\n", ret); }
From: Hans Leidekker hans@codeweavers.com
--- dlls/odbccp32/tests/misc.c | 3 --- 1 file changed, 3 deletions(-)
diff --git a/dlls/odbccp32/tests/misc.c b/dlls/odbccp32/tests/misc.c index d4dc5ffcb54..759c6181100 100644 --- a/dlls/odbccp32/tests/misc.c +++ b/dlls/odbccp32/tests/misc.c @@ -508,12 +508,9 @@ static void test_SQLInstallDriverEx(void) ok(sql_ret == SQL_NO_DATA || (sql_ret && error_code == SQL_SUCCESS), "SQLInstallDriverEx failed %d, %lu\n", sql_ret, error_code); ok(!strcmp(path, syspath), "invalid path %s\n", path);
-if (0) /* Crashes on XP. */ -{ sql_ret = 0; ret = SQLConfigDriver(NULL, ODBC_CONFIG_DRIVER, "WINE ODBC Driver", NULL, error, sizeof(error), NULL); ok(!ret, "SQLConfigDriver failed '%s'\n",error); -}
ret = SQLConfigDriver(NULL, ODBC_CONFIG_DRIVER, "WINE ODBC Driver", "CPTimeout=59\0NoWrite=60\0", error, sizeof(error), NULL); ok(ret, "SQLConfigDriver failed\n");
When attempting to add a new USER_DSN, it's failing for me.
0120:trace:odbc:SQLConfigDataSourceW 0001009E, 1, L"MySQL ODBC 8.0 Unicode Driver", (null) 0120:trace:odbc:DllMain proxy ODBC: 78D20000,1,00000000 0120:trace:odbc:SQLGetPrivateProfileStringW L"MySQL ODBC 8.0 Unicode Driver" (null) L"" 0031C184 4096 L"ODBCINST.INI" 0120:fixme:odbc:SQLPostInstallerErrorW 7 L"Cannot find driver"
The driver entry can be found under HKEY_LOCAL_MACHINE. My understanding is that the MySQL driver is attempting to retrieve default values before loading it's dialog.
How can I reproduce this?
Easiest way is to install the MySQL ODBC driver and write a small test calling the SQLConfigDataSourceW function with the above parameters.
Can you point me to the installer?
I actually wrote this patch for the MySQL 8.3 driver (not the setup dll). It sets the config mode and then calls SQLGetPrivateProfileStringW() and expects to find itself.
I was using the 8.3 driver but expect 9.0 to have the same issue.
It fails with and without this patch (I changed "MySQL ODBC 8.0 Unicode Driver" to MySQL ODBC 8.3 Unicode Driver" to match the version I installed). Do I need any additional configuration?
Upstream is failing since it's only looking in HKEY_USER, and your code isn't correcting that.
My registry the the following. HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI\MySQL ODBC 8.0 Unicode Driver
Have a look at the mysql code (function Driver::lookup), its queries the registry to find the driver and when SQLGetPrivateProfileStringW fails produces the follow error. 0120:fixme:odbc:SQLPostInstallerErrorW 7 L"Cannot find driver" .. aka SQLPostInstallerErrorW(ODBC_ERROR_INVALID_NAME, W_CANNOT_FIND_DRIVER) (MYSQL source).
We could check if the drivers under "HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI\ODBC Drivers" first, and default to HKEY_LOCAL_MACHINE in that case.
After looking in the registry ODBCINST.INI = Driver information ODBC.INI = DSN information.
For ODBCINST.INI, default to both? The mysql seem to restore config_mode after calling SQLGetPrivateProfileStringW, suggesting that the code_mode might change internally.
Upstream is failing since it's only looking in HKEY_USER, and your code isn't correcting that.
This patch isn't trying to fix that. The reason it's only looking under HKEY_USER is because SQLConfigDataSource() sets the config mode to ODBC_ADD_DSN for a user DSN before calling the setup function, which is correct AFAICT. This is the same before and after this patch.