]> granicus.if.org Git - python/commitdiff
bpo-1102: View.Fetch() now returns None when it's exhausted (GH-4459)
authorBerker Peksag <berker.peksag@gmail.com>
Thu, 23 Nov 2017 14:33:12 +0000 (17:33 +0300)
committerGitHub <noreply@github.com>
Thu, 23 Nov 2017 14:33:12 +0000 (17:33 +0300)
(cherry picked from commit bdb8315c21825487b54852ff0511fb4881ea2181)

Lib/test/test_msilib.py
Misc/NEWS.d/next/Windows/2017-11-19-09-46-27.bpo-1102.NY-g1F.rst [new file with mode: 0644]
PC/_msi.c

index f656f7234e2d333810f154ce51436dfda32ced58..aa19883ac6fe62de3b9afefcaa516deb42aaaf3d 100644 (file)
@@ -1,7 +1,45 @@
 """ Test suite for the code in msilib """
 import unittest
-from test.support import import_module
+from test.support import TESTFN, import_module, unlink
 msilib = import_module('msilib')
+import msilib.schema
+
+
+def init_database():
+    path = TESTFN + '.msi'
+    db = msilib.init_database(
+        path,
+        msilib.schema,
+        'Python Tests',
+        'product_code',
+        '1.0',
+        'PSF',
+    )
+    return db, path
+
+
+class MsiDatabaseTestCase(unittest.TestCase):
+
+    def test_view_fetch_returns_none(self):
+        db, db_path = init_database()
+        properties = []
+        view = db.OpenView('SELECT Property, Value FROM Property')
+        view.Execute(None)
+        while True:
+            record = view.Fetch()
+            if record is None:
+                break
+            properties.append(record.GetString(1))
+        view.Close()
+        self.assertEqual(
+            properties,
+            [
+                'ProductName', 'ProductCode', 'ProductVersion',
+                'Manufacturer', 'ProductLanguage',
+            ]
+        )
+        self.addCleanup(unlink, db_path)
+
 
 class Test_make_id(unittest.TestCase):
     #http://msdn.microsoft.com/en-us/library/aa369212(v=vs.85).aspx
diff --git a/Misc/NEWS.d/next/Windows/2017-11-19-09-46-27.bpo-1102.NY-g1F.rst b/Misc/NEWS.d/next/Windows/2017-11-19-09-46-27.bpo-1102.NY-g1F.rst
new file mode 100644 (file)
index 0000000..6a6618e
--- /dev/null
@@ -0,0 +1,4 @@
+Return ``None`` when ``View.Fetch()`` returns ``ERROR_NO_MORE_ITEMS``
+instead of raising ``MSIError``.
+
+Initial patch by Anthony Tuininga.
index 2ab7e731a1e876354e0412f74f042be120deb780..eab39d9b002dede6517a01f2965002085971e8fc 100644 (file)
--- a/PC/_msi.c
+++ b/PC/_msi.c
@@ -729,8 +729,12 @@ view_fetch(msiobj *view, PyObject*args)
     int status;
     MSIHANDLE result;
 
-    if ((status = MsiViewFetch(view->h, &result)) != ERROR_SUCCESS)
+    status = MsiViewFetch(view->h, &result);
+    if (status == ERROR_NO_MORE_ITEMS) {
+        Py_RETURN_NONE;
+    } else if (status != ERROR_SUCCESS) {
         return msierror(status);
+    }
 
     return record_new(result);
 }