Module: wine Branch: master Commit: 4a32845a569d78b047d3ee2cd35239df25a254ed URL: http://source.winehq.org/git/wine.git/?a=commit;h=4a32845a569d78b047d3ee2cd3...
Author: Mike McCormack mike@codeweavers.com Date: Thu Oct 26 14:08:38 2006 +0900
msi: Fixed the UPDATE query to work with explicit values.
---
dlls/msi/insert.c | 6 +++--- dlls/msi/query.h | 2 ++ dlls/msi/tests/db.c | 42 ++++++++++++------------------------------ dlls/msi/update.c | 25 ++++++++++++++++++------- 4 files changed, 35 insertions(+), 40 deletions(-)
diff --git a/dlls/msi/insert.c b/dlls/msi/insert.c index 33c915f..aefc8fc 100644 --- a/dlls/msi/insert.c +++ b/dlls/msi/insert.c @@ -57,12 +57,12 @@ static UINT INSERT_fetch_int( struct tag }
/* - * INSERT_merge_record + * msi_query_merge_record * * Merge a value_list and a record to create a second record. * Replace wildcard entries in the valuelist with values from the record */ -static MSIRECORD *INSERT_merge_record( UINT fields, column_info *vl, MSIRECORD *rec ) +MSIRECORD *msi_query_merge_record( UINT fields, column_info *vl, MSIRECORD *rec ) { MSIRECORD *merged; DWORD wildcard_count = 1, i; @@ -128,7 +128,7 @@ static UINT INSERT_execute( struct tagMS * Merge the wildcard values into the list of values provided * in the query, and create a record containing both. */ - values = INSERT_merge_record( col_count, iv->vals, record ); + values = msi_query_merge_record( col_count, iv->vals, record ); if( !values ) goto err;
diff --git a/dlls/msi/query.h b/dlls/msi/query.h index 16aeb66..b15a61e 100644 --- a/dlls/msi/query.h +++ b/dlls/msi/query.h @@ -125,4 +125,6 @@ UINT ALTER_CreateView( MSIDATABASE *db,
int sqliteGetToken(const WCHAR *z, int *tokenType);
+MSIRECORD *msi_query_merge_record( UINT fields, column_info *vl, MSIRECORD *rec ); + #endif /* __WINE_MSI_QUERY_H */ diff --git a/dlls/msi/tests/db.c b/dlls/msi/tests/db.c index 761b9f9..b9ffaa7 100644 --- a/dlls/msi/tests/db.c +++ b/dlls/msi/tests/db.c @@ -3003,13 +3003,10 @@ static void test_update(void) query = "UPDATE `Control` SET `Text` = 'this is text' WHERE `Dialog_` = 'ErrorDialog'"; r = MsiDatabaseOpenView(hdb, query, &view); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - todo_wine - { - r = MsiViewExecute(view, 0); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - r = MsiViewClose(view); - ok(r == ERROR_SUCCESS, "MsiViewClose failed\n"); - } + r = MsiViewExecute(view, 0); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + r = MsiViewClose(view); + ok(r == ERROR_SUCCESS, "MsiViewClose failed\n"); r = MsiCloseHandle(view); ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n");
@@ -3026,10 +3023,7 @@ static void test_update(void) size = MAX_PATH; r = MsiRecordGetString(rec, 1, result, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - todo_wine - { - ok(!lstrcmp(result, "this is text"), "Expected `this is text`, got %s\n", result); - } + ok(!lstrcmp(result, "this is text"), "Expected `this is text`, got %s\n", result);
MsiCloseHandle(rec);
@@ -3055,13 +3049,10 @@ static void test_update(void) query = "UPDATE `Control` SET `Text` = 'this is text' WHERE `Dialog_` = 'ErrorDialog' AND `Control` = 'ErrorText'"; r = MsiDatabaseOpenView(hdb, query, &view); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCESS, got %d\n", r); - todo_wine - { - r = MsiViewExecute(view, 0); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - r = MsiViewClose(view); - ok(r == ERROR_SUCCESS, "MsiViewClose failed\n"); - } + r = MsiViewExecute(view, 0); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + r = MsiViewClose(view); + ok(r == ERROR_SUCCESS, "MsiViewClose failed\n"); r = MsiCloseHandle(view); ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n");
@@ -3078,10 +3069,7 @@ static void test_update(void) size = MAX_PATH; r = MsiRecordGetString(rec, 1, result, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - todo_wine - { - ok(!lstrcmp(result, "this is text"), "Expected `this is text`, got %s\n", result); - } + ok(!lstrcmp(result, "this is text"), "Expected `this is text`, got %s\n", result);
MsiCloseHandle(rec);
@@ -3130,10 +3118,7 @@ static void test_update(void) size = MAX_PATH; r = MsiRecordGetString(rec, 1, result, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - todo_wine - { - ok(!lstrcmp(result, "this is text"), "Expected `this is text`, got %s\n", result); - } + ok(!lstrcmp(result, "this is text"), "Expected `this is text`, got %s\n", result);
MsiCloseHandle(rec);
@@ -3143,10 +3128,7 @@ static void test_update(void) size = MAX_PATH; r = MsiRecordGetString(rec, 1, result, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - todo_wine - { - ok(!lstrcmp(result, "this is text"), "Expected `this is text`, got %s\n", result); - } + ok(!lstrcmp(result, "this is text"), "Expected `this is text`, got %s\n", result);
MsiCloseHandle(rec);
diff --git a/dlls/msi/update.c b/dlls/msi/update.c index 9cbe55a..c97d9e8 100644 --- a/dlls/msi/update.c +++ b/dlls/msi/update.c @@ -59,13 +59,11 @@ static UINT UPDATE_execute( struct tagMS { MSIUPDATEVIEW *uv = (MSIUPDATEVIEW*)view; UINT n, type, val, r, row, col_count = 0, row_count = 0; + MSIRECORD *values = NULL; MSIVIEW *wv;
TRACE("%p %p\n", uv, record );
- if( !record ) - return ERROR_FUNCTION_FAILED; - wv = uv->wv; if( !wv ) return ERROR_FUNCTION_FAILED; @@ -79,6 +77,10 @@ static UINT UPDATE_execute( struct tagMS if( r ) goto err;
+ values = msi_query_merge_record( col_count, uv->vals, record ); + if (!values) + return ERROR_FUNCTION_FAILED; + for( row = 0; row < row_count; row++ ) { for( n = 1; n <= col_count; n++ ) @@ -87,15 +89,22 @@ static UINT UPDATE_execute( struct tagMS if( r ) break;
- if( type & MSITYPE_STRING ) + if( MSI_RecordIsNull( values, n )) + val = 0; + else if( type & MSITYPE_STRING ) { - const WCHAR *str = MSI_RecordGetString( record, n ); + const WCHAR *str = MSI_RecordGetString( values, n ); val = msi_addstringW( uv->db->strings, 0, str, -1, 1 ); } + else if ((type & 0xff) == 2) + { + val = MSI_RecordGetInteger( values, n ); + val ^= 0x8000; + } else { - val = MSI_RecordGetInteger( record, n ); - val |= 0x8000; + val = MSI_RecordGetInteger( values, n ); + val ^= 0x80000000; } r = wv->ops->set_int( wv, row, n, val ); if( r ) @@ -103,6 +112,8 @@ static UINT UPDATE_execute( struct tagMS } }
+ msiobj_release( &values->hdr ); + err: return ERROR_SUCCESS; }