ReactOS 0.4.17-dev-966-gf06eace
misc.c
Go to the documentation of this file.
1/*
2 * Copyright 2007 Bill Medland
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
19#include <wine/test.h>
20#include <stdarg.h>
21
22#include "windef.h"
23#include "winbase.h"
24#include "winreg.h"
25#include "odbcinst.h"
26
27static const WCHAR abcd_key[] = L"Software\\ODBC\\abcd.INI\\wineodbc";
28static const WCHAR abcdini_key[] = L"Software\\ODBC\\abcd.INI";
29
30static void check_error_(int line, DWORD expect)
31{
33 DWORD err;
34 ret = SQLInstallerError(1, &err, NULL, 0, NULL);
35 ok_(__FILE__, line)(ret == SQL_SUCCESS_WITH_INFO, "got %d\n", ret);
36 ok_(__FILE__, line)(err == expect, "expected %lu, got %u\n", expect, ret);
37}
38#define check_error(a) check_error_(__LINE__, a)
39
40static void test_SQLConfigMode(void)
41{
42 BOOL bool_ret;
44 RETCODE sql_ret;
46 int i;
47
48 ok(SQLGetConfigMode(NULL), "SQLGetConfigMode(NULL) should succeed\n");
49
50 bool_ret = SQLGetConfigMode(&config_mode);
51 ok(bool_ret && config_mode == ODBC_BOTH_DSN, "Failed to get the initial SQLGetConfigMode or it was not both\n");
52
53 /* try to set invalid mode */
55 sql_ret = SQLInstallerErrorW(1, &error_code, NULL, 0, NULL);
56 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");
57
58 for (i = ODBC_SYSTEM_DSN; i >= ODBC_BOTH_DSN; --i)
59 {
60 ok(SQLSetConfigMode((UWORD)i), "SQLSetConfigMode Failed to set config mode\n");
61 bool_ret = SQLGetConfigMode(&config_mode);
62 ok(bool_ret && config_mode == i, "Failed to confirm SQLSetConfigMode.\n");
63 }
64 /* And that leaves it correctly on BOTH */
65}
66
67static void test_SQLInstallerError(void)
68{
69 RETCODE sql_ret;
70
71 /* MSDN states that the error number should be between 1 and 8. Passing 0 is an error */
72 sql_ret = SQLInstallerError(0, NULL, NULL, 0, NULL);
73 ok(sql_ret == SQL_ERROR, "SQLInstallerError(0...) failed with %d instead of SQL_ERROR\n", sql_ret);
74 /* However numbers greater than 8 do not return SQL_ERROR.
75 * I am currently unsure as to whether it should return SQL_NO_DATA or "the same as for error 8";
76 * I have never been able to generate 8 errors to test it
77 */
78 sql_ret = SQLInstallerError(65535, NULL, NULL, 0, NULL);
79 ok(sql_ret == SQL_NO_DATA, "SQLInstallerError(>8...) failed with %d instead of SQL_NO_DATA\n", sql_ret);
80
81 /* Force an error to work with. This should generate ODBC_ERROR_INVALID_BUFF_LEN */
82 ok(!SQLGetInstalledDrivers(0, 0, 0), "Failed to force an error for testing\n");
83 sql_ret = SQLInstallerError(2, NULL, NULL, 0, NULL);
84 ok(sql_ret == SQL_NO_DATA, "Too many errors when forcing an error for testing\n");
85
86 /* Null pointers are acceptable in all obvious places */
87 sql_ret = SQLInstallerError(1, NULL, NULL, 0, NULL);
88 ok(sql_ret == SQL_SUCCESS_WITH_INFO, "SQLInstallerError(null addresses) failed with %d instead of SQL_SUCCESS_WITH_INFO\n", sql_ret);
89}
90
92{
93 BOOL bool_ret;
94 RETCODE sql_ret;
96 CHAR target_path[MAX_PATH];
97 WORD path_out;
98
99 /* NULL check */
100 bool_ret = SQLInstallDriverManager(NULL, 0, NULL);
101 sql_ret = SQLInstallerErrorW(1, &error_code, NULL, 0, NULL);
102 ok(!bool_ret, "SQLInstallDriverManager unexpectedly succeeded\n");
104 "Expected SQLInstallDriverManager to fail with ODBC_ERROR_INVALID_BUFF_LEN\n");
105
106 /* Length smaller than MAX_PATH */
107 bool_ret = SQLInstallDriverManager(target_path, MAX_PATH / 2, NULL);
108 sql_ret = SQLInstallerErrorW(1, &error_code, NULL, 0, NULL);
109 ok(!bool_ret, "SQLInstallDriverManager unexpectedly succeeded\n");
111 "Expected SQLInstallDriverManager to fail with ODBC_ERROR_INVALID_BUFF_LEN\n");
112
113 path_out = 0xcafe;
114 bool_ret = SQLInstallDriverManager(target_path, MAX_PATH / 2, &path_out);
115 sql_ret = SQLInstallerErrorW(1, &error_code, NULL, 0, NULL);
116 ok(!bool_ret, "SQLInstallDriverManager unexpectedly succeeded\n");
118 "Expected SQLInstallDriverManager to fail with ODBC_ERROR_INVALID_BUFF_LEN\n");
119 ok(path_out == 0xcafe, "Expected path_out to not have changed\n");
120
121 /* Length OK */
122 bool_ret = SQLInstallDriverManager(target_path, MAX_PATH, NULL);
123 sql_ret = SQLInstallerErrorW(1, &error_code, NULL, 0, NULL);
125 {
126 win_skip("not enough privileges\n");
127 return;
128 }
129 ok(bool_ret, "SQLInstallDriverManager unexpectedly failed: %ld\n",
130 error_code);
131 if (bool_ret)
132 ok(sql_ret == SQL_NO_DATA, "Expected SQL_NO_DATA, got %d\n", sql_ret);
133 else
134 ok(sql_ret == SQL_SUCCESS_WITH_INFO,
135 "Expected SQL_SUCCESS_WITH_INFO, got %d\n", sql_ret);
136
137 path_out = 0xcafe;
138 bool_ret = SQLInstallDriverManager(target_path, MAX_PATH, &path_out);
139 sql_ret = SQLInstallerErrorW(1, &error_code, NULL, 0, NULL);
140 ok(bool_ret, "SQLInstallDriverManager unexpectedly failed: %ld\n",
141 error_code);
142 if (bool_ret)
143 ok(sql_ret == SQL_NO_DATA, "Expected SQL_NO_DATA, got %d\n", sql_ret);
144 else
145 ok(sql_ret == SQL_SUCCESS_WITH_INFO,
146 "Expected SQL_SUCCESS_WITH_INFO, got %d\n", sql_ret);
147 /* path_out should in practice be less than 0xcafe */
148 ok(path_out != 0xcafe, "Expected path_out to show the correct amount of bytes\n");
149}
150
152{
153 static const WCHAR odbc_key[] = L"Software\\ODBC\\ODBC.INI\\wineodbc";
154 BOOL ret;
155 LONG reg_ret;
157
158 ret = SQLWritePrivateProfileString("wineodbc", "testing" , "value", "");
159 ok(!ret, "SQLWritePrivateProfileString passed\n");
161 ok(error_code == ODBC_ERROR_INVALID_STR, "SQLInstallerErrorW ret: %ld\n", error_code);
162
163 ret = SQLWritePrivateProfileString("wineodbc", "testing" , "value", NULL);
164 ok(!ret, "SQLWritePrivateProfileString passed\n");
166 ok(error_code == ODBC_ERROR_INVALID_STR, "SQLInstallerErrorW ret: %ld\n", error_code);
167
168 ret = SQLWritePrivateProfileString("wineodbc", "testing" , "value", "odbc.ini");
169 ok(ret, "SQLWritePrivateProfileString failed\n");
170 if(ret)
171 {
172 HKEY hkey;
173
174 ret = SQLWritePrivateProfileString("wineodbc", "testing" , NULL, "odbc.ini");
175 ok(ret, "SQLWritePrivateProfileString failed\n");
176
177 reg_ret = RegOpenKeyExW(HKEY_CURRENT_USER, odbc_key, 0, KEY_READ, &hkey);
178 ok(reg_ret == ERROR_SUCCESS, "RegOpenKeyExW failed\n");
179 if(reg_ret == ERROR_SUCCESS)
180 {
181 reg_ret = RegDeleteKeyW(HKEY_CURRENT_USER, odbc_key);
182 ok(reg_ret == ERROR_SUCCESS, "RegDeleteKeyW failed\n");
183
184 RegCloseKey(hkey);
185 }
186 }
187
188 ret = SQLWritePrivateProfileString("wineodbc", "testing" , "value", "abcd.ini");
189 ok(ret, "SQLWritePrivateProfileString failed\n");
190 if(ret)
191 {
192 HKEY hkey;
193
194 reg_ret = RegOpenKeyExW(HKEY_CURRENT_USER, abcd_key, 0, KEY_READ, &hkey);
195 ok(reg_ret == ERROR_SUCCESS, "RegOpenKeyExW failed\n");
196 if(reg_ret == ERROR_SUCCESS)
197 {
199 ok(reg_ret == ERROR_SUCCESS, "RegDeleteKeyW failed\n");
200
201 RegCloseKey(hkey);
202 }
203
204 /* Cleanup key */
206 ok(reg_ret == ERROR_SUCCESS, "RegDeleteKeyW failed\n");
207 }
208}
209
211{
212 int ret;
213 char buffer[256] = {0};
214 LONG reg_ret;
215
216 strcpy(buffer, "wine");
217 ret = SQLGetPrivateProfileString(NULL, "testing" , "default", buffer, 256, "ODBC.INI");
218 ok(ret == 0, "SQLGetPrivateProfileString returned %d\n", ret);
219 ok(!strcmp(buffer, ""), "incorrect string '%s'\n", buffer);
220
221 strcpy(buffer, "wine");
222 ret = SQLGetPrivateProfileString("wineodbc", NULL , "default", buffer, 256, "ODBC.INI");
223 ok(ret == 0, "SQLGetPrivateProfileString returned %d\n", ret);
224 ok(!strcmp(buffer, ""), "incorrect string '%s'\n", buffer);
225
226 strcpy(buffer, "value");
227 ret = SQLGetPrivateProfileString("wineodbc", "testing" , NULL, buffer, 256, "ODBC.INI");
228 ok(ret == 0, "SQLGetPrivateProfileString returned %d\n", ret);
229 ok(!strcmp(buffer, ""), "incorrect string '%s'\n", buffer);
230
231 ret = SQLGetPrivateProfileString("wineodbc", "testing" , "defaultX", buffer, 256, "ODBC.INI");
232 ok(ret == strlen("defaultX"), "SQLGetPrivateProfileString returned %d\n", ret);
233 ok(!strcmp(buffer, "defaultX"), "incorrect string '%s'\n", buffer);
234
235 ret = SQLGetPrivateProfileString("wineodbc", "testing" , "defaultX", buffer, 4, "ODBC.INI");
236 ok(ret == strlen("def"), "SQLGetPrivateProfileString returned %d\n", ret);
237 ok(!strcmp(buffer, "def"), "incorrect string '%s'\n", buffer);
238
239 ret = SQLGetPrivateProfileString("wineodbc", "testing" , "defaultX", buffer, 8, "ODBC.INI");
240 ok(ret == strlen("default"), "SQLGetPrivateProfileString returned %d\n", ret);
241 ok(!strcmp(buffer, "default"), "incorrect string '%s'\n", buffer);
242
243 ret = SQLGetPrivateProfileString("wineodbc", "testing" , "defaultX", NULL, 256, "ODBC.INI");
244 ok(ret == 0, "SQLGetPrivateProfileString returned %d\n", ret);
245
246 strcpy(buffer, "value");
247 ret = SQLGetPrivateProfileString("wineodbc", "testing" , "defaultX", buffer, 0, "ODBC.INI");
248 ok(ret == 0, "SQLGetPrivateProfileString returned %d\n", ret);
249 ok(!strcmp(buffer, "value"), "incorrect string '%s'\n", buffer);
250
251 ret = SQLWritePrivateProfileString("wineodbc", "testing" , "value0123456789", "abcd.ini");
252 ok(ret, "SQLWritePrivateProfileString failed\n");
253 if(ret)
254 {
255 HKEY hkey;
256
257 ret = SQLGetPrivateProfileString("wineodbc", "testing" , "defaultY", buffer, 256, "abcd.ini");
258 ok(ret == strlen("value0123456789"), "SQLGetPrivateProfileString returned %d\n", ret);
259 ok(!strcmp(buffer, "value0123456789"), "incorrect string '%s'\n", buffer);
260
261 ret = SQLGetPrivateProfileString("wineodbc", "testing" , "defaultY", NULL, 0, "abcd.ini");
262 ok(ret == 0, "SQLGetPrivateProfileString returned %d\n", ret);
263
264 ret = SQLGetPrivateProfileString("wineodbc", "testing" , "defaultY", buffer, 7, "abcd.ini");
265 ok(ret == 6, "SQLGetPrivateProfileString returned %d\n", ret);
266
267 strcpy(buffer, "wine");
268 ret = SQLGetPrivateProfileString("wineodbc", NULL , "", buffer, 10, "abcd.ini");
269 ok(ret == (strlen("testing")+1), "SQLGetPrivateProfileString returned %d\n", ret);
270 ok(!strcmp(buffer, "testing"), "incorrect string '%s'\n", buffer);
271
272 ret = SQLWritePrivateProfileString("wineodbc", "value" , "0", "abcd.ini");
273 ok(ret, "SQLWritePrivateProfileString failed\n");
274
275 strcpy(buffer, "wine");
276 ret = SQLGetPrivateProfileString("wineodbc", NULL , "", buffer, 256, "abcd.ini");
277 ok(ret == (strlen("testing") + strlen("value")+2), "SQLGetPrivateProfileString returned %d\n", ret);
278 if(ret >= (strlen("testing") + strlen("value")+2))
279 {
280 ok(memcmp(buffer, "testing\0value\0", 14) == 0, "incorrect string '%s'\n", buffer);
281 }
282
283 strcpy(buffer, "XXXXXXXXXXXXXXX");
284 ret = SQLGetPrivateProfileString("wineodbc", NULL , "", buffer, 10, "abcd.ini");
285 ok(ret == (strlen("testing")+1), "SQLGetPrivateProfileString returned %d\n", ret);
286 if(ret >= (strlen("testing")+1))
287 {
288 ok(!strcmp(buffer, "testing"), "incorrect string '%s'\n", buffer);
289 /* Show that the buffer is cleared and partial enteries aren't added */
290 ok(memcmp(buffer, "testing\0X", 9) != 0, "incorrect string '%s'\n", buffer);
291 }
292
293 strcpy(buffer, "wine");
294 ret = SQLGetPrivateProfileString("wineodbc", NULL , "", buffer, 2, "abcd.ini");
295 ok(ret == 0, "SQLGetPrivateProfileString returned %d\n", ret);
296
297 reg_ret = RegOpenKeyExW(HKEY_CURRENT_USER, abcd_key, 0, KEY_READ, &hkey);
298 ok(reg_ret == ERROR_SUCCESS, "RegOpenKeyExW failed\n");
299 if(reg_ret == ERROR_SUCCESS)
300 {
302 ok(reg_ret == ERROR_SUCCESS, "RegDeleteKeyW failed\n");
303
304 RegCloseKey(hkey);
305 }
306
307 /* Cleanup key */
309 ok(reg_ret == ERROR_SUCCESS, "RegDeleteKeyW failed\n");
310 }
311}
312
314{
315 UWORD orig_mode;
316 int ret;
317 WCHAR buffer[256] = {0};
318 LONG reg_ret;
319
320 lstrcpyW(buffer, L"wine");
321 ret = SQLGetPrivateProfileStringW(NULL, L"testing", L"default", buffer, 256, L"ODBC.INI");
322 ok(ret == 0, "SQLGetPrivateProfileStringW returned %d\n", ret);
323 ok(!lstrcmpW(buffer, L"wine"), "incorrect string '%s'\n", wine_dbgstr_w(buffer));
324
325 lstrcpyW(buffer, L"wine");
326 ret = SQLGetPrivateProfileStringW(L"wineodbc", NULL , L"default", buffer, 256, L"ODBC.INI");
327 ok(ret == 0, "SQLGetPrivateProfileStringW returned %d\n", ret);
328 ok(!lstrcmpW(buffer, L""), "incorrect string '%s'\n", wine_dbgstr_w(buffer));
329
330 lstrcpyW(buffer, L"value");
331 ret = SQLGetPrivateProfileStringW(L"wineodbc", L"testing", NULL, buffer, 256, L"ODBC.INI");
332 ok(ret == 0, "SQLGetPrivateProfileStringW returned %d\n", ret);
333 ok(!lstrcmpW(buffer, L""), "incorrect string '%s'\n", wine_dbgstr_w(buffer));
334
335 ret = SQLGetPrivateProfileStringW(L"wineodbc", L"testing", L"default", buffer, 256, L"ODBC.INI");
336 ok(ret == lstrlenW(L"default"), "SQLGetPrivateProfileStringW returned %d\n", ret);
337 ok(!lstrcmpW(buffer, L"default"), "incorrect string '%s'\n", wine_dbgstr_w(buffer));
338
339 ret = SQLGetPrivateProfileStringW(L"wineodbc", L"testing", L"default", buffer, 4, L"ODBC.INI");
340 ok(ret == lstrlenW(L"def"), "SQLGetPrivateProfileStringW returned %d\n", ret);
341 ok(!lstrcmpW(buffer, L"def"), "incorrect string '%s'\n", wine_dbgstr_w(buffer));
342
343 ret = SQLGetPrivateProfileStringW(L"wineodbc", L"testing", L"default", buffer, 8, L"ODBC.INI");
344 ok(ret == lstrlenW(L"default"), "SQLGetPrivateProfileStringW returned %d\n", ret);
345 ok(!lstrcmpW(buffer, L"default"), "incorrect string '%s'\n", wine_dbgstr_w(buffer));
346
347 ret = SQLGetPrivateProfileStringW(L"wineodbc", L"testing", L"default", NULL, 256, L"ODBC.INI");
348 ok(ret == 0, "SQLGetPrivateProfileStringW returned %d\n", ret);
349
350 lstrcpyW(buffer, L"value");
351 ret = SQLGetPrivateProfileStringW(L"wineodbc", L"testing", L"default", buffer, 0, L"ODBC.INI");
352 ok(ret == 0, "SQLGetPrivateProfileStringW returned %d\n", ret);
353 ok(!lstrcmpW(buffer, L"value"), "incorrect string '%s'\n", wine_dbgstr_w(buffer));
354
355 ret = SQLWritePrivateProfileString("wineodbc", "testing" , "value0123456789", "abcd.ini");
356 ok(ret, "SQLWritePrivateProfileString failed\n");
357 if(ret)
358 {
359 HKEY hkey;
360
361 ret = SQLGetPrivateProfileStringW(L"wineodbc", L"testing", L"default", buffer, 256, L"abcd.INI");
362 ok(ret == lstrlenW(L"value0123456789"), "SQLGetPrivateProfileStringW returned %d\n", ret);
363 ok(!lstrcmpW(buffer, L"value0123456789"), "incorrect string '%s'\n", wine_dbgstr_w(buffer));
364
365 ret = SQLGetPrivateProfileStringW(L"wineodbc", L"testing", L"default", NULL, 0, L"abcd.INI");
366 ok(ret == 0, "SQLGetPrivateProfileStringW returned %d\n", ret);
367
368 ret = SQLGetPrivateProfileStringW(L"wineodbc", L"testing", L"default", buffer, 7, L"abcd.INI");
369 ok(ret == 6, "SQLGetPrivateProfileStringW returned %d\n", ret);
370
371 lstrcpyW(buffer, L"wine");
372 ret = SQLGetPrivateProfileStringW(L"wineodbc", NULL , L"", buffer, 10, L"abcd.INI");
373 ok(ret == lstrlenW(L"testing") + 1, "SQLGetPrivateProfileStringW returned %d\n", ret);
374 ok(!lstrcmpW(buffer, L"testing"), "incorrect string '%s'\n", wine_dbgstr_w(buffer));
375
376 ret = SQLWritePrivateProfileString("wineodbc", "value" , "0", "abcd.ini");
377 ok(ret, "SQLWritePrivateProfileString failed\n");
378
379 lstrcpyW(buffer, L"wine");
380 ret = SQLGetPrivateProfileStringW(L"wineodbc", NULL , L"", buffer, 256, L"abcd.INI");
381 ok(ret == (lstrlenW(L"testing") + lstrlenW(L"value") + 2), "SQLGetPrivateProfileStringW returned %d\n", ret);
382 if(ret == (lstrlenW(L"testing") + lstrlenW(L"value") + 2))
383 {
384 ok(!memcmp(buffer, L"testing\0value", sizeof(L"testing\0value")),
385 "incorrect string '%s'\n", wine_dbgstr_wn(buffer, ret));
386 }
387
388 lstrcpyW(buffer, L"value");
389 ret = SQLGetPrivateProfileStringW(L"wineodbc", NULL , L"", buffer, 10, L"abcd.INI");
390 ok(ret == lstrlenW(L"testing") + 1, "SQLGetPrivateProfileStringW returned %d\n", ret);
391 if(ret >= lstrlenW(L"testing") + 1)
392 {
393 ok(!lstrcmpW(buffer, L"testing"), "incorrect string '%s'\n", wine_dbgstr_w(buffer));
394 }
395
396 lstrcpyW(buffer, L"value");
397 ret = SQLGetPrivateProfileStringW(L"wineodbc", NULL , L"", buffer, 2, L"abcd.INI");
398 ok(ret == 0, "SQLGetPrivateProfileStringW returned %d\n", ret);
399
400 reg_ret = RegOpenKeyExW(HKEY_CURRENT_USER, abcd_key, 0, KEY_READ, &hkey);
401 ok(reg_ret == ERROR_SUCCESS, "RegOpenKeyExW failed\n");
402 if(reg_ret == ERROR_SUCCESS)
403 {
405 ok(reg_ret == ERROR_SUCCESS, "RegDeleteKeyW failed\n");
406
407 RegCloseKey(hkey);
408 }
409
410 /* Cleanup key */
412 ok(reg_ret == ERROR_SUCCESS, "RegDeleteKeyW failed\n");
413 }
414
415 ret = SQLGetConfigMode(&orig_mode);
416 ok(ret, "SQLGetConfigMode failed\n");
417
419 ok(ret, "SQLSetConfigMode failed\n");
420
421 ret = SQLWritePrivateProfileStringW(L"wineodbc", L"testing" , L"value", L"ODBC.INI");
422 if (!ret)
423 {
427 {
428 win_skip("not enough privileges\n");
429 SQLSetConfigMode(orig_mode);
430 return;
431 }
432 }
433 ok(ret, "SQLWritePrivateProfileString failed\n");
434
435 ret = SQLWritePrivateProfileStringW(L"wineodbc1", L"testing" , L"systemdsn", L"ODBC.INI");
436 ok(ret, "SQLWritePrivateProfileString failed\n");
437
438 ret = SQLGetPrivateProfileStringW(L"wineodbc", NULL, L"", buffer, 256, L"ODBC.INI");
439 ok(ret, "SQLGetPrivateProfileStringW failed\n");
440
442 ok(ret, "SQLSetConfigMode failed\n");
443
444 ret = SQLGetPrivateProfileStringW(L"wineodbc", NULL, L"", buffer, 256, L"ODBC.INI");
445 ok(!ret, "SQLGetPrivateProfileStringW succeeded\n");
446
447 ret = SQLWritePrivateProfileStringW(L"wineodbc1", L"testing" , L"userdsn", L"ODBC.INI");
448 ok(ret, "SQLWritePrivateProfileString failed\n");
449
451 ok(ret, "SQLSetConfigMode failed\n");
452
453 ret = SQLGetPrivateProfileStringW(L"wineodbc", NULL, L"", buffer, 256, L"ODBC.INI");
454 ok(ret, "SQLGetPrivateProfileStringW failed\n");
455
456 reg_ret = RegDeleteKeyW(HKEY_LOCAL_MACHINE, L"Software\\ODBC\\ODBC.INI\\wineodbc");
457 ok(reg_ret == ERROR_SUCCESS, "RegDeleteKeyW failed %ld\n", reg_ret);
458
459 /* Show existing USER DSN is checked before MACHINE */
460 ret = SQLWritePrivateProfileStringW(L"wineodbc1", L"testing" , L"bothdsn", L"ODBC.INI");
461 ok(ret, "SQLWritePrivateProfileString failed\n");
462
464 ok(ret, "SQLSetConfigMode failed\n");
465
466 ret = SQLGetPrivateProfileStringW(L"wineodbc1", L"testing", L"", buffer, 256, L"ODBC.INI");
467 ok(ret, "SQLGetPrivateProfileStringW failed\n");
468 ok(!wcscmp(buffer, L"systemdsn"), "Wrong value\n");
469
470 reg_ret = RegDeleteKeyW(HKEY_CURRENT_USER, L"Software\\ODBC\\ODBC.INI\\wineodbc1");
471 ok(reg_ret == ERROR_SUCCESS, "RegDeleteKeyW failed %ld\n", reg_ret);
472
473 reg_ret = RegDeleteKeyW(HKEY_LOCAL_MACHINE, L"Software\\ODBC\\ODBC.INI\\wineodbc1");
474 ok(reg_ret == ERROR_SUCCESS, "RegDeleteKeyW failed %ld\n", reg_ret);
475
477 ok(ret, "SQLSetConfigMode failed\n");
478
479 /* Writes to USER if no key found */
480 ret = SQLWritePrivateProfileStringW(L"wineodbc1", L"testing" , L"userwrite", L"ODBC.INI");
481 ok(ret, "SQLWritePrivateProfileString failed\n");
482
484 ok(ret, "SQLSetConfigMode failed\n");
485
486 ret = SQLGetPrivateProfileStringW(L"wineodbc1", L"testing", L"", buffer, 256, L"ODBC.INI");
487 ok(ret, "SQLGetPrivateProfileStringW failed\n");
488 ok(!wcscmp(buffer, L"userwrite"), "Wrong value\n");
489
490 reg_ret = RegDeleteKeyW(HKEY_CURRENT_USER, L"Software\\ODBC\\ODBC.INI\\wineodbc1");
491 ok(reg_ret == ERROR_SUCCESS, "RegDeleteKeyW failed %ld\n", reg_ret);
492
494 ok(ret, "SQLSetConfigMode failed\n");
495
496 ret = SQLWritePrivateProfileStringW(L"wineodbc", L"testing" , L"value", L"ODBC.INI");
497 ok(ret, "SQLWritePrivateProfileString failed\n");
498
499 ret = SQLGetPrivateProfileStringW(L"wineodbc", NULL, L"", buffer, 256, L"ODBC.INI");
500 ok(ret, "SQLGetPrivateProfileStringW failed\n");
501
502 ret = SQLWritePrivateProfileStringW(L"wineodbc", L"testing" , L"value", L"ODBCINST.INI");
503 ok(ret, "SQLWritePrivateProfileString failed\n");
504
505 ret = SQLGetPrivateProfileStringW(L"wineodbc", NULL, L"", buffer, 256, L"ODBCINST.INI");
506 ok(ret, "SQLGetPrivateProfileStringW failed\n");
507
508 reg_ret = RegDeleteKeyW(HKEY_LOCAL_MACHINE, L"Software\\ODBC\\ODBCINST.INI\\wineodbc");
509 ok(reg_ret == ERROR_SUCCESS, "RegDeleteKeyW failed %ld\n", reg_ret);
510
512 ok(ret, "SQLSetConfigMode failed\n");
513
514 ret = SQLGetPrivateProfileStringW(L"wineodbc", NULL, L"", buffer, 256, L"ODBC.INI");
515 ok(!ret, "SQLGetPrivateProfileStringW succeeded\n");
516
518 ok(ret, "SQLSetConfigMode failed\n");
519
520 ret = SQLGetPrivateProfileStringW(L"wineodbc", NULL, L"", buffer, 256, L"ODBC.INI");
521 ok(ret, "SQLGetPrivateProfileStringW failed\n");
522
523 reg_ret = RegDeleteKeyW(HKEY_CURRENT_USER, L"Software\\ODBC\\ODBC.INI\\wineodbc");
524 ok(reg_ret == ERROR_SUCCESS, "RegDeleteKeyW failed %ld\n", reg_ret);
525
526 ret = SQLSetConfigMode(orig_mode);
527 ok(ret, "SQLSetConfigMode failed\n");
528}
529
530static void test_SQLInstallDriverEx(void)
531{
532 char path[MAX_PATH];
533 char syspath[MAX_PATH];
534 WORD size = 0;
535 BOOL ret, sql_ret;
536 DWORD cnt, error_code = 0;
537 HKEY hkey;
538 LONG res;
539 char error[1000];
540
542
543 ret = SQLConfigDriver(NULL, ODBC_CONFIG_DRIVER, "WINE ODBC Driver", "CPTimeout=59", error, sizeof(error), NULL);
544 ok(!ret, "SQLConfigDriver returned %d\n", ret);
545 sql_ret = SQLInstallerErrorW(1, &error_code, NULL, 0, NULL);
546 ok(sql_ret && error_code == ODBC_ERROR_COMPONENT_NOT_FOUND, "SQLConfigDriver returned %d, %lu\n", sql_ret, error_code);
547
548 ret = SQLInstallDriverEx("WINE ODBC Driver\0Driver=sample.dll\0Setup=sample.dll\0\0", NULL,
550 ok(ret, "SQLInstallDriverEx failed\n");
551 sql_ret = SQLInstallerErrorW(1, &error_code, NULL, 0, NULL);
553 {
554 win_skip("not enough privileges\n");
555 return;
556 }
557 ok(sql_ret == SQL_NO_DATA || (sql_ret && error_code == SQL_SUCCESS), "SQLInstallDriverEx failed %d, %lu\n", sql_ret, error_code);
558 ok(!strcmp(path, syspath), "invalid path %s\n", path);
559
560 sql_ret = 0;
561 ret = SQLConfigDriver(NULL, ODBC_CONFIG_DRIVER, "WINE ODBC Driver", NULL, error, sizeof(error), NULL);
562 ok(!ret, "SQLConfigDriver failed '%s'\n",error);
563
564 ret = SQLConfigDriver(NULL, ODBC_CONFIG_DRIVER, "WINE ODBC Driver", "CPTimeout=59\0NoWrite=60\0", error, sizeof(error), NULL);
565 ok(ret, "SQLConfigDriver failed\n");
566 sql_ret = SQLInstallerErrorW(1, &error_code, NULL, 0, NULL);
567 ok(sql_ret == SQL_NO_DATA || (sql_ret && error_code == SQL_SUCCESS), "SQLConfigDriver failed %d, %lu\n", sql_ret, error_code);
568
569 ret = SQLInstallDriverEx("WINE ODBC Driver Path\0Driver=sample.dll\0Setup=sample.dll\0\0", "c:\\temp", path, MAX_PATH, &size, ODBC_INSTALL_COMPLETE, NULL);
570 ok(ret, "SQLInstallDriverEx failed\n");
571 sql_ret = SQLInstallerErrorW(1, &error_code, NULL, 0, NULL);
572 ok(sql_ret == SQL_NO_DATA || (sql_ret && error_code == SQL_SUCCESS), "SQLInstallDriverEx failed %d, %lu\n", sql_ret, error_code);
573 ok(!strcmp(path, "c:\\temp"), "invalid path %s\n", path);
574
575 ret = SQLConfigDriver(NULL, ODBC_CONFIG_DRIVER, "WINE ODBC Driver Path", "empty", error, sizeof(error), NULL);
576 ok(!ret, "SQLConfigDriver successful\n");
577 sql_ret = SQLInstallerErrorW(1, &error_code, NULL, 0, NULL);
578 ok(sql_ret && error_code == ODBC_ERROR_INVALID_KEYWORD_VALUE, "SQLConfigDriver failed %d, %lu\n", sql_ret, error_code);
579
580 ret = SQLConfigDriver(NULL, ODBC_CONFIG_DRIVER, "WINE ODBC Driver Path", "NoWrite=60;xxxx=555", error, sizeof(error), NULL);
581 ok(ret, "SQLConfigDriver failed\n");
582 sql_ret = SQLInstallerErrorW(1, &error_code, NULL, 0, NULL);
583 ok(sql_ret == SQL_NO_DATA || (sql_ret && error_code == SQL_SUCCESS), "SQLConfigDriver failed %d, %lu\n", sql_ret, error_code);
584
585 if (ret)
586 {
587 DWORD type = 0xdeadbeef, size = MAX_PATH;
588
589 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\ODBC\\ODBCINST.INI\\WINE ODBC Driver", 0, KEY_READ, &hkey);
590 ok(res == ERROR_SUCCESS, "RegOpenKeyExW failed\n");
591 if (res == ERROR_SUCCESS)
592 {
593 char driverpath[MAX_PATH];
594
595 strcpy(driverpath, syspath);
596 strcat(driverpath, "\\sample.dll");
597
598 memset(path, 0, sizeof(path));
599 res = RegQueryValueExA(hkey, "Driver", NULL, &type, (BYTE *)path, &size);
600 ok(res == ERROR_SUCCESS, "got %ld\n", res);
601 ok(type == REG_SZ, "got %lu\n", type);
602 ok(size == strlen(driverpath) + 1, "got %lu\n", size);
603 ok(!strcmp(path, driverpath), "invalid path %s\n", path);
604
605 res = RegQueryValueExA(hkey, "CPTimeout", NULL, &type, (BYTE *)&path, &size);
606 ok(res == ERROR_SUCCESS, "got %ld\n", res);
607 ok(type == REG_SZ, "got %lu\n", type);
608 ok(size == strlen("59") + 1, "got %lu\n", size);
609 ok(!strcmp(path, "59"), "invalid value %s\n", path);
610
611 res = RegQueryValueExA(hkey, "NoWrite", NULL, &type, (BYTE *)&path, &size);
612 ok(res == ERROR_FILE_NOT_FOUND, "got %ld\n", res);
613
614 RegCloseKey(hkey);
615 }
616
617 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\ODBC\\ODBCINST.INI\\WINE ODBC Driver Path", 0, KEY_READ, &hkey);
618 ok(res == ERROR_SUCCESS, "RegOpenKeyExW failed\n");
619 if (res == ERROR_SUCCESS)
620 {
621 size = sizeof(path);
622 res = RegQueryValueExA(hkey, "NoWrite", NULL, &type, (BYTE *)&path, &size);
623 ok(res == ERROR_SUCCESS, "got %ld\n", res);
624 ok(type == REG_SZ, "got %lu\n", type);
625 ok(size == strlen("60;xxxx=555") + 1, "got %lu\n", size);
626 ok(!strcmp(path, "60;xxxx=555"), "invalid value %s\n", path);
627
628 res = RegQueryValueExA(hkey, "CPTimeout", NULL, &type, (BYTE *)&path, &size);
629 ok(res == ERROR_FILE_NOT_FOUND, "got %ld\n", res);
630 RegCloseKey(hkey);
631 }
632 }
633
634 cnt = 100;
635 ret = SQLRemoveDriver("WINE ODBC Driver", FALSE, &cnt);
636 ok(ret, "SQLRemoveDriver failed\n");
637 ok(cnt == 0, "SQLRemoveDriver failed %ld\n", cnt);
638
639 cnt = 100;
640 ret = SQLRemoveDriver("WINE ODBC Driver Path", FALSE, &cnt);
641 ok(ret, "SQLRemoveDriver failed\n");
642 ok(cnt == 0, "SQLRemoveDriver failed %ld\n", cnt);
643}
644
646{
647 char path[MAX_PATH];
648 char syspath[MAX_PATH];
649 WORD size = 0;
650 BOOL ret, sql_ret;
651 DWORD cnt, error_code = 0;
652 HKEY hkey;
653 LONG res;
654
656
657 ret = SQLInstallTranslatorEx("WINE ODBC Translator\0Translator=sample.dll\0Setup=sample.dll\0",
659 sql_ret = SQLInstallerErrorW(1, &error_code, NULL, 0, NULL);
661 {
662 win_skip("not enough privileges\n");
663 return;
664 }
665 ok(sql_ret && error_code == SQL_SUCCESS, "SQLInstallDriverEx failed %d, %lu\n", sql_ret, error_code);
666 ok(!strcmp(path, syspath), "invalid path %s\n", path);
667 ok(size == strlen(path), "invalid length %d\n", size);
668
669 ret = SQLInstallTranslatorEx("WINE ODBC Translator Path\0Translator=sample.dll\0Setup=sample.dll\0",
670 "c:\\temp", path, MAX_PATH, &size, ODBC_INSTALL_COMPLETE, NULL);
671 sql_ret = SQLInstallerErrorW(1, &error_code, NULL, 0, NULL);
672 ok(sql_ret && error_code == SQL_SUCCESS, "SQLInstallTranslatorEx failed %d, %lu\n", sql_ret, error_code);
673 ok(!strcmp(path, "c:\\temp"), "invalid path %s\n", path);
674 ok(size == strlen(path), "invalid length %d\n", size);
675
676 if(ret)
677 {
678 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\ODBC\\ODBCINST.INI\\WINE ODBC Translator", 0,
679 KEY_READ, &hkey);
680 ok(res == ERROR_SUCCESS, "RegOpenKeyExW failed\n");
681 if (res == ERROR_SUCCESS)
682 {
683 DWORD type = 0xdeadbeef, size = MAX_PATH;
684 char driverpath[MAX_PATH];
685
686 strcpy(driverpath, syspath);
687 strcat(driverpath, "\\sample.dll");
688
689 memset(path, 0, sizeof(path));
690 res = RegQueryValueExA(hkey, "Translator", NULL, &type, (BYTE *)path, &size);
691 ok(res == ERROR_SUCCESS, "RegGetValueA failed\n");
692 ok(type == REG_SZ, "got %lu\n", type);
693 ok(size == strlen(driverpath) + 1, "got %lu\n", size);
694 ok(!strcmp(path, driverpath), "invalid path %s\n", path);
695
696 RegCloseKey(hkey);
697 }
698 }
699
700 cnt = 100;
701 ret = SQLRemoveTranslator("WINE ODBC Translator", &cnt);
702 ok(ret, "SQLRemoveTranslator failed\n");
703 ok(cnt == 0, "SQLRemoveTranslator failed %ld\n", cnt);
704
705 cnt = 100;
706 ret = SQLRemoveTranslator("WINE ODBC Translator Path", &cnt);
707 ok(ret, "SQLRemoveTranslator failed\n");
708 ok(cnt == 0, "SQLRemoveTranslator failed %ld\n", cnt);
709
710 cnt = 100;
711 ret = SQLRemoveTranslator("WINE ODBC Translator NonExist", &cnt);
712 ok(!ret, "SQLRemoveTranslator succeeded\n");
713 ok(cnt == 100, "SQLRemoveTranslator succeeded %ld\n", cnt);
714 sql_ret = SQLInstallerErrorW(1, &error_code, NULL, 0, NULL);
716 "SQLInstallTranslatorEx failed %d, %lu\n", sql_ret, error_code);
717
718}
719
721{
722 char buffer[1000], *p;
723 WORD written, len;
724 BOOL ret, sql_ret;
726 int found = 0;
727
728 ret = SQLInstallDriverEx("Wine test\0Driver=test.dll\0\0", NULL, buffer,
729 sizeof(buffer), &written, ODBC_INSTALL_COMPLETE, NULL);
730 ok(ret, "SQLInstallDriverEx failed: %d\n", ret);
731 sql_ret = SQLInstallerErrorW(1, &error_code, NULL, 0, NULL);
733 {
734 skip("not enough privileges\n");
735 return;
736 }
737
738 ret = SQLGetInstalledDrivers(NULL, sizeof(buffer), &written);
739 ok(!ret, "got %d\n", ret);
741
742 ret = SQLGetInstalledDrivers(buffer, 0, &written);
743 ok(!ret, "got %d\n", ret);
745
747 ok(ret, "got %d\n", ret);
748 ok(strlen(buffer) == 8, "got len %u\n", lstrlenA(buffer));
749 ok(!buffer[9], "buffer not doubly null-terminated\n");
750
751 ret = SQLGetInstalledDrivers(buffer, 10, &written);
752 ok(ret, "got %d\n", ret);
753 ok(strlen(buffer) == 8, "got len %u\n", lstrlenA(buffer));
754 ok(written == 10, "got written %d\n", written);
755 ok(!buffer[9], "buffer not doubly null-terminated\n");
756
757 ret = SQLGetInstalledDrivers(buffer, sizeof(buffer), &written);
758 ok(ret, "got %d\n", ret);
759 ok(!buffer[written-1] && !buffer[written-2], "buffer not doubly null-terminated\n");
760 len = strlen(buffer);
761
762 for (p = buffer; *p; p += strlen(p) + 1)
763 {
764 if (!strcmp(p, "Wine test"))
765 found = 1;
766 }
767 ok(found, "installed driver not found\n");
768
769 ret = SQLGetInstalledDrivers(buffer, len, &written);
770 ok(ret, "got %d\n", ret);
771 ok(strlen(buffer) == len-2, "expected len %d, got %u\n", len-2, lstrlenA(buffer));
772 ok(written == len, "expected written %d, got %d\n", len, written);
773 ok(!buffer[len-1], "buffer not doubly null-terminated\n");
774
775 ret = SQLGetInstalledDrivers(buffer, len+1, &written);
776 ok(ret, "got %d\n", ret);
777 ok(strlen(buffer) == len-1, "expected len %d, got %u\n", len-1, lstrlenA(buffer));
778 ok(written == len+1, "expected written %d, got %d\n", len+1, written);
779 ok(!buffer[len], "buffer not doubly null-terminated\n");
780
781 ret = SQLGetInstalledDrivers(buffer, len+2, &written);
782 ok(ret, "got %d\n", ret);
783 ok(strlen(buffer) == len, "expected len %d, got %u\n", len, lstrlenA(buffer));
784 ok(written == len+2, "expected written %d, got %d\n", len+2, written);
785 ok(!buffer[len+1], "buffer not doubly null-terminated\n");
786
787 SQLRemoveDriver("Wine test", TRUE, NULL);
788}
789
790static void test_SQLValidDSN(void)
791{
792 static const char *invalid = "[]{}(),;?*=!@\\";
793 char str[10];
794 int i;
795 BOOL ret;
796
798 ok(!ret, "got %d\n", ret);
799
800 strcpy(str, "wine10");
801 for(i = 0; i < strlen(invalid); i++)
802 {
803 str[4] = invalid[i];
805 ok(!ret, "got %d\n", ret);
806 }
807
808 /* Too large */
809 ret = SQLValidDSN("Wine123456789012345678901234567890");
810 ok(!ret, "got %d\n", ret);
811
812 /* Valid with a space */
813 ret = SQLValidDSN("Wine Vinegar");
814 ok(ret, "got %d\n", ret);
815
816 /* Max DSN name value */
817 ret = SQLValidDSN("12345678901234567890123456789012");
818 ok(ret, "got %d\n", ret);
819
820 ret = SQLValidDSN("");
821 ok(!ret, "got %d\n", ret);
822}
823
824static void test_SQLValidDSNW(void)
825{
826 WCHAR str[10];
827 int i;
828 BOOL ret;
829
831 ok(!ret, "got %d\n", ret);
832
833 lstrcpyW(str, L"wine10");
834 for (i = 0; i < lstrlenW(L"[]{}(),;?*=!@\\"); i++)
835 {
836 str[4] = L"[]{}(),;?*=!@\\"[i];
838 ok(!ret, "got %d\n", ret);
839 }
840
841 ret = SQLValidDSNW(L"Wine123456789012345678901234567890");
842 ok(!ret, "got %d\n", ret);
843
844 ret = SQLValidDSNW(L"Wine Vinegar");
845 ok(ret, "got %d\n", ret);
846
847 ret = SQLValidDSNW(L"12345678901234567890123456789012");
848 ok(ret, "got %d\n", ret);
849
850 ret = SQLValidDSNW(L"");
851 ok(!ret, "got %d\n", ret);
852}
853
855{
856 BOOL ret;
857
858 ret = SQLConfigDataSource(0, ODBC_ADD_DSN, "SQL Server", "DSN=WINEMQIS\0Database=MQIS\0\0");
859 todo_wine ok(ret, "got %d\n", ret);
860
861 ret = SQLConfigDataSource(0, ODBC_REMOVE_DSN, "SQL Server", "DSN=WINEMQIS\0\0");
862 todo_wine ok(ret, "got %d\n", ret);
863
864 ret = SQLConfigDataSource(0, ODBC_REMOVE_DSN, "SQL Server", "DSN=WINEMQIS\0\0");
865 if(!ret)
866 {
867 RETCODE ret;
868 DWORD err;
869 ret = SQLInstallerError(1, &err, NULL, 0, NULL);
870 ok(ret == SQL_SUCCESS_WITH_INFO, "got %d\n", ret);
871 todo_wine ok(err == ODBC_ERROR_INVALID_DSN, "got %lu\n", err);
872 }
873
874 ret = SQLConfigDataSource(0, ODBC_ADD_DSN, "ODBC driver", "DSN=ODBC data source\0\0");
875 ok(!ret, "got %d\n", ret);
877}
878
879static BOOL check_dsn_exists(HKEY key, const WCHAR *dsn)
880{
881 HKEY hkey;
882 WCHAR buffer[256];
883 LONG res;
884
885 wcscpy(buffer, L"Software\\ODBC\\ODBC.INI\\");
886 wcscat(buffer, dsn);
887
888 res = RegOpenKeyExW(key, buffer, 0, KEY_READ, &hkey);
889 if (!res)
890 RegCloseKey(hkey);
891
892 return res == ERROR_SUCCESS;
893}
894
895static void test_SQLWriteDSNToIni(void)
896{
897 BOOL ret;
898 char buffer[MAX_PATH];
899 char path[MAX_PATH];
900 DWORD type, size;
901
903
905 ok(!ret, "got %d\n", ret);
906
908 ok(!ret, "got %d\n", ret);
909
911 ok(!ret, "Found registry key\n");
912
913 ret = SQLWriteDSNToIni("wine_dbs", "SQL Server");
914 if (!ret)
915 {
916 win_skip("Doesn't have permission to write a System DSN\n");
917 return;
918 }
919
921 ok(ret, "Failed to find registry key\n");
922
924 ret = SQLWriteDSNToIni("wine_dbs", "SQL Server");
925 ok(ret, "got %d\n", ret);
926
928 ok(ret, "Failed to find registry key\n");
929
931
932 if(ret)
933 {
934 HKEY hkey;
935 LONG res;
936
937 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\ODBC\\ODBC.INI\\ODBC Data Sources", 0,
938 KEY_READ, &hkey);
939 ok(res == ERROR_SUCCESS, "RegOpenKeyExW failed\n");
940 if (res == ERROR_SUCCESS)
941 {
942 type = 0xdeadbeef;
943 size = MAX_PATH;
944
945 memset(buffer, 0, sizeof(buffer));
946 res = RegQueryValueExA(hkey, "wine_dbs", NULL, &type, (BYTE *)buffer, &size);
947 ok(res == ERROR_SUCCESS, "RegGetValueA failed\n");
948 ok(type == REG_SZ, "got %lu\n", type);
949 ok(!strcmp(buffer, "SQL Server"), "incorrect string '%s'\n", buffer);
950
951 RegCloseKey(hkey);
952 }
953
955
956 /* ODBC_BOTH_DSN set and has both System/User DSN but only removes USER. */
957 ret = SQLRemoveDSNFromIni("wine_dbs");
958 ok(ret, "got %d\n", ret);
959
961 ok(!ret, "Found registry key\n");
962
964 ok(ret, "Failed to find registry key\n");
965
966 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\ODBC\\ODBC.INI\\wine_dbs", 0,
967 KEY_READ, &hkey);
968 ok(res == ERROR_SUCCESS, "RegOpenKeyExW failed\n");
969 if (res == ERROR_SUCCESS)
970 {
971 type = 0xdeadbeef;
972 size = MAX_PATH;
973
974 memset(path, 0, sizeof(path));
975 res = RegQueryValueExA(hkey, "driver", NULL, &type, (BYTE *)path, &size);
976 ok(res == ERROR_SUCCESS, "RegGetValueA failed\n");
977 ok(type == REG_SZ, "got %lu\n", type);
978 /* WINE doesn't have a 'SQL Server' driver available */
979 todo_wine ok(strlen(path) != 0, "Invalid value\n");
980
981 RegCloseKey(hkey);
982 }
983
985
986 ret = SQLRemoveDSNFromIni("wine_dbs");
987 ok(ret, "got %d\n", ret);
988 }
989
990 /* Show that values are written, even though an invalid driver was specified. */
991 ret = SQLWriteDSNToIni("wine_mis", "Missing Access Driver (*.mis)");
992 ok(ret, "got %d\n", ret);
993 if(ret)
994 {
995 HKEY hkey;
996 LONG res;
997
998 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\ODBC\\ODBC.INI\\ODBC Data Sources", 0,
999 KEY_READ, &hkey);
1000 ok(res == ERROR_SUCCESS, "RegOpenKeyExW failed\n");
1001 if (res == ERROR_SUCCESS)
1002 {
1003 type = 0xdeadbeef;
1004 size = MAX_PATH;
1005
1006 memset(buffer, 0, sizeof(buffer));
1007 res = RegQueryValueExA(hkey, "wine_mis", NULL, &type, (BYTE *)buffer, &size);
1008 ok(res == ERROR_SUCCESS, "RegGetValueA failed\n");
1009 ok(type == REG_SZ, "got %lu\n", type);
1010 ok(!strcmp(buffer, "Missing Access Driver (*.mis)"), "incorrect string '%s'\n", buffer);
1011
1012 RegCloseKey(hkey);
1013 }
1014
1015 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\ODBC\\ODBC.INI\\wine_mis", 0,
1016 KEY_READ, &hkey);
1017 ok(res == ERROR_SUCCESS, "RegOpenKeyExW failed\n");
1018 if (res == ERROR_SUCCESS)
1019 {
1020 type = 0xdeadbeef;
1021 size = MAX_PATH;
1022
1023 memset(path, 0, sizeof(path));
1024 res = RegQueryValueExA(hkey, "driver", NULL, &type, (BYTE *)path, &size);
1025 ok(res == ERROR_SUCCESS, "RegGetValueA failed\n");
1026 ok(type == REG_SZ, "got %lu\n", type);
1027 ok(strlen(path) == 0, "Invalid value\n");
1028
1029 RegCloseKey(hkey);
1030 }
1031
1032 ret = SQLRemoveDSNFromIni("wine_mis");
1033 ok(ret, "got %d\n", ret);
1034 }
1035}
1036
1038{
1052}
#define expect(EXPECTED, GOT)
Definition: SystemMenu.c:483
#define REG_SZ
Definition: layer.c:22
#define ok(value,...)
Definition: atltest.h:57
#define skip(...)
Definition: atltest.h:64
#define START_TEST(x)
Definition: atltest.h:75
#define ok_(x1, x2)
Definition: atltest.h:61
#define RegCloseKey(hKey)
Definition: registry.h:49
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
LONG WINAPI RegOpenKeyExA(_In_ HKEY hKey, _In_ LPCSTR lpSubKey, _In_ DWORD ulOptions, _In_ REGSAM samDesired, _Out_ PHKEY phkResult)
Definition: reg.c:3298
LONG WINAPI RegDeleteKeyW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey)
Definition: reg.c:1239
LONG WINAPI RegQueryValueExA(_In_ HKEY hkeyorg, _In_ LPCSTR name, _In_ LPDWORD reserved, _Out_opt_ LPDWORD type, _Out_opt_ LPBYTE data, _Inout_opt_ LPDWORD count)
Definition: reg.c:4009
#define MAX_PATH
Definition: compat.h:34
#define lstrcpyW
Definition: compat.h:749
#define lstrlenW
Definition: compat.h:750
UINT WINAPI GetSystemDirectoryA(OUT LPSTR lpBuffer, IN UINT uSize)
Definition: path.c:2301
int WINAPI lstrcmpW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4152
_ACRTIMP int __cdecl wcscmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:1977
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2807
_ACRTIMP size_t __cdecl strlen(const char *)
Definition: string.c:1597
_ACRTIMP int __cdecl strcmp(const char *, const char *)
Definition: string.c:3324
return ret
Definition: mutex.c:147
#define L(x)
Definition: resources.c:13
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLuint res
Definition: glext.h:9613
GLuint buffer
Definition: glext.h:5915
GLsizeiptr size
Definition: glext.h:5919
GLfloat GLfloat p
Definition: glext.h:8902
GLenum GLsizei len
Definition: glext.h:6722
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
unsigned short UWORD
Definition: lzx.c:49
#define wine_dbgstr_w
Definition: kernel32.h:34
int WINAPI lstrlenA(LPCSTR lpString)
Definition: lstring.c:145
#define win_skip
Definition: minitest.h:67
#define todo_wine
Definition: minitest.h:80
#define error(str)
Definition: mkdosfs.c:1605
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
static const WCHAR abcdini_key[]
Definition: misc.c:28
static void test_SQLGetPrivateProfileStringW(void)
Definition: misc.c:313
static void test_SQLValidDSN(void)
Definition: misc.c:790
#define check_error(a)
Definition: misc.c:38
static void test_SQLInstallTranslatorEx(void)
Definition: misc.c:645
static void test_SQLValidDSNW(void)
Definition: misc.c:824
static BOOL check_dsn_exists(HKEY key, const WCHAR *dsn)
Definition: misc.c:879
static void test_SQLGetPrivateProfileString(void)
Definition: misc.c:210
static void test_SQLInstallDriverEx(void)
Definition: misc.c:530
static void test_SQLWritePrivateProfileString(void)
Definition: misc.c:151
static const WCHAR abcd_key[]
Definition: misc.c:27
static void test_SQLGetInstalledDrivers(void)
Definition: misc.c:720
static void test_SQLConfigDataSource(void)
Definition: misc.c:854
static void test_SQLWriteDSNToIni(void)
Definition: misc.c:895
static void check_error_(int line, DWORD expect)
Definition: misc.c:30
static void test_SQLConfigMode(void)
Definition: misc.c:40
static void test_SQLInstallDriverManager(void)
Definition: misc.c:91
static void test_SQLInstallerError(void)
Definition: misc.c:67
#define KEY_READ
Definition: nt_native.h:1026
#define ODBC_SYSTEM_DSN
Definition: odbcinst.h:30
#define ODBC_INSTALL_COMPLETE
Definition: odbcinst.h:20
#define ODBC_ERROR_WRITING_SYSINFO_FAILED
Definition: odbcinst.h:49
#define ODBC_ADD_DSN
Definition: odbcinst.h:12
#define ODBC_CONFIG_DRIVER
Definition: odbcinst.h:23
#define ODBC_REMOVE_DSN
Definition: odbcinst.h:14
#define ODBC_ERROR_INVALID_PARAM_SEQUENCE
Definition: odbcinst.h:44
#define ODBC_ERROR_INVALID_DSN
Definition: odbcinst.h:39
#define ODBC_ERROR_INVALID_STR
Definition: odbcinst.h:34
#define ODBC_BOTH_DSN
Definition: odbcinst.h:28
#define ODBC_ERROR_COMPONENT_NOT_FOUND
Definition: odbcinst.h:36
#define ODBC_USER_DSN
Definition: odbcinst.h:29
#define ODBC_ERROR_INVALID_BUFF_LEN
Definition: odbcinst.h:32
#define ODBC_ERROR_INVALID_KEYWORD_VALUE
Definition: odbcinst.h:38
short WCHAR
Definition: pedump.c:58
long LONG
Definition: pedump.c:60
char CHAR
Definition: pedump.c:57
#define err(...)
#define wine_dbgstr_wn
Definition: testlist.c:2
const WCHAR * str
wcscat
wcscpy
strcat
Definition: string.h:92
strcpy
Definition: string.h:131
#define memset(x, y, z)
Definition: compat.h:39
#define SQL_SUCCESS
Definition: sql.h:163
#define SQL_SUCCESS_WITH_INFO
Definition: sql.h:164
#define SQL_ERROR
Definition: sql.h:68
#define SQL_NO_DATA
Definition: sql.h:315
short RETCODE
Definition: sqltypes.h:28
Definition: copy.c:22
Definition: parser.c:49
_In_ size_t cnt
Definition: wcstombs.cpp:43
BOOL WINAPI SQLSetConfigMode(UWORD wConfigMode)
Definition: odbccp32.c:1740
int WINAPI SQLGetPrivateProfileStringW(LPCWSTR section, LPCWSTR entry, LPCWSTR defvalue, LPWSTR buff, int buff_len, LPCWSTR filename)
Definition: odbccp32.c:765
BOOL WINAPI SQLRemoveTranslator(LPCSTR lpszTranslator, LPDWORD lpdwUsageCount)
Definition: odbccp32.c:1725
static int error_code[8]
Definition: odbccp32.c:53
BOOL WINAPI SQLGetInstalledDrivers(char *buf, WORD size, WORD *sizeout)
Definition: odbccp32.c:710
SQLRETURN WINAPI SQLInstallerError(WORD iError, DWORD *pfErrorCode, LPSTR lpszErrorMsg, WORD cbErrorMsgMax, WORD *pcbErrorMsg)
Definition: odbccp32.c:1321
BOOL WINAPI SQLValidDSNW(LPCWSTR lpszDSN)
Definition: odbccp32.c:1757
BOOL WINAPI SQLInstallDriverManager(LPSTR lpszPath, WORD cbPathMax, WORD *pcbPathOut)
Definition: odbccp32.c:1208
BOOL WINAPI SQLConfigDriver(HWND hwnd, WORD request, LPCSTR driver, LPCSTR args, LPSTR msg, WORD msgmax, WORD *msgout)
Definition: odbccp32.c:545
BOOL WINAPI SQLGetConfigMode(UWORD *pwConfigMode)
Definition: odbccp32.c:633
BOOL WINAPI SQLInstallDriverEx(LPCSTR lpszDriver, LPCSTR lpszPathIn, LPSTR lpszPathOut, WORD cbPathOutMax, WORD *pcbPathOut, WORD fRequest, LPDWORD lpdwUsageCount)
Definition: odbccp32.c:1138
BOOL WINAPI SQLConfigDataSource(HWND hwnd, WORD request, LPCSTR driver, LPCSTR attributes)
Definition: odbccp32.c:442
int WINAPI SQLGetPrivateProfileString(LPCSTR section, LPCSTR entry, LPCSTR defvalue, LPSTR buff, int buff_len, LPCSTR filename)
Definition: odbccp32.c:847
BOOL WINAPI SQLRemoveDSNFromIni(LPCSTR lpszDSN)
Definition: odbccp32.c:1640
BOOL WINAPI SQLWriteDSNToIni(LPCSTR lpszDSN, LPCSTR lpszDriver)
Definition: odbccp32.c:1863
BOOL WINAPI SQLValidDSN(LPCSTR lpszDSN)
Definition: odbccp32.c:1770
BOOL WINAPI SQLWritePrivateProfileString(LPCSTR lpszSection, LPCSTR lpszEntry, LPCSTR lpszString, LPCSTR lpszFilename)
Definition: odbccp32.c:1961
BOOL WINAPI SQLRemoveDriver(LPCSTR lpszDriver, BOOL fRemoveDSN, LPDWORD lpdwUsageCount)
Definition: odbccp32.c:1563
BOOL WINAPI SQLInstallTranslatorEx(LPCSTR lpszTranslator, LPCSTR lpszPathIn, LPSTR lpszPathOut, WORD cbPathOutMax, WORD *pcbPathOut, WORD fRequest, LPDWORD lpdwUsageCount)
Definition: odbccp32.c:1376
BOOL WINAPI SQLWritePrivateProfileStringW(LPCWSTR lpszSection, LPCWSTR lpszEntry, LPCWSTR lpszString, LPCWSTR lpszFilename)
Definition: odbccp32.c:1903
SQLRETURN WINAPI SQLInstallerErrorW(WORD iError, DWORD *pfErrorCode, LPWSTR lpszErrorMsg, WORD cbErrorMsgMax, WORD *pcbErrorMsg)
Definition: odbccp32.c:1262
BOOL WINAPI SQLRemoveDSNFromIniW(LPCWSTR lpszDSN)
Definition: odbccp32.c:1588
static UWORD config_mode
Definition: odbccp32.c:46
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define HKEY_CURRENT_USER
Definition: winreg.h:11
unsigned char BYTE
Definition: xxhash.c:193