Nikolay Sivov : oledb32: Add a table of init properties, support Persist Security Info switch in init string.

Alexandre Julliard julliard at winehq.org
Mon Feb 11 13:06:31 CST 2013


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Sun Feb 10 20:01:23 2013 +0400

oledb32: Add a table of init properties, support Persist Security Info switch in init string.

---

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

diff --git a/dlls/oledb32/datainit.c b/dlls/oledb32/datainit.c
index aa61d3b..d979846 100644
--- a/dlls/oledb32/datainit.c
+++ b/dlls/oledb32/datainit.c
@@ -289,30 +289,89 @@ static void free_dbpropset(ULONG count, DBPROPSET *propset)
     CoTaskMemFree(propset);
 }
 
+struct dbproperty {
+    const WCHAR *name;
+    DBPROPID id;
+    DBPROPOPTIONS options;
+    VARTYPE type;
+};
+
+static const WCHAR datasourceW[] = {'D','a','t','a',' ','S','o','u','r','c','e',0};
+static const WCHAR persistsiW[] = {'P','e','r','s','i','s','t',' ','S','e','c','u','r','i','t','y',' ','I','n','f','o',0};
+
+static const struct dbproperty dbproperties[] = {
+    { datasourceW, DBPROP_INIT_DATASOURCE, DBPROPOPTIONS_REQUIRED, VT_BSTR },
+    { persistsiW, DBPROP_AUTH_PERSIST_SENSITIVE_AUTHINFO, DBPROPOPTIONS_OPTIONAL, VT_BOOL }
+};
+
 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};
+    VARIANT src, dest;
+    int min, max, n;
+    HRESULT hr;
+
+    min = 0;
+    max = sizeof(dbproperties)/sizeof(struct dbproperty) - 1;
 
-    if (!strcmpW(datasourceW, name))
+    while (min <= max)
     {
-        *propset = CoTaskMemAlloc(sizeof(DBPROPSET));
-        (*propset)->rgProperties = CoTaskMemAlloc(sizeof(DBPROP));
-        (*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;
+        int r;
+
+        n = (min+max)/2;
+
+        r = strcmpW(dbproperties[n].name, name);
+        if (!r)
+            break;
+
+        if (r < 0)
+            min = n+1;
+        else
+            max = n-1;
     }
-    else
+
+    if (min > max)
     {
         *propset = NULL;
         FIXME("unsupported property %s\n", debugstr_w(name));
         return E_FAIL;
     }
+
+    VariantInit(&dest);
+
+    V_VT(&src) = VT_BSTR;
+    V_BSTR(&src) = value;
+
+    hr = VariantChangeType(&dest, &src, 0, dbproperties[n].type);
+    if (FAILED(hr))
+    {
+        ERR("failed to init property %s value as type %d\n", debugstr_w(name), dbproperties[n].type);
+        return hr;
+    }
+
+    *propset = CoTaskMemAlloc(sizeof(DBPROPSET));
+    if (!*propset)
+    {
+        VariantClear(&dest);
+        return E_OUTOFMEMORY;
+    }
+
+    (*propset)->rgProperties = CoTaskMemAlloc(sizeof(DBPROP));
+    if (!(*propset)->rgProperties)
+    {
+        VariantClear(&dest);
+        CoTaskMemFree(*propset);
+        return E_OUTOFMEMORY;
+    }
+
+    (*propset)->cProperties = 1;
+    (*propset)->guidPropertySet = DBPROPSET_DBINIT;
+    (*propset)->rgProperties[0].dwPropertyID = dbproperties[n].id;
+    (*propset)->rgProperties[0].dwOptions = dbproperties[n].options;
+    (*propset)->rgProperties[0].dwStatus = 0;
+    memset(&(*propset)->rgProperties[0].colid, 0, sizeof(DBID));
+    (*propset)->rgProperties[0].vValue = dest;
+
+    return S_OK;
 }
 
 /*** IDataInitialize methods ***/
diff --git a/dlls/oledb32/tests/database.c b/dlls/oledb32/tests/database.c
index 4d3694c..d744c86 100644
--- a/dlls/oledb32/tests/database.c
+++ b/dlls/oledb32/tests/database.c
@@ -59,12 +59,13 @@ 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',';',
-         'D','a','t','a',' ','S','o','u','r','c','e','=','d','u','m','m','y',';',0};
+         'D','a','t','a',' ','S','o','u','r','c','e','=','d','u','m','m','y',';',
+         'P','e','r','s','i','s','t',' ','S','e','c','u','r','i','t','y',' ','I','n','f','o','=','F','a','l','s','e',';',0};
     static WCHAR initstring_default[] = {'D','a','t','a',' ','S','o','u','r','c','e','=','d','u','m','m','y',';',0};
     IDataInitialize *datainit = NULL;
     HRESULT hr;
 
-    hr = CoCreateInstance(&CLSID_MSDAINITIALIZE, NULL, CLSCTX_INPROC_SERVER, &IID_IDataInitialize,(void**)&datainit);
+    hr = CoCreateInstance(&CLSID_MSDAINITIALIZE, NULL, CLSCTX_INPROC_SERVER, &IID_IDataInitialize, (void**)&datainit);
     if (FAILED(hr))
     {
         win_skip("Unable to load oledb library\n");




More information about the wine-cvs mailing list