Module: wine Branch: master Commit: f6ae2507ef8038789923c9bf7142d3cd72c9526e URL: http://source.winehq.org/git/wine.git/?a=commit;h=f6ae2507ef8038789923c9bf71...
Author: Hib Eris hib@hiberis.nl Date: Tue Oct 20 14:29:54 2009 +0200
msi: Fix table rows order.
---
dlls/msi/table.c | 42 ++++++++++++++++++++++++++++++++++++++++++ dlls/msi/tests/db.c | 16 ++++++++-------- 2 files changed, 50 insertions(+), 8 deletions(-)
diff --git a/dlls/msi/table.c b/dlls/msi/table.c index d787cb5..c567582 100644 --- a/dlls/msi/table.c +++ b/dlls/msi/table.c @@ -1657,6 +1657,41 @@ static UINT table_validate_new( MSITABLEVIEW *tv, MSIRECORD *rec ) return ERROR_SUCCESS; }
+static UINT find_insert_index( MSITABLEVIEW *tv, MSIRECORD *rec, UINT *pidx ) +{ + UINT r, idx, j, ivalue, x; + + TRACE("%p %p %p\n", tv, rec, pidx); + + for (idx = 0; idx < tv->table->row_count; idx++) + { + for (j = 0; j < tv->num_cols; j++ ) + { + r = get_table_value_from_record (tv, rec, j+1, &ivalue); + if (r != ERROR_SUCCESS) + break; + + r = TABLE_fetch_int(&tv->view, idx, j + 1, &x); + if (r != ERROR_SUCCESS) + return r; + + if (ivalue > x) + break; + else if (ivalue == x) + continue; + else { + TRACE("Found %d.\n", idx); + *pidx = idx; + return ERROR_SUCCESS; + } + } + } + + TRACE("Found %d.\n", idx); + *pidx = idx; + return ERROR_SUCCESS; +} + static UINT TABLE_insert_row( struct tagMSIVIEW *view, MSIRECORD *rec, UINT row, BOOL temporary ) { MSITABLEVIEW *tv = (MSITABLEVIEW*)view; @@ -1669,6 +1704,13 @@ static UINT TABLE_insert_row( struct tagMSIVIEW *view, MSIRECORD *rec, UINT row, if( r != ERROR_SUCCESS ) return ERROR_FUNCTION_FAILED;
+ if (row == -1) + { + r = find_insert_index(tv, rec, &row); + if( r != ERROR_SUCCESS ) + return ERROR_FUNCTION_FAILED; + } + r = table_create_new_row( view, &row, temporary ); TRACE("insert_row returned %08x\n", r); if( r != ERROR_SUCCESS ) diff --git a/dlls/msi/tests/db.c b/dlls/msi/tests/db.c index 4bb0039..bfaba17 100644 --- a/dlls/msi/tests/db.c +++ b/dlls/msi/tests/db.c @@ -4527,11 +4527,11 @@ static void test_rows_order(void) sz = sizeof(buffer); r = MsiRecordGetString(hrec, 1, buffer, &sz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - todo_wine ok(!lstrcmp(buffer, "A"), "Expected A, got %s\n", buffer); + ok(!lstrcmp(buffer, "A"), "Expected A, got %s\n", buffer); sz = sizeof(buffer); r = MsiRecordGetString(hrec, 2, buffer, &sz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - todo_wine ok(!lstrcmp(buffer, "B"), "Expected B, got %s\n", buffer); + ok(!lstrcmp(buffer, "B"), "Expected B, got %s\n", buffer); r = MsiCloseHandle(hrec); ok(r == ERROR_SUCCESS, "failed to close record\n");
@@ -4540,11 +4540,11 @@ static void test_rows_order(void) sz = sizeof(buffer); r = MsiRecordGetString(hrec, 1, buffer, &sz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - todo_wine ok(!lstrcmp(buffer, "C"), "Expected E, got %s\n", buffer); + ok(!lstrcmp(buffer, "C"), "Expected E, got %s\n", buffer); sz = sizeof(buffer); r = MsiRecordGetString(hrec, 2, buffer, &sz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - todo_wine ok(!lstrcmp(buffer, "E"), "Expected E, got %s\n", buffer); + ok(!lstrcmp(buffer, "E"), "Expected E, got %s\n", buffer); r = MsiCloseHandle(hrec); ok(r == ERROR_SUCCESS, "failed to close record\n");
@@ -4553,11 +4553,11 @@ static void test_rows_order(void) sz = sizeof(buffer); r = MsiRecordGetString(hrec, 1, buffer, &sz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - todo_wine ok(!lstrcmp(buffer, "D"), "Expected D, got %s\n", buffer); + ok(!lstrcmp(buffer, "D"), "Expected D, got %s\n", buffer); sz = sizeof(buffer); r = MsiRecordGetString(hrec, 2, buffer, &sz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - todo_wine ok(!lstrcmp(buffer, "E"), "Expected E, got %s\n", buffer); + ok(!lstrcmp(buffer, "E"), "Expected E, got %s\n", buffer); r = MsiCloseHandle(hrec); ok(r == ERROR_SUCCESS, "failed to close record\n");
@@ -4566,11 +4566,11 @@ static void test_rows_order(void) sz = sizeof(buffer); r = MsiRecordGetString(hrec, 1, buffer, &sz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - todo_wine ok(!lstrcmp(buffer, "F"), "Expected F, got %s\n", buffer); + ok(!lstrcmp(buffer, "F"), "Expected F, got %s\n", buffer); sz = sizeof(buffer); r = MsiRecordGetString(hrec, 2, buffer, &sz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - todo_wine ok(!lstrcmp(buffer, "A"), "Expected A, got %s\n", buffer); + ok(!lstrcmp(buffer, "A"), "Expected A, got %s\n", buffer); r = MsiCloseHandle(hrec); ok(r == ERROR_SUCCESS, "failed to close record\n");