msi 1: Keep track of the wildcard record index

James Hawkins truiken at gmail.com
Fri Jul 27 13:11:54 CDT 2007


Hi,

This fixes bug 7529.  http://bugs.winehq.org/show_bug.cgi?id=7529

Changelog:
* Keep track of the wildcard record index.

 dlls/msi/tests/db.c |   53 +++++++++++++--------------------------------------
 dlls/msi/where.c    |   42 ++++++++++++++++++++++------------------
 2 files changed, 36 insertions(+), 59 deletions(-)

-- 
James Hawkins
-------------- next part --------------
diff --git a/dlls/msi/tests/db.c b/dlls/msi/tests/db.c
index 39ef6ac..3e38f20 100644
--- a/dlls/msi/tests/db.c
+++ b/dlls/msi/tests/db.c
@@ -3703,68 +3703,41 @@ static void test_select_markers(void)
     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
 
     r = MsiViewExecute(view, rec);
-    todo_wine
-    {
-        ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
-    }
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
 
     r = MsiViewFetch(view, &res);
-    todo_wine
-    {
-        ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
-    }
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
 
     size = MAX_PATH;
     r = MsiRecordGetString(res, 1, buf, &size);
-    todo_wine
-    {
-        ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
-        ok(!lstrcmp(buf, "apple"), "Expected apple, got %s\n", buf);
-    }
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    ok(!lstrcmp(buf, "apple"), "Expected apple, got %s\n", buf);
 
     size = MAX_PATH;
     r = MsiRecordGetString(res, 2, buf, &size);
-    todo_wine
-    {
-        ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
-        ok(!lstrcmp(buf, "two"), "Expected two, got %s\n", buf);
-    }
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    ok(!lstrcmp(buf, "two"), "Expected two, got %s\n", buf);
 
     r = MsiRecordGetInteger(res, 3);
-    todo_wine
-    {
-        ok(r == 1, "Expected 1, got %d\n", r);
-    }
+    ok(r == 1, "Expected 1, got %d\n", r);
 
     MsiCloseHandle(res);
 
     r = MsiViewFetch(view, &res);
-    todo_wine
-    {
-        ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
-    }
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
 
     size = MAX_PATH;
     r = MsiRecordGetString(res, 1, buf, &size);
-    todo_wine
-    {
-        ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
-        ok(!lstrcmp(buf, "apple"), "Expected apple, got %s\n", buf);
-    }
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    ok(!lstrcmp(buf, "apple"), "Expected apple, got %s\n", buf);
 
     size = MAX_PATH;
     r = MsiRecordGetString(res, 2, buf, &size);
-    todo_wine
-    {
-        ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
-        ok(!lstrcmp(buf, "two"), "Expected two, got %s\n", buf);
-    }
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    ok(!lstrcmp(buf, "two"), "Expected two, got %s\n", buf);
 
     r = MsiRecordGetInteger(res, 3);
-    todo_wine
-    {
-        ok(r == 2, "Expected 2, got %d\n", r);
-    }
+    ok(r == 2, "Expected 2, got %d\n", r);
 
     MsiCloseHandle(res);
 
diff --git a/dlls/msi/where.c b/dlls/msi/where.c
index c6a1181..5104e67 100644
--- a/dlls/msi/where.c
+++ b/dlls/msi/where.c
@@ -46,6 +46,7 @@ typedef struct tagMSIWHEREVIEW
     UINT           row_count;
     UINT          *reorder;
     struct expr   *cond;
+    UINT           rec_index;
 } MSIWHEREVIEW;
 
 static UINT WHERE_fetch_int( struct tagMSIVIEW *view, UINT row, UINT col, UINT *val )
@@ -156,24 +157,25 @@ static INT INT_evaluate_unary( INT lval,
     return 0;
 }
 
