Added test to show that ConfigDSNW is called from the ASCII version.
Signed-off-by: Alistair Leslie-Hughes leslie_alistair@hotmail.com --- dlls/odbccp32/odbccp32.c | 121 +++++++++++++++++++++++++++++-------- dlls/odbccp32/tests/misc.c | 15 +++++ 2 files changed, 112 insertions(+), 24 deletions(-)
diff --git a/dlls/odbccp32/odbccp32.c b/dlls/odbccp32/odbccp32.c index 283ed41a591..47dd8c14bdd 100644 --- a/dlls/odbccp32/odbccp32.c +++ b/dlls/odbccp32/odbccp32.c @@ -68,6 +68,9 @@ static const WCHAR odbc_error_load_lib_failed[] = {'L','o','a','d',' ','L','i',' 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); + /* Push an error onto the error stack, taking care of ranges etc. */ static void push_error(int code, LPCWSTR msg) { @@ -219,30 +222,6 @@ static BOOL SQLInstall_narrow(int mode, LPSTR buffer, LPCWSTR str, WORD str_leng return success; }
-BOOL WINAPI SQLConfigDataSourceW(HWND hwndParent, WORD fRequest, - LPCWSTR lpszDriver, LPCWSTR lpszAttributes) -{ - LPCWSTR p; - - clear_errors(); - FIXME("%p %d %s %s\n", hwndParent, fRequest, debugstr_w(lpszDriver), - debugstr_w(lpszAttributes)); - - for (p = lpszAttributes; *p; p += lstrlenW(p) + 1) - FIXME("%s\n", debugstr_w(p)); - - return TRUE; -} - -BOOL WINAPI SQLConfigDataSource(HWND hwndParent, WORD fRequest, - LPCSTR lpszDriver, LPCSTR lpszAttributes) -{ - FIXME("%p %d %s %s\n", hwndParent, fRequest, debugstr_a(lpszDriver), - debugstr_a(lpszAttributes)); - clear_errors(); - return TRUE; -} - static HMODULE load_config_driver(const WCHAR *driver) { static WCHAR reg_driver[] = {'d','r','i','v','e','r',0}; @@ -359,6 +338,100 @@ fail: return FALSE; }
+BOOL WINAPI SQLConfigDataSourceW(HWND hwnd, WORD request, LPCWSTR driver, LPCWSTR attributes) +{ + HMODULE mod; + BOOL ret = FALSE; + + TRACE("%p, %d, %s, %s\n", hwnd, request, debugstr_w(driver), debugstr_w(attributes)); + if (TRACE_ON(odbc)) + { + const WCHAR *p; + for (p = attributes; *p; p += lstrlenW(p) + 1) + TRACE("%s\n", debugstr_w(p)); + } + + clear_errors(); + + mod = load_config_driver(driver); + if (!mod) + return FALSE; + + pConfigDSNW = (void*)GetProcAddress(mod, "ConfigDSNW"); + if(pConfigDSNW) + ret = pConfigDSNW(hwnd, request, driver, attributes); + else + ERR("Failed to find ConfigDSNW\n"); + + if (!ret) + push_error(ODBC_ERROR_REQUEST_FAILED, odbc_error_request_failed); + + FreeLibrary(mod); + + return ret; +} + +BOOL WINAPI SQLConfigDataSource(HWND hwnd, WORD request, LPCSTR driver, LPCSTR attributes) +{ + HMODULE mod; + BOOL ret = FALSE; + WCHAR *driverW; + + TRACE("%p, %d, %s, %s\n", hwnd, request, debugstr_a(driver), debugstr_a(attributes)); + + if (TRACE_ON(odbc)) + { + const char *p; + for (p = attributes; *p; p += lstrlenA(p) + 1) + TRACE("%s\n", debugstr_a(p)); + } + + clear_errors(); + + driverW = heap_strdupAtoW(driver); + if (!driverW) + { + push_error(ODBC_ERROR_OUT_OF_MEM, odbc_error_out_of_mem); + return FALSE; + } + + mod = load_config_driver(driverW); + if (!mod) + { + heap_free(driverW); + return FALSE; + } + + pConfigDSN = (void*)GetProcAddress(mod, "ConfigDSN"); + if (pConfigDSN) + { + TRACE("Calling ConfigDSN\n"); + ret = pConfigDSN(hwnd, request, driver, attributes); + } + else + { + pConfigDSNW = (void*)GetProcAddress(mod, "ConfigDSNW"); + if (pConfigDSNW) + { + WCHAR *attr = NULL; + TRACE("Calling ConfigDSNW\n"); + + attr = SQLInstall_strdup_multi(attributes); + if(attr) + ret = pConfigDSNW(hwnd, request, driverW, attr); + heap_free(attr); + } + } + + if (!ret) + push_error(ODBC_ERROR_REQUEST_FAILED, odbc_error_request_failed); + + heap_free(driverW); + FreeLibrary(mod); + + return ret; +} + BOOL WINAPI SQLConfigDriverW(HWND hwnd, WORD request, LPCWSTR driver, LPCWSTR args, LPWSTR msg, WORD msgmax, WORD *msgout) { diff --git a/dlls/odbccp32/tests/misc.c b/dlls/odbccp32/tests/misc.c index dc65bdf3f9a..140a6488c2d 100644 --- a/dlls/odbccp32/tests/misc.c +++ b/dlls/odbccp32/tests/misc.c @@ -741,6 +741,20 @@ static void test_SQLValidDSNW(void) ok(ret, "got %d\n", ret); }
+static void test_SQLConfigDataSource(void) +{ + BOOL ret; + + /* SQL Server driver exports function ConfigDSNW and the MDAC28 installer uses the + * SQLConfigDataSource to register this DSN. + */ + ret = SQLConfigDataSource(0, ODBC_ADD_DSN, "SQL Server", "DSN=WINEMQIS\0Database=MQIS\0\0"); + todo_wine ok(ret == TRUE, "got %d\n", ret); + + ret = SQLConfigDataSource(0, ODBC_REMOVE_DSN, "SQL Server", "DSN=WINEMQIS\0\0"); + todo_wine ok(ret == TRUE, "got %d\n", ret); +} + START_TEST(misc) { test_SQLConfigMode(); @@ -754,4 +768,5 @@ START_TEST(misc) test_SQLGetInstalledDrivers(); test_SQLValidDSN(); test_SQLValidDSNW(); + test_SQLConfigDataSource(); }
Alistair Leslie-Hughes leslie_alistair@hotmail.com writes:
Added test to show that ConfigDSNW is called from the ASCII version.
Signed-off-by: Alistair Leslie-Hughes leslie_alistair@hotmail.com
dlls/odbccp32/odbccp32.c | 121 +++++++++++++++++++++++++++++-------- dlls/odbccp32/tests/misc.c | 15 +++++ 2 files changed, 112 insertions(+), 24 deletions(-)
This breaks the tests:
../../../tools/runtest -q -P wine -T ../../.. -M msi.dll -p msi_test.exe action && touch action.ok action.c:2995: Tests skipped: 64-bit RegisterProduct tests action.c:5577: Test failed: Expected ERROR_SUCCESS, got 1627 action.c:5579: Test failed: file not created action.c:5580: Test failed: file not created action.c:5581: Test failed: file not created action.c:5582: Test failed: file not created action.c:5583: Test failed: file not created action.c:5595: Test failed: driver not installed action.c:5596: Test failed: driver 2 not installed custom.c:1584: Test failed: driver absent custom.c:1585: Test failed: driver 2 absent make: *** [Makefile:196: action.ok] Error 10