Module: wine Branch: master Commit: 65ac2061946398934951dd201582f879cd70af9d URL: http://source.winehq.org/git/wine.git/?a=commit;h=65ac2061946398934951dd2015...
Author: Hib Eris hib@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);