Module: wine Branch: master Commit: ce8199a46ec0d78842e0204d71a7b2332c3cb7ab URL: http://source.winehq.org/git/wine.git/?a=commit;h=ce8199a46ec0d78842e0204d71...
Author: James Hawkins truiken@gmail.com Date: Tue Jan 8 22:16:07 2008 -0700
msi: Handle markers in the WHERE section of an UPDATE query, with tests.
---
dlls/msi/tests/db.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++ dlls/msi/update.c | 44 +++++++++++++++++++++++++++++---- 2 files changed, 105 insertions(+), 6 deletions(-)
diff --git a/dlls/msi/tests/db.c b/dlls/msi/tests/db.c index 891139b..5282bf4 100644 --- a/dlls/msi/tests/db.c +++ b/dlls/msi/tests/db.c @@ -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); diff --git a/dlls/msi/update.c b/dlls/msi/update.c index 23d7ab5..44d30c6 100644 --- a/dlls/msi/update.c +++ b/dlls/msi/update.c @@ -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; }