diff options
Diffstat (limited to 'libmsi/drop.c')
-rw-r--r-- | libmsi/drop.c | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/libmsi/drop.c b/libmsi/drop.c new file mode 100644 index 0000000..f0b5803 --- /dev/null +++ b/libmsi/drop.c @@ -0,0 +1,142 @@ +/* + * Implementation of the Microsoft Installer (msi.dll) + * + * Copyright 2008 James Hawkins + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include <stdarg.h> + +#include "windef.h" +#include "winbase.h" +#include "winerror.h" +#include "wine/debug.h" +#include "msi.h" +#include "msiquery.h" +#include "objbase.h" +#include "objidl.h" +#include "msipriv.h" + +#include "query.h" + +WINE_DEFAULT_DEBUG_CHANNEL(msidb); + +typedef struct tagMSIDROPVIEW +{ + MSIVIEW view; + MSIDATABASE *db; + MSIVIEW *table; + column_info *colinfo; + INT hold; +} MSIDROPVIEW; + +static UINT DROP_execute(struct tagMSIVIEW *view, MSIRECORD *record) +{ + MSIDROPVIEW *dv = (MSIDROPVIEW*)view; + UINT r; + + TRACE("%p %p\n", dv, record); + + if( !dv->table ) + return ERROR_FUNCTION_FAILED; + + r = dv->table->ops->execute(dv->table, record); + if (r != ERROR_SUCCESS) + return r; + + return dv->table->ops->drop(dv->table); +} + +static UINT DROP_close(struct tagMSIVIEW *view) +{ + MSIDROPVIEW *dv = (MSIDROPVIEW*)view; + + TRACE("%p\n", dv); + + return ERROR_SUCCESS; +} + +static UINT DROP_get_dimensions(struct tagMSIVIEW *view, UINT *rows, UINT *cols) +{ + MSIDROPVIEW *dv = (MSIDROPVIEW*)view; + + TRACE("%p %p %p\n", dv, rows, cols); + + return ERROR_FUNCTION_FAILED; +} + +static UINT DROP_delete( struct tagMSIVIEW *view ) +{ + MSIDROPVIEW *dv = (MSIDROPVIEW*)view; + + TRACE("%p\n", dv ); + + if( dv->table ) + dv->table->ops->delete( dv->table ); + + msi_free( dv ); + + return ERROR_SUCCESS; +} + +static const MSIVIEWOPS drop_ops = +{ + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + DROP_execute, + DROP_close, + DROP_get_dimensions, + NULL, + NULL, + DROP_delete, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, +}; + +UINT DROP_CreateView(MSIDATABASE *db, MSIVIEW **view, LPCWSTR name) +{ + MSIDROPVIEW *dv; + UINT r; + + TRACE("%p %s\n", view, debugstr_w(name)); + + dv = msi_alloc_zero(sizeof *dv); + if(!dv) + return ERROR_FUNCTION_FAILED; + + r = TABLE_CreateView(db, name, &dv->table); + if (r != ERROR_SUCCESS) + { + msi_free( dv ); + return r; + } + + dv->view.ops = &drop_ops; + dv->db = db; + + *view = (MSIVIEW *)dv; + + return ERROR_SUCCESS; +} |