msi: Keep assembly caches loaded until the package is destroyed.
[wine] / dlls / msi / drop.c
1 /*
2  * Implementation of the Microsoft Installer (msi.dll)
3  *
4  * Copyright 2008 James Hawkins
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20
21 #include <stdarg.h>
22
23 #include "windef.h"
24 #include "winbase.h"
25 #include "winerror.h"
26 #include "wine/debug.h"
27 #include "msi.h"
28 #include "msiquery.h"
29 #include "objbase.h"
30 #include "objidl.h"
31 #include "msipriv.h"
32
33 #include "query.h"
34
35 WINE_DEFAULT_DEBUG_CHANNEL(msidb);
36
37 typedef struct tagMSIDROPVIEW
38 {
39     MSIVIEW view;
40     MSIDATABASE *db;
41     MSIVIEW *table;
42     column_info *colinfo;
43     INT hold;
44 } MSIDROPVIEW;
45
46 static UINT DROP_execute(struct tagMSIVIEW *view, MSIRECORD *record)
47 {
48     MSIDROPVIEW *dv = (MSIDROPVIEW*)view;
49     UINT r;
50
51     TRACE("%p %p\n", dv, record);
52
53     if( !dv->table )
54          return ERROR_FUNCTION_FAILED;
55
56     r = dv->table->ops->execute(dv->table, record);
57     if (r != ERROR_SUCCESS)
58         return r;
59
60     return dv->table->ops->drop(dv->table);
61 }
62
63 static UINT DROP_close(struct tagMSIVIEW *view)
64 {
65     MSIDROPVIEW *dv = (MSIDROPVIEW*)view;
66
67     TRACE("%p\n", dv);
68
69     return ERROR_SUCCESS;
70 }
71
72 static UINT DROP_get_dimensions(struct tagMSIVIEW *view, UINT *rows, UINT *cols)
73 {
74     MSIDROPVIEW *dv = (MSIDROPVIEW*)view;
75
76     TRACE("%p %p %p\n", dv, rows, cols);
77
78     return ERROR_FUNCTION_FAILED;
79 }
80
81 static UINT DROP_delete( struct tagMSIVIEW *view )
82 {
83     MSIDROPVIEW *dv = (MSIDROPVIEW*)view;
84
85     TRACE("%p\n", dv );
86
87     if( dv->table )
88         dv->table->ops->delete( dv->table );
89
90     msi_free( dv );
91
92     return ERROR_SUCCESS;
93 }
94
95 static const MSIVIEWOPS drop_ops =
96 {
97     NULL,
98     NULL,
99     NULL,
100     NULL,
101     NULL,
102     NULL,
103     DROP_execute,
104     DROP_close,
105     DROP_get_dimensions,
106     NULL,
107     NULL,
108     DROP_delete,
109     NULL,
110     NULL,
111     NULL,
112     NULL,
113     NULL,
114     NULL,
115     NULL,
116 };
117
118 UINT DROP_CreateView(MSIDATABASE *db, MSIVIEW **view, LPCWSTR name)
119 {
120     MSIDROPVIEW *dv;
121     UINT r;
122
123     TRACE("%p %s\n", view, debugstr_w(name));
124
125     dv = msi_alloc_zero(sizeof *dv);
126     if(!dv)
127         return ERROR_FUNCTION_FAILED;
128
129     r = TABLE_CreateView(db, name, &dv->table);
130     if (r != ERROR_SUCCESS)
131     {
132         msi_free( dv );
133         return r;
134     }
135
136     dv->view.ops = &drop_ops;
137     dv->db = db;
138
139     *view = (MSIVIEW *)dv;
140
141     return ERROR_SUCCESS;
142 }