summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/library/msilib.rst13
-rw-r--r--Misc/NEWS3
-rw-r--r--PC/_msi.c47
3 files changed, 63 insertions, 0 deletions
diff --git a/Doc/library/msilib.rst b/Doc/library/msilib.rst
index a1e5e98..fd66600 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 d78e993..bec0980 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 fd6fc5d..6b1c594 100644
--- a/PC/_msi.c
+++ b/PC/_msi.c
@@ -339,6 +339,49 @@ record_getfieldcount(msiobj* record, PyObject* args)
}
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)
{
int status = MsiRecordClearData(record->h);
@@ -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,