Signed-off-by: Alistair Leslie-Hughes leslie_alistair@hotmail.com --- dlls/msdasql/msdasql_main.c | 50 +++++++++++++++++++++++++++++++++++ dlls/msdasql/tests/provider.c | 27 +++++++++++++++++++ 2 files changed, 77 insertions(+)
diff --git a/dlls/msdasql/msdasql_main.c b/dlls/msdasql/msdasql_main.c index 38cec9e88e1..d9aaf491d3c 100644 --- a/dlls/msdasql/msdasql_main.c +++ b/dlls/msdasql/msdasql_main.c @@ -180,6 +180,7 @@ struct msdasql IDBProperties IDBProperties_iface; IDBInitialize IDBInitialize_iface; IDBCreateSession IDBCreateSession_iface; + IPersist IPersist_iface;
LONG ref; }; @@ -204,6 +205,11 @@ static inline struct msdasql *impl_from_IDBCreateSession(IDBCreateSession *iface return CONTAINING_RECORD(iface, struct msdasql, IDBCreateSession_iface); }
+static inline struct msdasql *impl_from_IPersist( IPersist *iface ) +{ + return CONTAINING_RECORD( iface, struct msdasql, IPersist_iface ); +} + static HRESULT WINAPI msdsql_QueryInterface(IUnknown *iface, REFIID riid, void **out) { struct msdasql *provider = impl_from_IUnknown(iface); @@ -227,6 +233,10 @@ static HRESULT WINAPI msdsql_QueryInterface(IUnknown *iface, REFIID riid, void * { *out = &provider->IDBCreateSession_iface; } + else if(IsEqualGUID(&IID_IPersist, riid)) + { + *out = &provider->IPersist_iface; + } else { FIXME("(%s, %p)\n", debugstr_guid(riid), out); @@ -459,6 +469,45 @@ static const struct IDBCreateSessionVtbl dbsess_vtbl = dbsess_CreateSession };
+static HRESULT WINAPI persist_QueryInterface(IPersist *iface, REFIID riid, void **ppv) +{ + struct msdasql *provider = impl_from_IPersist( iface ); + return IUnknown_QueryInterface(&provider->MSDASQL_iface, riid, ppv); +} + +static ULONG WINAPI persist_AddRef(IPersist *iface) +{ + struct msdasql *provider = impl_from_IPersist( iface ); + return IUnknown_AddRef(&provider->MSDASQL_iface); +} + +static ULONG WINAPI persist_Release(IPersist *iface) +{ + struct msdasql *provider = impl_from_IPersist( iface ); + return IUnknown_Release(&provider->MSDASQL_iface); +} + +static HRESULT WINAPI persist_GetClassID(IPersist *iface, CLSID *classid) +{ + struct msdasql *provider = impl_from_IPersist( iface ); + + TRACE("(%p)->(%p)\n", provider, classid); + + if(!classid) + return E_INVALIDARG; + + *classid = CLSID_MSDASQL; + return S_OK; + +} + +static const IPersistVtbl persistVtbl = { + persist_QueryInterface, + persist_AddRef, + persist_Release, + persist_GetClassID +}; + static HRESULT create_msdasql_provider(REFIID riid, void **ppv) { struct msdasql *provider; @@ -472,6 +521,7 @@ static HRESULT create_msdasql_provider(REFIID riid, void **ppv) provider->IDBProperties_iface.lpVtbl = &dbprops_vtbl; provider->IDBInitialize_iface.lpVtbl = &dbinit_vtbl; provider->IDBCreateSession_iface.lpVtbl = &dbsess_vtbl; + provider->IPersist_iface.lpVtbl = &persistVtbl; provider->ref = 1;
hr = IUnknown_QueryInterface(&provider->MSDASQL_iface, riid, ppv); diff --git a/dlls/msdasql/tests/provider.c b/dlls/msdasql/tests/provider.c index ff4757eb236..16d6de6cd9a 100644 --- a/dlls/msdasql/tests/provider.c +++ b/dlls/msdasql/tests/provider.c @@ -36,6 +36,32 @@ DEFINE_GUID(DBPROPSET_DBINIT, 0xc8b522bc, 0x5cf3, 0x11ce, 0xad, 0xe5, 0x00, 0 static BOOL db_created; static char mdbpath[MAX_PATH];
+static test_msdasql(void) +{ + HRESULT hr; + IUnknown *unk; + IPersist *persist; + CLSID classid; + + hr = CoCreateInstance( &CLSID_MSDASQL, NULL, CLSCTX_ALL, &IID_IUnknown, (void **)&unk); + ok(hr == S_OK, "Failed to create object 0x%08x\n", hr); + if (FAILED(hr)) + { + return; + } + + hr = IUnknown_QueryInterface(unk, &IID_IPersist, (void**)&persist); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = IPersist_GetClassID(persist, &classid); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(IsEqualGUID(&classid, &CLSID_MSDASQL), "got %s\n", debugstr_guid(&classid)); + + IPersist_Release(persist); + + IUnknown_Release(unk); +} + static void test_Properties(void) { HRESULT hr; @@ -264,6 +290,7 @@ START_TEST(provider)
setup_database();
+ test_msdasql(); test_Properties(); test_sessions();