2 * Copyright (C) 2005 Mike McCormack for CodeWeavers
4 * A test program for MSI records
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
25 #include "wine/test.h"
27 static const char *msifile = "winetest.msi";
29 static BOOL create_temp_file(char *name)
32 unsigned char buffer[26], i;
36 r = GetTempFileName(".", "msitest",0,name);
39 handle = CreateFile(name, GENERIC_READ|GENERIC_WRITE,
40 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
41 if(handle==INVALID_HANDLE_VALUE)
45 r = WriteFile(handle,buffer,sizeof buffer,&sz,NULL);
50 static void test_msirecord(void)
57 const char str[] = "hello";
58 const WCHAR strW[] = { 'h','e','l','l','o',0};
59 char filename[MAX_PATH];
61 /* check behaviour with an invalid record */
62 r = MsiRecordGetFieldCount(0);
63 ok(r==-1, "field count for invalid record not -1\n");
65 r = MsiRecordIsNull(0, 0);
66 ok(r==0, "invalid handle not considered to be non-null...\n");
67 ok(GetLastError()==0, "MsiRecordIsNull set LastError\n");
68 r = MsiRecordGetInteger(0,0);
69 ok(r == MSI_NULL_INTEGER, "got integer from invalid record\n");
70 r = MsiRecordSetInteger(0,0,0);
71 ok(r == ERROR_INVALID_HANDLE, "MsiRecordSetInteger returned wrong error\n");
72 r = MsiRecordSetInteger(0,-1,0);
73 ok(r == ERROR_INVALID_HANDLE, "MsiRecordSetInteger returned wrong error\n");
75 h = MsiCreateRecord(-1);
76 ok(h==0, "created record with -1 elements\n");
77 h = MsiCreateRecord(0x10000);
78 ok(h==0, "created record with 0x10000 elements\n");
79 /* doesn't set LastError */
80 ok(GetLastError()==0, "MsiCreateRecord set last error\n");
81 r = MsiRecordClearData(0);
82 ok(r == ERROR_INVALID_HANDLE, "MsiRecordClearData returned wrong error\n");
83 r = MsiRecordDataSize(0,0);
84 ok(r == 0, "MsiRecordDataSize returned wrong error\n");
87 /* check behaviour of a record with 0 elements */
88 h = MsiCreateRecord(0);
89 ok(h!=0, "couldn't create record with zero elements\n");
90 r = MsiRecordGetFieldCount(h);
91 ok(r==0, "field count should be zero\n");
92 r = MsiRecordIsNull(h,0);
93 ok(r, "new record wasn't null\n");
94 r = MsiRecordIsNull(h,1);
95 ok(r, "out of range record wasn't null\n");
96 r = MsiRecordIsNull(h,-1);
97 ok(r, "out of range record wasn't null\n");
98 r = MsiRecordDataSize(h,0);
99 ok(r==0, "size of null record is 0\n");
102 r = MsiRecordGetString(h, 0, buf, &sz);
103 ok(r==ERROR_SUCCESS, "failed to get null string\n");
104 ok(sz==0, "null string too long\n");
105 ok(buf[0]==0, "null string not set\n");
107 /* same record, but add an integer to it */
108 r = MsiRecordSetInteger(h, 0, 0);
109 ok(r == ERROR_SUCCESS, "Failed to set integer at 0 to 0\n");
110 r = MsiRecordIsNull(h,0);
111 ok(r==0, "new record is null after setting an integer\n");
112 r = MsiRecordDataSize(h,0);
113 ok(r==sizeof(DWORD), "size of integer record is 4\n");
114 r = MsiRecordSetInteger(h, 0, 1);
115 ok(r == ERROR_SUCCESS, "Failed to set integer at 0 to 1\n");
116 r = MsiRecordSetInteger(h, 1, 1);
117 ok(r == ERROR_INVALID_PARAMETER, "set integer at 1\n");
118 r = MsiRecordSetInteger(h, -1, 0);
119 ok(r == ERROR_INVALID_PARAMETER, "set integer at -1\n");
120 r = MsiRecordIsNull(h,0);
121 ok(r==0, "new record is null after setting an integer\n");
122 r = MsiRecordGetInteger(h, 0);
123 ok(r == 1, "failed to get integer\n");
125 /* same record, but add a string to it */
126 r = MsiRecordSetString(h, 0, NULL);
127 ok(r == ERROR_SUCCESS, "Failed to set null string at 0\n");
128 r = MsiRecordIsNull(h, 0);
129 ok(r == TRUE, "null string not null field\n");
130 r = MsiRecordSetString(h, 0, "");
131 ok(r == ERROR_SUCCESS, "Failed to set empty string at 0\n");
132 r = MsiRecordIsNull(h, 0);
133 ok(r == TRUE, "null string not null field\n");
134 r = MsiRecordSetString(h,0,str);
135 ok(r == ERROR_SUCCESS, "Failed to set string at 0\n");
136 r = MsiRecordGetInteger(h, 0);
137 ok(r == MSI_NULL_INTEGER, "should get invalid integer\n");
138 r = MsiRecordDataSize(h,0);
139 ok(r==sizeof str-1, "size of string record is strlen\n");
142 r = MsiRecordGetString(h,0,buf,&sz);
143 ok(r == ERROR_SUCCESS, "Failed to get string at 0\n");
144 ok(0==strcmp(buf,str), "MsiRecordGetString returned the wrong string\n");
145 ok(sz == sizeof str-1, "MsiRecordGetString returned the wrong length\n");
148 r = MsiRecordGetString(h,0,buf,&sz);
149 ok(r == ERROR_MORE_DATA, "small buffer should yield ERROR_MORE_DATA\n");
150 ok(sz == sizeof str-1, "MsiRecordGetString returned the wrong length\n");
151 ok(0==strncmp(buf,str,sizeof str-3), "MsiRecordGetString returned the wrong string\n");
152 ok(buf[sizeof str - 3]==0, "string wasn't nul terminated\n");
156 r = MsiRecordGetString(h,0,buf,&sz);
157 ok(r == ERROR_SUCCESS, "wrong error\n");
158 ok(sz == sizeof str-1, "MsiRecordGetString returned the wrong length\n");
159 ok(0==strcmp(buf,str), "MsiRecordGetString returned the wrong string\n");
162 memset(bufW, 0, sizeof bufW);
164 r = MsiRecordGetStringW(h,0,bufW,&sz);
165 ok(r == ERROR_MORE_DATA, "wrong error\n");
166 ok(sz == 5, "MsiRecordGetString returned the wrong length\n");
167 ok(0==memcmp(bufW,strW,8), "MsiRecordGetString returned the wrong string\n");
171 r = MsiRecordGetStringW(h,0,bufW,&sz);
172 ok(r == ERROR_MORE_DATA, "wrong error\n");
173 ok(sz == 5, "MsiRecordGetString returned the wrong length\n");
174 ok('x'==bufW[0], "MsiRecordGetString returned the wrong string\n");
176 memset(buf, 0, sizeof buf);
178 r = MsiRecordGetStringA(h,0,buf,&sz);
179 ok(r == ERROR_MORE_DATA, "wrong error\n");
180 ok(sz == 5, "MsiRecordGetString returned the wrong length\n");
181 ok(0==memcmp(buf,str,4), "MsiRecordGetString returned the wrong string\n");
185 r = MsiRecordGetStringA(h,0,buf,&sz);
186 ok(r == ERROR_MORE_DATA, "wrong error\n");
187 ok(sz == 5, "MsiRecordGetString returned the wrong length\n");
188 ok('x'==buf[0], "MsiRecordGetString returned the wrong string\n");
190 /* same record, check we can wipe all the data */
191 r = MsiRecordClearData(h);
192 ok(r == ERROR_SUCCESS, "Failed to clear record\n");
193 r = MsiRecordClearData(h);
194 ok(r == ERROR_SUCCESS, "Failed to clear record again\n");
195 r = MsiRecordIsNull(h,0);
196 ok(r, "cleared record wasn't null\n");
198 /* same record, try converting strings to integers */
199 i = MsiRecordSetString(h,0,"42");
200 ok(i == ERROR_SUCCESS, "Failed to set string at 0\n");
201 i = MsiRecordGetInteger(h, 0);
202 ok(i == 42, "should get invalid integer\n");
203 i = MsiRecordSetString(h,0,"-42");
204 ok(i == ERROR_SUCCESS, "Failed to set string at 0\n");
205 i = MsiRecordGetInteger(h, 0);
206 ok(i == -42, "should get invalid integer\n");
207 i = MsiRecordSetString(h,0," 42");
208 ok(i == ERROR_SUCCESS, "Failed to set string at 0\n");
209 i = MsiRecordGetInteger(h, 0);
210 ok(i == MSI_NULL_INTEGER, "should get invalid integer\n");
211 i = MsiRecordSetString(h,0,"42 ");
212 ok(i == ERROR_SUCCESS, "Failed to set string at 0\n");
213 i = MsiRecordGetInteger(h, 0);
214 ok(i == MSI_NULL_INTEGER, "should get invalid integer\n");
215 i = MsiRecordSetString(h,0,"42.0");
216 ok(i == ERROR_SUCCESS, "Failed to set string at 0\n");
217 i = MsiRecordGetInteger(h, 0);
218 ok(i == MSI_NULL_INTEGER, "should get invalid integer\n");
219 i = MsiRecordSetString(h,0,"0x42");
220 ok(i == ERROR_SUCCESS, "Failed to set string at 0\n");
221 i = MsiRecordGetInteger(h, 0);
222 ok(i == MSI_NULL_INTEGER, "should get invalid integer\n");
223 i = MsiRecordSetString(h,0,"1000000000000000");
224 ok(i == ERROR_SUCCESS, "Failed to set string at 0\n");
225 i = MsiRecordGetInteger(h, 0);
226 ok(i == -1530494976, "should get truncated integer\n");
227 i = MsiRecordSetString(h,0,"2147483647");
228 ok(i == ERROR_SUCCESS, "Failed to set string at 0\n");
229 i = MsiRecordGetInteger(h, 0);
230 ok(i == 2147483647, "should get maxint\n");
231 i = MsiRecordSetString(h,0,"-2147483647");
232 ok(i == ERROR_SUCCESS, "Failed to set string at 0\n");
233 i = MsiRecordGetInteger(h, 0);
234 ok(i == -2147483647, "should get -maxint-1\n");
235 i = MsiRecordSetString(h,0,"4294967297");
236 ok(i == ERROR_SUCCESS, "Failed to set string at 0\n");
237 i = MsiRecordGetInteger(h, 0);
238 ok(i == 1, "should get one\n");
239 i = MsiRecordSetString(h,0,"foo");
240 ok(i == ERROR_SUCCESS, "Failed to set string at 0\n");
241 i = MsiRecordGetInteger(h, 0);
242 ok(i == MSI_NULL_INTEGER, "should get zero\n");
243 i = MsiRecordSetString(h,0,"");
244 ok(i == ERROR_SUCCESS, "Failed to set string at 0\n");
245 i = MsiRecordGetInteger(h, 0);
246 ok(i == MSI_NULL_INTEGER, "should get zero\n");
247 i = MsiRecordSetString(h,0,"+1");
248 ok(i == ERROR_SUCCESS, "Failed to set string at 0\n");
249 i = MsiRecordGetInteger(h, 0);
250 ok(i == MSI_NULL_INTEGER, "should get zero\n");
252 /* same record, try converting integers to strings */
253 r = MsiRecordSetInteger(h, 0, 32);
254 ok(r == ERROR_SUCCESS, "Failed to set integer at 0 to 32\n");
256 r = MsiRecordGetString(h, 0, NULL, &sz);
257 ok(r == ERROR_SUCCESS, "failed to get string from integer\n");
258 ok(sz == 2, "length wrong\n");
261 r = MsiRecordGetString(h, 0, buf, &sz);
262 ok(r == ERROR_SUCCESS, "failed to get string from integer\n");
263 ok(0==strcmp(buf,"32"), "failed to get string from integer\n");
264 r = MsiRecordSetInteger(h, 0, -32);
265 ok(r == ERROR_SUCCESS, "Failed to set integer at 0 to 32\n");
268 r = MsiRecordGetString(h, 0, NULL, &sz);
269 ok(r == ERROR_SUCCESS, "failed to get string from integer\n");
270 ok(sz == 3, "length wrong\n");
272 r = MsiRecordGetString(h, 0, buf, &sz);
273 ok(r == ERROR_SUCCESS, "failed to get string from integer\n");
274 ok(0==strcmp(buf,"-32"), "failed to get string from integer\n");
277 /* same record, now try streams */
278 r = MsiRecordSetStream(h, 0, NULL);
279 ok(r == ERROR_INVALID_PARAMETER, "set NULL stream\n");
281 r = MsiRecordReadStream(h, 0, buf, &sz);
282 ok(r == ERROR_INVALID_DATATYPE, "read non-stream type\n");
283 ok(sz == sizeof buf, "set sz\n");
284 r = MsiRecordDataSize( h, -1);
285 ok(r == 0,"MsiRecordDataSize returned wrong size\n");
286 r = MsiRecordDataSize( h, 0);
287 ok(r == 4,"MsiRecordDataSize returned wrong size\n");
289 /* same record, now close it */
290 r = MsiCloseHandle(h);
291 ok(r == ERROR_SUCCESS, "Failed to close handle\n");
293 /* now try streams in a new record - need to create a file to play with */
294 r = create_temp_file(filename);
298 /* streams can't be inserted in field 0 for some reason */
299 h = MsiCreateRecord(2);
300 ok(h, "couldn't create a two field record\n");
301 r = MsiRecordSetStream(h, 0, filename);
302 ok(r == ERROR_INVALID_PARAMETER, "added stream to field 0\n");
303 r = MsiRecordSetStream(h, 1, filename);
304 ok(r == ERROR_SUCCESS, "failed to add stream to record\n");
305 r = MsiRecordReadStream(h, 1, buf, NULL);
306 ok(r == ERROR_INVALID_PARAMETER, "should return error\n");
307 /* http://test.winehq.org/data/200503181000/98_jmelgarejo98casa/msi:record.txt */
308 DeleteFile(filename); /* Windows 98 doesn't like this at all, so don't check return. */
309 r = MsiRecordReadStream(h, 1, NULL, NULL);
310 ok(r == ERROR_INVALID_PARAMETER, "should return error\n");
312 r = MsiRecordReadStream(h, 1, NULL, &sz);
313 ok(r == ERROR_SUCCESS, "failed to read stream\n");
314 ok(sz==26,"couldn't get size of stream\n");
316 r = MsiRecordReadStream(h, 1, buf, &sz);
317 ok(r == ERROR_SUCCESS, "failed to read stream\n");
318 ok(sz==0,"short read\n");
320 r = MsiRecordReadStream(h, 1, buf, &sz);
321 ok(r == ERROR_SUCCESS, "failed to read stream\n");
322 ok(sz==sizeof buf,"short read\n");
323 ok(!strncmp(buf,"abcdefghij",10), "read the wrong thing\n");
325 r = MsiRecordReadStream(h, 1, buf, &sz);
326 ok(r == ERROR_SUCCESS, "failed to read stream\n");
327 ok(sz==sizeof buf,"short read\n");
328 ok(!strncmp(buf,"klmnopqrst",10), "read the wrong thing\n");
329 memset(buf,0,sizeof buf);
331 r = MsiRecordReadStream(h, 1, buf, &sz);
332 ok(r == ERROR_SUCCESS, "failed to read stream\n");
333 ok(sz==6,"short read\n");
334 ok(!strcmp(buf,"uvwxyz"), "read the wrong thing\n");
335 memset(buf,0,sizeof buf);
337 r = MsiRecordReadStream(h, 1, buf, &sz);
338 ok(r == ERROR_SUCCESS, "failed to read stream\n");
339 ok(sz==0,"size non-zero at end of stream\n");
340 ok(buf[0]==0, "read something at end of the stream\n");
341 r = MsiRecordSetStream(h, 1, NULL);
342 ok(r == ERROR_SUCCESS, "failed to reset stream\n");
344 r = MsiRecordReadStream(h, 1, NULL, &sz);
345 ok(r == ERROR_SUCCESS, "bytes left wrong after reset\n");
346 ok(sz==26,"couldn't get size of stream\n");
347 r = MsiRecordDataSize(h,1);
348 ok(r == 26,"MsiRecordDataSize returned wrong size\n");
350 /* now close the stream record */
351 r = MsiCloseHandle(h);
352 ok(r == ERROR_SUCCESS, "Failed to close handle\n");
353 DeleteFile(filename); /* Delete it for sure, when everything else is closed. */
356 static void test_MsiRecordGetString(void)
363 rec = MsiCreateRecord(2);
364 ok(rec != 0, "Expected a valid handle\n");
367 r = MsiRecordGetString(rec, 1, NULL, &sz);
368 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n",r);
369 ok(sz == 0, "Expected 0, got %d\n",sz);
372 lstrcpyA(buf, "apple");
373 r = MsiRecordGetString(rec, 1, buf, &sz);
374 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
375 ok(!lstrcmpA(buf, ""), "Expected \"\", got \"%s\"\n", buf);
376 ok(sz == 0, "Expected 0, got %d\n", sz);
379 lstrcpyA(buf, "apple");
380 r = MsiRecordGetString(rec, 10, buf, &sz);
381 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
382 ok(!lstrcmpA(buf, ""), "Expected \"\", got \"%s\"\n", buf);
383 ok(sz == 0, "Expected 0, got %d\n", sz);
387 rec = MsiCreateRecord(1);
388 ok(rec != 0, "Expected a valid handle\n");
390 r = MsiRecordSetInteger(rec, 1, 5);
391 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
394 r = MsiRecordGetString(rec, 1, NULL, &sz);
395 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n",r);
396 ok(sz == 1, "Expected 1, got %d\n",sz);
399 lstrcpyA(buf, "apple");
400 r = MsiRecordGetString(rec, 1, buf, &sz);
401 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
402 ok(!lstrcmpA(buf, "5"), "Expected \"5\", got \"%s\"\n", buf);
403 ok(sz == 1, "Expectd 1, got %d\n", sz);
405 r = MsiRecordSetInteger(rec, 1, -5);
406 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
409 lstrcpyA(buf, "apple");
410 r = MsiRecordGetString(rec, 1, buf, &sz);
411 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
412 ok(!lstrcmpA(buf, "-5"), "Expected \"-5\", got \"%s\"\n", buf);
413 ok(sz == 2, "Expectd 2, got %d\n", sz);
418 static void test_MsiRecordGetInteger(void)
424 rec = MsiCreateRecord(1);
425 ok(rec != 0, "Expected a valid handle\n");
427 r = MsiRecordSetString(rec, 1, "5");
428 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
430 val = MsiRecordGetInteger(rec, 1);
431 ok(val == 5, "Expected 5, got %d\n", val);
433 r = MsiRecordSetString(rec, 1, "-5");
434 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
436 val = MsiRecordGetInteger(rec, 1);
437 ok(val == -5, "Expected -5, got %d\n", val);
439 r = MsiRecordSetString(rec, 1, "5apple");
440 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
442 val = MsiRecordGetInteger(rec, 1);
443 ok(val == MSI_NULL_INTEGER, "Expected MSI_NULL_INTEGER, got %d\n", val);
448 static void test_fieldzero(void)
450 MSIHANDLE hdb, hview, rec;
456 rec = MsiCreateRecord(1);
457 ok(rec != 0, "Expected a valid handle\n");
459 r = MsiRecordGetInteger(rec, 0);
460 ok(r == MSI_NULL_INTEGER, "Expected MSI_NULL_INTEGER, got %d\n", r);
463 lstrcpyA(buf, "apple");
464 r = MsiRecordGetString(rec, 0, buf, &sz);
465 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
466 ok(!lstrcmpA(buf, ""), "Expected \"\", got \"%s\"\n", buf);
467 ok(sz == 0, "Expectd 0, got %d\n", sz);
469 r = MsiRecordIsNull(rec, 0);
470 ok(r == TRUE, "Expected TRUE, got %d\n", r);
472 r = MsiRecordGetInteger(rec, 1);
473 ok(r == MSI_NULL_INTEGER, "Expected MSI_NULL_INTEGER, got %d\n", r);
475 r = MsiRecordSetInteger(rec, 1, 42);
476 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
478 r = MsiRecordGetInteger(rec, 0);
479 ok(r == MSI_NULL_INTEGER, "Expected MSI_NULL_INTEGER, got %d\n", r);
482 lstrcpyA(buf, "apple");
483 r = MsiRecordGetString(rec, 0, buf, &sz);
484 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
485 ok(!lstrcmpA(buf, ""), "Expected \"\", got \"%s\"\n", buf);
486 ok(sz == 0, "Expectd 0, got %d\n", sz);
488 r = MsiRecordIsNull(rec, 0);
489 ok(r == TRUE, "Expected TRUE, got %d\n", r);
491 r = MsiRecordGetInteger(rec, 1);
492 ok(r == 42, "Expected 42, got %d\n", r);
494 r = MsiRecordSetString(rec, 1, "bologna");
495 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
497 r = MsiRecordGetInteger(rec, 0);
498 ok(r == MSI_NULL_INTEGER, "Expected MSI_NULL_INTEGER, got %d\n", r);
501 lstrcpyA(buf, "apple");
502 r = MsiRecordGetString(rec, 0, buf, &sz);
503 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
504 ok(!lstrcmpA(buf, ""), "Expected \"\", got \"%s\"\n", buf);
505 ok(sz == 0, "Expectd 0, got %d\n", sz);
507 r = MsiRecordIsNull(rec, 0);
508 ok(r == TRUE, "Expected TRUE, got %d\n", r);
511 lstrcpyA(buf, "apple");
512 r = MsiRecordGetString(rec, 1, buf, &sz);
513 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
514 ok(!lstrcmpA(buf, "bologna"), "Expected \"bologna\", got \"%s\"\n", buf);
515 ok(sz == 7, "Expectd 7, got %d\n", sz);
519 r = MsiOpenDatabase(msifile, MSIDBOPEN_CREATE, &hdb);
520 ok(r == ERROR_SUCCESS, "MsiOpenDatabase failed\n");
522 query = "CREATE TABLE `drone` ( "
523 "`id` INT, `name` CHAR(32), `number` CHAR(32) "
525 r = MsiDatabaseOpenView(hdb, query, &hview);
526 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
527 r = MsiViewExecute(hview, 0);
528 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
529 r = MsiViewClose(hview);
530 ok(r == ERROR_SUCCESS, "MsiViewClose failed\n");
531 r = MsiCloseHandle(hview);
532 ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n");
534 query = "INSERT INTO `drone` ( `id`, `name`, `number` )"
535 "VALUES('1', 'Abe', '8675309')";
536 r = MsiDatabaseOpenView(hdb, query, &hview);
537 ok(r == ERROR_SUCCESS, "MsiDatabaseOpenView failed\n");
538 r = MsiViewExecute(hview, 0);
539 ok(r == ERROR_SUCCESS, "MsiViewExecute failed\n");
540 r = MsiViewClose(hview);
541 ok(r == ERROR_SUCCESS, "MsiViewClose failed\n");
542 r = MsiCloseHandle(hview);
543 ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n");
545 r = MsiDatabaseGetPrimaryKeysA(hdb, "drone", &rec);
546 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
548 r = MsiRecordGetInteger(rec, 0);
549 ok(r == MSI_NULL_INTEGER, "Expected MSI_NULL_INTEGER, got %d\n", r);
552 lstrcpyA(buf, "apple");
553 r = MsiRecordGetString(rec, 0, buf, &sz);
554 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
555 ok(!lstrcmpA(buf, "drone"), "Expected \"drone\", got \"%s\"\n", buf);
556 ok(sz == 5, "Expectd 5, got %d\n", sz);
558 r = MsiRecordIsNull(rec, 0);
559 ok(r == FALSE, "Expected FALSE, got %d\n", r);
563 query = "SELECT * FROM `drone` WHERE `id` = 1";
564 r = MsiDatabaseOpenView(hdb, query, &hview);
565 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
566 r = MsiViewExecute(hview, 0);
567 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
568 r = MsiViewFetch(hview, &rec);
569 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
571 r = MsiRecordGetInteger(rec, 0);
572 ok(r != MSI_NULL_INTEGER && r != 0, "Expected non-NULL value, got %d\n", r);
574 r = MsiRecordIsNull(rec, 0);
575 ok(r == FALSE, "Expected FALSE, got %d\n", r);
578 DeleteFileA(msifile);
584 test_MsiRecordGetString();
585 test_MsiRecordGetInteger();