dlls/oledb32/convert.c | 231 +++++++++++++++++++++++++++++++++++++++++-
dlls/oledb32/tests/convert.c | 10 --
2 files changed, 228 insertions(+), 13 deletions(-)
diff --git a/dlls/oledb32/convert.c b/dlls/oledb32/convert.c
index 458abb5..a2385f0 100644
--- a/dlls/oledb32/convert.c
+++ b/dlls/oledb32/convert.c
@@ -126,13 +126,238 @@ static HRESULT WINAPI convert_DataConvert(IDataConvert* iface,
return E_NOTIMPL;
}
+static inline WORD get_dbtype_class(DBTYPE type)
+{
- switch(type)
- {
- case DBTYPE_I2:
- case DBTYPE_R4:
- case DBTYPE_R8:
- case DBTYPE_I1:
- case DBTYPE_UI1:
- case DBTYPE_UI2:
return DBTYPE_I2;
- case DBTYPE_I4:
- case DBTYPE_UI4:
return DBTYPE_I4;
- case DBTYPE_I8:
- case DBTYPE_UI8:
return DBTYPE_I8;
- case DBTYPE_BSTR:
- case DBTYPE_STR:
- case DBTYPE_WSTR:
return DBTYPE_BSTR;
- case DBTYPE_DBDATE:
- case DBTYPE_DBTIME:
- case DBTYPE_DBTIMESTAMP:
return DBTYPE_DBDATE;
- }
- return type;
+}
+/* Many src types will convert to this group of dst types */
+static inline BOOL common_class(WORD dst_class)
+{
- switch(dst_class)
- {
- case DBTYPE_EMPTY:
- case DBTYPE_NULL:
- case DBTYPE_I2:
- case DBTYPE_I4:
- case DBTYPE_BSTR:
- case DBTYPE_BOOL:
- case DBTYPE_VARIANT:
- case DBTYPE_I8:
- case DBTYPE_CY:
- case DBTYPE_DECIMAL:
- case DBTYPE_NUMERIC:
return TRUE;
- }
- return FALSE;
+}
+static inline BOOL array_type(DBTYPE type)
+{
- return (type >= DBTYPE_I2 && type <= DBTYPE_UI4);
+}
static HRESULT WINAPI convert_CanConvert(IDataConvert* iface,
{
convert *This = impl_from_IDataConvert(iface);
- FIXME("(%p)->(%d, %d): stub\n", This, wSrcType, wDstType);
- DBTYPE src_base_type = src_type & 0x1ff;
- DBTYPE dst_base_type = dst_type & 0x1ff;
- WORD dst_class = get_dbtype_class(dst_base_type);
- TRACE("(%p)->(%d, %d)\n", This, src_type, dst_type);
- if(src_type & DBTYPE_VECTOR || dst_type & DBTYPE_VECTOR) return S_FALSE;
I think this needs brackets...