Nikolay Sivov : oledb32: Support data source properties from init string passed to GetDataSource().

Alexandre Julliard julliard at winehq.org
Fri Dec 28 15:05:15 CST 2012


Module: wine
Branch: master
Commit: 3e8d4e76e5daf46ca3d2776a0aedcde51226c48d
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=3e8d4e76e5daf46ca3d2776a0aedcde51226c48d

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Fri Dec 28 14:59:23 2012 +0400

oledb32: Support data source properties from init string passed to GetDataSource().

---

 dlls/oledb32/datainit.c       |   84 +++++++++++++++++++++++++++++++++++++++--
 dlls/oledb32/tests/database.c |    2 +-
 2 files changed, 81 insertions(+), 5 deletions(-)

diff --git a/dlls/oledb32/datainit.c b/dlls/oledb32/datainit.c
index 1316c0f..c710367 100644
--- a/dlls/oledb32/datainit.c
+++ b/dlls/oledb32/datainit.c
@@ -289,6 +289,32 @@ static void free_dbpropset(ULONG count, DBPROPSET *propset)
     CoTaskMemFree(propset);
 }
 
+static HRESULT set_dbpropset(BSTR name, BSTR value, DBPROPSET **propset)
+{
+    static const WCHAR datasourceW[] = {'D','a','t','a',' ','S','o','u','r','c','e',0};
+
+    *propset = CoTaskMemAlloc(sizeof(DBPROPSET));
+    (*propset)->rgProperties = CoTaskMemAlloc(sizeof(DBPROP));
+
+    if (!strcmpW(datasourceW, name))
+    {
+        (*propset)->cProperties = 1;
+        (*propset)->guidPropertySet = DBPROPSET_DBINIT;
+        (*propset)->rgProperties[0].dwPropertyID = DBPROP_INIT_DATASOURCE;
+        (*propset)->rgProperties[0].dwOptions = DBPROPOPTIONS_REQUIRED;
+        (*propset)->rgProperties[0].dwStatus = 0;
+        memset(&(*propset)->rgProperties[0].colid, 0, sizeof(DBID));
+        V_VT(&(*propset)->rgProperties[0].vValue) = VT_BSTR;
+        V_BSTR(&(*propset)->rgProperties[0].vValue) = SysAllocString(value);
+        return S_OK;
+    }
+    else
+    {
+        FIXME("unsupported property %s\n", debugstr_w(name));
+        return E_FAIL;
+    }
+}
+
 /*** IDataInitialize methods ***/
 static HRESULT WINAPI datainit_GetDataSource(IDataInitialize *iface, IUnknown *outer, DWORD clsctx,
                                 LPWSTR initstring, REFIID riid, IUnknown **datasource)
@@ -296,11 +322,13 @@ static HRESULT WINAPI datainit_GetDataSource(IDataInitialize *iface, IUnknown *o
     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);
+    IDBProperties *dbprops;
+    DBPROPSET *propset;
     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);
+    TRACE("(%p)->(%p 0x%x %s %s %p)\n", This, outer, clsctx, debugstr_w(initstring), debugstr_guid(riid), datasource);
 
     /* first get provider name */
     provclsid = IID_NULL;
@@ -340,9 +368,7 @@ static HRESULT WINAPI datainit_GetDataSource(IDataInitialize *iface, IUnknown *o
     /* 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;
@@ -385,7 +411,57 @@ static HRESULT WINAPI datainit_GetDataSource(IDataInitialize *iface, IUnknown *o
             hr = create_db_init((void**)datasource);
     }
 
-    /* FIXME: set properties from init string */
+    /* now set properties */
+    if (initstring)
+    {
+        static const WCHAR scolW[] = {';',0};
+        static const WCHAR eqW[] = {'=',0};
+        WCHAR *eq, *start;
+
+        hr = IUnknown_QueryInterface(*datasource, &IID_IDBProperties, (void**)&dbprops);
+        if (FAILED(hr))
+        {
+            WARN("provider doesn't support IDBProperties\n");
+            return hr;
+        }
+
+        start = initstring;
+        while ((eq = strstrW(start, eqW)))
+        {
+            static const WCHAR providerW[] = {'P','r','o','v','i','d','e','r',0};
+            WCHAR *scol = strstrW(eq+1, scolW);
+            BSTR value, name;
+
+            name = SysAllocStringLen(start, eq - start);
+            /* skip equal sign to get value */
+            eq++;
+            value = SysAllocStringLen(eq, scol ? scol - eq : -1);
+
+            /* skip semicolon if present */
+            if (scol) scol++;
+            start = scol;
+
+            if (!strcmpW(name, providerW))
+            {
+                SysFreeString(name);
+                SysFreeString(value);
+                continue;
+            }
+
+            TRACE("property (name=%s, value=%s)\n", debugstr_w(name), debugstr_w(value));
+
+            hr = set_dbpropset(name, value, &propset);
+            SysFreeString(name);
+            SysFreeString(value);
+            if (FAILED(hr)) return hr;
+
+            hr = IDBProperties_SetProperties(dbprops, 1, propset);
+            free_dbpropset(1, propset);
+            TRACE("provider ret 0x%08x\n", hr);
+        }
+
+        IDBProperties_Release(dbprops);
+    }
 
     return hr;
 }
diff --git a/dlls/oledb32/tests/database.c b/dlls/oledb32/tests/database.c
index ede1074..4d3694c 100644
--- a/dlls/oledb32/tests/database.c
+++ b/dlls/oledb32/tests/database.c
@@ -58,7 +58,7 @@ static void test_GetDataSource(WCHAR *initstring)
 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,
+         'J','e','t','.','O','L','E','D','B','.','4','.','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;




More information about the wine-cvs mailing list