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)