Alistair Leslie-Hughes : odbccp32: Implement SQLRemoveDriver/ SQLRemoveDriverW.

Alexandre Julliard julliard at winehq.org
Tue Mar 21 16:05:53 CDT 2017


Module: wine
Branch: master
Commit: 3136beda264d8f01f9bf772aca1289be30623e13
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=3136beda264d8f01f9bf772aca1289be30623e13

Author: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
Date:   Mon Mar 20 23:07:32 2017 +0000

odbccp32: Implement SQLRemoveDriver/SQLRemoveDriverW.

Signed-off-by: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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)




More information about the wine-cvs mailing list