From 4864a619dc1cc9092780ccf5a6327e8abf66133d Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Fri, 24 Nov 2017 12:53:58 +0300 Subject: [PATCH] bpo-12382: Make OpenDatabase() raise better exception messages (GH-4528) Previously, 'msilib.OpenDatabase()' function raised a cryptical exception message when it couldn't open or create an MSI file. For example: Traceback (most recent call last): File "", line 1, in _msi.MSIError: unknown error 6e --- Lib/test/test_msilib.py | 12 ++++++++++++ .../Library/2017-11-23-21-47-36.bpo-12382.xWT9k0.rst | 2 ++ PC/_msi.c | 6 ++++++ 3 files changed, 20 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2017-11-23-21-47-36.bpo-12382.xWT9k0.rst diff --git a/Lib/test/test_msilib.py b/Lib/test/test_msilib.py index 65ff3869c3..4093134195 100644 --- a/Lib/test/test_msilib.py +++ b/Lib/test/test_msilib.py @@ -1,4 +1,5 @@ """ Test suite for the code in msilib """ +import os.path import unittest from test.support import TESTFN, import_module, unlink msilib = import_module('msilib') @@ -41,6 +42,17 @@ class MsiDatabaseTestCase(unittest.TestCase): ) self.addCleanup(unlink, db_path) + def test_database_open_failed(self): + with self.assertRaises(msilib.MSIError) as cm: + msilib.OpenDatabase('non-existent.msi', msilib.MSIDBOPEN_READONLY) + self.assertEqual(str(cm.exception), 'open failed') + + def test_database_create_failed(self): + db_path = os.path.join(TESTFN, 'test.msi') + with self.assertRaises(msilib.MSIError) as cm: + msilib.OpenDatabase(db_path, msilib.MSIDBOPEN_CREATE) + self.assertEqual(str(cm.exception), 'create failed') + 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/Library/2017-11-23-21-47-36.bpo-12382.xWT9k0.rst b/Misc/NEWS.d/next/Library/2017-11-23-21-47-36.bpo-12382.xWT9k0.rst new file mode 100644 index 0000000000..d9b54259cc --- /dev/null +++ b/Misc/NEWS.d/next/Library/2017-11-23-21-47-36.bpo-12382.xWT9k0.rst @@ -0,0 +1,2 @@ +:func:`msilib.OpenDatabase` now raises a better exception message when it +couldn't open or create an MSI file. Initial patch by William Tisäter. diff --git a/PC/_msi.c b/PC/_msi.c index a6a12e2010..8cc1fd59dd 100644 --- a/PC/_msi.c +++ b/PC/_msi.c @@ -315,6 +315,12 @@ msierror(int status) case ERROR_INVALID_PARAMETER: PyErr_SetString(MSIError, "invalid parameter"); return NULL; + case ERROR_OPEN_FAILED: + PyErr_SetString(MSIError, "open failed"); + return NULL; + case ERROR_CREATE_FAILED: + PyErr_SetString(MSIError, "create failed"); + return NULL; default: PyErr_Format(MSIError, "unknown error %x", status); return NULL; -- 2.40.0