mirror of
https://github.com/id-Software/GtkRadiant.git
synced 2026-03-20 17:09:39 +01:00
The GtkRadiant sources as originally released under the GPL license.
This commit is contained in:
474
setup/win32/msi/msiquery.c
Normal file
474
setup/win32/msi/msiquery.c
Normal file
@@ -0,0 +1,474 @@
|
||||
/*
|
||||
Copyright (C) 2001-2006 William Joseph.
|
||||
For a list of contributors, see the accompanying CONTRIBUTORS file.
|
||||
|
||||
This file is part of GtkRadiant.
|
||||
|
||||
GtkRadiant is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
GtkRadiant 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GtkRadiant; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include "Python.h"
|
||||
#include "structmember.h"
|
||||
|
||||
#include <windows.h>
|
||||
#include <msi.h>
|
||||
#include <msiquery.h>
|
||||
|
||||
typedef struct {
|
||||
PyObject_HEAD
|
||||
MSIHANDLE handle;
|
||||
} MsiRecord;
|
||||
|
||||
static void
|
||||
MsiRecord_dealloc(MsiRecord* self)
|
||||
{
|
||||
if(self->handle != 0)
|
||||
{
|
||||
unsigned int result = MsiCloseHandle(self->handle);
|
||||
}
|
||||
self->ob_type->tp_free((PyObject*)self);
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
MsiRecord_new(PyTypeObject *type, PyObject *args)
|
||||
{
|
||||
MsiRecord *self;
|
||||
|
||||
self = (MsiRecord *)type->tp_alloc(type, 0);
|
||||
if (self != NULL)
|
||||
{
|
||||
self->handle = 0;
|
||||
}
|
||||
|
||||
return (PyObject *)self;
|
||||
}
|
||||
|
||||
static int
|
||||
MsiRecord_init(MsiRecord *self, PyObject *args)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static PyMemberDef MsiRecord_members[] = {
|
||||
{NULL} /* Sentinel */
|
||||
};
|
||||
|
||||
static PyObject *
|
||||
MsiRecord_getstring(MsiRecord* self, PyObject *args)
|
||||
{
|
||||
char string[16384];
|
||||
DWORD size = 16384;
|
||||
int index;
|
||||
unsigned int result = 1;
|
||||
if (!PyArg_ParseTuple(args, "i", &index))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
if(self->handle != 0)
|
||||
{
|
||||
if(MsiRecordIsNull(self->handle, index))
|
||||
{
|
||||
puts("null record index");
|
||||
}
|
||||
result = MsiRecordGetString(self->handle, index, string, &size);
|
||||
printf("string: %s, index: %i\n", string, index);
|
||||
if(result != 0)
|
||||
{
|
||||
strcpy(string, "bleh");
|
||||
}
|
||||
}
|
||||
return PyString_FromString(string);
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
MsiRecord_setstring(MsiRecord* self, PyObject *args)
|
||||
{
|
||||
char* string;
|
||||
int index;
|
||||
unsigned int result = 1;
|
||||
if (!PyArg_ParseTuple(args, "is", &index, &string))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
if(self->handle != 0)
|
||||
{
|
||||
result = MsiRecordSetString(self->handle, index, string);
|
||||
}
|
||||
return Py_BuildValue("i", result);
|
||||
}
|
||||
|
||||
static PyMethodDef MsiRecord_methods[] = {
|
||||
{"getstring", (PyCFunction)MsiRecord_getstring, METH_VARARGS,
|
||||
"MsiRecordGetString"
|
||||
},
|
||||
{"setstring", (PyCFunction)MsiRecord_setstring, METH_VARARGS,
|
||||
"MsiRecordSetString"
|
||||
},
|
||||
{NULL} /* Sentinel */
|
||||
};
|
||||
|
||||
static PyTypeObject MsiRecordType = {
|
||||
PyObject_HEAD_INIT(NULL)
|
||||
0, /*ob_size*/
|
||||
"msiquery.MsiRecord", /*tp_name*/
|
||||
sizeof(MsiRecord), /*tp_basicsize*/
|
||||
0, /*tp_itemsize*/
|
||||
(destructor)MsiRecord_dealloc, /*tp_dealloc*/
|
||||
0, /*tp_print*/
|
||||
0, /*tp_getattr*/
|
||||
0, /*tp_setattr*/
|
||||
0, /*tp_compare*/
|
||||
0, /*tp_repr*/
|
||||
0, /*tp_as_number*/
|
||||
0, /*tp_as_sequence*/
|
||||
0, /*tp_as_mapping*/
|
||||
0, /*tp_hash */
|
||||
0, /*tp_call*/
|
||||
0, /*tp_str*/
|
||||
0, /*tp_getattro*/
|
||||
0, /*tp_setattro*/
|
||||
0, /*tp_as_buffer*/
|
||||
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
|
||||
"MsiRecord objects", /* tp_doc */
|
||||
0, /* tp_traverse */
|
||||
0, /* tp_clear */
|
||||
0, /* tp_richcompare */
|
||||
0, /* tp_weaklistoffset */
|
||||
0, /* tp_iter */
|
||||
0, /* tp_iternext */
|
||||
MsiRecord_methods, /* tp_methods */
|
||||
MsiRecord_members, /* tp_members */
|
||||
0, /* tp_getset */
|
||||
0, /* tp_base */
|
||||
0, /* tp_dict */
|
||||
0, /* tp_descr_get */
|
||||
0, /* tp_descr_set */
|
||||
0, /* tp_dictoffset */
|
||||
(initproc)MsiRecord_init, /* tp_init */
|
||||
0, /* tp_alloc */
|
||||
(newfunc)MsiRecord_new, /* tp_new */
|
||||
};
|
||||
|
||||
PyObject*
|
||||
MsiRecord_FromHandle(MSIHANDLE handle)
|
||||
{
|
||||
MsiRecord *record = (MsiRecord *)MsiRecordType.tp_new(&MsiRecordType, NULL, NULL);
|
||||
record->handle = handle;
|
||||
return (PyObject*)record;
|
||||
}
|
||||
|
||||
|
||||
typedef struct {
|
||||
PyObject_HEAD
|
||||
MSIHANDLE handle;
|
||||
} MsiView;
|
||||
|
||||
static void
|
||||
MsiView_dealloc(MsiView* self)
|
||||
{
|
||||
if(self->handle != 0)
|
||||
{
|
||||
unsigned int result;
|
||||
result = MsiViewClose(self->handle);
|
||||
result = MsiCloseHandle(self->handle);
|
||||
}
|
||||
self->ob_type->tp_free((PyObject*)self);
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
MsiView_new(PyTypeObject *type, PyObject *args)
|
||||
{
|
||||
MsiView *self;
|
||||
|
||||
self = (MsiView *)type->tp_alloc(type, 0);
|
||||
if (self != NULL)
|
||||
{
|
||||
self->handle = 0;
|
||||
}
|
||||
|
||||
return (PyObject *)self;
|
||||
}
|
||||
|
||||
static int
|
||||
MsiView_init(MsiView *self)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static PyMemberDef MsiView_members[] = {
|
||||
{NULL} /* Sentinel */
|
||||
};
|
||||
|
||||
static PyObject *
|
||||
MsiView_fetch(MsiView* self)
|
||||
{
|
||||
unsigned int result = 1;
|
||||
MSIHANDLE record;
|
||||
result = MsiViewFetch(self->handle, &record);
|
||||
if(result == 0)
|
||||
{
|
||||
return MsiRecord_FromHandle(record);
|
||||
}
|
||||
else
|
||||
{
|
||||
Py_INCREF(Py_None);
|
||||
return Py_None;
|
||||
}
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
MsiView_update(MsiView* self, PyObject *args)
|
||||
{
|
||||
unsigned int result = 1;
|
||||
MsiRecord *record;
|
||||
if(!PyArg_ParseTuple(args, "O!", &MsiRecordType, &record))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
result = MsiViewModify(self->handle, MSIMODIFY_UPDATE, record->handle);
|
||||
return Py_BuildValue("i", result);
|
||||
}
|
||||
|
||||
static PyMethodDef MsiView_methods[] = {
|
||||
{"fetch", (PyCFunction)MsiView_fetch, METH_NOARGS,
|
||||
"MsiViewFetch"
|
||||
},
|
||||
{"update", (PyCFunction)MsiView_update, METH_VARARGS,
|
||||
"MsiViewModify(UPDATE)"
|
||||
},
|
||||
{NULL} /* Sentinel */
|
||||
};
|
||||
|
||||
static PyTypeObject MsiViewType = {
|
||||
PyObject_HEAD_INIT(NULL)
|
||||
0, /*ob_size*/
|
||||
"msiquery.MsiView", /*tp_name*/
|
||||
sizeof(MsiView), /*tp_basicsize*/
|
||||
0, /*tp_itemsize*/
|
||||
(destructor)MsiView_dealloc, /*tp_dealloc*/
|
||||
0, /*tp_print*/
|
||||
0, /*tp_getattr*/
|
||||
0, /*tp_setattr*/
|
||||
0, /*tp_compare*/
|
||||
0, /*tp_repr*/
|
||||
0, /*tp_as_number*/
|
||||
0, /*tp_as_sequence*/
|
||||
0, /*tp_as_mapping*/
|
||||
0, /*tp_hash */
|
||||
0, /*tp_call*/
|
||||
0, /*tp_str*/
|
||||
0, /*tp_getattro*/
|
||||
0, /*tp_setattro*/
|
||||
0, /*tp_as_buffer*/
|
||||
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
|
||||
"MsiView objects", /* tp_doc */
|
||||
0, /* tp_traverse */
|
||||
0, /* tp_clear */
|
||||
0, /* tp_richcompare */
|
||||
0, /* tp_weaklistoffset */
|
||||
0, /* tp_iter */
|
||||
0, /* tp_iternext */
|
||||
MsiView_methods, /* tp_methods */
|
||||
MsiView_members, /* tp_members */
|
||||
0, /* tp_getset */
|
||||
0, /* tp_base */
|
||||
0, /* tp_dict */
|
||||
0, /* tp_descr_get */
|
||||
0, /* tp_descr_set */
|
||||
0, /* tp_dictoffset */
|
||||
(initproc)MsiView_init, /* tp_init */
|
||||
0, /* tp_alloc */
|
||||
(newfunc)MsiView_new, /* tp_new */
|
||||
};
|
||||
|
||||
PyObject*
|
||||
MsiView_FromHandle(MSIHANDLE handle)
|
||||
{
|
||||
MsiView *view = (MsiView *)MsiViewType.tp_new(&MsiViewType, NULL, NULL);
|
||||
view->handle = handle;
|
||||
MsiViewExecute(handle, 0);
|
||||
return (PyObject*)view;
|
||||
}
|
||||
|
||||
|
||||
typedef struct {
|
||||
PyObject_HEAD
|
||||
MSIHANDLE handle;
|
||||
} MsiDB;
|
||||
|
||||
static void
|
||||
MsiDB_dealloc(MsiDB* self)
|
||||
{
|
||||
if(self->handle != 0)
|
||||
{
|
||||
unsigned int result = MsiCloseHandle(self->handle);
|
||||
}
|
||||
self->ob_type->tp_free((PyObject*)self);
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
MsiDB_new(PyTypeObject *type, PyObject *args)
|
||||
{
|
||||
MsiDB *self;
|
||||
|
||||
self = (MsiDB *)type->tp_alloc(type, 0);
|
||||
if (self != NULL)
|
||||
{
|
||||
self->handle = 0;
|
||||
}
|
||||
|
||||
return (PyObject *)self;
|
||||
}
|
||||
|
||||
static int
|
||||
MsiDB_init(MsiDB *self, PyObject *args)
|
||||
{
|
||||
char* filename;
|
||||
if(!PyArg_ParseTuple(args, "s", &filename))
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
MsiOpenDatabase(filename, MSIDBOPEN_TRANSACT, &self->handle);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static PyMemberDef MsiDB_members[] = {
|
||||
{NULL} /* Sentinel */
|
||||
};
|
||||
|
||||
static PyObject *
|
||||
MsiDB_openview(MsiDB* self, PyObject *args)
|
||||
{
|
||||
char* query;
|
||||
unsigned int result = 1;
|
||||
if (!PyArg_ParseTuple(args, "s", &query))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
if(self->handle != 0)
|
||||
{
|
||||
MSIHANDLE view;
|
||||
result = MsiDatabaseOpenView(self->handle, query, &view);
|
||||
if(result == ERROR_SUCCESS)
|
||||
{
|
||||
return MsiView_FromHandle(view);
|
||||
}
|
||||
}
|
||||
Py_INCREF(Py_None);
|
||||
return Py_None;
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
MsiDB_commit(MsiDB* self)
|
||||
{
|
||||
unsigned int result = 1;
|
||||
if(self->handle != 0)
|
||||
{
|
||||
result = MsiDatabaseCommit(self->handle);
|
||||
if(result == ERROR_INVALID_HANDLE)
|
||||
{
|
||||
printf("invalid??\n");
|
||||
}
|
||||
}
|
||||
return Py_BuildValue("i", result);
|
||||
}
|
||||
|
||||
static PyMethodDef MsiDB_methods[] = {
|
||||
{"openview", (PyCFunction)MsiDB_openview, METH_VARARGS,
|
||||
"MsiViewExecute SQL query"
|
||||
},
|
||||
{"commit", (PyCFunction)MsiDB_commit, METH_NOARGS,
|
||||
"MsiDatabaseCommit"
|
||||
},
|
||||
{NULL} /* Sentinel */
|
||||
};
|
||||
|
||||
static PyTypeObject MsiDBType = {
|
||||
PyObject_HEAD_INIT(NULL)
|
||||
0, /*ob_size*/
|
||||
"msiquery.MsiDB", /*tp_name*/
|
||||
sizeof(MsiDB), /*tp_basicsize*/
|
||||
0, /*tp_itemsize*/
|
||||
(destructor)MsiDB_dealloc, /*tp_dealloc*/
|
||||
0, /*tp_print*/
|
||||
0, /*tp_getattr*/
|
||||
0, /*tp_setattr*/
|
||||
0, /*tp_compare*/
|
||||
0, /*tp_repr*/
|
||||
0, /*tp_as_number*/
|
||||
0, /*tp_as_sequence*/
|
||||
0, /*tp_as_mapping*/
|
||||
0, /*tp_hash */
|
||||
0, /*tp_call*/
|
||||
0, /*tp_str*/
|
||||
0, /*tp_getattro*/
|
||||
0, /*tp_setattro*/
|
||||
0, /*tp_as_buffer*/
|
||||
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
|
||||
"MsiDB objects", /* tp_doc */
|
||||
0, /* tp_traverse */
|
||||
0, /* tp_clear */
|
||||
0, /* tp_richcompare */
|
||||
0, /* tp_weaklistoffset */
|
||||
0, /* tp_iter */
|
||||
0, /* tp_iternext */
|
||||
MsiDB_methods, /* tp_methods */
|
||||
MsiDB_members, /* tp_members */
|
||||
0, /* tp_getset */
|
||||
0, /* tp_base */
|
||||
0, /* tp_dict */
|
||||
0, /* tp_descr_get */
|
||||
0, /* tp_descr_set */
|
||||
0, /* tp_dictoffset */
|
||||
(initproc)MsiDB_init, /* tp_init */
|
||||
0, /* tp_alloc */
|
||||
(newfunc)MsiDB_new, /* tp_new */
|
||||
};
|
||||
|
||||
static PyMethodDef msiquery_methods[] = {
|
||||
{NULL} /* Sentinel */
|
||||
};
|
||||
|
||||
PyMODINIT_FUNC
|
||||
initmsiquery(void)
|
||||
{
|
||||
PyObject* m;
|
||||
|
||||
if (PyType_Ready(&MsiRecordType) < 0)
|
||||
return;
|
||||
|
||||
if (PyType_Ready(&MsiViewType) < 0)
|
||||
return;
|
||||
|
||||
if (PyType_Ready(&MsiDBType) < 0)
|
||||
return;
|
||||
|
||||
m = Py_InitModule3("msiquery", msiquery_methods, "Msi API module.");
|
||||
|
||||
if (m == NULL)
|
||||
return;
|
||||
|
||||
Py_INCREF(&MsiRecordType);
|
||||
PyModule_AddObject(m, "MsiRecord", (PyObject *)&MsiRecordType);
|
||||
|
||||
Py_INCREF(&MsiViewType);
|
||||
PyModule_AddObject(m, "MsiView", (PyObject *)&MsiViewType);
|
||||
|
||||
Py_INCREF(&MsiDBType);
|
||||
PyModule_AddObject(m, "MsiDB", (PyObject *)&MsiDBType);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user