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