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