oledb32: Implement CanConvert.

Marcus Meissner meissner at suse.de
Mon Sep 21 08:36:21 CDT 2009


On Mon, Sep 21, 2009 at 01:50:51PM +0100, Huw Davies wrote:
> ---
>  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,
> -                                         DBTYPE wSrcType, DBTYPE wDstType)
> +                                         DBTYPE src_type, DBTYPE dst_type)
>  {
>      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);
>  
> -    return E_NOTIMPL;
> +    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...

Ciao, Marcus



More information about the wine-devel mailing list