2 Copyright (C) 2001-2006 William Joseph.
\r
3 For a list of contributors, see the accompanying CONTRIBUTORS file.
\r
5 This file is part of GtkRadiant.
\r
7 GtkRadiant is free software; you can redistribute it and/or modify
\r
8 it under the terms of the GNU General Public License as published by
\r
9 the Free Software Foundation; either version 2 of the License, or
\r
10 (at your option) any later version.
\r
12 GtkRadiant is distributed in the hope that it will be useful,
\r
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
15 GNU General Public License for more details.
\r
17 You should have received a copy of the GNU General Public License
\r
18 along with GtkRadiant; if not, write to the Free Software
\r
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
\r
23 #include "structmember.h"
35 MsiRecord_dealloc(MsiRecord* self)
\r
37 if(self->handle != 0)
\r
39 unsigned int result = MsiCloseHandle(self->handle);
\r
41 self->ob_type->tp_free((PyObject*)self);
\r
45 MsiRecord_new(PyTypeObject *type, PyObject *args)
\r
49 self = (MsiRecord *)type->tp_alloc(type, 0);
\r
55 return (PyObject *)self;
\r
59 MsiRecord_init(MsiRecord *self, PyObject *args)
\r
64 static PyMemberDef MsiRecord_members[] = {
\r
65 {NULL} /* Sentinel */
\r
69 MsiRecord_getstring(MsiRecord* self, PyObject *args)
\r
74 unsigned int result = 1;
\r
75 if (!PyArg_ParseTuple(args, "i", &index))
\r
79 if(self->handle != 0)
\r
81 if(MsiRecordIsNull(self->handle, index))
\r
83 puts("null record index");
\r
85 result = MsiRecordGetString(self->handle, index, string, &size);
\r
86 printf("string: %s, index: %i\n", string, index);
\r
89 strcpy(string, "bleh");
\r
92 return PyString_FromString(string);
\r
96 MsiRecord_setstring(MsiRecord* self, PyObject *args)
\r
100 unsigned int result = 1;
\r
101 if (!PyArg_ParseTuple(args, "is", &index, &string))
\r
105 if(self->handle != 0)
\r
107 result = MsiRecordSetString(self->handle, index, string);
\r
109 return Py_BuildValue("i", result);
\r
112 static PyMethodDef MsiRecord_methods[] = {
\r
113 {"getstring", (PyCFunction)MsiRecord_getstring, METH_VARARGS,
\r
114 "MsiRecordGetString"
\r
116 {"setstring", (PyCFunction)MsiRecord_setstring, METH_VARARGS,
\r
117 "MsiRecordSetString"
\r
119 {NULL} /* Sentinel */
\r
122 static PyTypeObject MsiRecordType = {
\r
123 PyObject_HEAD_INIT(NULL)
\r
125 "msiquery.MsiRecord", /*tp_name*/
\r
126 sizeof(MsiRecord), /*tp_basicsize*/
\r
128 (destructor)MsiRecord_dealloc, /*tp_dealloc*/
\r
134 0, /*tp_as_number*/
\r
135 0, /*tp_as_sequence*/
\r
136 0, /*tp_as_mapping*/
\r
142 0, /*tp_as_buffer*/
\r
143 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
\r
144 "MsiRecord objects", /* tp_doc */
\r
145 0, /* tp_traverse */
\r
147 0, /* tp_richcompare */
\r
148 0, /* tp_weaklistoffset */
\r
150 0, /* tp_iternext */
\r
151 MsiRecord_methods, /* tp_methods */
\r
152 MsiRecord_members, /* tp_members */
\r
156 0, /* tp_descr_get */
\r
157 0, /* tp_descr_set */
\r
158 0, /* tp_dictoffset */
\r
159 (initproc)MsiRecord_init, /* tp_init */
\r
161 (newfunc)MsiRecord_new, /* tp_new */
\r
165 MsiRecord_FromHandle(MSIHANDLE handle)
\r
167 MsiRecord *record = (MsiRecord *)MsiRecordType.tp_new(&MsiRecordType, NULL, NULL);
\r
168 record->handle = handle;
\r
169 return (PyObject*)record;
\r
179 MsiView_dealloc(MsiView* self)
\r
181 if(self->handle != 0)
\r
183 unsigned int result;
\r
184 result = MsiViewClose(self->handle);
\r
185 result = MsiCloseHandle(self->handle);
\r
187 self->ob_type->tp_free((PyObject*)self);
\r
191 MsiView_new(PyTypeObject *type, PyObject *args)
\r
195 self = (MsiView *)type->tp_alloc(type, 0);
\r
201 return (PyObject *)self;
\r
205 MsiView_init(MsiView *self)
\r
210 static PyMemberDef MsiView_members[] = {
\r
211 {NULL} /* Sentinel */
\r
215 MsiView_fetch(MsiView* self)
\r
217 unsigned int result = 1;
\r
219 result = MsiViewFetch(self->handle, &record);
\r
222 return MsiRecord_FromHandle(record);
\r
226 Py_INCREF(Py_None);
\r
232 MsiView_update(MsiView* self, PyObject *args)
\r
234 unsigned int result = 1;
\r
236 if(!PyArg_ParseTuple(args, "O!", &MsiRecordType, &record))
\r
240 result = MsiViewModify(self->handle, MSIMODIFY_UPDATE, record->handle);
\r
241 return Py_BuildValue("i", result);
\r
244 static PyMethodDef MsiView_methods[] = {
\r
245 {"fetch", (PyCFunction)MsiView_fetch, METH_NOARGS,
\r
248 {"update", (PyCFunction)MsiView_update, METH_VARARGS,
\r
249 "MsiViewModify(UPDATE)"
\r
251 {NULL} /* Sentinel */
\r
254 static PyTypeObject MsiViewType = {
\r
255 PyObject_HEAD_INIT(NULL)
\r
257 "msiquery.MsiView", /*tp_name*/
\r
258 sizeof(MsiView), /*tp_basicsize*/
\r
260 (destructor)MsiView_dealloc, /*tp_dealloc*/
\r
266 0, /*tp_as_number*/
\r
267 0, /*tp_as_sequence*/
\r
268 0, /*tp_as_mapping*/
\r
274 0, /*tp_as_buffer*/
\r
275 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
\r
276 "MsiView objects", /* tp_doc */
\r
277 0, /* tp_traverse */
\r
279 0, /* tp_richcompare */
\r
280 0, /* tp_weaklistoffset */
\r
282 0, /* tp_iternext */
\r
283 MsiView_methods, /* tp_methods */
\r
284 MsiView_members, /* tp_members */
\r
288 0, /* tp_descr_get */
\r
289 0, /* tp_descr_set */
\r
290 0, /* tp_dictoffset */
\r
291 (initproc)MsiView_init, /* tp_init */
\r
293 (newfunc)MsiView_new, /* tp_new */
\r
297 MsiView_FromHandle(MSIHANDLE handle)
\r
299 MsiView *view = (MsiView *)MsiViewType.tp_new(&MsiViewType, NULL, NULL);
\r
300 view->handle = handle;
\r
301 MsiViewExecute(handle, 0);
\r
302 return (PyObject*)view;
\r
312 MsiDB_dealloc(MsiDB* self)
\r
314 if(self->handle != 0)
\r
316 unsigned int result = MsiCloseHandle(self->handle);
\r
318 self->ob_type->tp_free((PyObject*)self);
\r
322 MsiDB_new(PyTypeObject *type, PyObject *args)
\r
326 self = (MsiDB *)type->tp_alloc(type, 0);
\r
332 return (PyObject *)self;
\r
336 MsiDB_init(MsiDB *self, PyObject *args)
\r
339 if(!PyArg_ParseTuple(args, "s", &filename))
\r
344 MsiOpenDatabase(filename, MSIDBOPEN_TRANSACT, &self->handle);
\r
349 static PyMemberDef MsiDB_members[] = {
\r
350 {NULL} /* Sentinel */
\r
354 MsiDB_openview(MsiDB* self, PyObject *args)
\r
357 unsigned int result = 1;
\r
358 if (!PyArg_ParseTuple(args, "s", &query))
\r
362 if(self->handle != 0)
\r
365 result = MsiDatabaseOpenView(self->handle, query, &view);
\r
366 if(result == ERROR_SUCCESS)
\r
368 return MsiView_FromHandle(view);
\r
371 Py_INCREF(Py_None);
\r
376 MsiDB_commit(MsiDB* self)
\r
378 unsigned int result = 1;
\r
379 if(self->handle != 0)
\r
381 result = MsiDatabaseCommit(self->handle);
\r
382 if(result == ERROR_INVALID_HANDLE)
\r
384 printf("invalid??\n");
\r
387 return Py_BuildValue("i", result);
\r
390 static PyMethodDef MsiDB_methods[] = {
\r
391 {"openview", (PyCFunction)MsiDB_openview, METH_VARARGS,
\r
392 "MsiViewExecute SQL query"
\r
394 {"commit", (PyCFunction)MsiDB_commit, METH_NOARGS,
\r
395 "MsiDatabaseCommit"
\r
397 {NULL} /* Sentinel */
\r
400 static PyTypeObject MsiDBType = {
\r
401 PyObject_HEAD_INIT(NULL)
\r
403 "msiquery.MsiDB", /*tp_name*/
\r
404 sizeof(MsiDB), /*tp_basicsize*/
\r
406 (destructor)MsiDB_dealloc, /*tp_dealloc*/
\r
412 0, /*tp_as_number*/
\r
413 0, /*tp_as_sequence*/
\r
414 0, /*tp_as_mapping*/
\r
420 0, /*tp_as_buffer*/
\r
421 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
\r
422 "MsiDB objects", /* tp_doc */
\r
423 0, /* tp_traverse */
\r
425 0, /* tp_richcompare */
\r
426 0, /* tp_weaklistoffset */
\r
428 0, /* tp_iternext */
\r
429 MsiDB_methods, /* tp_methods */
\r
430 MsiDB_members, /* tp_members */
\r
434 0, /* tp_descr_get */
\r
435 0, /* tp_descr_set */
\r
436 0, /* tp_dictoffset */
\r
437 (initproc)MsiDB_init, /* tp_init */
\r
439 (newfunc)MsiDB_new, /* tp_new */
\r
442 static PyMethodDef msiquery_methods[] = {
\r
443 {NULL} /* Sentinel */
\r
447 initmsiquery(void)
\r
451 if (PyType_Ready(&MsiRecordType) < 0)
\r
454 if (PyType_Ready(&MsiViewType) < 0)
\r
457 if (PyType_Ready(&MsiDBType) < 0)
\r
460 m = Py_InitModule3("msiquery", msiquery_methods, "Msi API module.");
\r
465 Py_INCREF(&MsiRecordType);
\r
466 PyModule_AddObject(m, "MsiRecord", (PyObject *)&MsiRecordType);
\r
468 Py_INCREF(&MsiViewType);
\r
469 PyModule_AddObject(m, "MsiView", (PyObject *)&MsiViewType);
\r
471 Py_INCREF(&MsiDBType);
\r
472 PyModule_AddObject(m, "MsiDB", (PyObject *)&MsiDBType);
\r