msi: Implement the DROP TABLE sql command.
[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 const MSIVIEWOPS drop_ops =
82 {
83     NULL,
84     NULL,
85     NULL,
86     NULL,
87     NULL,
88     NULL,
89     DROP_execute,
90     DROP_close,
91     DROP_get_dimensions,
92     NULL,
93     NULL,
94     NULL,
95     NULL,
96     NULL,
97     NULL,
98     NULL,
99     NULL,
100     NULL,
101     NULL,
102 };
103
104 UINT DROP_CreateView(MSIDATABASE *db, MSIVIEW **view, LPCWSTR name)
105 {
106     MSIDROPVIEW *dv;
107     UINT r;
108
109     TRACE("%p %s\n", view, debugstr_w(name));
110
111     dv = msi_alloc_zero(sizeof *dv);
112     if(!dv)
113         return ERROR_FUNCTION_FAILED;
114
115     r = TABLE_CreateView(db, name, &dv->table);
116     if (r != ERROR_SUCCESS || !dv->table)
117         return r;
118
119     dv->view.ops = &drop_ops;
120     dv->db = db;
121
122     *view = (MSIVIEW *)dv;
123
124     return ERROR_SUCCESS;
125 }