Index: _msi.c =================================================================== --- _msi.c (revision 57972) +++ _msi.c (working copy) @@ -350,6 +350,34 @@ } static PyObject* +record_getstring(msiobj* record, PyObject *args) +{ + int status, field, size; + PyObject *value; + char *data; + + if (!PyArg_ParseTuple(args, "i:GetString", &field)) + return NULL; + + size = 0; + status = MsiRecordGetString(record->h, field, "", &size); + if (status != ERROR_MORE_DATA) + return msierror(status); + size++; + data = PyMem_Malloc(size); + if (!data) + return PyErr_NoMemory(); + status = MsiRecordGetString(record->h, field, data, &size); + if (status != ERROR_SUCCESS) { + PyMem_Free(data); + return msierror(status); + } + value = PyString_FromString(data); + PyMem_Free(data); + return value; +} + +static PyObject* record_setstring(msiobj* record, PyObject *args) { int status; @@ -384,6 +412,22 @@ } static PyObject* +record_getinteger(msiobj* record, PyObject *args) +{ + int field, value; + + if (!PyArg_ParseTuple(args, "i:GetInteger", &field)) + return NULL; + + value = MsiRecordGetInteger(record->h, field); + if (value != MSI_NULL_INTEGER) + return PyInt_FromLong(value); + + Py_INCREF(Py_None); + return Py_None; +} + +static PyObject* record_setinteger(msiobj* record, PyObject *args) { int status; @@ -405,10 +449,14 @@ static PyMethodDef record_methods[] = { { "GetFieldCount", (PyCFunction)record_getfieldcount, METH_NOARGS, PyDoc_STR("GetFieldCount() -> int\nWraps MsiRecordGetFieldCount")}, + { "GetString", (PyCFunction)record_getstring, METH_VARARGS, + PyDoc_STR("GetString(field) -> value\nWraps MsiRecordGetString")}, { "SetString", (PyCFunction)record_setstring, METH_VARARGS, PyDoc_STR("SetString(field,str) -> None\nWraps MsiRecordSetString")}, { "SetStream", (PyCFunction)record_setstream, METH_VARARGS, PyDoc_STR("SetStream(field,filename) -> None\nWraps MsiRecordSetInteger")}, + { "GetInteger", (PyCFunction)record_getinteger, METH_VARARGS, + PyDoc_STR("GetInteger(field) -> value\nWraps MsiRecordGetInteger")}, { "SetInteger", (PyCFunction)record_setinteger, METH_VARARGS, PyDoc_STR("SetInteger(field,int) -> None\nWraps MsiRecordSetInteger")}, { "ClearData", (PyCFunction)record_cleardata, METH_NOARGS, @@ -662,8 +710,13 @@ int status; MSIHANDLE result; - if ((status = MsiViewFetch(view->h, &result)) != ERROR_SUCCESS) - return msierror(status); + status = MsiViewFetch(view->h, &result); + if (status == ERROR_NO_MORE_ITEMS) { + Py_INCREF(Py_None); + return Py_None; + } + if (status != ERROR_SUCCESS) + return msierror(status); return record_new(result); }