-static const WCHAR *STRING_evaluate( const string_table *st,
-              MSIVIEW *table, UINT row, const struct expr *expr, const MSIRECORD *record )
+static const WCHAR *STRING_evaluate( MSIWHEREVIEW *wv, UINT row,
+                                     const struct expr *expr,
+                                     const MSIRECORD *record )
 {
     UINT val = 0, r;
 
     switch( expr->type )
     {
     case EXPR_COL_NUMBER_STRING:
-        r = table->ops->fetch_int( table, row, expr->u.col_number, &val );
+        r = wv->table->ops->fetch_int( wv->table, row, expr->u.col_number, &val );
         if( r != ERROR_SUCCESS )
             return NULL;
-        return msi_string_lookup_id( st, val );
+        return msi_string_lookup_id( wv->db->strings, val );
 
     case EXPR_SVAL:
         return expr->u.sval;
 
     case EXPR_WILDCARD:
-        return MSI_RecordGetString( record, 1 );
+        return MSI_RecordGetString( record, ++wv->rec_index );
 
     default:
         ERR("Invalid expression type\n");
@@ -182,14 +184,14 @@ static const WCHAR *STRING_evaluate( con
     return NULL;
 }
 
-static UINT STRCMP_Evaluate( const string_table *st, MSIVIEW *table, UINT row,
-                             const struct expr *cond, INT *val, const MSIRECORD *record )
+static UINT STRCMP_Evaluate( MSIWHEREVIEW *wv, UINT row, const struct expr *cond,
+                             INT *val, const MSIRECORD *record )
 {
     int sr;
     const WCHAR *l_str, *r_str;
 
-    l_str = STRING_evaluate( st, table, row, cond->u.expr.left, record );
-    r_str = STRING_evaluate( st, table, row, cond->u.expr.right, record );
+    l_str = STRING_evaluate( wv, row, cond->u.expr.left, record );
+    r_str = STRING_evaluate( wv, row, cond->u.expr.right, record );
     if( l_str == r_str )
         sr = 0;
     else if( l_str && ! r_str )
@@ -206,8 +208,8 @@ static UINT STRCMP_Evaluate( const strin
     return ERROR_SUCCESS;
 }
 
-static UINT WHERE_evaluate( MSIDATABASE *db, MSIVIEW *table, UINT row, 
-                             const struct expr *cond, INT *val, MSIRECORD *record )
+static UINT WHERE_evaluate( MSIWHEREVIEW *wv, UINT row,
+                            struct expr *cond, INT *val, MSIRECORD *record )
 {
     UINT r, tval;
     INT lval, rval;
@@ -218,12 +220,12 @@ static UINT WHERE_evaluate( MSIDATABASE 
     switch( cond->type )
     {
     case EXPR_COL_NUMBER:
-        r = table->ops->fetch_int( table, row, cond->u.col_number, &tval );
+        r = wv->table->ops->fetch_int( wv->table, row, cond->u.col_number, &tval );
         *val = tval - 0x8000;
         return ERROR_SUCCESS;
 
     case EXPR_COL_NUMBER32:
-        r = table->ops->fetch_int( table, row, cond->u.col_number, &tval );
+        r = wv->table->ops->fetch_int( wv->table, row, cond->u.col_number, &tval );
         *val = tval - 0x80000000;
         return r;
 
@@ -232,27 +234,27 @@ static UINT WHERE_evaluate( MSIDATABASE 
         return ERROR_SUCCESS;
 
     case EXPR_COMPLEX:
-        r = WHERE_evaluate( db, table, row, cond->u.expr.left, &lval, record );
+        r = WHERE_evaluate( wv, row, cond->u.expr.left, &lval, record );
         if( r != ERROR_SUCCESS )
             return r;
-        r = WHERE_evaluate( db, table, row, cond->u.expr.right, &rval, record );
+        r = WHERE_evaluate( wv, row, cond->u.expr.right, &rval, record );
         if( r != ERROR_SUCCESS )
             return r;
         *val = INT_evaluate_binary( lval, cond->u.expr.op, rval );
         return ERROR_SUCCESS;
 
     case EXPR_UNARY:
-        r = table->ops->fetch_int( table, row, cond->u.expr.left->u.col_number, &tval );
+        r = wv->table->ops->fetch_int( wv->table, row, cond->u.expr.left->u.col_number, &tval );
         if( r != ERROR_SUCCESS )
             return r;
         *val = INT_evaluate_unary( tval, cond->u.expr.op );
         return ERROR_SUCCESS;
 
     case EXPR_STRCMP:
-        return STRCMP_Evaluate( db->strings, table, row, cond, val, record );
+        return STRCMP_Evaluate( wv, row, cond, val, record );
 
     case EXPR_WILDCARD:
-        *val = MSI_RecordGetInteger( record, 1 );
+        *val = MSI_RecordGetInteger( record, ++wv->rec_index );
         return ERROR_SUCCESS;
 
     default:
@@ -338,7 +340,8 @@ static UINT WHERE_execute( struct tagMSI
     for( i=0; i<count; i++ )
     {
         val = 0;
-        r = WHERE_evaluate( wv->db, table, i, wv->cond, &val, record );
+        wv->rec_index = 0;
+        r = WHERE_evaluate( wv, i, wv->cond, &val, record );
         if( r != ERROR_SUCCESS )
             return r;
         if( val )
@@ -603,6 +606,7 @@ UINT WHERE_CreateView( MSIDATABASE *db, 
     wv->row_count = 0;
     wv->reorder = NULL;
     wv->cond = cond;
+    wv->rec_index = 0;
     *view = (MSIVIEW*) wv;
 
     return ERROR_SUCCESS;
-- 
1.4.1


More information about the wine-patches mailing list