diff --git a/dlls/msi/table.c b/dlls/msi/table.c index 745712a1f184d2dfb4d4f55db7428ce259f7b391..533381714eb3e30794f7bcb3a3eb4416882f5b10 100644 --- a/dlls/msi/table.c +++ b/dlls/msi/table.c @@ -1532,6 +1532,29 @@ static UINT TABLE_delete_row( struct tagMSIVIEW *view, UINT row ) return ERROR_SUCCESS; } +static UINT msi_table_update(struct tagMSIVIEW *view, MSIRECORD *rec) +{ + MSITABLEVIEW *tv = (MSITABLEVIEW *)view; + UINT r, row; + + /* FIXME: MsiViewFetch should set rec index 0 to some ID that + * sets the fetched record apart from other records + */ + + if (!tv->table) + return ERROR_INVALID_PARAMETER; + + r = msi_table_find_row(tv, rec, &row); + if (r != ERROR_SUCCESS) + return ERROR_SUCCESS; + + /* the row cannot be changed */ + if (row != 0) + return ERROR_FUNCTION_FAILED; + + return TABLE_set_row(view, row, rec, (1 << tv->num_cols) - 1); +} + static UINT TABLE_modify( struct tagMSIVIEW *view, MSIMODIFY eModifyMode, MSIRECORD *rec) { @@ -1553,9 +1576,12 @@ static UINT TABLE_modify( struct tagMSIVIEW *view, MSIMODIFY eModifyMode, r = TABLE_insert_row( view, rec, TRUE ); break; + case MSIMODIFY_UPDATE: + r = msi_table_update( view, rec ); + break; + case MSIMODIFY_REFRESH: case MSIMODIFY_INSERT: - case MSIMODIFY_UPDATE: case MSIMODIFY_ASSIGN: case MSIMODIFY_REPLACE: case MSIMODIFY_MERGE: diff --git a/dlls/msi/tests/db.c b/dlls/msi/tests/db.c index 1cb8ce6ba718db305aaf55692f8be843c0e3491d..5b011897a6107a6c86b54d62f691364a67df9dbb 100644 --- a/dlls/msi/tests/db.c +++ b/dlls/msi/tests/db.c @@ -832,17 +832,11 @@ static void test_viewmodify(void) ok(r == ERROR_SUCCESS, "MsiRecordSetString failed\n"); r = MsiViewModify(hview, MSIMODIFY_UPDATE, hrec); - todo_wine - { - ok(r == ERROR_SUCCESS, "MsiViewModify failed\n"); - } + ok(r == ERROR_SUCCESS, "MsiViewModify failed\n"); /* do it again */ r = MsiViewModify(hview, MSIMODIFY_UPDATE, hrec); - todo_wine - { - ok(r == ERROR_SUCCESS, "MsiViewModify failed: %d\n", r); - } + ok(r == ERROR_SUCCESS, "MsiViewModify failed: %d\n", r); /* update the view, primary key */ r = MsiRecordSetInteger(hrec, 1, 5); @@ -883,10 +877,7 @@ static void test_viewmodify(void) sz = sizeof(buffer); r = MsiRecordGetString(hrec, 3, buffer, &sz); ok(r == ERROR_SUCCESS, "MsiRecordGetString failed\n"); - todo_wine - { - ok(!lstrcmp(buffer, "3141592"), "Expected 3141592, got %s\n", buffer); - } + ok(!lstrcmp(buffer, "3141592"), "Expected 3141592, got %s\n", buffer); r = MsiCloseHandle(hrec); ok(r == ERROR_SUCCESS, "failed to close record\n"); @@ -965,10 +956,7 @@ static void test_viewmodify(void) ok(r == ERROR_SUCCESS, "failed to set string\n"); r = MsiViewModify(hview, MSIMODIFY_UPDATE, hrec); - todo_wine - { - ok(r == ERROR_FUNCTION_FAILED, "MsiViewModify failed\n"); - } + ok(r == ERROR_FUNCTION_FAILED, "MsiViewModify failed\n"); r = MsiCloseHandle(hrec); ok(r == ERROR_SUCCESS, "failed to close record\n"); @@ -993,10 +981,7 @@ static void test_viewmodify(void) ok(r == ERROR_SUCCESS, "failed to set string\n"); r = MsiViewModify(hview, MSIMODIFY_UPDATE, hrec); - todo_wine - { - ok(r == ERROR_FUNCTION_FAILED, "MsiViewModify failed\n"); - } + ok(r == ERROR_FUNCTION_FAILED, "MsiViewModify failed\n"); r = MsiCloseHandle(hrec); ok(r == ERROR_SUCCESS, "failed to close record\n");