Patch #2125: Add GetInteger and GetString methods for

msilib.Record objects.
This commit is contained in:
Martin v. Löwis 2008-06-02 08:40:06 +00:00
parent 137d824148
commit ffe62ed46d
3 changed files with 63 additions and 0 deletions

View File

@ -264,6 +264,18 @@ Record Objects
:cfunc:`MsiRecordGetFieldCount`. :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) .. method:: Record.SetString(field, value)
Set *field* to *value* through :cfunc:`MsiRecordSetString`. *field* must be an 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 This module contains definitions for the UIText and ActionText tables, for the
standard installer actions. standard installer actions.

View File

@ -72,6 +72,9 @@ Extension Modules
Library Library
------- -------
- Patch #2125: Add GetInteger and GetString methods for
msilib.Record objects.
- Issue #2782: The datetime module's strftime methods now accept - Issue #2782: The datetime module's strftime methods now accept
unicode format strings just as time.strftime always has. unicode format strings just as time.strftime always has.

View File

@ -338,6 +338,49 @@ record_getfieldcount(msiobj* record, PyObject* args)
return PyInt_FromLong(MsiRecordGetFieldCount(record->h)); 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* static PyObject*
record_cleardata(msiobj* record, PyObject *args) record_cleardata(msiobj* record, PyObject *args)
{ {
@ -405,6 +448,10 @@ record_setinteger(msiobj* record, PyObject *args)
static PyMethodDef record_methods[] = { static PyMethodDef record_methods[] = {
{ "GetFieldCount", (PyCFunction)record_getfieldcount, METH_NOARGS, { "GetFieldCount", (PyCFunction)record_getfieldcount, METH_NOARGS,
PyDoc_STR("GetFieldCount() -> int\nWraps MsiRecordGetFieldCount")}, 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, { "SetString", (PyCFunction)record_setstring, METH_VARARGS,
PyDoc_STR("SetString(field,str) -> None\nWraps MsiRecordSetString")}, PyDoc_STR("SetString(field,str) -> None\nWraps MsiRecordSetString")},
{ "SetStream", (PyCFunction)record_setstream, METH_VARARGS, { "SetStream", (PyCFunction)record_setstream, METH_VARARGS,