From: Zhiyi Zhang zzhang@codeweavers.com
--- dlls/oledb32/tests/convert.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
diff --git a/dlls/oledb32/tests/convert.c b/dlls/oledb32/tests/convert.c index 85911808a16..f70562f8e79 100644 --- a/dlls/oledb32/tests/convert.c +++ b/dlls/oledb32/tests/convert.c @@ -3077,6 +3077,19 @@ static void test_converttoui8(void) ok(hr == S_OK, "got %08lx\n", hr); ok(dst_status == DBSTATUS_S_ISNULL, "got %08lx\n", dst_status); ok(dst_len == 44, "got %Id\n", dst_len); + + V_VT(&v) = VT_UI8; + V_UI8(&v) = 4321; + dst_len = 0x1234; + hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_UI8, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0); + todo_wine + ok(hr == S_OK, "got %08lx\n", hr); + todo_wine + ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status); + todo_wine + ok(dst_len == sizeof(dst), "got %Id\n", dst_len); + todo_wine + ok(dst.QuadPart == 4321, "got %d\n", (int)dst.QuadPart); }
static void test_getconversionsize(void)
From: Zhiyi Zhang zzhang@codeweavers.com
--- dlls/oledb32/convert.c | 5 +++++ dlls/oledb32/tests/convert.c | 4 ---- 2 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/dlls/oledb32/convert.c b/dlls/oledb32/convert.c index b8db8f06d8b..4ed9f0d8cc6 100644 --- a/dlls/oledb32/convert.c +++ b/dlls/oledb32/convert.c @@ -826,6 +826,11 @@ static HRESULT WINAPI convert_DataConvert(IDataConvert* iface, case DBTYPE_UI4: hr = VarUI8FromUI4(*(DWORD*)src, d); break; case DBTYPE_I8: hr = VarUI8FromI8(*(LONGLONG*)src, d); break; case DBTYPE_UI8: *d = *(ULONGLONG*)src; hr = S_OK; break; + case DBTYPE_VARIANT: + VariantInit(&tmp); + if ((hr = VariantChangeType(&tmp, src, 0, VT_UI8)) == S_OK) + *d = V_UI8(&tmp); + break; default: FIXME("Unimplemented conversion %04x -> UI8\n", src_type); return E_NOTIMPL; } break; diff --git a/dlls/oledb32/tests/convert.c b/dlls/oledb32/tests/convert.c index f70562f8e79..2d5f898e0df 100644 --- a/dlls/oledb32/tests/convert.c +++ b/dlls/oledb32/tests/convert.c @@ -3082,13 +3082,9 @@ static void test_converttoui8(void) V_UI8(&v) = 4321; dst_len = 0x1234; hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_UI8, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0); - todo_wine ok(hr == S_OK, "got %08lx\n", hr); - todo_wine ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status); - todo_wine ok(dst_len == sizeof(dst), "got %Id\n", dst_len); - todo_wine ok(dst.QuadPart == 4321, "got %d\n", (int)dst.QuadPart); }
From: Zhiyi Zhang zzhang@codeweavers.com
--- dlls/oledb32/tests/convert.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+)
diff --git a/dlls/oledb32/tests/convert.c b/dlls/oledb32/tests/convert.c index 2d5f898e0df..019e8c96d93 100644 --- a/dlls/oledb32/tests/convert.c +++ b/dlls/oledb32/tests/convert.c @@ -2680,6 +2680,33 @@ static void test_converttoguid(void) ok(hr == S_OK, "got %08lx\n", hr); ok(dst_status == DBSTATUS_S_ISNULL, "got %08lx\n", dst_status); ok(dst_len == 44, "got %Id\n", dst_len); + + dst_len = 0x1234; + dst = IID_IDCInfo; + V_VT(&v) = VT_BSTR; + V_BSTR(&v) = SysAllocStringLen(L"{0c733a8d-2a1c-11ce-ade5-00aa0044773d}", 38); + hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_GUID, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0); + todo_wine + ok(hr == S_OK, "got %08lx\n", hr); + todo_wine + ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status); + todo_wine + ok(dst_len == sizeof(GUID), "got %Id\n", dst_len); + todo_wine + ok(IsEqualGUID(&dst, &IID_IDataConvert), "didn't get IID_IDataConvert\n"); + SysFreeString(V_BSTR(&v)); + + dst_len = 0x1234; + V_VT(&v) = VT_BSTR; + V_BSTR(&v) = SysAllocStringLen(L"{invalid0-0000-0000-0000-000000000000}", 38); + hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_GUID, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0); + todo_wine + ok(hr == CO_E_CLASSSTRING, "got %08lx\n", hr); + todo_wine + ok(dst_status == DBSTATUS_E_CANTCONVERTVALUE, "got %08lx\n", dst_status); + todo_wine + ok(dst_len == sizeof(GUID), "got %Id\n", dst_len); + SysFreeString(V_BSTR(&v)); }
static void test_converttofiletime(void)
From: Zhiyi Zhang zzhang@codeweavers.com
--- dlls/oledb32/convert.c | 11 +++++++++++ dlls/oledb32/tests/convert.c | 7 ------- 2 files changed, 11 insertions(+), 7 deletions(-)
diff --git a/dlls/oledb32/convert.c b/dlls/oledb32/convert.c index 4ed9f0d8cc6..bb427e0cb54 100644 --- a/dlls/oledb32/convert.c +++ b/dlls/oledb32/convert.c @@ -855,6 +855,17 @@ static HRESULT WINAPI convert_DataConvert(IDataConvert* iface, { case DBTYPE_EMPTY: *d = GUID_NULL; hr = S_OK; break; case DBTYPE_GUID: *d = *(GUID*)src; hr = S_OK; break; + case DBTYPE_VARIANT: + if (V_VT((VARIANT *)src) == VT_BSTR) + { + hr = CLSIDFromString(V_BSTR((VARIANT *)src), d); + if (FAILED(hr)) + { + *dst_len = sizeof(GUID); + *dst_status = DBSTATUS_E_CANTCONVERTVALUE; + } + break; + } default: FIXME("Unimplemented conversion %04x -> GUID\n", src_type); return E_NOTIMPL; } break; diff --git a/dlls/oledb32/tests/convert.c b/dlls/oledb32/tests/convert.c index 019e8c96d93..aea2e40473c 100644 --- a/dlls/oledb32/tests/convert.c +++ b/dlls/oledb32/tests/convert.c @@ -2686,13 +2686,9 @@ static void test_converttoguid(void) V_VT(&v) = VT_BSTR; V_BSTR(&v) = SysAllocStringLen(L"{0c733a8d-2a1c-11ce-ade5-00aa0044773d}", 38); hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_GUID, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0); - todo_wine ok(hr == S_OK, "got %08lx\n", hr); - todo_wine ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status); - todo_wine ok(dst_len == sizeof(GUID), "got %Id\n", dst_len); - todo_wine ok(IsEqualGUID(&dst, &IID_IDataConvert), "didn't get IID_IDataConvert\n"); SysFreeString(V_BSTR(&v));
@@ -2700,11 +2696,8 @@ static void test_converttoguid(void) V_VT(&v) = VT_BSTR; V_BSTR(&v) = SysAllocStringLen(L"{invalid0-0000-0000-0000-000000000000}", 38); hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_GUID, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0); - todo_wine ok(hr == CO_E_CLASSSTRING, "got %08lx\n", hr); - todo_wine ok(dst_status == DBSTATUS_E_CANTCONVERTVALUE, "got %08lx\n", dst_status); - todo_wine ok(dst_len == sizeof(GUID), "got %Id\n", dst_len); SysFreeString(V_BSTR(&v)); }
From: Zhiyi Zhang zzhang@codeweavers.com
--- dlls/oledb32/tests/convert.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)
diff --git a/dlls/oledb32/tests/convert.c b/dlls/oledb32/tests/convert.c index aea2e40473c..d66141f6655 100644 --- a/dlls/oledb32/tests/convert.c +++ b/dlls/oledb32/tests/convert.c @@ -3943,6 +3943,21 @@ static void test_converttovar(void) ok(dst_status == DBSTATUS_S_ISNULL, "got %08lx\n", dst_status); ok(dst_len == sizeof(VARIANT), "got %Id\n", dst_len);
+ dst_len = 44; + V_VT(&var) = VT_UINT; + V_UINT(&var) = 1234; + hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_VARIANT, 0, &dst_len, &var, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0); + todo_wine + ok(hr == S_OK, "got %08lx\n", hr); + todo_wine + ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status); + todo_wine + ok(dst_len == sizeof(VARIANT), "got %Id\n", dst_len); + todo_wine + ok(V_VT(&dst) == VT_UINT, "got %d\n", V_VT(&dst)); + todo_wine + ok(V_UINT(&dst) == 1234, "got %u\n", V_UINT(&dst)); + VariantClear(&dst); }
static void test_converttotimestamp(void)
From: Zhiyi Zhang zzhang@codeweavers.com
--- dlls/oledb32/convert.c | 7 +++++++ dlls/oledb32/tests/convert.c | 5 ----- 2 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/dlls/oledb32/convert.c b/dlls/oledb32/convert.c index bb427e0cb54..1029dd0a0cf 100644 --- a/dlls/oledb32/convert.c +++ b/dlls/oledb32/convert.c @@ -1093,6 +1093,13 @@ static HRESULT WINAPI convert_DataConvert(IDataConvert* iface, hr = S_OK; break; } + case DBTYPE_VARIANT: + { + VariantInit(v); + VariantCopy(v, (VARIANT *)src); + hr = S_OK; + break; + } default: FIXME("Unimplemented conversion %04x -> VARIANT\n", src_type); return E_NOTIMPL; } break; diff --git a/dlls/oledb32/tests/convert.c b/dlls/oledb32/tests/convert.c index d66141f6655..fe34657b779 100644 --- a/dlls/oledb32/tests/convert.c +++ b/dlls/oledb32/tests/convert.c @@ -3947,15 +3947,10 @@ static void test_converttovar(void) V_VT(&var) = VT_UINT; V_UINT(&var) = 1234; hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_VARIANT, 0, &dst_len, &var, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0); - todo_wine ok(hr == S_OK, "got %08lx\n", hr); - todo_wine ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status); - todo_wine ok(dst_len == sizeof(VARIANT), "got %Id\n", dst_len); - todo_wine ok(V_VT(&dst) == VT_UINT, "got %d\n", V_VT(&dst)); - todo_wine ok(V_UINT(&dst) == 1234, "got %u\n", V_UINT(&dst)); VariantClear(&dst); }
You could use VariantCopy() return value here.