msdasql: Return all initialization properties if no property ID is specified in dbprops_GetProperties().
From: Zhiyi Zhang zzhang@codeweavers.com
--- dlls/msdasql/tests/provider.c | 42 ++++++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 10 deletions(-)
diff --git a/dlls/msdasql/tests/provider.c b/dlls/msdasql/tests/provider.c index bb549bb2262..b6936be31b5 100644 --- a/dlls/msdasql/tests/provider.c +++ b/dlls/msdasql/tests/provider.c @@ -43,6 +43,32 @@ static char mdbpath[MAX_PATH];
static const VARTYPE intptr_vartype = (sizeof(void *) == 8 ? VT_I8 : VT_I4);
+static void free_dbpropset(ULONG count, DBPROPSET *propset) +{ + ULONG i, j; + + for (i = 0; i < count; i++) + { + for (j = 0; j < propset[i].cProperties; j++) + VariantClear(&propset[i].rgProperties[j].vValue); + CoTaskMemFree(propset[i].rgProperties); + } + CoTaskMemFree(propset); +} + +static void free_dbpropinfoset(ULONG count, DBPROPINFOSET *propinfoset) +{ + ULONG i, j; + + for (i = 0; i < count; i++) + { + for (j = 0; j < propinfoset[i].cPropertyInfos; j++) + VariantClear(&propinfoset[i].rgPropertyInfos[j].vValues); + CoTaskMemFree(propinfoset[i].rgPropertyInfos); + } + CoTaskMemFree(propinfoset); +} + static void test_msdasql(void) { HRESULT hr; @@ -125,11 +151,8 @@ static void test_Properties(void) propidlist.rgPropertyIDs[i] = propinfoset->rgPropertyInfos[i].dwPropertyID; }
- for (i = 0; i < propinfoset->cPropertyInfos; i++) - VariantClear(&propinfoset->rgPropertyInfos[i].vValues); - - CoTaskMemFree(propinfoset->rgPropertyInfos); - CoTaskMemFree(propinfoset); + free_dbpropinfoset(infocount, propinfoset); + CoTaskMemFree(desc);
hr = IDBProperties_GetProperties(props, 1, &propidlist, &propcnt, &propset); ok(hr == S_OK, "got 0x%08lx\n", hr); @@ -162,7 +185,7 @@ static void test_Properties(void) }
CoTaskMemFree(propidlist.rgPropertyIDs); - CoTaskMemFree(propset); + free_dbpropset(propcnt, propset); }
propid = DBPROP_MULTIPLERESULTS; @@ -179,7 +202,7 @@ static void test_Properties(void) ok(propset->rgProperties[0].dwPropertyID == DBPROP_MULTIPLERESULTS, "got %ld\n", propset->rgProperties[0].dwPropertyID); ok(propset->rgProperties[0].dwStatus == DBPROPSTATUS_NOTSUPPORTED, "got %ld\n", propset->rgProperties[0].dwStatus);
- CoTaskMemFree(propset); + free_dbpropset(propcnt, propset);
IDBProperties_Release(props); } @@ -324,7 +347,7 @@ static void test_command_properties(ICommandProperties *props) } }
- CoTaskMemFree(propset); + free_dbpropset(count, propset); }
static void test_command_interfaces(IUnknown *cmd) @@ -528,8 +551,7 @@ static void test_rowset_info(IRowset *rowset) propset->rgProperties[i].dwPropertyID, row_props[i]); }
- CoTaskMemFree(propset); - + free_dbpropset(propcnt, propset); IRowsetInfo_Release(info); }
From: Zhiyi Zhang zzhang@codeweavers.com
--- dlls/msdasql/tests/provider.c | 38 +++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+)
diff --git a/dlls/msdasql/tests/provider.c b/dlls/msdasql/tests/provider.c index b6936be31b5..10517484c83 100644 --- a/dlls/msdasql/tests/provider.c +++ b/dlls/msdasql/tests/provider.c @@ -154,6 +154,7 @@ static void test_Properties(void) free_dbpropinfoset(infocount, propinfoset); CoTaskMemFree(desc);
+ /* Test specifying all supported properties */ hr = IDBProperties_GetProperties(props, 1, &propidlist, &propcnt, &propset); ok(hr == S_OK, "got 0x%08lx\n", hr); ok(propidlist.cPropertyIDs == 14, "got %lu\n", propidlist.cPropertyIDs); @@ -184,7 +185,44 @@ static void test_Properties(void) ok(V_VT(&propset->rgProperties[i].vValue) == vartype, "%lu wrong type %d\n", i, V_VT(&propset->rgProperties[i].vValue)); }
+ for (i = 0; i < propset->cProperties; i++) + ok(propset->rgProperties[i].dwPropertyID == properties[i], + "%ld %ld, got %ld\n", i, properties[i], propset->rgProperties[i].dwPropertyID); + + free_dbpropset(propcnt, propset); + + /* Test specifying only one supported properties */ + propidlist.cPropertyIDs = 1; + hr = IDBProperties_GetProperties(props, 1, &propidlist, &propcnt, &propset); + ok(hr == S_OK, "got 0x%08lx\n", hr); + ok(propset->cProperties == 1, "expected 1, got %lu\n", propset->cProperties); + free_dbpropset(propcnt, propset); + + /* Test when cPropertyIDSets is zero, all initialization properties should be returned */ + hr = IDBProperties_GetProperties(props, 0, &propidlist, &propcnt, &propset); + ok(hr == S_OK, "got 0x%08lx\n", hr); + todo_wine + ok(propset->cProperties == ARRAY_SIZE(properties), "got %lu\n", propset->cProperties); + for (i = 0; i < propset->cProperties; i++) + todo_wine_if(i > 0) + ok(propset->rgProperties[i].dwPropertyID == properties[i], + "%ld %ld, got %ld\n", i, properties[i], propset->rgProperties[i].dwPropertyID); + free_dbpropset(propcnt, propset); + + /* Test when propidlist.cPropertyIDs is zero, all initialization properties should be returned */ CoTaskMemFree(propidlist.rgPropertyIDs); + propidlist.guidPropertySet = DBPROPSET_DBINIT; + propidlist.cPropertyIDs = 0; + propidlist.rgPropertyIDs = NULL; + + hr = IDBProperties_GetProperties(props, 1, &propidlist, &propcnt, &propset); + ok(hr == S_OK, "got 0x%08lx\n", hr); + todo_wine + ok(propset->cProperties == ARRAY_SIZE(properties), "got %lu\n", propset->cProperties); + todo_wine + for (i = 0; i < propset->cProperties; i++) + ok(propset->rgProperties[i].dwPropertyID == properties[i], + "%ld %ld, got %ld\n", i, properties[i], propset->rgProperties[i].dwPropertyID); free_dbpropset(propcnt, propset); }
From: Zhiyi Zhang zzhang@codeweavers.com
--- dlls/msdasql/msdasql_main.c | 34 +++++++++++++++++++++++++++++++--- dlls/msdasql/tests/provider.c | 4 ---- 2 files changed, 31 insertions(+), 7 deletions(-)
diff --git a/dlls/msdasql/msdasql_main.c b/dlls/msdasql/msdasql_main.c index 7ec35678b6f..34342295651 100644 --- a/dlls/msdasql/msdasql_main.c +++ b/dlls/msdasql/msdasql_main.c @@ -357,18 +357,19 @@ static HRESULT WINAPI dbprops_GetProperties(IDBProperties *iface, ULONG cPropert struct msdasql *provider = impl_from_IDBProperties(iface); int i, j, k; DBPROPSET *propset; + BOOL no_prop_id;
TRACE("(%p)->(%ld %p %p %p)\n", provider, cPropertyIDSets, rgPropertyIDSets, pcPropertySets, prgPropertySets);
*pcPropertySets = 1;
- if (cPropertyIDSets != 1) + if (cPropertyIDSets > 1) { - FIXME("Currently only 1 property set supported.\n"); + FIXME("Currently only 0 or 1 property set are supported.\n"); cPropertyIDSets = 1; }
- propset = CoTaskMemAlloc(cPropertyIDSets * sizeof(DBPROPSET)); + propset = CoTaskMemAlloc(max(cPropertyIDSets, 1) * sizeof(DBPROPSET));
if (IsEqualGUID(&rgPropertyIDSets[0].guidPropertySet, &DBPROPSET_DATASOURCEINFO)) { @@ -391,6 +392,33 @@ static HRESULT WINAPI dbprops_GetProperties(IDBProperties *iface, ULONG cPropert
propset->guidPropertySet = DBPROPSET_DBINIT;
+ no_prop_id = TRUE; + for (i = 0; i < cPropertyIDSets; i++) + { + if (rgPropertyIDSets[i].cPropertyIDs) + { + no_prop_id = FALSE; + break; + } + } + + /* If no property ID is specified then return all currently set properties */ + if (no_prop_id) + { + propset->cProperties = ARRAY_SIZE(provider->properties); + propset->rgProperties = CoTaskMemAlloc(propset->cProperties * sizeof(DBPROP)); + for(i = 0; i < ARRAY_SIZE(provider->properties); i++) + { + propset->rgProperties[i].dwPropertyID = provider->properties[i].id; + V_VT(&propset->rgProperties[i].vValue) = VT_EMPTY; + VariantCopy(&propset->rgProperties[i].vValue, &provider->properties[i].value); + } + + *prgPropertySets = propset; + return S_OK; + } + + /* Return property info for properties in the specified property ID sets */ for (i=0; i < cPropertyIDSets; i++) { TRACE("Property id %d (count %ld, set %s)\n", i, rgPropertyIDSets[i].cPropertyIDs, diff --git a/dlls/msdasql/tests/provider.c b/dlls/msdasql/tests/provider.c index 10517484c83..706d5a13ef9 100644 --- a/dlls/msdasql/tests/provider.c +++ b/dlls/msdasql/tests/provider.c @@ -201,10 +201,8 @@ static void test_Properties(void) /* Test when cPropertyIDSets is zero, all initialization properties should be returned */ hr = IDBProperties_GetProperties(props, 0, &propidlist, &propcnt, &propset); ok(hr == S_OK, "got 0x%08lx\n", hr); - todo_wine ok(propset->cProperties == ARRAY_SIZE(properties), "got %lu\n", propset->cProperties); for (i = 0; i < propset->cProperties; i++) - todo_wine_if(i > 0) ok(propset->rgProperties[i].dwPropertyID == properties[i], "%ld %ld, got %ld\n", i, properties[i], propset->rgProperties[i].dwPropertyID); free_dbpropset(propcnt, propset); @@ -217,9 +215,7 @@ static void test_Properties(void)
hr = IDBProperties_GetProperties(props, 1, &propidlist, &propcnt, &propset); ok(hr == S_OK, "got 0x%08lx\n", hr); - todo_wine ok(propset->cProperties == ARRAY_SIZE(properties), "got %lu\n", propset->cProperties); - todo_wine for (i = 0; i < propset->cProperties; i++) ok(propset->rgProperties[i].dwPropertyID == properties[i], "%ld %ld, got %ld\n", i, properties[i], propset->rgProperties[i].dwPropertyID);