msi: Tests for transforms modifying rows in a table.

This commit is contained in:
Mike McCormack 2006-10-11 19:17:46 +09:00 committed by Alexandre Julliard
parent 5742b332fe
commit 8f56ae8b3a
1 changed files with 56 additions and 17 deletions

View File

@ -1698,18 +1698,19 @@ static void generate_transform(void)
LPCSTR query; LPCSTR query;
UINT r; UINT r;
/* create an empty database */ /* start with two identical databases */
r = MsiOpenDatabase(msifile, MSIDBOPEN_CREATE, &hdb1 ); CopyFile(msifile2, msifile, FALSE);
r = MsiOpenDatabase(msifile, MSIDBOPEN_TRANSACT, &hdb1 );
ok( r == ERROR_SUCCESS , "Failed to create database\n" ); ok( r == ERROR_SUCCESS , "Failed to create database\n" );
r = MsiDatabaseCommit( hdb1 ); r = MsiDatabaseCommit( hdb1 );
ok( r == ERROR_SUCCESS , "Failed to commit database\n" ); ok( r == ERROR_SUCCESS , "Failed to commit database\n" );
/* create another empty database */
r = MsiOpenDatabase(msifile2, MSIDBOPEN_READONLY, &hdb2 ); r = MsiOpenDatabase(msifile2, MSIDBOPEN_READONLY, &hdb2 );
ok( r == ERROR_SUCCESS , "Failed to create database\n" ); ok( r == ERROR_SUCCESS , "Failed to create database\n" );
/* the transform between two empty database should be empty */ /* the transform between two identical database should be empty */
r = MsiDatabaseGenerateTransform(hdb1, hdb2, NULL, 0, 0); r = MsiDatabaseGenerateTransform(hdb1, hdb2, NULL, 0, 0);
todo_wine { todo_wine {
ok( r == ERROR_NO_DATA, "return code %d, should be ERROR_NO_DATA\n", r ); ok( r == ERROR_NO_DATA, "return code %d, should be ERROR_NO_DATA\n", r );
@ -1727,6 +1728,10 @@ static void generate_transform(void)
r = run_query(hdb1, 0, query); r = run_query(hdb1, 0, query);
ok(r == ERROR_SUCCESS, "failed to add row 2\n"); ok(r == ERROR_SUCCESS, "failed to add row 2\n");
query = "UPDATE `MOO` SET `OOO` = 'c' WHERE `NOO` = 1";
r = run_query(hdb1, 0, query);
ok(r == ERROR_SUCCESS, "failed to add row 1\n");
/* database needs to be committed */ /* database needs to be committed */
MsiDatabaseCommit(hdb1); MsiDatabaseCommit(hdb1);
@ -1737,33 +1742,43 @@ static void generate_transform(void)
MsiCloseHandle( hdb2 ); MsiCloseHandle( hdb2 );
} }
/* data for generating a transform */
/* tables transform names - encoded as they would be in an msi database file */
static const WCHAR name1[] = { 0x4840, 0x3a8a, 0x481b, 0 }; /* AAR */ static const WCHAR name1[] = { 0x4840, 0x3a8a, 0x481b, 0 }; /* AAR */
static const WCHAR name2[] = { 0x4840, 0x3b3f, 0x43f2, 0x4438, 0x45b1, 0 }; /* _Columns */ static const WCHAR name2[] = { 0x4840, 0x3b3f, 0x43f2, 0x4438, 0x45b1, 0 }; /* _Columns */
static const WCHAR name3[] = { 0x4840, 0x3f7f, 0x4164, 0x422f, 0x4836, 0 }; /* _Tables */ static const WCHAR name3[] = { 0x4840, 0x3f7f, 0x4164, 0x422f, 0x4836, 0 }; /* _Tables */
static const WCHAR name4[] = { 0x4840, 0x3f3f, 0x4577, 0x446c, 0x3b6a, 0x45e4, 0x4824, 0 }; /* _StringData */ static const WCHAR name4[] = { 0x4840, 0x3f3f, 0x4577, 0x446c, 0x3b6a, 0x45e4, 0x4824, 0 }; /* _StringData */
static const WCHAR name5[] = { 0x4840, 0x3f3f, 0x4577, 0x446c, 0x3e6a, 0x44b2, 0x482f, 0 }; /* _StringPool */ static const WCHAR name5[] = { 0x4840, 0x3f3f, 0x4577, 0x446c, 0x3e6a, 0x44b2, 0x482f, 0 }; /* _StringPool */
static const WCHAR name6[] = { 0x4840, 0x3e16, 0x4181, 0};
/* data in each table */
static const WCHAR data1[] = { /* AAR */ static const WCHAR data1[] = { /* AAR */
0x0201, 0x0004, 0x8001, 0x0201, 0x0005, 0x8001, /* 0x0201 = add row (1), two shorts */
0x0201, 0x0005, 0x8002, 0x0201, 0x0006, 0x8002,
}; };
static const WCHAR data2[] = { /* _Columns */ static const WCHAR data2[] = { /* _Columns */
0x0401, 0x0001, 0x0000, 0x0002, 0xbdff, 0x0401, 0x0002, 0x0000, 0x0003, 0xbdff, /* 0x0401 = add row (1), 4 shorts */
0x0401, 0x0001, 0x0000, 0x0003, 0x8502, 0x0401, 0x0002, 0x0000, 0x0004, 0x8502,
}; };
static const WCHAR data3[] = { /* _Tables */ static const WCHAR data3[] = { /* _Tables */
0x0101, 0x0001, 0x0101, 0x0002, /* 0x0101 = add row (1), 1 short */
}; };
static const char data4[] = /* _StringData */ static const char data4[] = /* _StringData */
"AARCARBARvwbmw"; "cAARCARBARvwbmw"; /* all the strings squashed together */
static const WCHAR data5[] = { /* _StringPool */ static const WCHAR data5[] = { /* _StringPool */
/* len, refs */ /* len, refs */
0, 0, 0, 0, /* string 0 '' */
3, 3, /* string 1 */ 1, 1, /* string 1 'c' */
3, 1, /* string 2 */ 3, 3, /* string 2 'AAR' */
3, 1, /* string 3 */ 3, 1, /* string 3 'CAR' */
2, 1, /* string 4 */ 3, 1, /* string 4 'BAR' */
3, 1, /* string 5 */ 2, 1, /* string 5 'vw' */
3, 1, /* string 6 'bmw' */
};
/* update row, 0x0002 is a bitmask of present column data, keys are excluded */
static const WCHAR data6[] = { /* MOO */
0x0002, 0x8001, 0x0001,
}; };
static const struct { static const struct {
@ -1775,8 +1790,9 @@ static const struct {
{ name1, data1, sizeof data1 }, { name1, data1, sizeof data1 },
{ name2, data2, sizeof data2 }, { name2, data2, sizeof data2 },
{ name3, data3, sizeof data3 }, { name3, data3, sizeof data3 },
{ name4, data4, sizeof data4 }, { name4, data4, sizeof data4 - 1 },
{ name5, data5, sizeof data5 }, { name5, data5, sizeof data5 },
{ name6, data6, sizeof data6 },
}; };
#define NUM_TRANSFORM_TABLES (sizeof table_transform_data/sizeof table_transform_data[0]) #define NUM_TRANSFORM_TABLES (sizeof table_transform_data/sizeof table_transform_data[0])
@ -1836,6 +1852,18 @@ static void test_try_transform(void)
r = MsiOpenDatabase(msifile2, MSIDBOPEN_CREATE, &hdb ); r = MsiOpenDatabase(msifile2, MSIDBOPEN_CREATE, &hdb );
ok( r == ERROR_SUCCESS , "Failed to create database\n" ); ok( r == ERROR_SUCCESS , "Failed to create database\n" );
query = "CREATE TABLE `MOO` ( `NOO` SHORT NOT NULL, `OOO` CHAR(255) PRIMARY KEY `NOO`)";
r = run_query(hdb, 0, query);
ok(r == ERROR_SUCCESS, "failed to add table\n");
query = "INSERT INTO `MOO` ( `NOO`, `OOO` ) VALUES ( 1, 'a' )";
r = run_query(hdb, 0, query);
ok(r == ERROR_SUCCESS, "failed to add row 1\n");
query = "INSERT INTO `MOO` ( `NOO`, `OOO` ) VALUES ( 2, 'b' )";
r = run_query(hdb, 0, query);
ok(r == ERROR_SUCCESS, "failed to add row 1\n");
r = MsiDatabaseCommit( hdb ); r = MsiDatabaseCommit( hdb );
ok( r == ERROR_SUCCESS , "Failed to commit database\n" ); ok( r == ERROR_SUCCESS , "Failed to commit database\n" );
@ -1859,6 +1887,7 @@ static void test_try_transform(void)
MsiDatabaseCommit( hdb ); MsiDatabaseCommit( hdb );
/* check new values */
query = "select `BAR`,`CAR` from `AAR` where `BAR` = 1 AND `CAR` = 'vw'"; query = "select `BAR`,`CAR` from `AAR` where `BAR` = 1 AND `CAR` = 'vw'";
r = run_query(hdb, 0, query); r = run_query(hdb, 0, query);
ok(r == ERROR_SUCCESS, "select query failed\n"); ok(r == ERROR_SUCCESS, "select query failed\n");
@ -1867,6 +1896,16 @@ static void test_try_transform(void)
r = run_query(hdb, 0, query); r = run_query(hdb, 0, query);
ok(r == ERROR_SUCCESS, "select query failed\n"); ok(r == ERROR_SUCCESS, "select query failed\n");
/* check updated values */
query = "select `NOO`,`OOO` from `MOO` where `NOO` = 1 AND `OOO` = 'c'";
r = run_query(hdb, 0, query);
ok(r == ERROR_SUCCESS, "select query failed\n");
/* check unchanged values */
query = "select `NOO`,`OOO` from `MOO` where `NOO` = 1 AND `OOO` = 'c'";
r = run_query(hdb, 0, query);
ok(r == ERROR_SUCCESS, "select query failed\n");
MsiCloseHandle( hdb ); MsiCloseHandle( hdb );
DeleteFile(msifile); DeleteFile(msifile);