Mike McCormack : msi: Fixed the UPDATE query to work with explicit values.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Oct 26 06:31:41 CDT 2006


Module: wine
Branch: master
Commit: 4a32845a569d78b047d3ee2cd35239df25a254ed
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4a32845a569d78b047d3ee2cd35239df25a254ed

Author: Mike McCormack <mike at codeweavers.com>
Date:   Thu Oct 26 14:08:38 2006 +0900

msi: Fixed the UPDATE query to work with explicit values.

---

 dlls/msi/insert.c   |    6 +++---
 dlls/msi/query.h    |    2 ++
 dlls/msi/tests/db.c |   42 ++++++++++++------------------------------
 dlls/msi/update.c   |   25 ++++++++++++++++++-------
 4 files changed, 35 insertions(+), 40 deletions(-)

diff --git a/dlls/msi/insert.c b/dlls/msi/insert.c
index 33c915f..aefc8fc 100644
--- a/dlls/msi/insert.c
+++ b/dlls/msi/insert.c
@@ -57,12 +57,12 @@ static UINT INSERT_fetch_int( struct tag
 }
 
 /*
- * INSERT_merge_record
+ * msi_query_merge_record
  *
  * Merge a value_list and a record to create a second record.
  * Replace wildcard entries in the valuelist with values from the record
  */
