[PATCH 2/2] odbccp32: Implement SQLRemoveDriver/SQLRemoveDriverW
Alistair Leslie-Hughes
leslie_alistair at hotmail.com
Wed Dec 30 20:14:52 CST 2015
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
---
dlls/odbccp32/odbccp32.c | 57 ++++++++++++++++++++++++++++++++++++++++------
dlls/odbccp32/tests/misc.c | 4 ++--
2 files changed, 52 insertions(+), 9 deletions(-)
diff --git a/dlls/odbccp32/odbccp32.c b/dlls/odbccp32/odbccp32.c
index 3b654fb..f1fd64a 100644
--- a/dlls/odbccp32/odbccp32.c
+++ b/dlls/odbccp32/odbccp32.c
@@ -1110,22 +1110,65 @@ BOOL WINAPI SQLRemoveDefaultDataSource(void)
return FALSE;
}
-BOOL WINAPI SQLRemoveDriverW(LPCWSTR lpszDriver, BOOL fRemoveDSN,
- LPDWORD lpdwUsageCount)
+BOOL WINAPI SQLRemoveDriverW(LPCWSTR lpszDriver, BOOL removeDSN, LPDWORD usage_count)
{
+ DWORD usage_cnt = 0;
+ HKEY hkey;
+
clear_errors();
- FIXME("%s %d %p\n", debugstr_w(lpszDriver), fRemoveDSN, lpdwUsageCount);
- if (lpdwUsageCount) *lpdwUsageCount = 1;
+ TRACE("%s %d %p\n", debugstr_w(lpszDriver), removeDSN, usage_count);
+
+ if (RegOpenKeyW(HKEY_LOCAL_MACHINE, odbcini, &hkey) == ERROR_SUCCESS)
+ {
+ HKEY hkeydriver;
+
+ if (RegOpenKeyW(hkey, lpszDriver, &hkeydriver) == ERROR_SUCCESS)
+ {
+ if (usage_count)
+ {
+ if (RegGetValueA(hkeydriver, NULL, "UsageCount", RRF_RT_DWORD, NULL, &usage_cnt, NULL) == ERROR_SUCCESS)
+ {
+ usage_cnt--;
+ }
+ }
+
+ RegCloseKey(hkeydriver);
+ }
+
+ if(RegDeleteKeyW(hkey, lpszDriver) != ERROR_SUCCESS)
+ ERR("Failed to delete registry key: %s\n", debugstr_w(lpszDriver));
+
+ if (RegOpenKeyW(hkey, odbcdrivers, &hkeydriver) == ERROR_SUCCESS)
+ {
+ if(RegDeleteValueW(hkeydriver, lpszDriver) != ERROR_SUCCESS)
+ ERR("Failed to delete registry value: %s\n", debugstr_w(lpszDriver));
+
+ RegCloseKey(hkeydriver);
+ }
+
+ }
+
+ if (usage_count)
+ *usage_count = usage_cnt;
+
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 9ee3f24..7d0f6e8 100644
--- a/dlls/odbccp32/tests/misc.c
+++ b/dlls/odbccp32/tests/misc.c
@@ -457,12 +457,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)
--
2.6.4
More information about the wine-patches
mailing list