[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