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