msi: Update an existing record even if the low bit in the transform mask is set.

This commit is contained in:
Hans Leidekker 2010-06-11 15:20:12 +02:00 committed by Alexandre Julliard
parent 73774b3ef8
commit 6b1a1579f6
2 changed files with 53 additions and 44 deletions

View File

@ -2742,63 +2742,72 @@ static UINT msi_table_load_transform( MSIDATABASE *db, IStorage *stg,
rec = msi_get_transform_record( tv, st, stg, &rawdata[n], bytes_per_strref ); rec = msi_get_transform_record( tv, st, stg, &rawdata[n], bytes_per_strref );
if (rec) if (rec)
{ {
if ( mask & 1 ) WCHAR table[32];
DWORD sz = 32;
UINT number = MSI_NULL_INTEGER;
UINT row = 0;
if (!lstrcmpW( name, szColumns ))
{ {
WCHAR table[32]; MSI_RecordGetStringW( rec, 1, table, &sz );
DWORD sz = 32; number = MSI_RecordGetInteger( rec, 2 );
UINT number = MSI_NULL_INTEGER;
TRACE("inserting record\n"); /*
* Native msi seems writes nul into the Number (2nd) column of
if (!lstrcmpW(name, szColumns)) * the _Columns table, only when the columns are from a new table
*/
if ( number == MSI_NULL_INTEGER )
{ {
MSI_RecordGetStringW( rec, 1, table, &sz ); /* reset the column number on a new table */
number = MSI_RecordGetInteger( rec, 2 ); if (lstrcmpW( coltable, table ))
/*
* Native msi seems writes nul into the Number (2nd) column of
* the _Columns table, only when the columns are from a new table
*/
if ( number == MSI_NULL_INTEGER )
{ {
/* reset the column number on a new table */ colcol = 0;
if ( lstrcmpW(coltable, table) ) lstrcpyW( coltable, table );
{
colcol = 0;
lstrcpyW( coltable, table );
}
/* fix nul column numbers */
MSI_RecordSetInteger( rec, 2, ++colcol );
} }
/* fix nul column numbers */
MSI_RecordSetInteger( rec, 2, ++colcol );
} }
r = TABLE_insert_row( &tv->view, rec, -1, FALSE );
if (r != ERROR_SUCCESS)
WARN("insert row failed\n");
if ( number != MSI_NULL_INTEGER && !lstrcmpW(name, szColumns) )
msi_update_table_columns( db, table );
} }
else
{
UINT row = 0;
r = msi_table_find_row( tv, rec, &row ); if (TRACE_ON(msidb)) dump_record( rec );
if (r != ERROR_SUCCESS)
WARN("no matching row to transform\n"); r = msi_table_find_row( tv, rec, &row );
else if ( mask ) if (r == ERROR_SUCCESS)
{
if (!mask)
{ {
TRACE("modifying row [%d]:\n", row); TRACE("deleting row [%d]:\n", row);
TABLE_set_row( &tv->view, row, rec, mask ); r = TABLE_delete_row( &tv->view, row );
if (r != ERROR_SUCCESS)
WARN("failed to delete row %u\n", r);
}
else if (mask & 1)
{
TRACE("modifying full row [%d]:\n", row);
r = TABLE_set_row( &tv->view, row, rec, (1 << tv->num_cols) - 1 );
if (r != ERROR_SUCCESS)
WARN("failed to modify row %u\n", r);
} }
else else
{ {
TRACE("deleting row [%d]:\n", row); TRACE("modifying masked row [%d]:\n", row);
TABLE_delete_row( &tv->view, row ); r = TABLE_set_row( &tv->view, row, rec, mask );
if (r != ERROR_SUCCESS)
WARN("failed to modify row %u\n", r);
} }
} }
if( TRACE_ON(msidb) ) dump_record( rec ); else
{
TRACE("inserting row\n");
r = TABLE_insert_row( &tv->view, rec, -1, FALSE );
if (r != ERROR_SUCCESS)
WARN("failed to insert row %u\n", r);
}
if (number != MSI_NULL_INTEGER && !lstrcmpW( name, szColumns ))
msi_update_table_columns( db, table );
msiobj_release( &rec->hdr ); msiobj_release( &rec->hdr );
} }

View File

@ -794,7 +794,7 @@ static void test_simple_patch( void )
ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r );
r = MsiViewFetch( hview, &hrec ); r = MsiViewFetch( hview, &hrec );
todo_wine ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r );
MsiCloseHandle( hrec ); MsiCloseHandle( hrec );
MsiViewClose( hview ); MsiViewClose( hview );