-static MSIRECORD *INSERT_merge_record( UINT fields, column_info *vl, MSIRECORD *rec )
+MSIRECORD *msi_query_merge_record( UINT fields, column_info *vl, MSIRECORD *rec )
 {
     MSIRECORD *merged;
     DWORD wildcard_count = 1, i;
@@ -128,7 +128,7 @@ static UINT INSERT_execute( struct tagMS
      * Merge the wildcard values into the list of values provided
      * in the query, and create a record containing both.
      */
-    values = INSERT_merge_record( col_count, iv->vals, record );
+    values = msi_query_merge_record( col_count, iv->vals, record );
     if( !values )
         goto err;
 
diff --git a/dlls/msi/query.h b/dlls/msi/query.h
index 16aeb66..b15a61e 100644
--- a/dlls/msi/query.h
+++ b/dlls/msi/query.h
@@ -125,4 +125,6 @@ UINT ALTER_CreateView( MSIDATABASE *db,
 
 int sqliteGetToken(const WCHAR *z, int *tokenType);
 
+MSIRECORD *msi_query_merge_record( UINT fields, column_info *vl, MSIRECORD *rec );
+
 #endif /* __WINE_MSI_QUERY_H */
diff --git a/dlls/msi/tests/db.c b/dlls/msi/tests/db.c
index 761b9f9..b9ffaa7 100644
--- a/dlls/msi/tests/db.c
+++ b/dlls/msi/tests/db.c
@@ -3003,13 +3003,10 @@ static void test_update(void)
     query = "UPDATE `Control` SET `Text` = 'this is text' WHERE `Dialog_` = 'ErrorDialog'";
     r = MsiDatabaseOpenView(hdb, query, &view);
     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
-    todo_wine
-    {
-        r = MsiViewExecute(view, 0);
-        ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
-        r = MsiViewClose(view);
-        ok(r == ERROR_SUCCESS, "MsiViewClose failed\n");
-    }
+    r = MsiViewExecute(view, 0);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    r = MsiViewClose(view);
+    ok(r == ERROR_SUCCESS, "MsiViewClose failed\n");
     r = MsiCloseHandle(view);
     ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n");
 
@@ -3026,10 +3023,7 @@ static void test_update(void)
     size = MAX_PATH;
     r = MsiRecordGetString(rec, 1, result, &size);
     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
-    todo_wine
-    {
-        ok(!lstrcmp(result, "this is text"), "Expected `this is text`, got %s\n", result);
-    }
+    ok(!lstrcmp(result, "this is text"), "Expected `this is text`, got %s\n", result);
 
     MsiCloseHandle(rec);
 
@@ -3055,13 +3049,10 @@ static void test_update(void)
     query = "UPDATE `Control` SET `Text` = 'this is text' WHERE `Dialog_` = 'ErrorDialog' AND `Control` = 'ErrorText'";
     r = MsiDatabaseOpenView(hdb, query, &view);
     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCESS, got %d\n", r);
-    todo_wine
-    {
-        r = MsiViewExecute(view, 0);
-        ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
-        r = MsiViewClose(view);
-        ok(r == ERROR_SUCCESS, "MsiViewClose failed\n");
-    }
+    r = MsiViewExecute(view, 0);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    r = MsiViewClose(view);
+    ok(r == ERROR_SUCCESS, "MsiViewClose failed\n");
     r = MsiCloseHandle(view);
     ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n");
 
@@ -3078,10 +3069,7 @@ static void test_update(void)
     size = MAX_PATH;
     r = MsiRecordGetString(rec, 1, result, &size);
     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
-    todo_wine
-    {
-        ok(!lstrcmp(result, "this is text"), "Expected `this is text`, got %s\n", result);
-    }
+    ok(!lstrcmp(result, "this is text"), "Expected `this is text`, got %s\n", result);
 
     MsiCloseHandle(rec);
 
@@ -3130,10 +3118,7 @@ static void test_update(void)
     size = MAX_PATH;
     r = MsiRecordGetString(rec, 1, result, &size);
     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
-    todo_wine
-    {
-        ok(!lstrcmp(result, "this is text"), "Expected `this is text`, got %s\n", result);
-    }
+    ok(!lstrcmp(result, "this is text"), "Expected `this is text`, got %s\n", result);
 
     MsiCloseHandle(rec);
 
@@ -3143,10 +3128,7 @@ static void test_update(void)
     size = MAX_PATH;
     r = MsiRecordGetString(rec, 1, result, &size);
     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
-    todo_wine
-    {
-        ok(!lstrcmp(result, "this is text"), "Expected `this is text`, got %s\n", result);
-    }
+    ok(!lstrcmp(result, "this is text"), "Expected `this is text`, got %s\n", result);
 
     MsiCloseHandle(rec);
 
diff --git a/dlls/msi/update.c b/dlls/msi/update.c
index 9cbe55a..c97d9e8 100644
--- a/dlls/msi/update.c
+++ b/dlls/msi/update.c
@@ -59,13 +59,11 @@ static UINT UPDATE_execute( struct tagMS
 {
     MSIUPDATEVIEW *uv = (MSIUPDATEVIEW*)view;
     UINT n, type, val, r, row, col_count = 0, row_count = 0;
+    MSIRECORD *values = NULL;
     MSIVIEW *wv;
 
     TRACE("%p %p\n", uv, record );
 
-    if( !record )
-        return ERROR_FUNCTION_FAILED;
-
     wv = uv->wv;
     if( !wv )
         return ERROR_FUNCTION_FAILED;
@@ -79,6 +77,10 @@ static UINT UPDATE_execute( struct tagMS
     if( r )
         goto err;
 
+    values = msi_query_merge_record( col_count, uv->vals, record );
+    if (!values)
+        return ERROR_FUNCTION_FAILED;
+
     for( row = 0; row < row_count; row++ )
     {
         for( n = 1; n <= col_count; n++ )
@@ -87,15 +89,22 @@ static UINT UPDATE_execute( struct tagMS
             if( r )
                 break;
 
-            if( type & MSITYPE_STRING )
+            if( MSI_RecordIsNull( values, n ))
+                val = 0;
+            else if( type & MSITYPE_STRING )
             {
-                const WCHAR *str = MSI_RecordGetString( record, n );
+                const WCHAR *str = MSI_RecordGetString( values, n );
                 val = msi_addstringW( uv->db->strings, 0, str, -1, 1 );
             }
+            else if ((type & 0xff) == 2)
+            {
+                val = MSI_RecordGetInteger( values, n );
+                val ^= 0x8000;
+            }
             else
             {
-                val = MSI_RecordGetInteger( record, n );
-                val |= 0x8000;
+                val = MSI_RecordGetInteger( values, n );
+                val ^= 0x80000000;
             }
             r = wv->ops->set_int( wv, row, n, val );
             if( r )
@@ -103,6 +112,8 @@ static UINT UPDATE_execute( struct tagMS
         }
     }
 
+    msiobj_release( &values->hdr );
+
 err:
     return ERROR_SUCCESS;
 }




More information about the wine-cvs mailing list