Mike McCormack : msi: Fixed the UPDATE query to work with explicit
values.
Alexandre Julliard
julliard at wine.codeweavers.com
Thu Oct 26 06:31:41 CDT 2006
Module: wine
Branch: master
Commit: 4a32845a569d78b047d3ee2cd35239df25a254ed
URL: http://source.winehq.org/git/wine.git/?a=commit;h=4a32845a569d78b047d3ee2cd35239df25a254ed
Author: Mike McCormack <mike at 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;
}
More information about the wine-cvs
mailing list