OLEDB conversion for DBTYPE_I1, I8, UI2 and partial implementatin of GetConversionSize
Andreas Pflug
pflug at pse-consulting.de
Thu Nov 18 05:11:06 CST 2010
---
dlls/oledb32/convert.c | 139 ++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 139 insertions(+), 0 deletions(-)
diff --git a/dlls/oledb32/convert.c b/dlls/oledb32/convert.c
index b93118e..4b07154 100644
--- a/dlls/oledb32/convert.c
+++ b/dlls/oledb32/convert.c
@@ -216,6 +216,38 @@ static HRESULT WINAPI convert_DataConvert(IDataConvert* iface,
switch(dst_type)
{
+ case DBTYPE_I1:
+ {
+ signed char *d = dst;
+ VARIANT tmp;
+ switch(src_type)
+ {
+ case DBTYPE_EMPTY: *d = 0; hr = S_OK; break;
+ case DBTYPE_I1: *d = *(signed char*)src; hr = S_OK; break;
+ case DBTYPE_I2: hr = VarI1FromI2(*(signed char*)src, d); break;
+ case DBTYPE_I4: hr = VarI1FromI4(*(signed int*)src, d); break;
+ case DBTYPE_I8: hr = VarI1FromI8(*(LONGLONG*)src, d); break;
+ case DBTYPE_UI1: hr = VarI1FromUI1(*(BYTE*)src, d); break;
+ case DBTYPE_UI2: hr = VarI1FromUI2(*(WORD*)src, d); break;
+ case DBTYPE_UI4: hr = VarI1FromUI4(*(DWORD*)src, d); break;
+ case DBTYPE_UI8: hr = VarI1FromUI8(*(ULONGLONG*)src, d); break;
+ case DBTYPE_R4: hr = VarI1FromR4(*(FLOAT*)src, d); break;
+ case DBTYPE_R8: hr = VarI1FromR8(*(DOUBLE*)src, d); break;
+ case DBTYPE_CY: hr = VarI1FromCy(*(CY*)src, d); break;
+ case DBTYPE_DATE: hr = VarI1FromDate(*(DATE*)src, d); break;
+ case DBTYPE_BSTR: hr = VarI1FromStr(*(WCHAR**)src, LOCALE_USER_DEFAULT, 0, d); break;
+ case DBTYPE_BOOL: hr = VarI1FromBool(*(VARIANT_BOOL*)src, d); break;
+ case DBTYPE_DECIMAL: hr = VarI1FromDec((DECIMAL*)src, d); break;
+ case DBTYPE_VARIANT:
+ VariantInit(&tmp);
+ if ((hr = VariantChangeType(&tmp, (VARIANT*)src, 0, VT_I1)) == S_OK)
+ *d = V_I2(&tmp);
+ break;
+ default: FIXME("Unimplemented conversion %04x -> I1\n", src_type); return E_NOTIMPL;
+ }
+ break;
+ }
+
case DBTYPE_I2:
{
signed short *d = dst;
@@ -280,6 +312,38 @@ static HRESULT WINAPI convert_DataConvert(IDataConvert* iface,
break;
}
+ case DBTYPE_I8:
+ {
+ LONGLONG *d = dst;
+ VARIANT tmp;
+ switch(src_type)
+ {
+ case DBTYPE_EMPTY: *d = 0; hr = S_OK; break;
+ case DBTYPE_I1: hr = VarI8FromI1(*(signed char*)src, d); break;
+ case DBTYPE_I2: hr = VarI8FromI2(*(signed short*)src, d); break;
+ case DBTYPE_I4: *d = *(signed int*)src; hr = S_OK; break; /* no VarI8FromI4 */
+ case DBTYPE_I8: *d = *(LONGLONG*)src; hr = S_OK; break;
+ case DBTYPE_UI1: hr = VarI8FromUI1(*(BYTE*)src, d); break;
+ case DBTYPE_UI2: hr = VarI8FromUI2(*(WORD*)src, d); break;
+ case DBTYPE_UI4: hr = VarI8FromUI4(*(DWORD*)src, d); break;
+ case DBTYPE_UI8: hr = VarI8FromUI8(*(ULONGLONG*)src, d); break;
+ case DBTYPE_R4: hr = VarI8FromR4(*(FLOAT*)src, d); break;
+ case DBTYPE_R8: hr = VarI8FromR8(*(DOUBLE*)src, d); break;
+ case DBTYPE_CY: hr = VarI8FromCy(*(CY*)src, d); break;
+ case DBTYPE_DATE: hr = VarI8FromDate(*(DATE*)src, d); break;
+ case DBTYPE_BSTR: hr = VarI8FromStr(*(WCHAR**)src, LOCALE_USER_DEFAULT, 0, d); break;
+ case DBTYPE_BOOL: hr = VarI8FromBool(*(VARIANT_BOOL*)src, d); break;
+ case DBTYPE_DECIMAL: hr = VarI8FromDec((DECIMAL*)src, d); break;
+ case DBTYPE_VARIANT:
+ VariantInit(&tmp);
+ if ((hr = VariantChangeType(&tmp, (VARIANT*)src, 0, VT_I8)) == S_OK)
+ *d = V_I4(&tmp);
+ break;
+ default: FIXME("Unimplemented conversion %04x -> I8\n", src_type); return E_NOTIMPL;
+ }
+ break;
+ }
+
case DBTYPE_R4:
{
FLOAT *d = dst;
@@ -534,6 +598,32 @@ static HRESULT WINAPI convert_DataConvert(IDataConvert* iface,
break;
}
+ case DBTYPE_UI2:
+ {
+ WORD *d = dst;
+ switch(src_type)
+ {
+ case DBTYPE_EMPTY: *d = 0; hr = S_OK; break;
+ case DBTYPE_I1: hr = VarUI2FromI1(*(signed char*)src, d); break;
+ case DBTYPE_I2: hr = VarUI2FromI2(*(signed short*)src, d); break;
+ case DBTYPE_I4: hr = VarUI2FromI4(*(signed int*)src, d); break;
+ case DBTYPE_I8: hr = VarUI2FromI8(*(LONGLONG*)src, d); break;
+ case DBTYPE_UI1: hr = VarUI2FromUI1(*(BYTE*)src, d); break;
+ case DBTYPE_UI2: *d = *(WORD*)src; hr = S_OK; break;
+ case DBTYPE_UI4: hr = VarUI2FromUI4(*(DWORD*)src, d); break;
+ case DBTYPE_UI8: hr = VarUI2FromUI8(*(ULONGLONG*)src, d); break;
+ case DBTYPE_R4: hr = VarUI2FromR4(*(FLOAT*)src, d); break;
+ case DBTYPE_R8: hr = VarUI2FromR8(*(double*)src, d); break;
+ case DBTYPE_CY: hr = VarUI2FromCy(*(CY*)src, d); break;
+ case DBTYPE_DATE: hr = VarUI2FromDate(*(DATE*)src, d); break;
+ case DBTYPE_BSTR: hr = VarUI2FromStr(*(WCHAR**)src, LOCALE_USER_DEFAULT, 0, d); break;
+ case DBTYPE_BOOL: hr = VarUI2FromBool(*(VARIANT_BOOL*)src, d); break;
+ case DBTYPE_DECIMAL: hr = VarUI2FromDec((DECIMAL*)src, d); break;
+ default: FIXME("Unimplemented conversion %04x -> UI2\n", src_type); return E_NOTIMPL;
+ }
+ break;
+ }
+
case DBTYPE_UI4:
{
DWORD *d = dst;
@@ -966,6 +1056,55 @@ static HRESULT WINAPI convert_GetConversionSize(IDataConvert* iface,
void *pSrc)
{
convert *This = impl_from_IDataConvert(iface);
+
+ DBLENGTH len = 0;
+ switch(wDstType)
+ {
+ case DBTYPE_I1:
+ case DBTYPE_UI1:
+ *pcbDstLength = 1; return S_OK;
+ case DBTYPE_I2:
+ case DBTYPE_UI2:
+ *pcbDstLength = 2; return S_OK;
+ len=2; break;
+ case DBTYPE_BOOL:
+ *pcbDstLength = sizeof(VARIANT_BOOL); return S_OK;
+ case DBTYPE_I4:
+ case DBTYPE_UI4:
+ case DBTYPE_R4:
+ *pcbDstLength = 4; return S_OK;
+ return 4;
+ case DBTYPE_I8:
+ case DBTYPE_UI8:
+ case DBTYPE_R8:
+ case DBTYPE_DATE:
+ *pcbDstLength = 8; return S_OK;
+ return 8;
+ case DBTYPE_DBTIMESTAMP:
+ *pcbDstLength = sizeof(DBTIMESTAMP); return S_OK;
+ case DBTYPE_CY:
+ *pcbDstLength = sizeof(CY); return S_OK;
+ case DBTYPE_FILETIME:
+ *pcbDstLength = sizeof(FILETIME); return S_OK;
+ case DBTYPE_GUID:
+ *pcbDstLength = sizeof(GUID); return S_OK;
+ case DBTYPE_STR:
+ if (wSrcType == wDstType && pcbSrcLength)
+ {
+ /* add 1 byte for trailing zero */
+ *pcbDstLength = *pcbSrcLength + 1;
+ return S_OK;
+ }
+ break;
+ case DBTYPE_WSTR:
+ if (wSrcType == wDstType && pcbSrcLength)
+ {
+ /* add 2 bytes for trailing zero */
+ *pcbDstLength = *pcbSrcLength + 2;
+ return S_OK;
+ }
+ break;
+ }
FIXME("(%p)->(%d, %d, %p, %p, %p): stub\n", This, wSrcType, wDstType, pcbSrcLength, pcbDstLength, pSrc);
return E_NOTIMPL;
--
1.7.2.3
--------------030505070201000701020308
Content-Type: text/plain;
name="0003-GetConversionSize-sanity-check.txt"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename="0003-GetConversionSize-sanity-check.txt"
More information about the wine-patches
mailing list