Alistair Leslie-Hughes : msdasql: ICommandText Execute use ODBC to fetch results.

Alexandre Julliard julliard at winehq.org
Mon Feb 7 15:56:03 CST 2022


Module: wine
Branch: master
Commit: 50fc9d7ddce7d2abe03549aa28df192b6cd944ac
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=50fc9d7ddce7d2abe03549aa28df192b6cd944ac

Author: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
Date:   Sun Feb  6 19:07:36 2022 +1100

msdasql: ICommandText Execute use ODBC to fetch results.

Signed-off-by: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msdasql/session.c        | 59 ++++++++++++++++++++++++++++++++-----------
 dlls/msdasql/tests/provider.c | 15 ++++++++---
 2 files changed, 56 insertions(+), 18 deletions(-)

diff --git a/dlls/msdasql/session.c b/dlls/msdasql/session.c
index 0f74c126138..199eb0830d6 100644
--- a/dlls/msdasql/session.c
+++ b/dlls/msdasql/session.c
@@ -477,6 +477,7 @@ struct msdasql_rowset
     IColumnsRowset IColumnsRowset_iface;
     IUnknown *caller;
     LONG refs;
+    SQLHSTMT hstmt;
 };
 
 static inline struct msdasql_rowset *impl_from_IRowset( IRowset *iface )
@@ -575,6 +576,8 @@ static ULONG WINAPI msdasql_rowset_Release(IRowset *iface)
     {
         TRACE( "destroying %p\n", rowset );
 
+        SQLFreeHandle(SQL_HANDLE_STMT, rowset->hstmt);
+
         if (rowset->caller)
             IUnknown_Release(rowset->caller);
 
@@ -845,27 +848,53 @@ static HRESULT WINAPI command_Execute(ICommandText *iface, IUnknown *outer, REFI
 {
     struct command *command = impl_from_ICommandText( iface );
     struct msdasql_rowset *msrowset;
-    HRESULT hr;
+    HRESULT hr = S_OK;
+    RETCODE ret;
+    SQLHSTMT hstmt = command->hstmt;
+    SQLLEN results = -1;
 
-    FIXME("%p, %p, %s, %p %p %p Semi Stub\n", command, outer, debugstr_guid(riid), params, affected, rowset);
+    TRACE("%p, %p, %s, %p %p %p\n", command, outer, debugstr_guid(riid), params, affected, rowset);
 
-    msrowset = heap_alloc(sizeof(*msrowset));
-    if (!msrowset)
-        return E_OUTOFMEMORY;
+    if (!hstmt)
+        SQLAllocHandle(SQL_HANDLE_STMT, command->hdbc, &hstmt);
 
-    msrowset->IRowset_iface.lpVtbl = &msdasql_rowset_vtbl;
-    msrowset->IRowsetInfo_iface.lpVtbl = &rowset_info_vtbl;
-    msrowset->IColumnsInfo_iface.lpVtbl = &rowset_columninfo_vtbll;
-    msrowset->IAccessor_iface.lpVtbl = &accessor_vtbl;
-    msrowset->IColumnsRowset_iface.lpVtbl = &columnrs_rs_vtbl;
-    msrowset->refs = 1;
-    ICommandText_QueryInterface(iface, &IID_IUnknown, (void**)&msrowset->caller);
+    ret = SQLExecDirectW(hstmt, command->query, SQL_NTS);
+    if (ret != SQL_SUCCESS)
+    {
+        dump_sql_diag_records(SQL_HANDLE_STMT, hstmt);
+        return E_FAIL;
+    }
+
+    ret = SQLRowCount(hstmt, &results);
+    if (ret != SQL_SUCCESS)
+        ERR("SQLRowCount failed (%d)\n", ret);
 
     if (affected)
-        *affected = 0; /* FIXME */
+        *affected = results;
+
+    *rowset = NULL;
+    if (!wcsnicmp( command->query, L"select ", 7 ))
+    {
+        msrowset = heap_alloc(sizeof(*msrowset));
+        if (!msrowset)
+            return E_OUTOFMEMORY;
 
-    hr = IRowset_QueryInterface(&msrowset->IRowset_iface, riid, (void**)rowset);
-    IRowset_Release(&msrowset->IRowset_iface);
+        command->hstmt = NULL;
+
+        msrowset->IRowset_iface.lpVtbl = &msdasql_rowset_vtbl;
+        msrowset->IRowsetInfo_iface.lpVtbl = &rowset_info_vtbl;
+        msrowset->IColumnsInfo_iface.lpVtbl = &rowset_columninfo_vtbll;
+        msrowset->IAccessor_iface.lpVtbl = &accessor_vtbl;
+        msrowset->IColumnsRowset_iface.lpVtbl = &columnrs_rs_vtbl;
+        msrowset->refs = 1;
+        ICommandText_QueryInterface(iface, &IID_IUnknown, (void**)&msrowset->caller);
+        msrowset->hstmt = hstmt;
+
+        hr = IRowset_QueryInterface(&msrowset->IRowset_iface, riid, (void**)rowset);
+        IRowset_Release(&msrowset->IRowset_iface);
+    }
+    else
+        SQLFreeStmt(hstmt, SQL_CLOSE);
 
     return hr;
 }
diff --git a/dlls/msdasql/tests/provider.c b/dlls/msdasql/tests/provider.c
index 7a5175fa050..d261e34e987 100644
--- a/dlls/msdasql/tests/provider.c
+++ b/dlls/msdasql/tests/provider.c
@@ -382,11 +382,20 @@ static void test_command_rowset(IUnknown *cmd)
     affected = 9999;
     hr = ICommandText_Execute(command_text, NULL, &IID_IRowset, NULL, &affected, &unk);
     ok(hr == S_OK, "got 0x%08lx\n", hr);
-    todo_wine ok(unk == NULL, "Unexpected value\n");
-    todo_wine ok(affected == -1, "got %Id\n", affected);
+    ok(unk == NULL, "Unexpected value\n");
+    ok(affected == -1, "got %Id\n", affected);
     if (unk)
         IUnknown_Release(unk);
 
+    hr = ICommandText_SetCommandText(command_text, &DBGUID_DEFAULT, L"insert into testing values(1, 0)");
+    ok(hr == S_OK, "got 0x%08lx\n", hr);
+
+    affected = 9999;
+    hr = ICommandText_Execute(command_text, NULL, &IID_IRowset, NULL, &affected, &unk);
+    ok(hr == S_OK, "got 0x%08lx\n", hr);
+    ok(affected == 1, "got %Id\n", affected);
+    ok(unk == NULL, "Unexpected value\n");
+
     hr = ICommandText_SetCommandText(command_text, &DBGUID_DEFAULT, L"select * from testing");
     ok(hr == S_OK, "got 0x%08lx\n", hr);
 
@@ -396,7 +405,7 @@ static void test_command_rowset(IUnknown *cmd)
     ok(unk != NULL, "Unexpected value\n");
     if (hr == S_OK)
     {
-        ok(affected == -1, "wrong affected value\n");
+        ok(affected == -1, "got %Id\n", affected);
 
         hr = IUnknown_QueryInterface(unk, &IID_IRowset, (void**)&rowset);
         ok(hr == S_OK, "got 0x%08lx\n", hr);




More information about the wine-cvs mailing list