MSI: Create the WHERE part of a query in one function call
Mike McCormack
mike at codeweavers.com
Thu Jul 1 10:23:16 CDT 2004
ChangeLog:
* Create the WHERE part of a query in one function call
-------------- next part --------------
diff -u dlls/msi.old/query.h dlls/msi/query.h
--- dlls/msi.old/query.h 2004-07-01 10:20:35.000000000 -0500
+++ dlls/msi/query.h 2004-07-01 10:20:49.000000000 -0500
@@ -110,8 +110,8 @@
UINT ORDER_CreateView( MSIDATABASE *db, MSIVIEW **view, MSIVIEW *table );
UINT ORDER_AddColumn( MSIVIEW *group, LPWSTR name );
-UINT WHERE_CreateView( MSIDATABASE *db, MSIVIEW **view, MSIVIEW *table );
-UINT WHERE_AddCondition( MSIVIEW *view, struct expr *condition );
+UINT WHERE_CreateView( MSIDATABASE *db, MSIVIEW **view, MSIVIEW *table,
+ struct expr *cond );
UINT CREATE_CreateView( MSIDATABASE *db, MSIVIEW **view, LPWSTR table,
create_col_info *col_info, BOOL temp );
diff -u dlls/msi.old/sql.y dlls/msi/sql.y
--- dlls/msi.old/sql.y 2004-07-01 10:20:35.000000000 -0500
+++ dlls/msi/sql.y 2004-07-01 10:20:49.000000000 -0500
@@ -215,40 +215,37 @@
;
ci->next = HeapAlloc( GetProcessHeap(), 0, sizeof *$$ );
- if( ci->next )
+ if( !ci->next )
{
- ci->next->colname = $3;
- ci->next->type = $4;
- ci->next->next = NULL;
- }
- else if( $1 )
- {
- HeapFree( GetProcessHeap(), 0, $1 );
- $1 = NULL;
+ /* FIXME: free $1 */
+ YYABORT;
}
+ ci->next->colname = $3;
+ ci->next->type = $4;
+ ci->next->next = NULL;
+
$$ = $1;
}
| column column_type
{
$$ = HeapAlloc( GetProcessHeap(), 0, sizeof *$$ );
- if( $$ )
- {
- $$->colname = $1;
- $$->type = $2;
- $$->next = NULL;
- }
+ if( ! $$ )
+ YYABORT;
+ $$->colname = $1;
+ $$->type = $2;
+ $$->next = NULL;
}
;
column_type:
data_type_l
{
- $$ = $1;
+ $$ = $1 | MSITYPE_VALID;
}
| data_type_l TK_LOCALIZABLE
{
FIXME("LOCALIZABLE ignored\n");
- $$ = $1;
+ $$ = $1 | MSITYPE_VALID;
}
;
@@ -270,7 +267,7 @@
}
| TK_CHAR TK_LP data_count TK_RP
{
- $$ = MSITYPE_STRING | 0x500 | $3;
+ $$ = MSITYPE_STRING | 0x400 | $3;
}
| TK_LONGCHAR
{
@@ -397,10 +394,7 @@
r = TABLE_CreateView( sql->db, $2, &view );
if( r != ERROR_SUCCESS )
YYABORT;
- r = WHERE_CreateView( sql->db, &view, view );
- if( r != ERROR_SUCCESS )
- YYABORT;
- r = WHERE_AddCondition( view, $4 );
+ r = WHERE_CreateView( sql->db, &view, view, $4 );
if( r != ERROR_SUCCESS )
YYABORT;
$$ = view;
diff -u dlls/msi.old/where.c dlls/msi/where.c
--- dlls/msi.old/where.c 2004-07-01 10:20:35.000000000 -0500
+++ dlls/msi/where.c 2004-07-01 10:20:49.000000000 -0500
@@ -321,36 +321,6 @@
WHERE_delete
};
-UINT WHERE_CreateView( MSIDATABASE *db, MSIVIEW **view, MSIVIEW *table )
-{
- MSIWHEREVIEW *wv = NULL;
- UINT count = 0, r;
-
- TRACE("%p\n", wv );
-
- r = table->ops->get_dimensions( table, NULL, &count );
- if( r != ERROR_SUCCESS )
- {
- ERR("can't get table dimensions\n");
- return r;
- }
-
- wv = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof *wv );
- if( !wv )
- return ERROR_FUNCTION_FAILED;
-
- /* fill the structure */
- wv->view.ops = &where_ops;
- wv->db = db;
- wv->table = table;
- wv->row_count = 0;
- wv->reorder = NULL;
- wv->cond = NULL;
- *view = (MSIVIEW*) wv;
-
- return ERROR_SUCCESS;
-}
-
static UINT WHERE_VerifyCondition( MSIDATABASE *db, MSIVIEW *table, struct expr *cond,
UINT *valid )
{
@@ -423,33 +393,42 @@
return ERROR_SUCCESS;
}
-UINT WHERE_AddCondition( MSIVIEW *view, struct expr *cond )
+UINT WHERE_CreateView( MSIDATABASE *db, MSIVIEW **view, MSIVIEW *table,
+ struct expr *cond )
{
- MSIWHEREVIEW *wv = (MSIWHEREVIEW *) view;
- UINT r, valid = 0;
-
- if( wv->view.ops != &where_ops )
- return ERROR_FUNCTION_FAILED;
- if( !wv->table )
- return ERROR_INVALID_PARAMETER;
-
- if( !cond )
- return ERROR_SUCCESS;
+ MSIWHEREVIEW *wv = NULL;
+ UINT count = 0, r, valid = 0;
- TRACE("Adding condition\n");
+ TRACE("%p\n", wv );
- r = WHERE_VerifyCondition( wv->db, wv->table, cond, &valid );
+ r = table->ops->get_dimensions( table, NULL, &count );
if( r != ERROR_SUCCESS )
- ERR("condition evaluation failed\n");
+ {
+ ERR("can't get table dimensions\n");
+ return r;
+ }
- TRACE("condition is %s\n", valid ? "valid" : "invalid" );
- if( !valid )
+ if( cond )
{
- delete_expr( cond );
- return ERROR_FUNCTION_FAILED;
+ r = WHERE_VerifyCondition( db, table, cond, &valid );
+ if( r != ERROR_SUCCESS )
+ return r;
+ if( !valid )
+ return ERROR_FUNCTION_FAILED;
}
+ wv = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof *wv );
+ if( !wv )
+ return ERROR_FUNCTION_FAILED;
+
+ /* fill the structure */
+ wv->view.ops = &where_ops;
+ wv->db = db;
+ wv->table = table;
+ wv->row_count = 0;
+ wv->reorder = NULL;
wv->cond = cond;
+ *view = (MSIVIEW*) wv;
return ERROR_SUCCESS;
}
More information about the wine-patches
mailing list