[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