Hib Eris : msi: Insert new tables in correct _Tables location.
Alexandre Julliard
julliard at winehq.org
Mon Jun 22 09:04:15 CDT 2009
Module: wine
Branch: master
Commit: 65ac2061946398934951dd201582f879cd70af9d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=65ac2061946398934951dd201582f879cd70af9d
Author: Hib Eris <hib at hiberis.nl>
Date: Sun Jun 21 19:28:57 2009 +0200
msi: Insert new tables in correct _Tables location.
---
dlls/msi/table.c | 40 ++++++++++++++++++++++++++++++++++++++--
dlls/msi/tests/db.c | 14 +++++++-------
2 files changed, 45 insertions(+), 9 deletions(-)
diff --git a/dlls/msi/table.c b/dlls/msi/table.c
index 0b5b991..dc21b3b 100644
--- a/dlls/msi/table.c
+++ b/dlls/msi/table.c
@@ -121,6 +121,7 @@ static void table_calc_column_offsets( MSIDATABASE *db, MSICOLUMNINFO *colinfo,
static UINT get_tablecolumns( MSIDATABASE *db,
LPCWSTR szTableName, MSICOLUMNINFO *colinfo, UINT *sz);
static void msi_free_colinfo( MSICOLUMNINFO *colinfo, UINT count );
+static UINT table_find_insert_idx (MSIVIEW *view, LPCWSTR name, INT *pidx);
static inline UINT bytes_per_column( MSIDATABASE *db, const MSICOLUMNINFO *col )
{
@@ -620,6 +621,7 @@ UINT msi_create_table( MSIDATABASE *db, LPCWSTR name, column_info *col_info,
column_info *col;
MSITABLE *table;
UINT i;
+ INT idx;
/* only add tables that don't exist already */
if( TABLE_Exists(db, name ) )
@@ -685,7 +687,11 @@ UINT msi_create_table( MSIDATABASE *db, LPCWSTR name, column_info *col_info,
if( r )
goto err;
- r = tv->ops->insert_row( tv, rec, -1, persistent == MSICONDITION_FALSE );
+ r = table_find_insert_idx (tv, name, &idx);
+ if (r != ERROR_SUCCESS)
+ idx = -1;
+
+ r = tv->ops->insert_row( tv, rec, idx, persistent == MSICONDITION_FALSE );
TRACE("insert_row returned %x\n", r);
if( r )
goto err;
@@ -735,7 +741,11 @@ UINT msi_create_table( MSIDATABASE *db, LPCWSTR name, column_info *col_info,
if( r )
goto err;
- r = tv->ops->insert_row( tv, rec, -1, FALSE );
+ r = table_find_insert_idx (tv, name, &idx);
+ if (r != ERROR_SUCCESS)
+ idx = -1;
+
+ r = tv->ops->insert_row( tv, rec, idx, FALSE );
if( r )
goto err;
@@ -2923,3 +2933,29 @@ void msi_free_transforms( MSIDATABASE *db )
msi_free( t );
}
}
+
+static UINT table_find_insert_idx (MSIVIEW *view, LPCWSTR name, INT *pidx)
+{
+ UINT r, name_id, row_id;
+ INT idx;
+ MSITABLEVIEW *tv = (MSITABLEVIEW *)view;
+
+ TRACE ("%p %s\n", view, debugstr_w(name));
+
+ r = msi_string2idW(tv->db->strings, name, &name_id);
+ if (r != ERROR_SUCCESS)
+ {
+ *pidx = -1;
+ return r;
+ }
+
+ for( idx = 0; idx < tv->table->row_count; idx++ )
+ {
+ r = TABLE_fetch_int( &tv->view, idx, 1, &row_id );
+ if (row_id > name_id)
+ break;
+ }
+
+ *pidx = idx;
+ return ERROR_SUCCESS;
+}
diff --git a/dlls/msi/tests/db.c b/dlls/msi/tests/db.c
index 75a0ebe..43b5648 100644
--- a/dlls/msi/tests/db.c
+++ b/dlls/msi/tests/db.c
@@ -4346,7 +4346,7 @@ static void test_tables_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, "baz"), "Expected baz, got %s\n", buffer);
+ ok(!lstrcmp(buffer, "baz"), "Expected baz, got %s\n", buffer);
r = MsiCloseHandle(hrec);
ok(r == ERROR_SUCCESS, "failed to close record\n");
@@ -4355,7 +4355,7 @@ static void test_tables_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, "bar"), "Expected bar, got %s\n", buffer);
+ ok(!lstrcmp(buffer, "bar"), "Expected bar, got %s\n", buffer);
r = MsiCloseHandle(hrec);
ok(r == ERROR_SUCCESS, "failed to close record\n");
@@ -4391,11 +4391,11 @@ static void test_tables_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, "baz"), "Expected baz, got %s\n", buffer);
+ ok(!lstrcmp(buffer, "baz"), "Expected baz, got %s\n", buffer);
sz = sizeof(buffer);
r = MsiRecordGetString(hrec, 3, buffer, &sz);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
- todo_wine ok(!lstrcmp(buffer, "bar"), "Expected bar, got %s\n", buffer);
+ ok(!lstrcmp(buffer, "bar"), "Expected bar, got %s\n", buffer);
r = MsiCloseHandle(hrec);
ok(r == ERROR_SUCCESS, "failed to close record\n");
@@ -4408,7 +4408,7 @@ static void test_tables_order(void)
sz = sizeof(buffer);
r = MsiRecordGetString(hrec, 3, buffer, &sz);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
- todo_wine ok(!lstrcmp(buffer, "baz"), "Expected baz, got %s\n", buffer);
+ ok(!lstrcmp(buffer, "baz"), "Expected baz, got %s\n", buffer);
r = MsiCloseHandle(hrec);
ok(r == ERROR_SUCCESS, "failed to close record\n");
@@ -4421,7 +4421,7 @@ static void test_tables_order(void)
sz = sizeof(buffer);
r = MsiRecordGetString(hrec, 3, buffer, &sz);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
- todo_wine ok(!lstrcmp(buffer, "foo"), "Expected foo, got %s\n", buffer);
+ ok(!lstrcmp(buffer, "foo"), "Expected foo, got %s\n", buffer);
r = MsiCloseHandle(hrec);
ok(r == ERROR_SUCCESS, "failed to close record\n");
@@ -4430,7 +4430,7 @@ static void test_tables_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, "bar"), "Expected bar, got %s\n", buffer);
+ ok(!lstrcmp(buffer, "bar"), "Expected bar, got %s\n", buffer);
sz = sizeof(buffer);
r = MsiRecordGetString(hrec, 3, buffer, &sz);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
More information about the wine-cvs
mailing list