Hib Eris : msi: Fix table rows order.

Alexandre Julliard julliard at winehq.org
Tue Oct 20 10:33:43 CDT 2009


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

Author: Hib Eris <hib at 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");
 




More information about the wine-cvs mailing list