[v2 PATCH 2/2] odbccp32: Implement SQLRemoveDriver/SQLRemoveDriverW
Alistair Leslie-Hughes
leslie_alistair at hotmail.com
Mon Mar 13 19:40:24 CDT 2017
v2 - Support Usage Count.
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
---
dlls/odbccp32/odbccp32.c | 62 ++++++++++++++++++++++++++++++++++++++++------
dlls/odbccp32/tests/misc.c | 4 +--
2 files changed, 57 insertions(+), 9 deletions(-)
diff --git a/dlls/odbccp32/odbccp32.c b/dlls/odbccp32/odbccp32.c
index 037a2a9..8aa9936 100644
--- a/dlls/odbccp32/odbccp32.c
+++ b/dlls/odbccp32/odbccp32.c
@@ -1132,22 +1132,70 @@ 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;
+
+ size = sizeof(usagecount);
+ RegGetValueA(hkeydriver, NULL, "UsageCount", RRF_RT_DWORD, &type, &usagecount, &size);
+ TRACE("Usage count %d\n", usagecount);
+ }
+
+ if (usagecount)
+ usagecount--;
+
+ if (!usagecount)
+ {
+ HKEY hkeydriver;
+
+ 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 bc765b8..5384c30 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)
--
1.9.1
More information about the wine-patches
mailing list