msi: Handle markers in the WHERE section of an UPDATE query, with tests.

This commit is contained in:
James Hawkins 2008-01-08 22:16:07 -07:00 committed by Alexandre Julliard
parent 272fb14e70
commit ce8199a46e
2 changed files with 105 additions and 6 deletions

View file

@ -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);

View file

@ -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;
}