Hans Leidekker : msi: Update an existing record even if the low bit in the transform mask is set .
Alexandre Julliard
julliard at winehq.org
Fri Jun 11 09:58:34 CDT 2010
Module: wine
Branch: master
Commit: 6b1a1579f6ea53d3c18faaedb2f1d94222c9fccf
URL: http://source.winehq.org/git/wine.git/?a=commit;h=6b1a1579f6ea53d3c18faaedb2f1d94222c9fccf
Author: Hans Leidekker <hans at codeweavers.com>
Date: Fri Jun 11 15:20:12 2010 +0200
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 3b117ae..72d1f21 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 4de2fd0..3a35e35 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 );
More information about the wine-cvs
mailing list