ReactOS  0.4.14-dev-323-g6fe6a88
alter.c
Go to the documentation of this file.
1 /*
2  * Implementation of the Microsoft Installer (msi.dll)
3  *
4  * Copyright 2006 Mike McCormack
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 
36 
37 typedef struct tagMSIALTERVIEW
38 {
44 } MSIALTERVIEW;
45 
46 static UINT ALTER_fetch_int( struct tagMSIVIEW *view, UINT row, UINT col, UINT *val )
47 {
49 
50  TRACE("%p %d %d %p\n", av, row, col, val );
51 
52  return ERROR_FUNCTION_FAILED;
53 }
54 
55 static UINT ALTER_fetch_stream( struct tagMSIVIEW *view, UINT row, UINT col, IStream **stm)
56 {
58 
59  TRACE("%p %d %d %p\n", av, row, col, stm );
60 
61  return ERROR_FUNCTION_FAILED;
62 }
63 
64 static UINT ALTER_get_row( struct tagMSIVIEW *view, UINT row, MSIRECORD **rec )
65 {
67 
68  TRACE("%p %d %p\n", av, row, rec );
69 
70  return av->table->ops->get_row(av->table, row, rec);
71 }
72 
74 {
75  (*(UINT *)param)++;
76  return ERROR_SUCCESS;
77 }
78 
80 {
81  MSIQUERY *view;
82  MSIRECORD *rec;
83  UINT r;
84 
85  static const WCHAR query[] = {
86  'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
87  '`','_','C','o','l','u','m','n','s','`',' ','W','H','E','R','E',' ',
88  '`','T','a','b','l','e','`','=','\'','%','s','\'',' ','A','N','D',' ',
89  '`','N','a','m','e','`','=','\'','%','s','\'',0
90  };
91 
92  r = MSI_OpenQuery(db, &view, query, table, column);
93  if (r != ERROR_SUCCESS)
94  return FALSE;
95 
97  if (r != ERROR_SUCCESS)
98  goto done;
99 
100  r = MSI_ViewFetch(view, &rec);
101  if (r == ERROR_SUCCESS)
102  msiobj_release(&rec->hdr);
103 
104 done:
105  msiobj_release(&view->hdr);
106  return (r == ERROR_SUCCESS);
107 }
108 
110 {
111  UINT r, colnum = 1;
112  MSIQUERY *view;
113  MSIVIEW *columns;
114 
115  static const WCHAR szColumns[] = {'_','C','o','l','u','m','n','s',0};
116  static const WCHAR query[] = {
117  'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
118  '`','_','C','o','l','u','m','n','s','`',' ','W','H','E','R','E',' ',
119  '`','T','a','b','l','e','`','=','\'','%','s','\'',' ','O','R','D','E','R',' ',
120  'B','Y',' ','`','N','u','m','b','e','r','`',0
121  };
122 
123  r = TABLE_CreateView(av->db, szColumns, &columns);
124  if (r != ERROR_SUCCESS)
125  return r;
126 
127  if (check_column_exists(av->db, av->colinfo->table, av->colinfo->column))
128  {
129  columns->ops->delete(columns);
130  return ERROR_BAD_QUERY_SYNTAX;
131  }
132 
133  r = MSI_OpenQuery(av->db, &view, query, av->colinfo->table, av->colinfo->column);
134  if (r == ERROR_SUCCESS)
135  {
137  msiobj_release(&view->hdr);
138  if (r != ERROR_SUCCESS)
139  {
140  columns->ops->delete(columns);
141  return r;
142  }
143  }
144  r = columns->ops->add_column(columns, av->colinfo->table,
145  colnum, av->colinfo->column,
146  av->colinfo->type, (av->hold == 1));
147 
148  columns->ops->delete(columns);
149  return r;
150 }
151 
153 {
155  UINT ref;
156 
157  TRACE("%p %p\n", av, record);
158 
159  if (av->hold == 1)
160  av->table->ops->add_ref(av->table);
161  else if (av->hold == -1)
162  {
163  ref = av->table->ops->release(av->table);
164  if (ref == 0)
165  av->table = NULL;
166  }
167 
168  if (av->colinfo)
169  return alter_add_column(av);
170 
171  return ERROR_SUCCESS;
172 }
173 
174 static UINT ALTER_close( struct tagMSIVIEW *view )
175 {
177 
178  TRACE("%p\n", av );
179 
180  return ERROR_SUCCESS;
181 }
182 
183 static UINT ALTER_get_dimensions( struct tagMSIVIEW *view, UINT *rows, UINT *cols )
184 {
186 
187  TRACE("%p %p %p\n", av, rows, cols );
188 
189  return ERROR_FUNCTION_FAILED;
190 }
191 
193  UINT *type, BOOL *temporary, LPCWSTR *table_name )
194 {
196 
197  TRACE("%p %d %p %p %p %p\n", av, n, name, type, temporary, table_name );
198 
199  return ERROR_FUNCTION_FAILED;
200 }
201 
202 static UINT ALTER_modify( struct tagMSIVIEW *view, MSIMODIFY eModifyMode,
203  MSIRECORD *rec, UINT row )
204 {
206 
207  TRACE("%p %d %p\n", av, eModifyMode, rec );
208 
209  return ERROR_FUNCTION_FAILED;
210 }
211 
212 static UINT ALTER_delete( struct tagMSIVIEW *view )
213 {
215 
216  TRACE("%p\n", av );
217  if (av->table)
218  av->table->ops->delete( av->table );
219  msi_free( av );
220 
221  return ERROR_SUCCESS;
222 }
223 
226 {
227  TRACE("%p, %d, %u, %p\n", view, col, val, *handle);
228 
229  return ERROR_FUNCTION_FAILED;
230 }
231 
232 static const MSIVIEWOPS alter_ops =
233 {
237  NULL,
238  NULL,
239  NULL,
241  ALTER_close,
244  ALTER_modify,
245  ALTER_delete,
247  NULL,
248  NULL,
249  NULL,
250  NULL,
251  NULL,
252  NULL,
253 };
254 
256 {
257  MSIALTERVIEW *av;
258  UINT r;
259 
260  TRACE("%p %p %s %d\n", view, colinfo, debugstr_w(name), hold );
261 
262  av = msi_alloc_zero( sizeof *av );
263  if( !av )
264  return ERROR_FUNCTION_FAILED;
265 
266  r = TABLE_CreateView( db, name, &av->table );
267  if (r != ERROR_SUCCESS)
268  {
269  msi_free( av );
270  return r;
271  }
272 
273  if (colinfo)
274  colinfo->table = name;
275 
276  /* fill the structure */
277  av->view.ops = &alter_ops;
278  av->db = db;
279  av->hold = hold;
280  av->colinfo = colinfo;
281 
282  *view = &av->view;
283 
284  return ERROR_SUCCESS;
285 }
static UINT ALTER_get_row(struct tagMSIVIEW *view, UINT row, MSIRECORD **rec)
Definition: alter.c:64
static UINT ALTER_delete(struct tagMSIVIEW *view)
Definition: alter.c:212
#define ERROR_SUCCESS
Definition: deptool.c:10
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
UINT TABLE_CreateView(MSIDATABASE *db, LPCWSTR name, MSIVIEW **view) DECLSPEC_HIDDEN
Definition: table.c:2162
MSIOBJECTHDR hdr
Definition: msipriv.h:141
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
MSIDATABASE * db
Definition: alter.c:40
UINT MSI_ViewExecute(MSIQUERY *, MSIRECORD *) DECLSPEC_HIDDEN
Definition: msiquery.c:443
struct tagMSIALTERVIEW MSIALTERVIEW
static UINT ITERATE_columns(MSIRECORD *row, LPVOID param)
Definition: alter.c:73
GLdouble n
Definition: glext.h:7729
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
static UINT ALTER_fetch_stream(struct tagMSIVIEW *view, UINT row, UINT col, IStream **stm)
Definition: alter.c:55
int32_t INT
Definition: typedefs.h:56
Definition: send.c:47
static void * msi_alloc_zero(size_t len) __WINE_ALLOC_SIZE(1)
Definition: msipriv.h:1210
static UINT ALTER_execute(struct tagMSIVIEW *view, MSIRECORD *record)
Definition: alter.c:152
UINT MSI_OpenQuery(MSIDATABASE *, MSIQUERY **, LPCWSTR,...) DECLSPEC_HIDDEN
Definition: msiquery.c:143
#define ERROR_FUNCTION_FAILED
Definition: winerror.h:985
UINT MSI_ViewFetch(MSIQUERY *, MSIRECORD **) DECLSPEC_HIDDEN
Definition: msiquery.c:364
unsigned int BOOL
Definition: ntddk_ex.h:94
UINT(* add_column)(struct tagMSIVIEW *view, LPCWSTR table, UINT number, LPCWSTR column, UINT type, BOOL hold)
Definition: msipriv.h:327
static UINT ALTER_modify(struct tagMSIVIEW *view, MSIMODIFY eModifyMode, MSIRECORD *rec, UINT row)
Definition: alter.c:202
#define debugstr_w
Definition: kernel32.h:32
GLenum GLint ref
Definition: glext.h:6028
smooth NULL
Definition: ftsmooth.c:416
LPCWSTR column
Definition: msipriv.h:212
WINE_DEFAULT_DEBUG_CHANNEL(msidb)
GLuint GLfloat * val
Definition: glext.h:7180
static BOOL check_column_exists(MSIDATABASE *db, LPCWSTR table, LPCWSTR column)
Definition: alter.c:79
#define TRACE(s)
Definition: solgame.cpp:4
static UINT ALTER_close(struct tagMSIVIEW *view)
Definition: alter.c:174
__wchar_t WCHAR
Definition: xmlstorage.h:180
static UINT ALTER_get_dimensions(struct tagMSIVIEW *view, UINT *rows, UINT *cols)
Definition: alter.c:183
const MSIVIEWOPS * ops
Definition: msipriv.h:348
static const WCHAR szColumns[]
Definition: table.c:79
GLfloat param
Definition: glext.h:5796
column_info * colinfo
Definition: alter.c:42
int msiobj_release(MSIOBJECTHDR *info)
Definition: handle.c:242
MSIVIEW * table
Definition: alter.c:41
UINT ALTER_CreateView(MSIDATABASE *db, MSIVIEW **view, LPCWSTR name, column_info *colinfo, int hold)
Definition: alter.c:255
static const MSIVIEWOPS alter_ops
Definition: alter.c:232
UINT(* delete)(struct tagMSIVIEW *)
Definition: msipriv.h:299
static UINT ALTER_find_matching_rows(struct tagMSIVIEW *view, UINT col, UINT val, UINT *row, MSIITERHANDLE *handle)
Definition: alter.c:224
static UINT ALTER_fetch_int(struct tagMSIVIEW *view, UINT row, UINT col, UINT *val)
Definition: alter.c:46
enum tagMSIMODIFY MSIMODIFY
unsigned int UINT
Definition: ndis.h:50
static BOOL msi_free(void *mem)
Definition: msipriv.h:1227
UINT(* get_row)(struct tagMSIVIEW *view, UINT row, MSIRECORD **rec)
Definition: msipriv.h:246
LPCWSTR table
Definition: msipriv.h:211
Definition: name.c:36
UINT(* release)(struct tagMSIVIEW *view)
Definition: msipriv.h:322
static IOleDocumentView * view
Definition: activex.c:1749
static UINT alter_add_column(MSIALTERVIEW *av)
Definition: alter.c:109
static UINT ALTER_get_column_info(struct tagMSIVIEW *view, UINT n, LPCWSTR *name, UINT *type, BOOL *temporary, LPCWSTR *table_name)
Definition: alter.c:192
UINT MSI_IterateRecords(MSIQUERY *, LPDWORD, record_func, LPVOID) DECLSPEC_HIDDEN
Definition: msiquery.c:168
#define ERROR_BAD_QUERY_SYNTAX
Definition: winerror.h:973
MSIVIEW view
Definition: alter.c:39
struct png_info_def *typedef unsigned char **typedef struct png_info_def *typedef struct png_info_def *typedef struct png_info_def *typedef unsigned char ** row
Definition: typeof.h:78
UINT(* add_ref)(struct tagMSIVIEW *view)
Definition: msipriv.h:317
GLuint const GLchar * name
Definition: glext.h:6031