From 6b1a1579f6ea53d3c18faaedb2f1d94222c9fccf Mon Sep 17 00:00:00 2001 From: Hans Leidekker Date: Fri, 11 Jun 2010 15:20:12 +0200 Subject: [PATCH] msi: Update an existing record even if the low bit in the transform mask is set. --- dlls/msi/table.c | 95 +++++++++++++++++++++++++++----------------------- dlls/msi/tests/patch.c | 2 +- 2 files changed, 53 insertions(+), 44 deletions(-) diff --git a/dlls/msi/table.c b/dlls/msi/table.c index 3b117ae53c4..72d1f2103a5 100644 --- a/dlls/msi/table.c +++ b/dlls/msi/table.c @@ -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 ); if (rec) { - if ( mask & 1 ) - { - WCHAR table[32]; - DWORD sz = 32; - UINT number = MSI_NULL_INTEGER; - - TRACE("inserting record\n"); + WCHAR table[32]; + DWORD sz = 32; + UINT number = MSI_NULL_INTEGER; + UINT row = 0; - if (!lstrcmpW(name, szColumns)) + if (!lstrcmpW( name, szColumns )) + { + MSI_RecordGetStringW( rec, 1, table, &sz ); + number = MSI_RecordGetInteger( rec, 2 ); + + /* + * 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 ) { - MSI_RecordGetStringW( rec, 1, table, &sz ); - number = MSI_RecordGetInteger( rec, 2 ); - - /* - * 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 */ + if (lstrcmpW( coltable, table )) { - /* reset the column number on a new table */ - if ( lstrcmpW(coltable, table) ) - { - colcol = 0; - lstrcpyW( coltable, table ); - } - - /* fix nul column numbers */ - MSI_RecordSetInteger( rec, 2, ++colcol ); + colcol = 0; + lstrcpyW( coltable, table ); } + + /* 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 (TRACE_ON(msidb)) dump_record( rec ); - if ( number != MSI_NULL_INTEGER && !lstrcmpW(name, szColumns) ) - msi_update_table_columns( db, table ); - } - else + r = msi_table_find_row( tv, rec, &row ); + if (r == ERROR_SUCCESS) { - UINT row = 0; - - r = msi_table_find_row( tv, rec, &row ); - if (r != ERROR_SUCCESS) - WARN("no matching row to transform\n"); - else if ( mask ) + if (!mask) { - TRACE("modifying row [%d]:\n", row); - TABLE_set_row( &tv->view, row, rec, mask ); + TRACE("deleting row [%d]:\n", row); + 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 { - TRACE("deleting row [%d]:\n", row); - TABLE_delete_row( &tv->view, row ); + TRACE("modifying masked row [%d]:\n", 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 ); } diff --git a/dlls/msi/tests/patch.c b/dlls/msi/tests/patch.c index 4de2fd0dc26..3a35e3544eb 100644 --- a/dlls/msi/tests/patch.c +++ b/dlls/msi/tests/patch.c @@ -794,7 +794,7 @@ static void test_simple_patch( void ) ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); 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 ); MsiViewClose( hview ); -- 2.11.4.GIT