James Hawkins : msi: Handle markers in the WHERE section of an UPDATE query , with tests.
Alexandre Julliard
julliard at winehq.org
Wed Jan 9 07:02:02 CST 2008
Module: wine
Branch: master
Commit: ce8199a46ec0d78842e0204d71a7b2332c3cb7ab
URL: http://source.winehq.org/git/wine.git/?a=commit;h=ce8199a46ec0d78842e0204d71a7b2332c3cb7ab
Author: James Hawkins <truiken at 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;
}
More information about the wine-cvs
mailing list