diff options
-rw-r--r-- | Lib/test/test_msilib.py | 41 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Windows/2017-11-19-09-46-27.bpo-1102.NY-g1F.rst | 4 | ||||
-rw-r--r-- | PC/_msi.c | 6 |
3 files changed, 49 insertions, 2 deletions
diff --git a/Lib/test/test_msilib.py b/Lib/test/test_msilib.py index f656f72..65ff386 100644 --- a/Lib/test/test_msilib.py +++ b/Lib/test/test_msilib.py @@ -1,7 +1,46 @@ """ 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() + db.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 index 0000000..6a6618e --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2017-11-19-09-46-27.bpo-1102.NY-g1F.rst @@ -0,0 +1,4 @@ +Return ``None`` when ``View.Fetch()`` returns ``ERROR_NO_MORE_ITEMS`` +instead of raising ``MSIError``. + +Initial patch by Anthony Tuininga. @@ -723,8 +723,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); } |