#include "wine/test.h"
-static const char *msifile = "winetest.msi";
-static const char *msifile2 = "winetst2.msi";
-static const char *mstfile = "winetst.mst";
+static const char *msifile = "winetest-db.msi";
+static const char *msifile2 = "winetst2-db.msi";
+static const char *mstfile = "winetst-db.mst";
+static const WCHAR msifileW[] = {'w','i','n','e','t','e','s','t','-','d','b','.','m','s','i',0};
static void test_msidatabase(void)
{
r = run_query( hdb, 0, query ); \
HeapFree(GetProcessHeap(), 0, query); \
return r; \
-}
+ }
make_add_entry(component,
"INSERT INTO `Component` "
r = try_query( hdb, "select * from 'c'");
ok(r == ERROR_BAD_QUERY_SYNTAX, "query failed\n");
+ r = try_query( hdb, "CREATE TABLE `\5a` (`b` CHAR NOT NULL PRIMARY KEY `b`)" );
+ ok( r == ERROR_SUCCESS , "query failed: %u\n", r );
+
+ r = try_query( hdb, "SELECT * FROM \5a" );
+ ok( r == ERROR_SUCCESS , "query failed: %u\n", r );
+
+ r = try_query( hdb, "CREATE TABLE `a\5` (`b` CHAR NOT NULL PRIMARY KEY `b`)" );
+ ok( r == ERROR_SUCCESS , "query failed: %u\n", r );
+
+ r = try_query( hdb, "SELECT * FROM a\5" );
+ ok( r == ERROR_SUCCESS , "query failed: %u\n", r );
+
+ r = try_query( hdb, "CREATE TABLE `-a` (`b` CHAR NOT NULL PRIMARY KEY `b`)" );
+ ok( r == ERROR_SUCCESS , "query failed: %u\n", r );
+
+ r = try_query( hdb, "SELECT * FROM -a" );
+ todo_wine ok( r == ERROR_SUCCESS , "query failed: %u\n", r );
+
+ r = try_query( hdb, "CREATE TABLE `a-` (`b` CHAR NOT NULL PRIMARY KEY `b`)" );
+ ok( r == ERROR_SUCCESS , "query failed: %u\n", r );
+
+ r = try_query( hdb, "SELECT * FROM a-" );
+ ok( r == ERROR_SUCCESS , "query failed: %u\n", r );
+
r = MsiCloseHandle( hdb );
ok(r == ERROR_SUCCESS , "Failed to close database transact\n");
ok(r == ERROR_SUCCESS, "failed to set string\n");
r = MsiViewModify(hview, MSIMODIFY_UPDATE, hrec);
- ok(r == ERROR_FUNCTION_FAILED, "MsiViewModify failed\n");
+ ok(r == ERROR_FUNCTION_FAILED, "MsiViewModify failed\n");
r = MsiCloseHandle(hrec);
ok(r == ERROR_SUCCESS, "failed to close record\n");
r = MsiViewModify(hview, MSIMODIFY_INSERT_TEMPORARY, hrec );
ok(r == ERROR_SUCCESS, "MsiViewModify failed\n");
+ r = MsiCloseHandle(hrec);
+ ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n");
r = MsiViewClose(hview);
ok(r == ERROR_SUCCESS, "MsiViewClose failed\n");
r = MsiCloseHandle(hview);
{
MsiViewGetColumnInfo( hview, type, &rec );
}
- MsiViewClose(hview);
+ MsiViewClose(hview);
MsiCloseHandle(hview);
return rec;
}
MsiCloseHandle( rec );
}
}
- MsiViewClose(hview);
+ MsiViewClose(hview);
MsiCloseHandle(hview);
return type;
}
CloseHandle(file);
}
-
+
#define create_file(name) create_file_data(name, name, 0)
static void test_streamtable(void)
{
- MSIHANDLE hdb = 0, rec, view;
+ MSIHANDLE hdb = 0, rec, view, hsi;
char file[MAX_PATH];
char buf[MAX_PATH];
DWORD size;
MsiCloseHandle( rec );
+ r = MsiDatabaseOpenView( hdb,
+ "SELECT * FROM `_Streams` WHERE `Name` = '\5SummaryInformation'", &view );
+ ok( r == ERROR_SUCCESS, "Failed to open database view: %u\n", r );
+
+ r = MsiViewExecute( view, 0 );
+ ok( r == ERROR_SUCCESS, "Failed to execute view: %u\n", r );
+
+ r = MsiViewFetch( view, &rec );
+ ok( r == ERROR_NO_MORE_ITEMS, "Unexpected result: %u\n", r );
+
+ MsiCloseHandle( rec );
+ MsiViewClose( view );
+ MsiCloseHandle( view );
+
+ /* create a summary information stream */
+ r = MsiGetSummaryInformationA( hdb, NULL, 1, &hsi );
+ ok( r == ERROR_SUCCESS, "Failed to get summary information handle: %u\n", r );
+
+ r = MsiSummaryInfoSetPropertyA( hsi, PID_SECURITY, VT_I4, 2, NULL, NULL );
+ ok( r == ERROR_SUCCESS, "Failed to set property: %u\n", r );
+
+ r = MsiSummaryInfoPersist( hsi );
+ ok( r == ERROR_SUCCESS, "Failed to save summary information: %u\n", r );
+
+ MsiCloseHandle( hsi );
+
+ r = MsiDatabaseOpenView( hdb,
+ "SELECT * FROM `_Streams` WHERE `Name` = '\5SummaryInformation'", &view );
+ ok( r == ERROR_SUCCESS, "Failed to open database view: %u\n", r );
+
+ r = MsiViewExecute( view, 0 );
+ ok( r == ERROR_SUCCESS, "Failed to execute view: %u\n", r );
+
+ r = MsiViewFetch( view, &rec );
+ ok( r == ERROR_SUCCESS, "Unexpected result: %u\n", r );
+
+ MsiCloseHandle( rec );
+ MsiViewClose( view );
+ MsiCloseHandle( view );
+
/* insert a file into the _Streams table */
create_file( "test.txt" );
MsiViewClose( view );
MsiCloseHandle( view );
+ /* insert another one */
+ create_file( "test1.txt" );
+
+ rec = MsiCreateRecord( 2 );
+ MsiRecordSetString( rec, 1, "data1" );
+
+ r = MsiRecordSetStream( rec, 2, "test1.txt" );
+ ok( r == ERROR_SUCCESS, "Failed to add stream data to the record: %d\n", r);
+
+ DeleteFile("test1.txt");
+
+ r = MsiDatabaseOpenView( hdb,
+ "INSERT INTO `_Streams` ( `Name`, `Data` ) VALUES ( ?, ? )", &view );
+ ok( r == ERROR_SUCCESS, "Failed to open database view: %d\n", r);
+
+ r = MsiViewExecute( view, rec );
+ ok( r == ERROR_SUCCESS, "Failed to execute view: %d\n", r);
+
+ MsiCloseHandle( rec );
+ MsiViewClose( view );
+ MsiCloseHandle( view );
+
r = MsiDatabaseOpenView( hdb,
- "SELECT `Name`, `Data` FROM `_Streams`", &view );
+ "SELECT `Name`, `Data` FROM `_Streams` WHERE `Name` = 'data'", &view );
ok( r == ERROR_SUCCESS, "Failed to open database view: %d\n", r);
r = MsiViewExecute( view, 0 );
ok( !lstrcmp(buf, "test.txt\n"), "Expected 'test.txt\\n', got %s\n", buf);
MsiCloseHandle( rec );
+ MsiViewClose( view );
+ MsiCloseHandle( view );
+
+ r = MsiDatabaseOpenView( hdb,
+ "SELECT `Name`, `Data` FROM `_Streams` WHERE `Name` = 'data1'", &view );
+ ok( r == ERROR_SUCCESS, "Failed to open database view: %d\n", r);
+
+ r = MsiViewExecute( view, 0 );
+ ok( r == ERROR_SUCCESS, "Failed to execute view: %d\n", r);
r = MsiViewFetch( view, &rec );
- ok( r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
+ ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+
+ size = MAX_PATH;
+ r = MsiRecordGetString( rec, 1, file, &size );
+ ok( r == ERROR_SUCCESS, "Failed to get string: %d\n", r);
+ ok( !lstrcmp(file, "data1"), "Expected 'data1', got %s\n", file);
+
+ size = MAX_PATH;
+ memset(buf, 0, MAX_PATH);
+ r = MsiRecordReadStream( rec, 2, buf, &size );
+ ok( r == ERROR_SUCCESS, "Failed to get stream: %d\n", r);
+ ok( !lstrcmp(buf, "test1.txt\n"), "Expected 'test1.txt\\n', got %s\n", buf);
+
+ MsiCloseHandle( rec );
+ MsiViewClose( view );
+ MsiCloseHandle( view );
+ /* perform an update */
+ create_file( "test2.txt" );
+ rec = MsiCreateRecord( 1 );
+
+ r = MsiRecordSetStream( rec, 1, "test2.txt" );
+ ok( r == ERROR_SUCCESS, "Failed to add stream data to the record: %d\n", r);
+
+ DeleteFile("test2.txt");
+
+ r = MsiDatabaseOpenView( hdb,
+ "UPDATE `_Streams` SET `Data` = ? WHERE `Name` = 'data1'", &view );
+ ok( r == ERROR_SUCCESS, "Failed to open database view: %d\n", r);
+
+ r = MsiViewExecute( view, rec );
+ ok( r == ERROR_SUCCESS, "Failed to execute view: %d\n", r);
+
+ MsiCloseHandle( rec );
+ MsiViewClose( view );
+ MsiCloseHandle( view );
+
+ r = MsiDatabaseOpenView( hdb,
+ "SELECT `Name`, `Data` FROM `_Streams` WHERE `Name` = 'data1'", &view );
+ ok( r == ERROR_SUCCESS, "Failed to open database view: %d\n", r);
+
+ r = MsiViewExecute( view, 0 );
+ ok( r == ERROR_SUCCESS, "Failed to execute view: %d\n", r);
+
+ r = MsiViewFetch( view, &rec );
+ ok( r == ERROR_SUCCESS, "Failed to fetch record: %d\n", r);
+
+ size = MAX_PATH;
+ r = MsiRecordGetString( rec, 1, file, &size );
+ ok( r == ERROR_SUCCESS, "Failed to get string: %d\n", r);
+ ok( !lstrcmp(file, "data1"), "Expected 'data1', got %s\n", file);
+
+ size = MAX_PATH;
+ memset(buf, 0, MAX_PATH);
+ r = MsiRecordReadStream( rec, 2, buf, &size );
+ ok( r == ERROR_SUCCESS, "Failed to get stream: %d\n", r);
+ todo_wine ok( !lstrcmp(buf, "test2.txt\n"), "Expected 'test2.txt\\n', got %s\n", buf);
+
+ MsiCloseHandle( rec );
MsiViewClose( view );
MsiCloseHandle( view );
MsiCloseHandle( hdb );
ok( r == ERROR_SUCCESS, "query failed: %d\n", r );
MsiCloseHandle( rec );
+ rec = 0;
+ query = "SELECT * FROM `Media` WHERE `DiskPrompt` < 'Cabinet'";
+ r = do_query(hdb, query, &rec);
+ ok( r == ERROR_BAD_QUERY_SYNTAX, "query failed: %d\n", r );
+ MsiCloseHandle( rec );
+
+ rec = 0;
+ query = "SELECT * FROM `Media` WHERE `DiskPrompt` > 'Cabinet'";
+ r = do_query(hdb, query, &rec);
+ ok( r == ERROR_BAD_QUERY_SYNTAX, "query failed: %d\n", r );
+ MsiCloseHandle( rec );
+
+ rec = 0;
+ query = "SELECT * FROM `Media` WHERE `DiskPrompt` <> 'Cabinet'";
+ r = do_query(hdb, query, &rec);
+ todo_wine ok( r == ERROR_SUCCESS, "query failed: %d\n", r );
+ MsiCloseHandle( rec );
+
+ rec = 0;
+ query = "SELECT * FROM `Media` WHERE `DiskPrompt` = 'Cabinet'";
+ r = do_query(hdb, query, &rec);
+ ok( r == ERROR_NO_MORE_ITEMS, "query failed: %d\n", r );
+ MsiCloseHandle( rec );
+
rec = MsiCreateRecord(1);
MsiRecordSetString(rec, 1, "");
ok( r == ERROR_BAD_QUERY_SYNTAX,
"Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r );
+ /* try updating a row in a join table */
+ query = "SELECT `Component`.`ComponentId`, `FeatureComponents`.`Feature_` "
+ "FROM `Component`, `FeatureComponents` "
+ "WHERE `Component`.`Component` = `FeatureComponents`.`Component_` "
+ "ORDER BY `Feature_`";
+ r = MsiDatabaseOpenView(hdb, query, &hview);
+ ok( r == ERROR_SUCCESS, "failed to open view: %d\n", r );
+
+ r = MsiViewExecute(hview, 0);
+ ok( r == ERROR_SUCCESS, "failed to execute view: %d\n", r );
+
+ r = MsiViewFetch(hview, &hrec);
+ ok( r == ERROR_SUCCESS, "failed to fetch view: %d\n", r );
+
+ r = MsiRecordSetString( hrec, 1, "epicranius" );
+ ok( r == ERROR_SUCCESS, "failed to set string: %d\n", r );
+
+ r = MsiViewModify(hview, MSIMODIFY_UPDATE, hrec);
+ ok( r == ERROR_SUCCESS, "failed to update row: %d\n", r );
+
+ /* try another valid operation for joins */
+ r = MsiViewModify(hview, MSIMODIFY_REFRESH, hrec);
+ todo_wine ok( r == ERROR_SUCCESS, "failed to refresh row: %d\n", r );
+
+ /* try an invalid operation for joins */
+ r = MsiViewModify(hview, MSIMODIFY_DELETE, hrec);
+ ok( r == ERROR_FUNCTION_FAILED, "unexpected result: %d\n", r );
+
+ r = MsiRecordSetString( hrec, 2, "epicranius" );
+ ok( r == ERROR_SUCCESS, "failed to set string: %d\n", r );
+
+ /* primary key cannot be updated */
+ r = MsiViewModify(hview, MSIMODIFY_UPDATE, hrec);
+ todo_wine ok( r == ERROR_FUNCTION_FAILED, "failed to update row: %d\n", r );
+
+ MsiCloseHandle(hrec);
+ MsiViewClose(hview);
+ MsiCloseHandle(hview);
+
+ r = MsiDatabaseOpenView(hdb, query, &hview);
+ ok(r == ERROR_SUCCESS, "MsiDatabaseOpenView failed\n");
+
+ r = MsiViewExecute(hview, 0);
+ ok(r == ERROR_SUCCESS, "MsiViewExecute failed\n");
+
+ r = MsiViewFetch(hview, &hrec);
+ ok(r == ERROR_SUCCESS, "MsiViewFetch failed\n");
+
+ size = MAX_PATH;
+ r = MsiRecordGetString( hrec, 1, buf, &size );
+ ok( r == ERROR_SUCCESS, "failed to get record string: %d\n", r );
+ ok( !lstrcmp( buf, "epicranius" ), "expected 'epicranius', got %s\n", buf );
+
+ MsiCloseHandle(hrec);
+ MsiViewClose(hview);
+ MsiCloseHandle(hview);
+
MsiCloseHandle(hdb);
DeleteFile(msifile);
}
ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
ok(stm != NULL, "Expected non-NULL stream\n");
+ CoTaskMemFree(stat.pwcsName);
+
sz = MAX_PATH;
memset(data, 'a', MAX_PATH);
hr = IStream_Read(stm, data, sz, &count);
MSIHANDLE hdb;
IStorage *stg = NULL;
- static const WCHAR msifileW[] = {'w','i','n','e','t','e','s','t','.','m','s','i',0};
-
DeleteFile(msifile);
r = MsiOpenDatabase(msifile, MSIDBOPEN_CREATE, &hdb);
query = "INSERT INTO `Table` ( `A` ) VALUES ( 'This is a ''string'' ok' )";
r = run_query(hdb, 0, query);
- ok(r == ERROR_BAD_QUERY_SYNTAX, "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r);
+ ok(r == ERROR_BAD_QUERY_SYNTAX, "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r);
query = "INSERT INTO `Table` ( `A` ) VALUES ( 'This is a '''string''' ok' )";
r = run_query(hdb, 0, query);
size = MAX_PATH;
r = MsiRecordGetString(hrec, 1, buf, &size);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
- ok(!lstrcmp(buf, "This is a \"string\" ok"),
- "Expected \"This is a \"string\" ok\", got %s\n", buf);
+ ok(!lstrcmp(buf, "This is a \"string\" ok"),
+ "Expected \"This is a \"string\" ok\", got %s\n", buf);
MsiCloseHandle(hrec);
r = MsiViewFetch(hview, &hrec);
- ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
+ ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
MsiViewClose(hview);
MsiCloseHandle(hview);
query = "CREATE TABLE `Table`\r ( `A` CHAR(72) NOT NULL PRIMARY KEY `A` )";
r = run_query(hdb, 0, query);
- ok(r == ERROR_BAD_QUERY_SYNTAX,
- "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r);
+ ok(r == ERROR_BAD_QUERY_SYNTAX,
+ "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r);
query = "CREATE TABLE `Table` \r( `A` CHAR(72) NOT NULL PRIMARY KEY `A` )";
r = run_query(hdb, 0, query);
query = "CREATE TABLE `Four` ( `A` CHAR(72\r) NOT NULL PRIMARY KEY `A` )";
r = run_query(hdb, 0, query);
- ok(r == ERROR_BAD_QUERY_SYNTAX,
- "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r);
+ ok(r == ERROR_BAD_QUERY_SYNTAX,
+ "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r);
query = "CREATE TABLE `Four` ( `A` CHAR(\r72) NOT NULL PRIMARY KEY `A` )";
r = run_query(hdb, 0, query);
size = MAX_PATH;
r = MsiRecordGetStringA(hrec, 1, buf, &size);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
- ok(!lstrcmpA(buf, "\rOne"), "Expected \"\\rOne\", got \"%s\"\n", buf);
+ ok(!lstrcmpA(buf, "\rOne"), "Expected \"\\rOne\", got \"%s\"\n", buf);
MsiCloseHandle(hrec);
size = MAX_PATH;
r = MsiRecordGetStringA(hrec, 1, buf, &size);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
- ok(!lstrcmpA(buf, "Tw\ro"), "Expected \"Tw\\ro\", got \"%s\"\n", buf);
+ ok(!lstrcmpA(buf, "Tw\ro"), "Expected \"Tw\\ro\", got \"%s\"\n", buf);
MsiCloseHandle(hrec);
/* check the column types */
hrec = get_column_info(hdb, "SELECT * FROM `_Storages`", MSICOLINFO_TYPES);
ok(hrec, "failed to get column info hrecord\n");
- ok(check_record(hrec, 1, "s62"), "wrong hrecord type\n");
- ok(check_record(hrec, 2, "V0"), "wrong hrecord type\n");
+ ok(check_record(hrec, 1, "s62"), "wrong hrecord type\n");
+ ok(check_record(hrec, 2, "V0"), "wrong hrecord type\n");
MsiCloseHandle(hrec);
/* now try the names */
hrec = get_column_info(hdb, "SELECT * FROM `_Storages`", MSICOLINFO_NAMES);
ok(hrec, "failed to get column info hrecord\n");
- ok(check_record(hrec, 1, "Name"), "wrong hrecord type\n");
- ok(check_record(hrec, 2, "Data"), "wrong hrecord type\n");
+ ok(check_record(hrec, 1, "Name"), "wrong hrecord type\n");
+ ok(check_record(hrec, 2, "Data"), "wrong hrecord type\n");
MsiCloseHandle(hrec);
query = "INSERT INTO `_Storages` (`Name`, `Data`) VALUES (?, ?)";
r = MsiDatabaseOpenView(hdb, query, &hview);
- ok(r == ERROR_SUCCESS, "Failed to open database hview: %d\n", r);
+ ok(r == ERROR_SUCCESS, "Failed to open database hview: %d\n", r);
r = MsiViewExecute(hview, hrec);
- ok(r == ERROR_SUCCESS, "Failed to execute hview: %d\n", r);
+ ok(r == ERROR_SUCCESS, "Failed to execute hview: %d\n", r);
MsiCloseHandle(hrec);
MsiViewClose(hview);
query = "SELECT `Name`, `Data` FROM `_Storages`";
r = MsiDatabaseOpenView(hdb, query, &hview);
- ok(r == ERROR_SUCCESS, "Failed to open database hview: %d\n", r);
+ ok(r == ERROR_SUCCESS, "Failed to open database hview: %d\n", r);
r = MsiViewExecute(hview, 0);
- ok(r == ERROR_SUCCESS, "Failed to execute hview: %d\n", r);
+ ok(r == ERROR_SUCCESS, "Failed to execute hview: %d\n", r);
r = MsiViewFetch(hview, &hrec);
- ok(r == ERROR_SUCCESS, "Failed to fetch hrecord: %d\n", r);
+ ok(r == ERROR_SUCCESS, "Failed to fetch hrecord: %d\n", r);
size = MAX_PATH;
r = MsiRecordGetString(hrec, 1, file, &size);
- ok(r == ERROR_SUCCESS, "Failed to get string: %d\n", r);
+ ok(r == ERROR_SUCCESS, "Failed to get string: %d\n", r);
ok(!lstrcmp(file, "stgname"), "Expected \"stgname\", got \"%s\"\n", file);
size = MAX_PATH;