Commit 0edd515b authored by Alistair Leslie-Hughes's avatar Alistair Leslie-Hughes Committed by Alexandre Julliard

oledb32: Support VT_NULL on all conversions.

parent 39d2ce59
...@@ -183,6 +183,15 @@ static HRESULT WINAPI convert_DataConvert(IDataConvert* iface, ...@@ -183,6 +183,15 @@ static HRESULT WINAPI convert_DataConvert(IDataConvert* iface,
return S_OK; return S_OK;
} }
if(src_type == DBTYPE_VARIANT && V_VT((VARIANT*)src) == VT_NULL)
{
if(dst_type == DBTYPE_VARIANT)
*dst_len = sizeof(VARIANT);
*dst_status = DBSTATUS_S_ISNULL;
return S_OK;
}
if(IDataConvert_CanConvert(iface, src_type, dst_type) != S_OK) if(IDataConvert_CanConvert(iface, src_type, dst_type) != S_OK)
{ {
return DB_E_UNSUPPORTEDCONVERSION; return DB_E_UNSUPPORTEDCONVERSION;
...@@ -631,18 +640,9 @@ static HRESULT WINAPI convert_DataConvert(IDataConvert* iface, ...@@ -631,18 +640,9 @@ static HRESULT WINAPI convert_DataConvert(IDataConvert* iface,
} }
break; break;
case DBTYPE_VARIANT: case DBTYPE_VARIANT:
if(V_VT((VARIANT*)src) == VT_NULL) VariantInit(&tmp);
{ if ((hr = VariantChangeType(&tmp, (VARIANT*)src, 0, VT_BSTR)) == S_OK)
*dst_status = DBSTATUS_S_ISNULL; *d = V_BSTR(&tmp);
*dst_len = get_length(DBTYPE_BSTR);
return S_OK;
}
else
{
VariantInit(&tmp);
if ((hr = VariantChangeType(&tmp, (VARIANT*)src, 0, VT_BSTR)) == S_OK)
*d = V_BSTR(&tmp);
}
break; break;
default: FIXME("Unimplemented conversion %04x -> BSTR\n", src_type); return E_NOTIMPL; default: FIXME("Unimplemented conversion %04x -> BSTR\n", src_type); return E_NOTIMPL;
} }
...@@ -1000,44 +1000,35 @@ static HRESULT WINAPI convert_DataConvert(IDataConvert* iface, ...@@ -1000,44 +1000,35 @@ static HRESULT WINAPI convert_DataConvert(IDataConvert* iface,
return S_OK; return S_OK;
case DBTYPE_VARIANT: case DBTYPE_VARIANT:
{ {
if(V_VT((VARIANT*)src) == VT_NULL) switch(V_VT((VARIANT*)src))
{ {
*dst_status = DBSTATUS_S_ISNULL; case VT_UI1 | VT_ARRAY:
*dst_len = 0;
return S_OK;
}
else
{ {
switch(V_VT((VARIANT*)src)) LONG l;
{ BYTE *data = NULL;
case VT_UI1 | VT_ARRAY:
{
LONG l;
BYTE *data = NULL;
hr = SafeArrayGetUBound(V_ARRAY((VARIANT*)src), 1, &l); hr = SafeArrayGetUBound(V_ARRAY((VARIANT*)src), 1, &l);
if(FAILED(hr)) if(FAILED(hr))
return hr; return hr;
hr = SafeArrayAccessData(V_ARRAY((VARIANT*)src), (VOID**)&data); hr = SafeArrayAccessData(V_ARRAY((VARIANT*)src), (VOID**)&data);
if(FAILED(hr)) if(FAILED(hr))
{ {
ERR("SafeArrayAccessData Failed = 0x%08x\n", hr); ERR("SafeArrayAccessData Failed = 0x%08x\n", hr);
return hr; return hr;
} }
*dst_len = l+1; *dst_len = l+1;
*dst_status = DBSTATUS_S_OK; *dst_status = DBSTATUS_S_OK;
memcpy(d, data, *dst_len); memcpy(d, data, *dst_len);
SafeArrayUnaccessData(V_ARRAY((VARIANT*)src)); SafeArrayUnaccessData(V_ARRAY((VARIANT*)src));
return S_OK; return S_OK;
} }
break; break;
default: default:
FIXME("Unimplemented variant type %d -> BYTES\n", V_VT((VARIANT*)src)); FIXME("Unimplemented variant type %d -> BYTES\n", V_VT((VARIANT*)src));
return E_NOTIMPL; return E_NOTIMPL;
}
} }
} }
break; break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment