msi: Update an existing record even if the low bit in the transform mask is set.
This commit is contained in:
parent
73774b3ef8
commit
6b1a1579f6
|
@ -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 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
Loading…
Reference in New Issue