From ffe62ed46d93685353e0011ea1cf06169e2e9e06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20v=2E=20L=C3=B6wis?= Date: Mon, 2 Jun 2008 08:40:06 +0000 Subject: [PATCH] Patch #2125: Add GetInteger and GetString methods for msilib.Record objects. --- Doc/library/msilib.rst | 13 ++++++++++++ Misc/NEWS | 3 +++ PC/_msi.c | 47 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+) diff --git a/Doc/library/msilib.rst b/Doc/library/msilib.rst index a1e5e98498e..fd666001d2a 100644 --- a/Doc/library/msilib.rst +++ b/Doc/library/msilib.rst @@ -264,6 +264,18 @@ Record Objects :cfunc:`MsiRecordGetFieldCount`. +.. method:: Record.GetInteger(field) + + Return the value of *field* as an integer where possible. *field* must + be an integer. + + +.. method:: Record.GetString(field) + + Return the value of *field* as a string where possible. *field* must + be an integer. + + .. method:: Record.SetString(field, value) Set *field* to *value* through :cfunc:`MsiRecordSetString`. *field* must be an @@ -543,3 +555,4 @@ definitions. Currently, these definitions are based on MSI version 2.0. This module contains definitions for the UIText and ActionText tables, for the standard installer actions. + diff --git a/Misc/NEWS b/Misc/NEWS index d78e993df5b..bec09804c37 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -72,6 +72,9 @@ Extension Modules Library ------- +- Patch #2125: Add GetInteger and GetString methods for + msilib.Record objects. + - Issue #2782: The datetime module's strftime methods now accept unicode format strings just as time.strftime always has. diff --git a/PC/_msi.c b/PC/_msi.c index fd6fc5db813..6b1c594d1c0 100644 --- a/PC/_msi.c +++ b/PC/_msi.c @@ -338,6 +338,49 @@ record_getfieldcount(msiobj* record, PyObject* args) return PyInt_FromLong(MsiRecordGetFieldCount(record->h)); } +static PyObject* +record_getinteger(msiobj* record, PyObject* args) +{ + unsigned int field; + int status; + + if (!PyArg_ParseTuple(args, "I:GetInteger", &field)) + return NULL; + status = MsiRecordGetInteger(record->h, field); + if (status == MSI_NULL_INTEGER){ + PyErr_SetString(MSIError, "could not convert record field to integer"); + return NULL; + } + return PyInt_FromLong((long) status); +} + +static PyObject* +record_getstring(msiobj* record, PyObject* args) +{ + unsigned int field; + unsigned int status; + char buf[2000]; + char *res = buf; + DWORD size = sizeof(buf); + PyObject* string; + + if (!PyArg_ParseTuple(args, "I:GetString", &field)) + return NULL; + status = MsiRecordGetString(record->h, field, res, &size); + if (status == ERROR_MORE_DATA) { + res = (char*) malloc(size + 1); + if (res == NULL) + return PyErr_NoMemory(); + status = MsiRecordGetString(record->h, field, res, &size); + } + if (status != ERROR_SUCCESS) + return msierror((int) status); + string = PyString_FromString(res); + if (buf != res) + free(res); + return string; +} + static PyObject* record_cleardata(msiobj* record, PyObject *args) { @@ -405,6 +448,10 @@ record_setinteger(msiobj* record, PyObject *args) static PyMethodDef record_methods[] = { { "GetFieldCount", (PyCFunction)record_getfieldcount, METH_NOARGS, PyDoc_STR("GetFieldCount() -> int\nWraps MsiRecordGetFieldCount")}, + { "GetInteger", (PyCFunction)record_getinteger, METH_VARARGS, + PyDoc_STR("GetInteger(field) -> int\nWraps MsiRecordGetInteger")}, + { "GetString", (PyCFunction)record_getstring, METH_VARARGS, + PyDoc_STR("GetString(field) -> string\nWraps MsiRecordGetString")}, { "SetString", (PyCFunction)record_setstring, METH_VARARGS, PyDoc_STR("SetString(field,str) -> None\nWraps MsiRecordSetString")}, { "SetStream", (PyCFunction)record_setstream, METH_VARARGS,