mirror of
https://github.com/reactos/wine.git
synced 2024-11-25 04:39:45 +00:00
msi: Fixed the UPDATE query to work with explicit values.
This commit is contained in:
parent
575cc67d0f
commit
4a32845a56
@ -57,12 +57,12 @@ static UINT INSERT_fetch_int( struct tagMSIVIEW *view, UINT row, UINT col, UINT
|
||||
}
|
||||
|
||||
/*
|
||||
* 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 tagMSIVIEW *view, MSIRECORD *record )
|
||||
* 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;
|
||||
|
||||
|
@ -125,4 +125,6 @@ UINT ALTER_CreateView( MSIDATABASE *db, MSIVIEW **view, LPCWSTR name, int hold )
|
||||
|
||||
int sqliteGetToken(const WCHAR *z, int *tokenType);
|
||||
|
||||
MSIRECORD *msi_query_merge_record( UINT fields, column_info *vl, MSIRECORD *rec );
|
||||
|
||||
#endif /* __WINE_MSI_QUERY_H */
|
||||
|
@ -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);
|
||||
|
||||
|
@ -59,13 +59,11 @@ static UINT UPDATE_execute( struct tagMSIVIEW *view, MSIRECORD *record )
|
||||
{
|
||||
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 tagMSIVIEW *view, MSIRECORD *record )
|
||||
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 tagMSIVIEW *view, MSIRECORD *record )
|
||||
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 tagMSIVIEW *view, MSIRECORD *record )
|
||||
}
|
||||
}
|
||||
|
||||
msiobj_release( &values->hdr );
|
||||
|
||||
err:
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user