Module: wine Branch: master Commit: 3136beda264d8f01f9bf772aca1289be30623e13 URL: http://source.winehq.org/git/wine.git/?a=commit;h=3136beda264d8f01f9bf772aca...
Author: Alistair Leslie-Hughes leslie_alistair@hotmail.com Date: Mon Mar 20 23:07:32 2017 +0000
odbccp32: Implement SQLRemoveDriver/SQLRemoveDriverW.
Signed-off-by: Alistair Leslie-Hughes leslie_alistair@hotmail.com Signed-off-by: Huw Davies huw@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/odbccp32/odbccp32.c | 68 +++++++++++++++++++++++++++++++++++++++++----- dlls/odbccp32/tests/misc.c | 4 +-- 2 files changed, 63 insertions(+), 9 deletions(-)
diff --git a/dlls/odbccp32/odbccp32.c b/dlls/odbccp32/odbccp32.c index 037a2a9..6a2c484 100644 --- a/dlls/odbccp32/odbccp32.c +++ b/dlls/odbccp32/odbccp32.c @@ -1132,22 +1132,76 @@ BOOL WINAPI SQLRemoveDefaultDataSource(void) return FALSE; }
-BOOL WINAPI SQLRemoveDriverW(LPCWSTR lpszDriver, BOOL fRemoveDSN, - LPDWORD lpdwUsageCount) +BOOL WINAPI SQLRemoveDriverW(LPCWSTR drivername, BOOL remove_dsn, LPDWORD usage_count) { + HKEY hkey; + DWORD usagecount = 1; + clear_errors(); - FIXME("%s %d %p\n", debugstr_w(lpszDriver), fRemoveDSN, lpdwUsageCount); - if (lpdwUsageCount) *lpdwUsageCount = 1; + TRACE("%s %d %p\n", debugstr_w(drivername), remove_dsn, usage_count); + + if (RegOpenKeyW(HKEY_LOCAL_MACHINE, odbcini, &hkey) == ERROR_SUCCESS) + { + HKEY hkeydriver; + + if (RegOpenKeyW(hkey, drivername, &hkeydriver) == ERROR_SUCCESS) + { + DWORD size, type; + DWORD count; + + size = sizeof(usagecount); + RegGetValueA(hkeydriver, NULL, "UsageCount", RRF_RT_DWORD, &type, &usagecount, &size); + TRACE("Usage count %d\n", usagecount); + count = usagecount - 1; + if (count) + { + if (RegSetValueExA(hkeydriver, "UsageCount", 0, REG_DWORD, (BYTE*)&count, sizeof(count)) != ERROR_SUCCESS) + ERR("Failed to write registry UsageCount key\n"); + } + + RegCloseKey(hkeydriver); + } + + if (usagecount) + usagecount--; + + if (!usagecount) + { + 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(RegDeleteValueW(hkeydriver, drivername) != ERROR_SUCCESS) + ERR("Failed to delete registry value: %s\n", debugstr_w(drivername)); + RegCloseKey(hkeydriver); + } + } + + RegCloseKey(hkey); + } + + if (usage_count) + *usage_count = usagecount; + return TRUE; }
BOOL WINAPI SQLRemoveDriver(LPCSTR lpszDriver, BOOL fRemoveDSN, LPDWORD lpdwUsageCount) { + WCHAR *driver; + BOOL ret; + clear_errors(); - FIXME("%s %d %p\n", debugstr_a(lpszDriver), fRemoveDSN, lpdwUsageCount); - if (lpdwUsageCount) *lpdwUsageCount = 1; - return TRUE; + TRACE("%s %d %p\n", debugstr_a(lpszDriver), fRemoveDSN, lpdwUsageCount); + + driver = SQLInstall_strdup(lpszDriver); + + ret = SQLRemoveDriverW(driver, fRemoveDSN, lpdwUsageCount); + + HeapFree(GetProcessHeap(), 0, driver); + return ret; }
BOOL WINAPI SQLRemoveDriverManager(LPDWORD pdwUsageCount) diff --git a/dlls/odbccp32/tests/misc.c b/dlls/odbccp32/tests/misc.c index 5ba1eee..905468c 100644 --- a/dlls/odbccp32/tests/misc.c +++ b/dlls/odbccp32/tests/misc.c @@ -462,12 +462,12 @@ void test_SQLInstallDriverEx(void) cnt = 100; ret = SQLRemoveDriver("WINE ODBC Driver", FALSE, &cnt); ok(ret, "SQLRemoveDriver failed\n"); - todo_wine ok(cnt == 0, "SQLRemoveDriver failed %d\n", cnt); + ok(cnt == 0, "SQLRemoveDriver failed %d\n", cnt);
cnt = 100; ret = SQLRemoveDriver("WINE ODBC Driver Path", FALSE, &cnt); ok(ret, "SQLRemoveDriver failed\n"); - todo_wine ok(cnt == 0, "SQLRemoveDriver failed %d\n", cnt); + ok(cnt == 0, "SQLRemoveDriver failed %d\n", cnt); }
START_TEST(misc)