[PATCH] oledb32: Support quoted values in initialisation strings
Nikolay Sivov
nsivov at codeweavers.com
Tue Aug 9 02:36:22 CDT 2016
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
For https://bugs.winehq.org/show_bug.cgi?id=41103,
test part from Alistair.
dlls/oledb32/datainit.c | 24 ++++++++++++++++++++----
dlls/oledb32/tests/database.c | 4 ++++
2 files changed, 24 insertions(+), 4 deletions(-)
diff --git a/dlls/oledb32/datainit.c b/dlls/oledb32/datainit.c
index 1ba0cb1..42d5dae 100644
--- a/dlls/oledb32/datainit.c
+++ b/dlls/oledb32/datainit.c
@@ -401,17 +401,33 @@ static HRESULT parse_init_string(const WCHAR *initstring, struct dbprops *props)
while (start && (eq = strchrW(start, '=')))
{
static const WCHAR providerW[] = {'P','r','o','v','i','d','e','r',0};
- WCHAR *scol = strchrW(eq+1, ';');
BSTR value, name;
+ WCHAR *delim;
name = SysAllocStringLen(start, eq - start);
/* skip equal sign to get value */
eq++;
- value = SysAllocStringLen(eq, scol ? scol - eq : -1);
+
+ if (*eq == '"')
+ {
+ /* for quoted value string, skip opening mark, look for terminating one */
+ eq++;
+ delim = strchrW(eq, '"');
+ }
+ else
+ delim = strchrW(eq, ';');
+
+ value = SysAllocStringLen(eq, delim ? delim - eq : -1);
/* skip semicolon if present */
- if (scol) scol++;
- start = scol;
+ if (delim)
+ {
+ if (*delim == '"')
+ delim++;
+ if (*delim == ';')
+ delim++;
+ }
+ start = delim;
if (!strcmpiW(name, providerW))
{
diff --git a/dlls/oledb32/tests/database.c b/dlls/oledb32/tests/database.c
index 442e57e..217fb4a 100644
--- a/dlls/oledb32/tests/database.c
+++ b/dlls/oledb32/tests/database.c
@@ -292,6 +292,9 @@ static void test_database(void)
static WCHAR initstring_lower[] = {'d','a','t','a',' ','s','o','u','r','c','e','=','d','u','m','m','y',';',0};
static WCHAR customprop[] = {'d','a','t','a',' ','s','o','u','r','c','e','=','d','u','m','m','y',';',
'c','u','s','t','o','m','p','r','o','p','=','1','2','3','.','4',';',0};
+ static WCHAR extended_prop[] = {'d','a','t','a',' ','s','o','u','r','c','e','=','d','u','m','m','y',';',
+ 'E','x','t','e','n','d','e','d',' ','P','r','o','p','e','r','t','i','e','s','=','\"','D','R','I','V','E','R','=','A',
+ ' ','W','i','n','e',' ','O','D','B','C',' ','d','r','i','v','e','r',';','U','I','D','=','w','i','n','e',';','\"',';',0};
IDataInitialize *datainit = NULL;
HRESULT hr;
@@ -308,6 +311,7 @@ static void test_database(void)
test_GetDataSource(initstring_default);
test_GetDataSource(initstring_lower);
test_GetDataSource2(customprop);
+ test_GetDataSource2(extended_prop);
}
static void test_errorinfo(void)
--
2.8.1
More information about the wine-patches
mailing list