oledb32: Partial implementation of GetDataSource().

oldstable
Nikolay Sivov 2012-12-26 20:53:45 +04:00 committed by Alexandre Julliard
parent 4ab4bc5d09
commit ec4de1f9fe
3 changed files with 140 additions and 40 deletions

View File

@ -273,21 +273,121 @@ static ULONG WINAPI datainit_Release(IDataInitialize *iface)
return ref;
}
/*** IDataInitialize methods ***/
static HRESULT WINAPI datainit_GetDataSource(IDataInitialize *iface, IUnknown *pUnkOuter, DWORD dwClsCtx,
LPWSTR pwszInitializationString, REFIID riid, IUnknown **ppDataSource)
static void free_dbpropset(ULONG count, DBPROPSET *propset)
{
datainit *This = impl_from_IDataInitialize(iface);
int i;
FIXME("(%p)->(%p %d %s %s %p)\n", This, pUnkOuter, dwClsCtx, debugstr_w(pwszInitializationString),
debugstr_guid(riid), ppDataSource);
if(IsEqualIID(riid, &IID_IDBInitialize))
for (i = 0; i < count; i++)
{
return create_db_init( (LPVOID*)ppDataSource);
int p;
for (p = 0; p < propset[i].cProperties; p++)
VariantClear(&propset[i].rgProperties[p].vValue);
CoTaskMemFree(propset[i].rgProperties);
}
CoTaskMemFree(propset);
}
/*** IDataInitialize methods ***/
static HRESULT WINAPI datainit_GetDataSource(IDataInitialize *iface, IUnknown *outer, DWORD clsctx,
LPWSTR initstring, REFIID riid, IUnknown **datasource)
{
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};
datainit *This = impl_from_IDataInitialize(iface);
WCHAR *prov = NULL;
CLSID provclsid;
HRESULT hr;
FIXME("(%p)->(%p 0x%x %s %s %p): semi-stub\n", This, outer, clsctx, debugstr_w(initstring), debugstr_guid(riid), datasource);
/* first get provider name */
provclsid = IID_NULL;
if (initstring && (prov = strstrW(initstring, providerW)))
{
WCHAR *start, *progid;
int len;
prov += sizeof(providerW)/sizeof(WCHAR)-1;
start = prov;
while (*prov && *prov != ';')
++prov;
TRACE("got provider %s\n", debugstr_wn(start, prov-start));
len = prov - start;
progid = CoTaskMemAlloc((len+1)*sizeof(WCHAR));
if (!progid) return E_OUTOFMEMORY;
memcpy(progid, start, len*sizeof(WCHAR));
progid[len] = 0;
hr = CLSIDFromProgID(progid, &provclsid);
CoTaskMemFree(progid);
if (FAILED(hr))
{
ERR("provider %s not registered\n", debugstr_wn(start, prov-start));
return hr;
}
}
else
{
hr = CLSIDFromProgID(msdasqlW, &provclsid);
if (FAILED(hr))
ERR("ODBC provider for OLE DB not registered\n");
}
return E_NOTIMPL;
/* check for provider mismatch if it was specified in init string */
if (*datasource && prov)
{
IDBProperties *dbprops;
DBPROPIDSET propidset;
DBPROPSET *propset;
enum DBPROPENUM prop;
CLSID initprov;
ULONG count;
hr = IUnknown_QueryInterface(*datasource, &IID_IDBProperties, (void**)&dbprops);
if (FAILED(hr))
{
WARN("provider doesn't support IDBProperties\n");
return hr;
}
prop = DBPROP_INIT_DATASOURCE;
propidset.rgPropertyIDs = &prop;
propidset.cPropertyIDs = 1;
propidset.guidPropertySet = DBPROPSET_DBINIT;
count = 0;
propset = NULL;
hr = IDBProperties_GetProperties(dbprops, 1, &propidset, &count, &propset);
IDBProperties_Release(dbprops);
if (FAILED(hr))
{
WARN("GetProperties failed for datasource, 0x%08x\n", hr);
return hr;
}
TRACE("initial data source provider %s\n", debugstr_w(V_BSTR(&propset->rgProperties[0].vValue)));
initprov = IID_NULL;
CLSIDFromProgID(V_BSTR(&propset->rgProperties[0].vValue), &initprov);
free_dbpropset(count, propset);
if (!IsEqualIID(&provclsid, &initprov)) return DB_E_MISMATCHEDPROVIDER;
}
if (!*datasource)
{
if (!IsEqualIID(&provclsid, &IID_NULL))
hr = CoCreateInstance(&provclsid, outer, clsctx, riid, (void**)datasource);
if (FAILED(hr) && IsEqualIID(riid, &IID_IDBInitialize))
hr = create_db_init((void**)datasource);
}
/* FIXME: set properties from init string */
return hr;
}
/* returns character length of string representation */
@ -342,22 +442,6 @@ static WCHAR *get_propinfo_descr(DBPROP *prop, DBPROPINFOSET *propinfoset)
return NULL;
}
static void free_dbpropset(ULONG count, DBPROPSET *propset)
{
int i;
for (i = 0; i < count; i++)
{
int p;
for (p = 0; p < propset[i].cProperties; p++)
VariantClear(&propset[i].rgProperties[p].vValue);
CoTaskMemFree(propset[i].rgProperties);
}
CoTaskMemFree(propset);
}
static void free_dbpropinfoset(ULONG count, DBPROPINFOSET *propinfoset)
{
int i;

View File

@ -30,22 +30,17 @@
#include "wine/test.h"
static void test_database(void)
static void test_GetDataSource(WCHAR *initstring)
{
HRESULT hr;
IDBInitialize *dbinit = NULL;
IDataInitialize *datainit = NULL;
IDBInitialize *dbinit = NULL;
HRESULT hr;
hr = CoCreateInstance(&CLSID_MSDAINITIALIZE, NULL, CLSCTX_INPROC_SERVER, &IID_IDataInitialize,(void**)&datainit);
if(FAILED(hr))
{
win_skip("Unable to load oledb library\n");
return;
}
hr = IDataInitialize_GetDataSource(datainit, NULL, CLSCTX_INPROC_SERVER, NULL, &IID_IDBInitialize, (IUnknown **)&dbinit);
ok(hr == S_OK, "got %08x\n", hr);
/* a failure to create data source here may indicate provider is simply not present */
hr = IDataInitialize_GetDataSource(datainit, NULL, CLSCTX_INPROC_SERVER, initstring, &IID_IDBInitialize, (IUnknown**)&dbinit);
if(SUCCEEDED(hr))
{
IDBProperties *props = NULL;
@ -53,16 +48,35 @@ static void test_database(void)
hr = IDBInitialize_QueryInterface(dbinit, &IID_IDBProperties, (void**)&props);
ok(hr == S_OK, "got %08x\n", hr);
if(SUCCEEDED(hr))
{
IDBProperties_Release(props);
}
IDBInitialize_Release(dbinit);
}
IDataInitialize_Release(datainit);
}
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','.',
'J','e','t','.','O','L','E','D','B','.','4','.','0',';',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};
IDataInitialize *datainit = NULL;
HRESULT hr;
hr = CoCreateInstance(&CLSID_MSDAINITIALIZE, NULL, CLSCTX_INPROC_SERVER, &IID_IDataInitialize,(void**)&datainit);
if (FAILED(hr))
{
win_skip("Unable to load oledb library\n");
return;
}
IDataInitialize_Release(datainit);
test_GetDataSource(NULL);
test_GetDataSource(initstring_jet);
test_GetDataSource(initstring_default);
}
START_TEST(database)
{
OleInitialize(NULL);

View File

@ -35,6 +35,8 @@
#define DB_E_DATAOVERFLOW 0x80040e57
#define DB_E_MISMATCHEDPROVIDER 0x80040e75
#define DB_S_ERRORSOCCURRED 0x00040eda
#endif /* __WINE_OLEDBERR_H */