Alistair Leslie-Hughes : odbccp32: Implement SQLRemoveTranslator/W.

Alexandre Julliard julliard at winehq.org
Thu Apr 6 15:05:23 CDT 2017


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

Author: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
Date:   Thu Apr  6 10:03:52 2017 +0000

odbccp32: Implement SQLRemoveTranslator/W.

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   | 78 +++++++++++++++++++++++++++++++++++++++++-----
 dlls/odbccp32/tests/misc.c | 17 +++++++---
 2 files changed, 84 insertions(+), 11 deletions(-)

diff --git a/dlls/odbccp32/odbccp32.c b/dlls/odbccp32/odbccp32.c
index 7b2f020..773c5d2 100644
--- a/dlls/odbccp32/odbccp32.c
+++ b/dlls/odbccp32/odbccp32.c
@@ -1229,20 +1229,84 @@ 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;
+    BOOL ret = TRUE;
+
     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", 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, translator) != ERROR_SUCCESS)
+            {
+                push_error(ODBC_ERROR_COMPONENT_NOT_FOUND, odbc_error_component_not_found);
+                WARN("Failed to delete registry key: %s\n", debugstr_w(translator));
+                ret = FALSE;
+            }
+
+            if (ret && RegOpenKeyW(hkey, odbctranslators, &hkeydriver) == ERROR_SUCCESS)
+            {
+                if(RegDeleteValueW(hkeydriver, translator) != ERROR_SUCCESS)
+                {
+                    push_error(ODBC_ERROR_COMPONENT_NOT_FOUND, odbc_error_component_not_found);
+                    WARN("Failed to delete registry key: %s\n", debugstr_w(translator));
+                    ret = FALSE;
+                }
+
+                RegCloseKey(hkeydriver);
+            }
+        }
+
+        RegCloseKey(hkey);
+    }
+
+    if (ret && usage_count)
+        *usage_count = usagecount;
+
+    return ret;
 }
 
 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 7a6e8db..ed8e6f1 100644
--- a/dlls/odbccp32/tests/misc.c
+++ b/dlls/odbccp32/tests/misc.c
@@ -530,13 +530,22 @@ 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);
+
+    cnt = 100;
+    ret = SQLRemoveTranslator("WINE ODBC Translator NonExist", &cnt);
+    ok(!ret, "SQLRemoveTranslator succeeded\n");
+    ok(cnt == 100, "SQLRemoveTranslator succeeded %d\n", cnt);
+    sql_ret = SQLInstallerErrorW(1, &error_code, NULL, 0, NULL);
+    ok(sql_ret && error_code == ODBC_ERROR_COMPONENT_NOT_FOUND,
+        "SQLInstallTranslatorEx failed %d, %u\n", sql_ret, error_code);
+
 }
 
 START_TEST(misc)




More information about the wine-cvs mailing list