static void test_SQLInstallDriverManager(void) { BOOL bool_ret; RETCODE sql_ret; DWORD error_code; CHAR target_path[MAX_PATH]; WORD path_out; /* NULL check */ bool_ret = SQLInstallDriverManager(NULL, 0, NULL); sql_ret = SQLInstallerErrorW(1, &error_code, NULL, 0, NULL); ok(!bool_ret, "SQLInstallDriverManager unexpectedly succeeded\n"); ok(sql_ret == SQL_SUCCESS_WITH_INFO && error_code == ODBC_ERROR_INVALID_BUFF_LEN, "Expected SQLInstallDriverManager to fail with ODBC_ERROR_INVALID_BUFF_LEN\n"); /* Length smaller than MAX_PATH */ bool_ret = SQLInstallDriverManager(target_path, MAX_PATH / 2, NULL); sql_ret = SQLInstallerErrorW(1, &error_code, NULL, 0, NULL); ok(!bool_ret, "SQLInstallDriverManager unexpectedly succeeded\n"); ok(sql_ret == SQL_SUCCESS_WITH_INFO && error_code == ODBC_ERROR_INVALID_BUFF_LEN, "Expected SQLInstallDriverManager to fail with ODBC_ERROR_INVALID_BUFF_LEN\n"); path_out = 0xcafe; bool_ret = SQLInstallDriverManager(target_path, MAX_PATH / 2, &path_out); sql_ret = SQLInstallerErrorW(1, &error_code, NULL, 0, NULL); ok(!bool_ret, "SQLInstallDriverManager unexpectedly succeeded\n"); ok(sql_ret == SQL_SUCCESS_WITH_INFO && error_code == ODBC_ERROR_INVALID_BUFF_LEN, "Expected SQLInstallDriverManager to fail with ODBC_ERROR_INVALID_BUFF_LEN\n"); ok(path_out == 0xcafe, "Expected path_out to not have changed\n"); /* Length OK */ bool_ret = SQLInstallDriverManager(target_path, MAX_PATH, NULL); sql_ret = SQLInstallerErrorW(1, &error_code, NULL, 0, NULL); if(!bool_ret && error_code == ODBC_ERROR_WRITING_SYSINFO_FAILED) { win_skip("not enough privileges\n"); return; } ok(bool_ret, "SQLInstallDriverManager unexpectedly failed: %d\n", error_code); if (bool_ret) ok(sql_ret == SQL_NO_DATA, "Expected SQL_NO_DATA, got %d\n", sql_ret); else ok(sql_ret == SQL_SUCCESS_WITH_INFO, "Expected SQL_SUCCESS_WITH_INFO, got %d\n", sql_ret); path_out = 0xcafe; bool_ret = SQLInstallDriverManager(target_path, MAX_PATH, &path_out); sql_ret = SQLInstallerErrorW(1, &error_code, NULL, 0, NULL); ok(bool_ret, "SQLInstallDriverManager unexpectedly failed: %d\n", error_code); if (bool_ret) ok(sql_ret == SQL_NO_DATA, "Expected SQL_NO_DATA, got %d\n", sql_ret); else ok(sql_ret == SQL_SUCCESS_WITH_INFO, "Expected SQL_SUCCESS_WITH_INFO, got %d\n", sql_ret); /* path_out should in practice be less than 0xcafe */ ok(path_out != 0xcafe, "Expected path_out to show the correct amount of bytes\n"); }
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; ret = SQLWritePrivateProfileString("wineodbc", "testing" , "value", ""); ok(!ret, "SQLWritePrivateProfileString passed\n"); SQLInstallerErrorW(1, &error_code, NULL, 0, NULL); ok(error_code == ODBC_ERROR_INVALID_STR, "SQLInstallerErrorW ret: %d\n", error_code); ret = SQLWritePrivateProfileString("wineodbc", "testing" , "value", NULL); ok(!ret, "SQLWritePrivateProfileString passed\n"); SQLInstallerErrorW(1, &error_code, NULL, 0, NULL); ok(error_code == ODBC_ERROR_INVALID_STR, "SQLInstallerErrorW ret: %d\n", error_code); ret = SQLWritePrivateProfileString("wineodbc", "testing" , "value", "odbc.ini"); ok(ret, "SQLWritePrivateProfileString failed\n"); if(ret) { HKEY hkey; reg_ret = RegOpenKeyExW(HKEY_CURRENT_USER, odbc_key, 0, KEY_READ, &hkey); ok(reg_ret == ERROR_SUCCESS, "RegOpenKeyExW failed\n"); if(reg_ret == ERROR_SUCCESS) { reg_ret = RegDeleteKeyW(HKEY_CURRENT_USER, odbc_key); ok(reg_ret == ERROR_SUCCESS, "RegDeleteKeyW failed\n"); RegCloseKey(hkey); } } ret = SQLWritePrivateProfileString("wineodbc", "testing" , "value", "abcd.ini"); ok(ret, "SQLWritePrivateProfileString failed\n"); if(ret) { HKEY hkey; 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"); } }
static void test_SQLConfigMode(void) { BOOL bool_ret; DWORD error_code; RETCODE sql_ret; UWORD config_mode; int i; ok(SQLGetConfigMode(NULL), "SQLGetConfigMode(NULL) should succeed\n"); bool_ret = SQLGetConfigMode(&config_mode); ok(bool_ret && config_mode == ODBC_BOTH_DSN, "Failed to get the initial SQLGetConfigMode or it was not both\n"); /* try to set invalid mode */ bool_ret = SQLSetConfigMode(ODBC_SYSTEM_DSN+1); sql_ret = SQLInstallerErrorW(1, &error_code, NULL, 0, NULL); ok(!bool_ret && sql_ret == SQL_SUCCESS_WITH_INFO && error_code == ODBC_ERROR_INVALID_PARAM_SEQUENCE, "SQLSetConfigMode with invalid argument did not fail correctly\n"); for (i = ODBC_SYSTEM_DSN; i >= ODBC_BOTH_DSN; --i) { ok(SQLSetConfigMode((UWORD)i), "SQLSetConfigMode Failed to set config mode\n"); bool_ret = SQLGetConfigMode(&config_mode); ok(bool_ret && config_mode == i, "Failed to confirm SQLSetConfigMode.\n"); } /* And that leaves it correctly on BOTH */ }
SQLRETURN WINAPI SQLInstallerError(WORD iError, DWORD *pfErrorCode, LPSTR lpszErrorMsg, WORD cbErrorMsgMax, WORD *pcbErrorMsg) { SQLRETURN ret; LPWSTR wbuf; WORD cbwbuf; TRACE("%d %p %p %d %p\n", iError, pfErrorCode, lpszErrorMsg, cbErrorMsgMax, pcbErrorMsg); wbuf = 0; if (lpszErrorMsg && cbErrorMsgMax) { wbuf = HeapAlloc(GetProcessHeap(), 0, cbErrorMsgMax*sizeof(WCHAR)); if (!wbuf) return SQL_ERROR; } ret = SQLInstallerErrorW(iError, pfErrorCode, wbuf, cbErrorMsgMax, &cbwbuf); if (wbuf) { WORD cbBuf = 0; SQLInstall_narrow(1, lpszErrorMsg, wbuf, cbwbuf+1, cbErrorMsgMax, &cbBuf); HeapFree(GetProcessHeap(), 0, wbuf); if (pcbErrorMsg) *pcbErrorMsg = cbBuf-1; } return ret; }