]> granicus.if.org Git - python/commitdiff
Patch #2125: Add GetInteger and GetString methods for
authorMartin v. Löwis <martin@v.loewis.de>
Mon, 2 Jun 2008 08:40:06 +0000 (08:40 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Mon, 2 Jun 2008 08:40:06 +0000 (08:40 +0000)
msilib.Record objects.

Doc/library/msilib.rst
Misc/NEWS
PC/_msi.c

index a1e5e98498e6d39506f0d8bb1a3f0fcd020a3a7f..fd666001d2a6cb2d7c612537083e3ccd065f9d52 100644 (file)
@@ -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.
 
+
index d78e993df5ba73ab057e4fabda35356a8c6b05ac..bec09804c374044c90d6f12bc37a9bee1b867904 100644 (file)
--- 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.
 
index fd6fc5db813c42b317fb8343c2314123ce307099..6b1c594d1c048f401d7c98079365cd7234e23fa1 100644 (file)
--- 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,