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