James Hawkins : msi: Implement the MSIMODIFY_REFRESH command of MsiViewModify.

Alexandre Julliard julliard at winehq.org
Mon Feb 18 08:50:36 CST 2008


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

Author: James Hawkins <truiken at gmail.com>
Date:   Wed Feb 13 23:36:44 2008 -0600

msi: Implement the MSIMODIFY_REFRESH command of MsiViewModify.

---

 dlls/msi/table.c            |   22 +++++++++++++++++++++-
 dlls/msi/tests/automation.c |    4 +---
 dlls/msi/tests/db.c         |   20 ++++----------------
 dlls/msi/where.c            |   12 +++++++++---
 4 files changed, 35 insertions(+), 23 deletions(-)

diff --git a/dlls/msi/table.c b/dlls/msi/table.c
index c7fbcc2..69108ef 100644
--- a/dlls/msi/table.c
+++ b/dlls/msi/table.c
@@ -1626,6 +1626,23 @@ static UINT modify_delete_row( struct tagMSIVIEW *view, MSIRECORD *rec )
     return TABLE_delete_row(view, row);
 }
 
+static UINT msi_refresh_record( struct tagMSIVIEW *view, MSIRECORD *rec, UINT row )
+{
+    MSIRECORD *curr;
+    UINT r, i, count;
+
+    r = TABLE_get_row(view, row - 1, &curr);
+    if (r != ERROR_SUCCESS)
+        return r;
+
+    count = MSI_RecordGetFieldCount(rec);
+    for (i = 0; i < count; i++)
+        MSI_RecordCopyField(curr, i + 1, rec, i + 1);
+
+    msiobj_release(&curr->hdr);
+    return ERROR_SUCCESS;
+}
+
 static UINT TABLE_modify( struct tagMSIVIEW *view, MSIMODIFY eModifyMode,
                           MSIRECORD *rec, UINT row)
 {
@@ -1657,11 +1674,14 @@ static UINT TABLE_modify( struct tagMSIVIEW *view, MSIMODIFY eModifyMode,
         r = TABLE_insert_row( view, rec, TRUE );
         break;
 
+    case MSIMODIFY_REFRESH:
+        r = msi_refresh_record( view, rec, row );
+        break;
+
     case MSIMODIFY_UPDATE:
         r = msi_table_update( view, rec, row );
         break;
 
-    case MSIMODIFY_REFRESH:
     case MSIMODIFY_ASSIGN:
     case MSIMODIFY_REPLACE:
     case MSIMODIFY_MERGE:
diff --git a/dlls/msi/tests/automation.c b/dlls/msi/tests/automation.c
index 8cf764e..c5d44f5 100644
--- a/dlls/msi/tests/automation.c
+++ b/dlls/msi/tests/automation.c
@@ -1527,10 +1527,8 @@ static void test_Database(IDispatch *pDatabase, BOOL readonly)
             ok(hr == DISP_E_EXCEPTION, "View_Modify failed, hresult 0x%08x\n", hr);
             ok_exception(hr, szModifyModeRecord);
 
-            /* View::Modify with MSIMODIFY_REFRESH should undo our changes */
             hr = View_Modify(pView, MSIMODIFY_REFRESH, pRecord);
-            /* Wine's MsiViewModify currently does not support MSIMODIFY_REFRESH */
-            todo_wine ok(hr == S_OK, "View_Modify failed, hresult 0x%08x\n", hr);
+            ok(hr == S_OK, "View_Modify failed, hresult 0x%08x\n", hr);
 
             /* Record::StringDataGet, confirm that the record is back to its unmodified value */
             memset(szString, 0, sizeof(szString));
diff --git a/dlls/msi/tests/db.c b/dlls/msi/tests/db.c
index d6eed20..ebcdc77 100644
--- a/dlls/msi/tests/db.c
+++ b/dlls/msi/tests/db.c
@@ -5762,10 +5762,7 @@ static void test_viewmodify_refresh(void)
     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
 
     r = MsiViewModify(hview, MSIMODIFY_REFRESH, hrec);
-    todo_wine
-    {
-        ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
-    }
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
 
     size = MAX_PATH;
     r = MsiRecordGetStringA(hrec, 1, buffer, &size);
@@ -5774,10 +5771,7 @@ static void test_viewmodify_refresh(void)
     ok(size == 2, "Expected 2, got %d\n", size);
 
     r = MsiRecordGetInteger(hrec, 2);
-    todo_wine
-    {
-        ok(r == 2, "Expected 2, got %d\n", r);
-    }
+    ok(r == 2, "Expected 2, got %d\n", r);
 
     MsiCloseHandle(hrec);
     MsiViewClose(hview);
@@ -5805,10 +5799,7 @@ static void test_viewmodify_refresh(void)
     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
 
     r = MsiViewModify(hview, MSIMODIFY_REFRESH, hrec);
-    todo_wine
-    {
-        ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
-    }
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
 
     size = MAX_PATH;
     r = MsiRecordGetStringA(hrec, 1, buffer, &size);
@@ -5817,10 +5808,7 @@ static void test_viewmodify_refresh(void)
     ok(size == 5, "Expected 5, got %d\n", size);
 
     r = MsiRecordGetInteger(hrec, 2);
-    todo_wine
-    {
-        ok(r == 2, "Expected 2, got %d\n", r);
-    }
+    ok(r == 2, "Expected 2, got %d\n", r);
 
     MsiCloseHandle(hrec);
     MsiViewClose(hview);
diff --git a/dlls/msi/where.c b/dlls/msi/where.c
index e4d00c0..c12f7a4 100644
--- a/dlls/msi/where.c
+++ b/dlls/msi/where.c
@@ -503,11 +503,17 @@ static UINT WHERE_modify( struct tagMSIVIEW *view, MSIMODIFY eModifyMode,
                           MSIRECORD *rec, UINT row )
 {
     MSIWHEREVIEW *wv = (MSIWHEREVIEW*)view;
+    UINT r;
 
-    TRACE("%p %d %p\n", wv, eModifyMode, rec );
+    TRACE("%p %d %p\n", wv, eModifyMode, rec);
 
-    if( !wv->table )
-         return ERROR_FUNCTION_FAILED;
+    r = WHERE_execute(view, NULL);
+    if (r != ERROR_SUCCESS)
+        return r;
+
+    r = find_entry_in_hash(wv->reorder, row - 1, &row);
+    if (r != ERROR_SUCCESS)
+        return r;
 
     return wv->table->ops->modify( wv->table, eModifyMode, rec, row );
 }




More information about the wine-cvs mailing list