[PATCH] msdasql: Add ITransaction to session interafe
Alistair Leslie-Hughes
leslie_alistair at hotmail.com
Thu Jan 27 03:08:29 CST 2022
---
dlls/msdasql/session.c | 68 +++++++++++++++++++++++++++++++++++
dlls/msdasql/tests/provider.c | 5 ++-
2 files changed, 70 insertions(+), 3 deletions(-)
diff --git a/dlls/msdasql/session.c b/dlls/msdasql/session.c
index e58d152a418..901a763924d 100644
--- a/dlls/msdasql/session.c
+++ b/dlls/msdasql/session.c
@@ -44,6 +44,7 @@ struct msdasql_session
ISessionProperties ISessionProperties_iface;
IDBCreateCommand IDBCreateCommand_iface;
ITransactionJoin ITransactionJoin_iface;
+ ITransaction ITransaction_iface;
LONG refs;
IUnknown *datasource;
@@ -81,6 +82,11 @@ static inline struct msdasql_session *impl_from_ITransactionJoin( ITransactionJo
return CONTAINING_RECORD( iface, struct msdasql_session, ITransactionJoin_iface );
}
+static inline struct msdasql_session *impl_from_ITransaction( ITransaction *iface )
+{
+ return CONTAINING_RECORD( iface, struct msdasql_session, ITransaction_iface );
+}
+
static HRESULT WINAPI session_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
{
struct msdasql_session *session = impl_from_IUnknown( iface );
@@ -118,6 +124,11 @@ static HRESULT WINAPI session_QueryInterface(IUnknown *iface, REFIID riid, void
TRACE("(%p)->(ITransactionJoin %p)\n", iface, ppv);
*ppv = &session->ITransactionJoin_iface;
}
+ else if(IsEqualGUID(&IID_ITransaction, riid))
+ {
+ TRACE("(%p)->(ITransaction %p)\n", iface, ppv);
+ *ppv = &session->ITransaction_iface;
+ }
else if(IsEqualGUID(&IID_IBindResource, riid))
{
TRACE("(%p)->(IID_IBindResource not support)\n", iface);
@@ -1248,6 +1259,61 @@ static const ITransactionJoinVtbl transactionjoinVtbl =
transjoin_JoinTransaction
};
+static HRESULT WINAPI transaction_QueryInterface(ITransaction *iface, REFIID riid, void **out)
+{
+ struct msdasql_session *session = impl_from_ITransaction( iface );
+ return IUnknown_QueryInterface(&session->session_iface, riid, out);
+}
+
+static ULONG WINAPI transaction_AddRef(ITransaction *iface)
+{
+ struct msdasql_session *session = impl_from_ITransaction( iface );
+ return IUnknown_AddRef(&session->session_iface);
+}
+
+static ULONG WINAPI transaction_Release(ITransaction *iface)
+{
+ struct msdasql_session *session = impl_from_ITransaction( iface );
+ return IUnknown_Release(&session->session_iface);
+}
+
+static HRESULT WINAPI transaction_Commit(ITransaction *iface, BOOL retaining, DWORD tc, DWORD rm)
+{
+ struct msdasql_session *session = impl_from_ITransaction( iface );
+
+ FIXME("%p, %d, %d, %d\n", session, retaining, tc, rm);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI transaction_Abort(ITransaction *iface, BOID *reason, BOOL retaining, BOOL async)
+{
+ struct msdasql_session *session = impl_from_ITransaction( iface );
+
+ FIXME("%p, %p, %d, %d\n", session, reason, retaining, async);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI transaction_GetTransactionInfo(ITransaction *iface, XACTTRANSINFO *info)
+{
+ struct msdasql_session *session = impl_from_ITransaction( iface );
+
+ FIXME("%p, %p\n", session, info);
+
+ return E_NOTIMPL;
+}
+
+static const ITransactionVtbl transactionVtbl =
+{
+ transaction_QueryInterface,
+ transaction_AddRef,
+ transaction_Release,
+ transaction_Commit,
+ transaction_Abort,
+ transaction_GetTransactionInfo
+};
+
HRESULT create_db_session(REFIID riid, IUnknown *datasource, HDBC hdbc, void **unk)
{
struct msdasql_session *session;
@@ -1263,6 +1329,8 @@ HRESULT create_db_session(REFIID riid, IUnknown *datasource, HDBC hdbc, void **u
session->ISessionProperties_iface.lpVtbl = &propertiesVtbl;
session->IDBCreateCommand_iface.lpVtbl = &createcommandVtbl;
session->ITransactionJoin_iface.lpVtbl = &transactionjoinVtbl;
+ session->ITransaction_iface.lpVtbl = &transactionVtbl;
+
IUnknown_QueryInterface(datasource, &IID_IUnknown, (void**)&session->datasource);
session->refs = 1;
session->hdbc = hdbc;
diff --git a/dlls/msdasql/tests/provider.c b/dlls/msdasql/tests/provider.c
index ee81ad1d311..22fbf26c107 100644
--- a/dlls/msdasql/tests/provider.c
+++ b/dlls/msdasql/tests/provider.c
@@ -481,9 +481,8 @@ static void test_sessions(void)
IGetDataSource_Release(datasource);
hr = IUnknown_QueryInterface(session, &IID_ITransaction, (void**)&transaction);
- todo_wine ok(hr == S_OK, "got 0x%08x\n", hr);
- if(hr == S_OK)
- ITransaction_Release(transaction);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ITransaction_Release(transaction);
hr = IUnknown_QueryInterface(session, &IID_ITransactionLocal, (void**)&local);
todo_wine ok(hr == S_OK, "got 0x%08x\n", hr);
--
2.34.1
More information about the wine-devel
mailing list