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); }