[PATCH] msdasql: Connect to DSN in IDBInitialize Initialize.

Alistair Leslie-Hughes leslie_alistair at hotmail.com
Thu Jan 20 21:33:19 CST 2022


Signed-off-by: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
---
 dlls/msdasql/Makefile.in    |  2 +-
 dlls/msdasql/msdasql_main.c | 63 ++++++++++++++++++++++++++++++++++++-
 2 files changed, 63 insertions(+), 2 deletions(-)

diff --git a/dlls/msdasql/Makefile.in b/dlls/msdasql/Makefile.in
index ee8fa672623..0f5453131f6 100644
--- a/dlls/msdasql/Makefile.in
+++ b/dlls/msdasql/Makefile.in
@@ -1,5 +1,5 @@
 MODULE    = msdasql.dll
-IMPORTS   = uuid ole32 oleaut32
+IMPORTS   = uuid ole32 oleaut32 odbc32
 
 EXTRADLLFLAGS = -Wb,--prefer-native
 
diff --git a/dlls/msdasql/msdasql_main.c b/dlls/msdasql/msdasql_main.c
index bc208a74cc5..cf69195baf7 100644
--- a/dlls/msdasql/msdasql_main.c
+++ b/dlls/msdasql/msdasql_main.c
@@ -30,6 +30,9 @@
 
 #include "initguid.h"
 #include "msdasql.h"
+#include "odbcinst.h"
+#include "sqlext.h"
+#include "sqlucode.h"
 
 #include "msdasql_private.h"
 
@@ -40,6 +43,22 @@ DEFINE_GUID(DBPROPSET_DBINIT,    0xc8b522bc, 0x5cf3, 0x11ce, 0xad, 0xe5, 0x00, 0
 
 DEFINE_GUID(DBGUID_DEFAULT,      0xc8b521fb, 0x5cf3, 0x11ce, 0xad, 0xe5, 0x00, 0xaa, 0x00, 0x44, 0x77, 0x3d);
 
+static void dump_sql_diag_records(SQLSMALLINT type, SQLHANDLE handle)
+{
+    SQLCHAR state[6], msg[SQL_MAX_MESSAGE_LENGTH];
+    SQLINTEGER native;
+    SQLSMALLINT i = 1, len;
+
+    if (!TRACE_ON(msdasql))
+        return;
+
+    while(SQLGetDiagRec(type, handle, i, state, &native, msg, sizeof(msg), &len) != SQL_SUCCESS)
+    {
+        WARN("%d: %s: %s\n", i, state, msg);
+        i++;
+    }
+}
+
 static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv)
 {
     *ppv = NULL;
@@ -210,6 +229,10 @@ struct msdasql
 
     LONG     ref;
     struct msdasql_prop properties[14];
+
+    /* ODBC Support */
+    HENV henv;
+    HDBC hdbc;
 };
 
 static inline struct msdasql *impl_from_IUnknown(IUnknown *iface)
@@ -294,6 +317,10 @@ static ULONG  WINAPI msdsql_Release(IUnknown *iface)
 
     if (!ref)
     {
+        SQLDisconnect(provider->hdbc);
+
+        SQLFreeHandle(SQL_HANDLE_DBC, provider->hdbc);
+        SQLFreeHandle(SQL_HANDLE_ENV, provider->henv);
         free(provider);
     }
 
@@ -502,8 +529,33 @@ static ULONG WINAPI dbinit_Release(IDBInitialize *iface)
 static HRESULT WINAPI dbinit_Initialize(IDBInitialize *iface)
 {
     struct msdasql *provider = impl_from_IDBInitialize(iface);
+    int i;
+    SQLRETURN ret;
 
-    FIXME("%p stub\n", provider);
+    FIXME("%p semi-stub\n", provider);
+
+    for(i=0; i < sizeof(provider->properties); i++)
+    {
+        if (provider->properties[i].id == DBPROP_INIT_DATASOURCE)
+            break;
+    }
+
+    if (i >= sizeof(provider->properties))
+    {
+        ERR("Datasource not found\n");
+        return E_FAIL;
+    }
+
+    ret = SQLConnectW( provider->hdbc, (SQLWCHAR *)V_BSTR(&provider->properties[i].value),
+        SQL_NTS, (SQLWCHAR *)NULL, SQL_NTS, (SQLWCHAR *)NULL, SQL_NTS );
+    TRACE("SQLConnectW ret %d\n", ret);
+    if (ret != SQL_SUCCESS)
+    {
+        dump_sql_diag_records(SQL_HANDLE_DBC, provider->hdbc);
+
+        if (ret != SQL_SUCCESS_WITH_INFO)
+           return E_FAIL;
+    }
 
     return S_OK;
 }
@@ -653,6 +705,15 @@ static HRESULT create_msdasql_provider(REFIID riid, void **ppv)
         }
     }
 
+    SQLAllocHandle(SQL_HANDLE_ENV, NULL, &provider->henv );
+    if (SQLSetEnvAttr(provider->henv, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3_80, 0) == SQL_ERROR)
+    {
+        WARN("Falling back to SQL_OV_ODBC3\n");
+        SQLSetEnvAttr(provider->henv, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3, 0);
+    }
+
+    SQLAllocHandle(SQL_HANDLE_DBC, provider->henv, &provider->hdbc);
+
     hr = IUnknown_QueryInterface(&provider->MSDASQL_iface, riid, ppv);
     IUnknown_Release(&provider->MSDASQL_iface);
     return hr;
-- 
2.34.1




More information about the wine-devel mailing list