[v2 PATCH 2/3] odbccp32: Implement SQLRemoveTranslator/W

Alistair Leslie-Hughes leslie_alistair at hotmail.com
Wed Mar 22 17:06:18 CDT 2017


v2 - No Changes.

Signed-off-by: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
---
 dlls/odbccp32/odbccp32.c   | 69 +++++++++++++++++++++++++++++++++++++++++-----
 dlls/odbccp32/tests/misc.c |  8 +++---
 2 files changed, 66 insertions(+), 11 deletions(-)

diff --git a/dlls/odbccp32/odbccp32.c b/dlls/odbccp32/odbccp32.c
index 7b2f020..d95a110 100644
--- a/dlls/odbccp32/odbccp32.c
+++ b/dlls/odbccp32/odbccp32.c
@@ -1229,20 +1229,75 @@ BOOL WINAPI SQLRemoveDSNFromIni(LPCSTR lpszDSN)
     return FALSE;
 }
 
-BOOL WINAPI SQLRemoveTranslatorW(LPCWSTR lpszTranslator, LPDWORD lpdwUsageCount)
+BOOL WINAPI SQLRemoveTranslatorW(const WCHAR *translator, DWORD *usage_count)
 {
+    HKEY hkey;
+    DWORD usagecount = 1;
+
     clear_errors();
-    FIXME("%s %p\n", debugstr_w(lpszTranslator), lpdwUsageCount);
-    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-    return FALSE;
+    TRACE("%s %p\n", debugstr_w(translator), usage_count);
+
+    if (RegOpenKeyW(HKEY_LOCAL_MACHINE, odbcini, &hkey) == ERROR_SUCCESS)
+    {
+        HKEY hkeydriver;
+
+        if (RegOpenKeyW(hkey, translator, &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", count);
+            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, translator) != ERROR_SUCCESS)
+                ERR("Failed to delete registry key: %s\n", debugstr_w(translator));
+
+            if (RegOpenKeyW(hkey, odbctranslators, &hkeydriver) == ERROR_SUCCESS)
+            {
+                if(RegDeleteValueW(hkeydriver, translator) != ERROR_SUCCESS)
+                    ERR("Failed to delete registry value: %s\n", debugstr_w(translator));
+
+                RegCloseKey(hkeydriver);
+            }
+        }
+
+        RegCloseKey(hkey);
+    }
+
+    if (usage_count)
+        *usage_count = 0;
+
+    return TRUE;
 }
 
 BOOL WINAPI SQLRemoveTranslator(LPCSTR lpszTranslator, LPDWORD lpdwUsageCount)
 {
+    WCHAR *translator;
+    BOOL ret;
+
     clear_errors();
-    FIXME("%s %p\n", debugstr_a(lpszTranslator), lpdwUsageCount);
-    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-    return FALSE;
+    TRACE("%s %p\n", debugstr_a(lpszTranslator), lpdwUsageCount);
+
+    translator = SQLInstall_strdup(lpszTranslator);
+    ret =  SQLRemoveTranslatorW(translator, lpdwUsageCount);
+
+    HeapFree(GetProcessHeap(), 0, translator);
+    return ret;
 }
 
 BOOL WINAPI SQLSetConfigMode(UWORD wConfigMode)
diff --git a/dlls/odbccp32/tests/misc.c b/dlls/odbccp32/tests/misc.c
index e977e91..036bcf9 100644
--- a/dlls/odbccp32/tests/misc.c
+++ b/dlls/odbccp32/tests/misc.c
@@ -525,13 +525,13 @@ void test_SQLInstallTranslatorEx(void)
 
     cnt = 100;
     ret = SQLRemoveTranslator("WINE ODBC Translator", &cnt);
-    todo_wine ok(ret, "SQLRemoveTranslator failed\n");
-    todo_wine ok(cnt == 0, "SQLRemoveTranslator failed %d\n", cnt);
+    ok(ret, "SQLRemoveTranslator failed\n");
+    ok(cnt == 0, "SQLRemoveTranslator failed %d\n", cnt);
 
     cnt = 100;
     ret = SQLRemoveTranslator("WINE ODBC Translator Path", &cnt);
-    todo_wine ok(ret, "SQLRemoveTranslator failed\n");
-    todo_wine ok(cnt == 0, "SQLRemoveTranslator failed %d\n", cnt);
+    ok(ret, "SQLRemoveTranslator failed\n");
+    ok(cnt == 0, "SQLRemoveTranslator failed %d\n", cnt);
 }
 
 START_TEST(misc)
-- 
1.9.1




More information about the wine-patches mailing list