oledb32: Support data source properties from init string passed to GetDataSource().
This commit is contained in:
parent
6e989604a3
commit
3e8d4e76e5
|
@ -289,6 +289,32 @@ static void free_dbpropset(ULONG count, DBPROPSET *propset)
|
||||||
CoTaskMemFree(propset);
|
CoTaskMemFree(propset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HRESULT set_dbpropset(BSTR name, BSTR value, DBPROPSET **propset)
|
||||||
|
{
|
||||||
|
static const WCHAR datasourceW[] = {'D','a','t','a',' ','S','o','u','r','c','e',0};
|
||||||
|
|
||||||
|
*propset = CoTaskMemAlloc(sizeof(DBPROPSET));
|
||||||
|
(*propset)->rgProperties = CoTaskMemAlloc(sizeof(DBPROP));
|
||||||
|
|
||||||
|
if (!strcmpW(datasourceW, name))
|
||||||
|
{
|
||||||
|
(*propset)->cProperties = 1;
|
||||||
|
(*propset)->guidPropertySet = DBPROPSET_DBINIT;
|
||||||
|
(*propset)->rgProperties[0].dwPropertyID = DBPROP_INIT_DATASOURCE;
|
||||||
|
(*propset)->rgProperties[0].dwOptions = DBPROPOPTIONS_REQUIRED;
|
||||||
|
(*propset)->rgProperties[0].dwStatus = 0;
|
||||||
|
memset(&(*propset)->rgProperties[0].colid, 0, sizeof(DBID));
|
||||||
|
V_VT(&(*propset)->rgProperties[0].vValue) = VT_BSTR;
|
||||||
|
V_BSTR(&(*propset)->rgProperties[0].vValue) = SysAllocString(value);
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FIXME("unsupported property %s\n", debugstr_w(name));
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*** IDataInitialize methods ***/
|
/*** IDataInitialize methods ***/
|
||||||
static HRESULT WINAPI datainit_GetDataSource(IDataInitialize *iface, IUnknown *outer, DWORD clsctx,
|
static HRESULT WINAPI datainit_GetDataSource(IDataInitialize *iface, IUnknown *outer, DWORD clsctx,
|
||||||
LPWSTR initstring, REFIID riid, IUnknown **datasource)
|
LPWSTR initstring, REFIID riid, IUnknown **datasource)
|
||||||
|
@ -296,11 +322,13 @@ static HRESULT WINAPI datainit_GetDataSource(IDataInitialize *iface, IUnknown *o
|
||||||
static const WCHAR providerW[] = {'P','r','o','v','i','d','e','r','=',0};
|
static const WCHAR providerW[] = {'P','r','o','v','i','d','e','r','=',0};
|
||||||
static const WCHAR msdasqlW[] = {'M','S','D','A','S','Q','L',0};
|
static const WCHAR msdasqlW[] = {'M','S','D','A','S','Q','L',0};
|
||||||
datainit *This = impl_from_IDataInitialize(iface);
|
datainit *This = impl_from_IDataInitialize(iface);
|
||||||
|
IDBProperties *dbprops;
|
||||||
|
DBPROPSET *propset;
|
||||||
WCHAR *prov = NULL;
|
WCHAR *prov = NULL;
|
||||||
CLSID provclsid;
|
CLSID provclsid;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
FIXME("(%p)->(%p 0x%x %s %s %p): semi-stub\n", This, outer, clsctx, debugstr_w(initstring), debugstr_guid(riid), datasource);
|
TRACE("(%p)->(%p 0x%x %s %s %p)\n", This, outer, clsctx, debugstr_w(initstring), debugstr_guid(riid), datasource);
|
||||||
|
|
||||||
/* first get provider name */
|
/* first get provider name */
|
||||||
provclsid = IID_NULL;
|
provclsid = IID_NULL;
|
||||||
|
@ -340,9 +368,7 @@ static HRESULT WINAPI datainit_GetDataSource(IDataInitialize *iface, IUnknown *o
|
||||||
/* check for provider mismatch if it was specified in init string */
|
/* check for provider mismatch if it was specified in init string */
|
||||||
if (*datasource && prov)
|
if (*datasource && prov)
|
||||||
{
|
{
|
||||||
IDBProperties *dbprops;
|
|
||||||
DBPROPIDSET propidset;
|
DBPROPIDSET propidset;
|
||||||
DBPROPSET *propset;
|
|
||||||
enum DBPROPENUM prop;
|
enum DBPROPENUM prop;
|
||||||
CLSID initprov;
|
CLSID initprov;
|
||||||
ULONG count;
|
ULONG count;
|
||||||
|
@ -385,7 +411,57 @@ static HRESULT WINAPI datainit_GetDataSource(IDataInitialize *iface, IUnknown *o
|
||||||
hr = create_db_init((void**)datasource);
|
hr = create_db_init((void**)datasource);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME: set properties from init string */
|
/* now set properties */
|
||||||
|
if (initstring)
|
||||||
|
{
|
||||||
|
static const WCHAR scolW[] = {';',0};
|
||||||
|
static const WCHAR eqW[] = {'=',0};
|
||||||
|
WCHAR *eq, *start;
|
||||||
|
|
||||||
|
hr = IUnknown_QueryInterface(*datasource, &IID_IDBProperties, (void**)&dbprops);
|
||||||
|
if (FAILED(hr))
|
||||||
|
{
|
||||||
|
WARN("provider doesn't support IDBProperties\n");
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
start = initstring;
|
||||||
|
while ((eq = strstrW(start, eqW)))
|
||||||
|
{
|
||||||
|
static const WCHAR providerW[] = {'P','r','o','v','i','d','e','r',0};
|
||||||
|
WCHAR *scol = strstrW(eq+1, scolW);
|
||||||
|
BSTR value, name;
|
||||||
|
|
||||||
|
name = SysAllocStringLen(start, eq - start);
|
||||||
|
/* skip equal sign to get value */
|
||||||
|
eq++;
|
||||||
|
value = SysAllocStringLen(eq, scol ? scol - eq : -1);
|
||||||
|
|
||||||
|
/* skip semicolon if present */
|
||||||
|
if (scol) scol++;
|
||||||
|
start = scol;
|
||||||
|
|
||||||
|
if (!strcmpW(name, providerW))
|
||||||
|
{
|
||||||
|
SysFreeString(name);
|
||||||
|
SysFreeString(value);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
TRACE("property (name=%s, value=%s)\n", debugstr_w(name), debugstr_w(value));
|
||||||
|
|
||||||
|
hr = set_dbpropset(name, value, &propset);
|
||||||
|
SysFreeString(name);
|
||||||
|
SysFreeString(value);
|
||||||
|
if (FAILED(hr)) return hr;
|
||||||
|
|
||||||
|
hr = IDBProperties_SetProperties(dbprops, 1, propset);
|
||||||
|
free_dbpropset(1, propset);
|
||||||
|
TRACE("provider ret 0x%08x\n", hr);
|
||||||
|
}
|
||||||
|
|
||||||
|
IDBProperties_Release(dbprops);
|
||||||
|
}
|
||||||
|
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,7 +58,7 @@ static void test_GetDataSource(WCHAR *initstring)
|
||||||
static void test_database(void)
|
static void test_database(void)
|
||||||
{
|
{
|
||||||
static WCHAR initstring_jet[] = {'P','r','o','v','i','d','e','r','=','M','i','c','r','o','s','o','f','t','.',
|
static WCHAR initstring_jet[] = {'P','r','o','v','i','d','e','r','=','M','i','c','r','o','s','o','f','t','.',
|
||||||
'J','e','t','.','O','L','E','D','B','.','4','.','0',';',0,
|
'J','e','t','.','O','L','E','D','B','.','4','.','0',';',
|
||||||
'D','a','t','a',' ','S','o','u','r','c','e','=','d','u','m','m','y',';',0};
|
'D','a','t','a',' ','S','o','u','r','c','e','=','d','u','m','m','y',';',0};
|
||||||
static WCHAR initstring_default[] = {'D','a','t','a',' ','S','o','u','r','c','e','=','d','u','m','m','y',';',0};
|
static WCHAR initstring_default[] = {'D','a','t','a',' ','S','o','u','r','c','e','=','d','u','m','m','y',';',0};
|
||||||
IDataInitialize *datainit = NULL;
|
IDataInitialize *datainit = NULL;
|
||||||
|
|
Loading…
Reference in New Issue