oledb32: Support quoted values in initialisation strings.
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Alistair Leslie-Hughes <leslie_alistair@hotmail.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
92ce6e6bab
commit
85c6afe4ce
|
@ -401,17 +401,33 @@ static HRESULT parse_init_string(const WCHAR *initstring, struct dbprops *props)
|
||||||
while (start && (eq = strchrW(start, '=')))
|
while (start && (eq = strchrW(start, '=')))
|
||||||
{
|
{
|
||||||
static const WCHAR providerW[] = {'P','r','o','v','i','d','e','r',0};
|
static const WCHAR providerW[] = {'P','r','o','v','i','d','e','r',0};
|
||||||
WCHAR *scol = strchrW(eq+1, ';');
|
|
||||||
BSTR value, name;
|
BSTR value, name;
|
||||||
|
WCHAR *delim;
|
||||||
|
|
||||||
name = SysAllocStringLen(start, eq - start);
|
name = SysAllocStringLen(start, eq - start);
|
||||||
/* skip equal sign to get value */
|
/* skip equal sign to get value */
|
||||||
eq++;
|
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 */
|
/* skip semicolon if present */
|
||||||
if (scol) scol++;
|
if (delim)
|
||||||
start = scol;
|
{
|
||||||
|
if (*delim == '"')
|
||||||
|
delim++;
|
||||||
|
if (*delim == ';')
|
||||||
|
delim++;
|
||||||
|
}
|
||||||
|
start = delim;
|
||||||
|
|
||||||
if (!strcmpiW(name, providerW))
|
if (!strcmpiW(name, providerW))
|
||||||
{
|
{
|
||||||
|
|
|
@ -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 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',';',
|
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};
|
'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;
|
IDataInitialize *datainit = NULL;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
|
@ -308,6 +311,7 @@ static void test_database(void)
|
||||||
test_GetDataSource(initstring_default);
|
test_GetDataSource(initstring_default);
|
||||||
test_GetDataSource(initstring_lower);
|
test_GetDataSource(initstring_lower);
|
||||||
test_GetDataSource2(customprop);
|
test_GetDataSource2(customprop);
|
||||||
|
test_GetDataSource2(extended_prop);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_errorinfo(void)
|
static void test_errorinfo(void)
|
||||||
|
|
Loading…
Reference in New Issue