From 599b30833acb4fcda84e8e4272b61e2e47a504a6 Mon Sep 17 00:00:00 2001 From: David Hedberg Date: Thu, 10 Mar 2011 02:20:56 +0100 Subject: [PATCH] msi: Use ordering information to update the correct row. --- dlls/msi/table.c | 3 ++ dlls/msi/tests/db.c | 85 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+) diff --git a/dlls/msi/table.c b/dlls/msi/table.c index bc05987767c..80fe3ee51f3 100644 --- a/dlls/msi/table.c +++ b/dlls/msi/table.c @@ -1776,6 +1776,9 @@ static UINT msi_table_update(struct tagMSIVIEW *view, MSIRECORD *rec, UINT row) if (row != new_row + 1) return ERROR_FUNCTION_FAILED; + if(tv->order) + new_row = tv->order->reorder[new_row]; + return TABLE_set_row(view, new_row, rec, (1 << tv->num_cols) - 1); } diff --git a/dlls/msi/tests/db.c b/dlls/msi/tests/db.c index de2b9f5a340..06bd8d16800 100644 --- a/dlls/msi/tests/db.c +++ b/dlls/msi/tests/db.c @@ -5266,6 +5266,7 @@ static void test_select_markers(void) static void test_viewmodify_update(void) { MSIHANDLE hdb = 0, hview = 0, hrec = 0; + UINT i, test_max, offset, count; const char *query; UINT r; @@ -5432,6 +5433,90 @@ static void test_viewmodify_update(void) r = MsiCloseHandle(hview); ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n"); + query = "CREATE TABLE `table2` (`A` INT, `B` INT PRIMARY KEY `A`)"; + r = run_query( hdb, 0, query ); + ok(r == ERROR_SUCCESS, "query failed\n"); + + query = "INSERT INTO `table2` (`A`, `B`) VALUES (?, ?)"; + r = MsiDatabaseOpenView( hdb, query, &hview ); + ok(r == ERROR_SUCCESS, "MsiDatabaseOpenView failed\n"); + + test_max = 100; + offset = 1234; + for(i = 0; i < test_max; i++) + { + + hrec = MsiCreateRecord( 2 ); + MsiRecordSetInteger( hrec, 1, test_max - i ); + MsiRecordSetInteger( hrec, 2, i ); + + r = MsiViewExecute( hview, hrec ); + ok(r == ERROR_SUCCESS, "Got %d\n", r); + + r = MsiCloseHandle( hrec ); + ok(r == ERROR_SUCCESS, "Got %d\n", r); + } + + r = MsiViewClose( hview ); + ok(r == ERROR_SUCCESS, "Got %d\n", r); + r = MsiCloseHandle( hview ); + ok(r == ERROR_SUCCESS, "Got %d\n", r); + + /* Update. */ + query = "SELECT * FROM `table2` ORDER BY `B`"; + r = MsiDatabaseOpenView( hdb, query, &hview); + ok(r == ERROR_SUCCESS, "MsiDatabaseOpenView failed\n"); + r = MsiViewExecute( hview, 0 ); + ok(r == ERROR_SUCCESS, "MsiViewExecute failed\n"); + + count = 0; + while (MsiViewFetch( hview, &hrec ) == ERROR_SUCCESS) + { + UINT b = MsiRecordGetInteger( hrec, 2 ); + + r = MsiRecordSetInteger( hrec, 2, b + offset); + ok(r == ERROR_SUCCESS, "Got %d\n", r); + + r = MsiViewModify( hview, MSIMODIFY_UPDATE, hrec ); + ok(r == ERROR_SUCCESS, "Got %d\n", r); + + r = MsiCloseHandle(hrec); + ok(r == ERROR_SUCCESS, "failed to close record\n"); + count++; + } + ok(count == test_max, "Got count %d\n", count); + + r = MsiViewClose(hview); + ok(r == ERROR_SUCCESS, "MsiViewClose failed\n"); + r = MsiCloseHandle(hview); + ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n"); + + /* Recheck. */ + query = "SELECT * FROM `table2` ORDER BY `B`"; + r = MsiDatabaseOpenView( hdb, query, &hview); + ok(r == ERROR_SUCCESS, "MsiDatabaseOpenView failed\n"); + r = MsiViewExecute( hview, 0 ); + ok(r == ERROR_SUCCESS, "MsiViewExecute failed\n"); + + count = 0; + while (MsiViewFetch( hview, &hrec ) == ERROR_SUCCESS) + { + UINT a = MsiRecordGetInteger( hrec, 1 ); + UINT b = MsiRecordGetInteger( hrec, 2 ); + ok( ( test_max - a + offset) == b, "Got (%d, %d), expected (%d, %d)\n", + a, b, test_max - a + offset, b); + + r = MsiCloseHandle(hrec); + ok(r == ERROR_SUCCESS, "failed to close record\n"); + count++; + } + ok(count == test_max, "Got count %d\n", count); + + r = MsiViewClose(hview); + ok(r == ERROR_SUCCESS, "MsiViewClose failed\n"); + r = MsiCloseHandle(hview); + ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n"); + r = MsiCloseHandle( hdb ); ok(r == ERROR_SUCCESS, "MsiOpenDatabase close failed\n"); }