From ef34d8139cbd3e11e8a0b773dcdf2604756f8233 Mon Sep 17 00:00:00 2001 From: Zhiyi Zhang Date: Mon, 20 Nov 2023 15:36:22 +0800 Subject: [PATCH] oledb32: Remove unnecessary properties in datainit_GetInitializationString(). The following properties are removed: 1. Duplicate properties. 2. Properties without value. 3. Properties that should be ignored according to MSDN. 4. DBPROP_AUTH_PASSWORD when include_pass is FALSE. --- dlls/oledb32/datainit.c | 51 ++++++++++++++++++++++++++++++----- dlls/oledb32/tests/database.c | 5 ++-- 2 files changed, 47 insertions(+), 9 deletions(-) diff --git a/dlls/oledb32/datainit.c b/dlls/oledb32/datainit.c index 801317f82a5..b185ff4a128 100644 --- a/dlls/oledb32/datainit.c +++ b/dlls/oledb32/datainit.c @@ -875,6 +875,36 @@ static void free_dbpropinfoset(ULONG count, DBPROPINFOSET *propinfoset) CoTaskMemFree(propinfoset); } +/* Whether a property should be skipped in datainit_GetInitializationString() */ +static BOOL skip_property(const DBPROPSET *propset, unsigned int prop_index, boolean include_pass) +{ + DWORD prop_id = propset->rgProperties[prop_index].dwPropertyID; + unsigned int i; + + /* Skip password if include_pass is FALSE */ + if (!include_pass && prop_id == DBPROP_AUTH_PASSWORD) + return TRUE; + + /* Skip these properties according to the function spec */ + if (prop_id == DBPROP_INIT_ASYNCH + || prop_id == DBPROP_INIT_HWND + || prop_id == DBPROP_INIT_PROMPT + || prop_id == DBPROP_INIT_TIMEOUT + || prop_id == DBPROP_INIT_GENERALTIMEOUT + || prop_id == DBPROP_INIT_OLEDBSERVICES + || prop_id == DBPROP_INIT_LCID) /* DBPROP_INIT_LCID should also be ignored according to tests */ + return TRUE; + + /* Skip duplicate properties */ + for (i = prop_index + 1; i < propset->cProperties; i++) + { + if (propset->rgProperties[i].dwPropertyID == prop_id) + return TRUE; + } + + return FALSE; +} + static HRESULT WINAPI datainit_GetInitializationString(IDataInitialize *iface, IUnknown *datasource, boolean include_pass, LPWSTR *init_string) { @@ -884,12 +914,12 @@ static HRESULT WINAPI datainit_GetInitializationString(IDataInitialize *iface, I IDBProperties *props; DBPROPIDSET propidset; ULONG propset_count, infocount; + ULONG i, len, propvalue_length; WCHAR *progid, *desc; DBPROPSET *propset; IPersist *persist; HRESULT hr; CLSID clsid; - ULONG i, len; TRACE("(%p)->(%p %d %p)\n", This, datasource, include_pass, init_string); @@ -936,12 +966,17 @@ static HRESULT WINAPI datainit_GetInitializationString(IDataInitialize *iface, I len = lstrlenW(progid) + lstrlenW(providerW) + 1; /* including '\0' */ for (i = 0; i < propset->cProperties; i++) { - WCHAR *descr = get_propinfo_descr(&propset->rgProperties[i], propinfoset); + WCHAR *descr; + + if (skip_property(propset, i, TRUE)) + continue; + + descr = get_propinfo_descr(&propset->rgProperties[i], propinfoset); if (descr) { - /* include '=' and ';' */ - len += lstrlenW(descr) + 2; - len += get_propvalue_length(&propset->rgProperties[i]); + propvalue_length = get_propvalue_length(&propset->rgProperties[i]); + if (propvalue_length) + len += lstrlenW(descr) + propvalue_length + 2; /* include ';' and '=' */ } if ((propset->rgProperties[i].dwPropertyID == DBPROP_AUTH_PERSIST_SENSITIVE_AUTHINFO) && @@ -962,11 +997,15 @@ static HRESULT WINAPI datainit_GetInitializationString(IDataInitialize *iface, I { WCHAR *descr; - if (!include_pass && propset->rgProperties[i].dwPropertyID == DBPROP_AUTH_PASSWORD) continue; + if (skip_property(propset, i, include_pass)) + continue; descr = get_propinfo_descr(&propset->rgProperties[i], propinfoset); if (descr) { + if (!get_propvalue_length(&propset->rgProperties[i])) + continue; + lstrcatW(*init_string, L";"); lstrcatW(*init_string, descr); lstrcatW(*init_string, L"="); diff --git a/dlls/oledb32/tests/database.c b/dlls/oledb32/tests/database.c index bd940634847..6296ecfe1ef 100644 --- a/dlls/oledb32/tests/database.c +++ b/dlls/oledb32/tests/database.c @@ -542,7 +542,6 @@ static void _expect_initstring(int line, IDataInitialize *datainit, const WCHAR ok_(__FILE__, line)(hr == S_OK, "got %08lx\n", hr); hr = IDataInitialize_GetInitializationString(datainit, (IUnknown*)dbinit, 0, &result); ok_(__FILE__, line)(hr == S_OK, "got %08lx\n", hr); - todo_wine ok_(__FILE__, line)(!lstrcmpW(expected, result), "expected %s, got %s\n", wine_dbgstr_w(expected), wine_dbgstr_w(result)); CoTaskMemFree(result); @@ -596,8 +595,8 @@ static void test_initializationstring(void) if(hr == S_OK) { trace("Init String: %s\n", wine_dbgstr_w(initstring)); - todo_wine ok(!lstrcmpW(initstring_msdasql, initstring) || - !lstrcmpW(initstring_sqloledb, initstring), "got %s\n", wine_dbgstr_w(initstring)); + ok(!lstrcmpW(initstring_msdasql, initstring) || + !lstrcmpW(initstring_sqloledb, initstring), "got %s\n", wine_dbgstr_w(initstring)); CoTaskMemFree(initstring); }