From 3f4de44cf7f3da754efbbc0e70feabf3b9384dce Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 25 Jun 2020 02:12:41 -0700 Subject: bpo-41074: Fix support of non-ASCII names and SQL in msilib. (GH-21126) * Fix support of non-ASCII names in functions OpenDatabase() and init_database(). * Fix support of non-ASCII SQL in method Database.OpenView(). (cherry picked from commit 55939b1708d6fc0d36d2be11ccdc6bf207e1bd41) Co-authored-by: Serhiy Storchaka --- Lib/test/test_msilib.py | 14 ++++++++++++-- .../next/Windows/2020-06-24-21-30-42.bpo-41074.gaQc3C.rst | 3 +++ PC/_msi.c | 12 ++++++------ 3 files changed, 21 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Windows/2020-06-24-21-30-42.bpo-41074.gaQc3C.rst diff --git a/Lib/test/test_msilib.py b/Lib/test/test_msilib.py index f9bd0da..153a8ac 100644 --- a/Lib/test/test_msilib.py +++ b/Lib/test/test_msilib.py @@ -1,13 +1,13 @@ """ Test suite for the code in msilib """ import os import unittest -from test.support import TESTFN, import_module, unlink +from test.support import TESTFN, FS_NONASCII, import_module, unlink msilib = import_module('msilib') import msilib.schema def init_database(): - path = TESTFN + '.msi' + path = TESTFN + (FS_NONASCII or '') + '.msi' db = msilib.init_database( path, msilib.schema, @@ -42,6 +42,16 @@ class MsiDatabaseTestCase(unittest.TestCase): ) self.addCleanup(unlink, db_path) + def test_view_non_ascii(self): + db, db_path = init_database() + view = db.OpenView("SELECT 'ß-розпад' FROM Property") + view.Execute(None) + record = view.Fetch() + self.assertEqual(record.GetString(1), 'ß-розпад') + view.Close() + db.Close() + self.addCleanup(unlink, db_path) + def test_summaryinfo_getproperty_issue1104(self): db, db_path = init_database() try: diff --git a/Misc/NEWS.d/next/Windows/2020-06-24-21-30-42.bpo-41074.gaQc3C.rst b/Misc/NEWS.d/next/Windows/2020-06-24-21-30-42.bpo-41074.gaQc3C.rst new file mode 100644 index 0000000..ec91fd3 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2020-06-24-21-30-42.bpo-41074.gaQc3C.rst @@ -0,0 +1,3 @@ +Fixed support of non-ASCII names in functions :func:`msilib.OpenDatabase` +and :func:`msilib.init_database` and non-ASCII SQL in method +:meth:`msilib.Database.OpenView`. diff --git a/PC/_msi.c b/PC/_msi.c index accbe7a..5079a52 100644 --- a/PC/_msi.c +++ b/PC/_msi.c @@ -872,14 +872,14 @@ static PyObject* msidb_openview(msiobj *msidb, PyObject *args) { int status; - char *sql; + const wchar_t *sql; MSIHANDLE hView; msiobj *result; - if (!PyArg_ParseTuple(args, "s:OpenView", &sql)) + if (!PyArg_ParseTuple(args, "u:OpenView", &sql)) return NULL; - if ((status = MsiDatabaseOpenView(msidb->h, sql, &hView)) != ERROR_SUCCESS) + if ((status = MsiDatabaseOpenViewW(msidb->h, sql, &hView)) != ERROR_SUCCESS) return msierror(status); result = PyObject_NEW(struct msiobj, &msiview_Type); @@ -998,18 +998,18 @@ static PyTypeObject msidb_Type = { static PyObject* msiopendb(PyObject *obj, PyObject *args) { int status; - char *path; + const wchar_t *path; int persist; MSIHANDLE h; msiobj *result; - if (!PyArg_ParseTuple(args, "si:MSIOpenDatabase", &path, &persist)) + if (!PyArg_ParseTuple(args, "ui:MSIOpenDatabase", &path, &persist)) return NULL; /* We need to validate that persist is a valid MSIDBOPEN_* value. Otherwise, MsiOpenDatabase may treat the value as a pointer, leading to unexpected behavior. */ if (Py_INVALID_PERSIST(persist)) return msierror(ERROR_INVALID_PARAMETER); - status = MsiOpenDatabase(path, (LPCSTR)(SIZE_T)persist, &h); + status = MsiOpenDatabaseW(path, (LPCWSTR)(SIZE_T)persist, &h); if (status != ERROR_SUCCESS) return msierror(status); -- cgit v0.12