msi: Handle markers in the WHERE section of an UPDATE query, with tests.
This commit is contained in:
parent
272fb14e70
commit
ce8199a46e
|
@ -3777,6 +3777,73 @@ static void test_update(void)
|
|||
ok(r == ERROR_SUCCESS, "MsiViewClose failed\n");
|
||||
r = MsiCloseHandle(view);
|
||||
ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n");
|
||||
|
||||
query = "CREATE TABLE `Apple` ( `Banana` CHAR(72) NOT NULL, "
|
||||
"`Orange` CHAR(72), `Pear` INT PRIMARY KEY `Banana`)";
|
||||
r = run_query(hdb, 0, query);
|
||||
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
||||
|
||||
query = "INSERT INTO `Apple` ( `Banana`, `Orange`, `Pear` )"
|
||||
"VALUES('one', 'two', 3)";
|
||||
r = run_query(hdb, 0, query);
|
||||
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
||||
|
||||
query = "INSERT INTO `Apple` ( `Banana`, `Orange`, `Pear` )"
|
||||
"VALUES('three', 'four', 5)";
|
||||
r = run_query(hdb, 0, query);
|
||||
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
||||
|
||||
query = "INSERT INTO `Apple` ( `Banana`, `Orange`, `Pear` )"
|
||||
"VALUES('six', 'two', 7)";
|
||||
r = run_query(hdb, 0, query);
|
||||
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
||||
|
||||
rec = MsiCreateRecord(2);
|
||||
MsiRecordSetInteger(rec, 1, 8);
|
||||
MsiRecordSetString(rec, 2, "two");
|
||||
|
||||
query = "UPDATE `Apple` SET `Pear` = ? WHERE `Orange` = ?";
|
||||
r = run_query(hdb, rec, query);
|
||||
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
||||
|
||||
MsiCloseHandle(rec);
|
||||
|
||||
query = "SELECT `Pear` FROM `Apple` ORDER BY `Orange`";
|
||||
r = MsiDatabaseOpenView(hdb, query, &view);
|
||||
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
||||
r = MsiViewExecute(view, 0);
|
||||
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
||||
|
||||
r = MsiViewFetch(view, &rec);
|
||||
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
||||
|
||||
r = MsiRecordGetInteger(rec, 1);
|
||||
ok(r == 8, "Expected 8, got %d\n", r);
|
||||
|
||||
MsiCloseHandle(rec);
|
||||
|
||||
r = MsiViewFetch(view, &rec);
|
||||
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
||||
|
||||
r = MsiRecordGetInteger(rec, 1);
|
||||
ok(r == 8, "Expected 8, got %d\n", r);
|
||||
|
||||
MsiCloseHandle(rec);
|
||||
|
||||
r = MsiViewFetch(view, &rec);
|
||||
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
||||
|
||||
r = MsiRecordGetInteger(rec, 1);
|
||||
ok(r == 5, "Expected 5, got %d\n", r);
|
||||
|
||||
MsiCloseHandle(rec);
|
||||
|
||||
r = MsiViewFetch(view, &rec);
|
||||
ok(r == ERROR_NO_MORE_ITEMS, "Expectd ERROR_NO_MORE_ITEMS, got %d\n", r);
|
||||
|
||||
MsiViewClose(view);
|
||||
MsiCloseHandle(view);
|
||||
|
||||
r = MsiDatabaseCommit(hdb);
|
||||
ok(r == ERROR_SUCCESS, "MsiDatabaseCommit failed\n");
|
||||
r = MsiCloseHandle(hdb);
|
||||
|
|
|
@ -60,26 +60,56 @@ static UINT UPDATE_execute( struct tagMSIVIEW *view, MSIRECORD *record )
|
|||
MSIUPDATEVIEW *uv = (MSIUPDATEVIEW*)view;
|
||||
UINT i, r, col_count = 0, row_count = 0;
|
||||
MSIRECORD *values = NULL;
|
||||
MSIRECORD *where = NULL;
|
||||
MSIVIEW *wv;
|
||||
UINT cols_count, where_count;
|
||||
column_info *col = uv->vals;
|
||||
|
||||
TRACE("%p %p\n", uv, record );
|
||||
|
||||
/* extract the where markers from the record */
|
||||
if (record)
|
||||
{
|
||||
r = MSI_RecordGetFieldCount(record);
|
||||
|
||||
for (i = 0; col; col = col->next)
|
||||
i++;
|
||||
|
||||
cols_count = i;
|
||||
where_count = r - i;
|
||||
|
||||
if (where_count > 0)
|
||||
{
|
||||
where = MSI_CreateRecord(where_count);
|
||||
|
||||
if (where)
|
||||
for (i = 1; i <= where_count; i++)
|
||||
MSI_RecordCopyField(record, cols_count + i, where, i);
|
||||
}
|
||||
}
|
||||
|
||||
wv = uv->wv;
|
||||
if( !wv )
|
||||
return ERROR_FUNCTION_FAILED;
|
||||
{
|
||||
r = ERROR_FUNCTION_FAILED;
|
||||
goto done;
|
||||
}
|
||||
|
||||
r = wv->ops->execute( wv, 0 );
|
||||
r = wv->ops->execute( wv, where );
|
||||
TRACE("tv execute returned %x\n", r);
|
||||
if( r )
|
||||
return r;
|
||||
goto done;
|
||||
|
||||
r = wv->ops->get_dimensions( wv, &row_count, &col_count );
|
||||
if( r )
|
||||
return r;
|
||||
goto done;
|
||||
|
||||
values = msi_query_merge_record( col_count, uv->vals, record );
|
||||
if (!values)
|
||||
return ERROR_FUNCTION_FAILED;
|
||||
{
|
||||
r = ERROR_FUNCTION_FAILED;
|
||||
goto done;
|
||||
}
|
||||
|
||||
for ( i=0; i<row_count; i++ )
|
||||
{
|
||||
|
@ -88,7 +118,9 @@ static UINT UPDATE_execute( struct tagMSIVIEW *view, MSIRECORD *record )
|
|||
break;
|
||||
}
|
||||
|
||||
msiobj_release( &values->hdr );
|
||||
done:
|
||||
if ( where ) msiobj_release( &where->hdr );
|
||||
if ( values ) msiobj_release( &values->hdr );
|
||||
|
||||
return r;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue