From: Alistair Leslie-Hughes Subject: odbccp32: Implement SQLGetPrivateProfileString (try 6) Message-Id: <55810D3E.5070600@hotmail.com> Date: Wed, 17 Jun 2015 16:01:34 +1000 Hi, Thanks Hugh and Nikolay for your feedback. Changelog: odbccp32: Implement SQLGetPrivateProfileString Best Regards Alistair Leslie-Hughes From 9c2e36fff41a568003c6aa80560cb67d9996637d Mon Sep 17 00:00:00 2001 From: Alistair Leslie-Hughes Date: Sat, 6 Jun 2015 19:26:24 +1000 Subject: [PATCH] Implement SQLGetPrivateProfileString To: wine-patches --- dlls/odbccp32/odbccp32.c | 106 ++++++++++++++++++++++++++++++++++++++++----- dlls/odbccp32/tests/misc.c | 75 +++++++++++++++++++++++++++++++- include/odbcinst.h | 4 +- 3 files changed, 171 insertions(+), 14 deletions(-) diff --git a/dlls/odbccp32/odbccp32.c b/dlls/odbccp32/odbccp32.c index ddb0598..4e33825 100644 --- a/dlls/odbccp32/odbccp32.c +++ b/dlls/odbccp32/odbccp32.c @@ -36,6 +36,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(odbc); /* Registry key names */ +static const WCHAR odbc_key[] = {'S','o','f','t','w','a','r','e','\\','O','D','B','C','\\',0}; static const WCHAR drivers_key[] = {'S','o','f','t','w','a','r','e','\\','O','D','B','C','\\','O','D','B','C','I','N','S','T','.','I','N','I','\\','O','D','B','C',' ','D','r','i','v','e','r','s',0}; /* This config mode is known to be process-wide. @@ -400,27 +401,112 @@ BOOL WINAPI SQLGetInstalledDrivers(LPSTR lpszBuf, WORD cbBufMax, } int WINAPI SQLGetPrivateProfileStringW(LPCWSTR lpszSection, LPCWSTR lpszEntry, - LPCWSTR lpszDefault, LPCWSTR RetBuffer, int cbRetBuffer, + LPCWSTR lpszDefault, LPWSTR RetBuffer, int cbRetBuffer, LPCWSTR lpszFilename) { - clear_errors(); - FIXME("%s %s %s %p %d %s\n", debugstr_w(lpszSection), debugstr_w(lpszEntry), + LONG ret = 0; + HKEY hkey; + DWORD size = 0; + BOOL usedefault = TRUE; + + TRACE("%s %s %s %p %d %s\n", debugstr_w(lpszSection), debugstr_w(lpszEntry), debugstr_w(lpszDefault), RetBuffer, cbRetBuffer, debugstr_w(lpszFilename)); - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; + + clear_errors(); + + if(!cbRetBuffer) + return 0; + + if(RetBuffer) + RetBuffer[0] = 0; + + if(!lpszSection || !lpszEntry || !lpszDefault || !RetBuffer || !cbRetBuffer) + return ret; + + if (RegOpenKeyW(HKEY_CURRENT_USER, odbc_key, &hkey) == ERROR_SUCCESS) + { + HKEY hkeyfilename; + + if (RegOpenKeyW(hkey, lpszFilename, &hkeyfilename) == ERROR_SUCCESS) + { + HKEY hkeysect; + + if (RegOpenKeyW(hkeyfilename, lpszSection, &hkeysect) == ERROR_SUCCESS) + { + DWORD type; + + size = cbRetBuffer; + if(RegGetValueW(hkeysect, NULL, lpszEntry, RRF_RT_REG_SZ, &type, RetBuffer, &size) == ERROR_SUCCESS) + { + usedefault = FALSE; + ret = (size / sizeof(WCHAR)) - 1; + } + + RegCloseKey(hkeysect); + } + + RegCloseKey(hkeyfilename); + } + + RegCloseKey(hkey); + } + + if(usedefault) + { + lstrcpynW( RetBuffer, lpszDefault, cbRetBuffer); + ret = lstrlenW(RetBuffer); + } + + TRACE("RetBuffer='%s' - %d\n", debugstr_w(RetBuffer), ret); + + return ret; } int WINAPI SQLGetPrivateProfileString(LPCSTR lpszSection, LPCSTR lpszEntry, - LPCSTR lpszDefault, LPCSTR RetBuffer, int cbRetBuffer, + LPCSTR lpszDefault, LPSTR RetBuffer, int cbRetBuffer, LPCSTR lpszFilename) { - clear_errors(); - FIXME("%s %s %s %p %d %s\n", debugstr_a(lpszSection), debugstr_a(lpszEntry), + LONG ret = 0; + LPWSTR sect, entry, string, file, retval = NULL; + + TRACE("%s %s %s %p %d %s\n", debugstr_a(lpszSection), debugstr_a(lpszEntry), debugstr_a(lpszDefault), RetBuffer, cbRetBuffer, debugstr_a(lpszFilename)); - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; + + clear_errors(); + + if(!cbRetBuffer) + return 0; + + if(RetBuffer) + RetBuffer[0] = 0; + + if(!lpszSection || !lpszEntry || !lpszDefault || !RetBuffer) + return ret; + + sect = heap_strdupAtoW(lpszSection); + entry = heap_strdupAtoW(lpszEntry); + string = heap_strdupAtoW(lpszDefault); + file = heap_strdupAtoW(lpszFilename); + retval = heap_alloc(cbRetBuffer*sizeof(WCHAR)); + + ret = SQLGetPrivateProfileStringW(sect, entry, string, retval, cbRetBuffer, file); + if(ret) + { + WideCharToMultiByte(CP_ACP, 0, retval, -1, RetBuffer, ret+1, NULL, NULL); + } + + heap_free(sect); + heap_free(entry); + heap_free(string); + heap_free(file); + + heap_free(retval); + + TRACE("RetBuffer='%s' - %d\n", debugstr_a(RetBuffer), ret); + + return ret; } BOOL WINAPI SQLGetTranslatorW(HWND hwndParent, LPWSTR lpszName, WORD cbNameMax, diff --git a/dlls/odbccp32/tests/misc.c b/dlls/odbccp32/tests/misc.c index f1f3f00..6df241d 100644 --- a/dlls/odbccp32/tests/misc.c +++ b/dlls/odbccp32/tests/misc.c @@ -24,6 +24,10 @@ #include "winreg.h" #include "odbcinst.h" +static const WCHAR abcd_key[] = {'S','o','f','t','w','a','r','e','\\','O','D','B','C','\\','a','b','c','d','.','I','N','I','\\','w','i','n','e','o','d','b','c',0}; +static const WCHAR abcdini_key[] = {'S','o','f','t','w','a','r','e','\\','O','D','B','C','\\','a','b','c','d','.','I','N','I',0 }; + + static void test_SQLConfigMode(void) { BOOL bool_ret; @@ -133,8 +137,6 @@ static void test_SQLInstallDriverManager(void) static void test_SQLWritePrivateProfileString(void) { static const WCHAR odbc_key[] = {'S','o','f','t','w','a','r','e','\\','O','D','B','C','\\','O','D','B','C','.','I','N','I','\\','w','i','n','e','o','d','b','c',0}; - static const WCHAR abcd_key[] = {'S','o','f','t','w','a','r','e','\\','O','D','B','C','\\','a','b','c','d','.','I','N','I','\\','w','i','n','e','o','d','b','c',0}; - static const WCHAR abcdini_key[] = {'S','o','f','t','w','a','r','e','\\','O','D','B','C','\\','a','b','c','d','.','I','N','I',0 }; BOOL ret; LONG reg_ret; DWORD error_code; @@ -188,10 +190,79 @@ static void test_SQLWritePrivateProfileString(void) } } +static void test_SQLGetPrivateProfileString(void) +{ + int ret; + char buffer[256] = {0}; + LONG reg_ret; + + strcpy(buffer, "wine"); + ret = SQLGetPrivateProfileString(NULL, "testing" , "default", buffer, 256, "ODBC.INI"); + ok(ret == 0, "SQLGetPrivateProfileString returned %d\n", ret); + ok(!strcmp(buffer, ""), "incorrect string '%s'\n", buffer); + + strcpy(buffer, "wine"); + ret = SQLGetPrivateProfileString("wineodbc", NULL , "default", buffer, 256, "ODBC.INI"); + ok(ret == 0, "SQLGetPrivateProfileString returned %d\n", ret); + ok(!strcmp(buffer, ""), "incorrect string '%s'\n", buffer); + + strcpy(buffer, "value"); + ret = SQLGetPrivateProfileString("wineodbc", "testing" , NULL, buffer, 256, "ODBC.INI"); + ok(ret == 0, "SQLGetPrivateProfileString returned %d\n", ret); + ok(!strcmp(buffer, ""), "incorrect string '%s'\n", buffer); + + ret = SQLGetPrivateProfileString("wineodbc", "testing" , "defaultX", buffer, 256, "ODBC.INI"); + ok(ret == 8, "SQLGetPrivateProfileString returned %d\n", ret); + ok(!strcmp(buffer, "defaultX"), "incorrect string '%s'\n", buffer); + + ret = SQLGetPrivateProfileString("wineodbc", "testing" , "defaultX", buffer, 4, "ODBC.INI"); + ok(ret == 3, "SQLGetPrivateProfileString returned %d\n", ret); + ok(!strcmp(buffer, "def"), "incorrect string '%s'\n", buffer); + + ret = SQLGetPrivateProfileString("wineodbc", "testing" , "defaultX", buffer, 8, "ODBC.INI"); + ok(ret == 7, "SQLGetPrivateProfileString returned %d\n", ret); + ok(!strcmp(buffer, "default"), "incorrect string '%s'\n", buffer); + + ret = SQLGetPrivateProfileString("wineodbc", "testing" , "defaultX", NULL, 256, "ODBC.INI"); + ok(ret == 0, "SQLGetPrivateProfileString returned %d\n", ret); + + strcpy(buffer, "value"); + ret = SQLGetPrivateProfileString("wineodbc", "testing" , "defaultX", buffer, 0, "ODBC.INI"); + ok(ret == 0, "SQLGetPrivateProfileString returned %d\n", ret); + ok(!strcmp(buffer, "value"), "incorrect string '%s'\n", buffer); + + ret = SQLWritePrivateProfileString("wineodbc", "testing" , "value0123456789", "abcd.ini"); + ok(ret, "SQLWritePrivateProfileString failed\n"); + if(ret) + { + HKEY hkey; + + ret = SQLGetPrivateProfileString("wineodbc", "testing" , "defaultY", buffer, 256, "abcd.ini"); + ok(ret == 15, "SQLGetPrivateProfileString returned %d\n", ret); + ok(!strcmp(buffer, "value0123456789"), "incorrect string '%s'\n", buffer); + + reg_ret = RegOpenKeyExW(HKEY_CURRENT_USER, abcd_key, 0, KEY_READ, &hkey); + ok(reg_ret == ERROR_SUCCESS, "RegOpenKeyExW failed\n"); + if(reg_ret == ERROR_SUCCESS) + { + reg_ret = RegDeleteKeyW(HKEY_CURRENT_USER, abcd_key); + ok(reg_ret == ERROR_SUCCESS, "RegDeleteKeyW failed\n"); + + RegCloseKey(hkey); + } + + /* Cleanup key */ + reg_ret = RegDeleteKeyW(HKEY_CURRENT_USER, abcdini_key); + ok(reg_ret == ERROR_SUCCESS, "RegDeleteKeyW failed\n"); + } + +} + START_TEST(misc) { test_SQLConfigMode(); test_SQLInstallerError(); test_SQLInstallDriverManager(); test_SQLWritePrivateProfileString(); + test_SQLGetPrivateProfileString(); } diff --git a/include/odbcinst.h b/include/odbcinst.h index a1109d5..7395cb5 100644 --- a/include/odbcinst.h +++ b/include/odbcinst.h @@ -84,8 +84,8 @@ BOOL WINAPI SQLGetAvailableDriversW(LPCWSTR,LPWSTR,WORD,WORD*); BOOL WINAPI SQLGetConfigMode(UWORD*); BOOL WINAPI SQLGetInstalledDrivers(LPSTR,WORD,WORD*); BOOL WINAPI SQLGetInstalledDriversW(LPWSTR,WORD,WORD*); -int WINAPI SQLGetPrivateProfileString(LPCSTR,LPCSTR,LPCSTR,LPCSTR,int,LPCSTR); -int WINAPI SQLGetPrivateProfileStringW(LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR,int,LPCWSTR); +int WINAPI SQLGetPrivateProfileString(LPCSTR,LPCSTR,LPCSTR,LPSTR,int,LPCSTR); +int WINAPI SQLGetPrivateProfileStringW(LPCWSTR,LPCWSTR,LPCWSTR,LPWSTR,int,LPCWSTR); BOOL WINAPI SQLGetTranslator(HWND,LPSTR,WORD,WORD*,LPSTR,WORD,WORD*,DWORD*); BOOL WINAPI SQLGetTranslatorW(HWND,LPWSTR,WORD,WORD*,LPWSTR,WORD,WORD*,DWORD*); BOOL WINAPI SQLInstallDriver(LPCSTR,LPCSTR,LPSTR,WORD,WORD*); -- 2.1.4