summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin v. Löwis <martin@v.loewis.de>2008-06-02 10:08:54 (GMT)
committerMartin v. Löwis <martin@v.loewis.de>2008-06-02 10:08:54 (GMT)
commite95593e9b1498843b403d20f956a0eac9d3b4cc0 (patch)
tree23c1604ad8ae9b6f909f4c0054dba79c5add2886
parent90cc5ab976af11adc3469b04a290c2a15a9d4079 (diff)
downloadcpython-e95593e9b1498843b403d20f956a0eac9d3b4cc0.zip
cpython-e95593e9b1498843b403d20f956a0eac9d3b4cc0.tar.gz
cpython-e95593e9b1498843b403d20f956a0eac9d3b4cc0.tar.bz2
Merged revisions 63888 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r63888 | martin.v.loewis | 2008-06-02 10:40:06 +0200 (Mo, 02 Jun 2008) | 2 lines Patch #2125: Add GetInteger and GetString methods for msilib.Record objects. ........
-rw-r--r--Doc/library/msilib.rst13
-rw-r--r--PC/_msi.c47
2 files changed, 60 insertions, 0 deletions
diff --git a/Doc/library/msilib.rst b/Doc/library/msilib.rst
index 6f558e6..eb58d44 100644
--- a/Doc/library/msilib.rst
+++ b/Doc/library/msilib.rst
@@ -262,6 +262,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
@@ -541,3 +553,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/PC/_msi.c b/PC/_msi.c
index 5b68bc2..d372776 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,