James Hawkins : msi: Actually delete the row data instead of blanking it out.

Alexandre Julliard julliard at winehq.org
Wed Jan 9 07:02:05 CST 2008


Module: wine
Branch: master
Commit: 4b75f33012cb382d91e396bbe3821a65e131c753
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4b75f33012cb382d91e396bbe3821a65e131c753

Author: James Hawkins <truiken at gmail.com>
Date:   Wed Jan  9 01:36:25 2008 -0700

msi: Actually delete the row data instead of blanking it out.

---

 dlls/msi/delete.c   |   11 ++---------
 dlls/msi/table.c    |    7 +++++++
 dlls/msi/tests/db.c |   14 ++++----------
 dlls/msi/where.c    |   22 +++++++++++++++++++++-
 4 files changed, 34 insertions(+), 20 deletions(-)

diff --git a/dlls/msi/delete.c b/dlls/msi/delete.c
index d315f27..8d37324 100644
--- a/dlls/msi/delete.c
+++ b/dlls/msi/delete.c
@@ -77,7 +77,6 @@ static UINT DELETE_execute( struct tagMSIVIEW *view, MSIRECORD *record )
 {
     MSIDELETEVIEW *dv = (MSIDELETEVIEW*)view;
     UINT r, i, rows = 0, cols = 0;
-    MSIRECORD *empty;
 
     TRACE("%p %p\n", dv, record);
 
@@ -92,17 +91,11 @@ static UINT DELETE_execute( struct tagMSIVIEW *view, MSIRECORD *record )
     if( r != ERROR_SUCCESS )
         return r;
 
-    TRACE("blanking %d rows\n", rows);
-
-    empty = MSI_CreateRecord( cols );
-    if (!empty)
-        return ERROR_FUNCTION_FAILED;
+    TRACE("deleting %d rows\n", rows);
 
     /* blank out all the rows that match */
     for ( i=0; i<rows; i++ )
-        dv->table->ops->set_row( dv->table, i, empty, (1<<cols)-1 );
-
-    msiobj_release( &empty->hdr );
+        dv->table->ops->delete_row( dv->table, i );
 
     return ERROR_SUCCESS;
 }
diff --git a/dlls/msi/table.c b/dlls/msi/table.c
index 2da9d2c..97f0298 100644
--- a/dlls/msi/table.c
+++ b/dlls/msi/table.c
@@ -1572,6 +1572,13 @@ static UINT TABLE_delete_row( struct tagMSIVIEW *view, UINT row )
         data = tv->table->nonpersistent_data;
     }
 
+    /* reset the hash tables */
+    for (i = 0; i < tv->num_cols; i++)
+    {
+        msi_free( tv->columns[i].hash_table );
+        tv->columns[i].hash_table = NULL;
+    }
+
     if ( row == num_rows - 1 )
         return ERROR_SUCCESS;
 
diff --git a/dlls/msi/tests/db.c b/dlls/msi/tests/db.c
index 719ea9e..a327ced 100644
--- a/dlls/msi/tests/db.c
+++ b/dlls/msi/tests/db.c
@@ -4991,7 +4991,7 @@ static void test_viewmodify_delete_temporary(void)
     DeleteFileA(msifile);
 }
 
-static void test_msidatabasecommit()
+static void test_deleterow()
 {
     MSIHANDLE hdb, hview, hrec;
     const char *query;
@@ -5040,18 +5040,12 @@ static void test_msidatabasecommit()
     size = MAX_PATH;
     r = MsiRecordGetStringA(hrec, 1, buf, &size);
     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
-    todo_wine
-    {
-        ok(!lstrcmpA(buf, "two"), "Expected two, got %s\n", buf);
-    }
+    ok(!lstrcmpA(buf, "two"), "Expected two, got %s\n", buf);
 
     MsiCloseHandle(hrec);
 
     r = MsiViewFetch(hview, &hrec);
-    todo_wine
-    {
-        ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
-    }
+    ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
 
     MsiViewClose(hview);
     MsiCloseHandle(hview);
@@ -5089,5 +5083,5 @@ START_TEST(db)
     test_defaultdatabase();
     test_order();
     test_viewmodify_delete_temporary();
-    test_msidatabasecommit();
+    test_deleterow();
 }
diff --git a/dlls/msi/where.c b/dlls/msi/where.c
index 98eaa62..e4d00c0 100644
--- a/dlls/msi/where.c
+++ b/dlls/msi/where.c
@@ -200,6 +200,26 @@ static UINT WHERE_set_row( struct tagMSIVIEW *view, UINT row, MSIRECORD *rec, UI
     return wv->table->ops->set_row( wv->table, row, rec, mask );
 }
 
+static UINT WHERE_delete_row(struct tagMSIVIEW *view, UINT row)
+{
+    MSIWHEREVIEW *wv = (MSIWHEREVIEW *)view;
+    UINT r;
+
+    TRACE("(%p %d)\n", view, row);
+
+    if ( !wv->table )
+        return ERROR_FUNCTION_FAILED;
+
+    if ( row > wv->row_count )
+        return ERROR_NO_MORE_ITEMS;
+
+    r = find_entry_in_hash( wv->reorder, row, &row );
+    if ( r != ERROR_SUCCESS )
+        return r;
+
+    return wv->table->ops->delete_row( wv->table, row );
+}
+
 static INT INT_evaluate_binary( INT lval, UINT op, INT rval )
 {
     switch( op )
@@ -549,7 +569,7 @@ static const MSIVIEWOPS where_ops =
     WHERE_get_row,
     WHERE_set_row,
     NULL,
-    NULL,
+    WHERE_delete_row,
     WHERE_execute,
     WHERE_close,
     WHERE_get_dimensions,




More information about the wine-cvs mailing list