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