]> granicus.if.org Git - python/commitdiff
bpo-12382: Make OpenDatabase() raise better exception messages (GH-4528)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Fri, 24 Nov 2017 10:31:21 +0000 (02:31 -0800)
committerBerker Peksag <berker.peksag@gmail.com>
Fri, 24 Nov 2017 10:31:21 +0000 (13:31 +0300)
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 "<stdin>", line 1, in <module>
    _msi.MSIError: unknown error 6e

(cherry picked from commit 4864a619dc1cc9092780ccf5a6327e8abf66133d)

Lib/test/test_msilib.py
Misc/NEWS.d/next/Library/2017-11-23-21-47-36.bpo-12382.xWT9k0.rst [new file with mode: 0644]
PC/_msi.c

index aa19883ac6fe62de3b9afefcaa516deb42aaaf3d..eb2c76e69da2a836114e7ae25bc57d1f7e20073a 100644 (file)
@@ -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')
@@ -40,6 +41,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 (file)
index 0000000..d9b5425
--- /dev/null
@@ -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.
index eab39d9b002dede6517a01f2965002085971e8fc..00755d6375e277b570c6b4a98d989eac0b5d7145 100644 (file)
--- a/PC/_msi.c
+++ b/PC/_msi.c
@@ -325,6 +325,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;