Changeset 14361

Show
Ignore:
Timestamp:
04/24/08 00:02:09 (3 months ago)
Author:
warmerdam
Message:

preliminary MSVC only solution for widechar text to utf-8 (#2339)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/1.5/gdal/port/cpl_odbc.cpp

    r12531 r14361  
    5959#endif /* ndef SQLColumns_TABLE_CAT */ 
    6060 
     61#ifdef _MSC_VER 
     62#include "windows.h" 
     63#endif 
     64 
    6165/************************************************************************/ 
    6266/*                           CPLODBCDriverInstaller()                   */ 
     
    464468        m_papszColTypeNames[iCol] = CPLStrdup((const char*)szName); 
    465469 
     470//        CPLDebug( "ODBC", "%s %s %d", m_papszColNames[iCol],  
     471//                  szName, m_panColType[iCol] ); 
    466472    } 
    467473 
     
    696702    for( iCol = 0; iCol < m_nColCount; iCol++ ) 
    697703    { 
    698         char szWrkData[512]; 
     704        char szWrkData[513]; 
    699705        _SQLLEN cbDataLen; 
    700706        SQLSMALLINT nFetchType = GetTypeMapping( m_panColType[iCol] ); 
    701707 
    702         // For now we will fetch data in binary and string formats only 
    703         if ( nFetchType != SQL_C_BINARY ) 
     708        // Handle values other than WCHAR and BINARY as CHAR. 
     709#ifdef _MSC_VER 
     710        if( nFetchType != SQL_C_BINARY && nFetchType != SQL_C_WCHAR ) 
     711#else 
     712        if( nFetchType != SQL_C_BINARY ) 
     713#endif 
    704714            nFetchType = SQL_C_CHAR; 
    705715 
     
    734744                if (nFetchType == SQL_C_CHAR)  
    735745                    while ((cbDataLen > 1) && (szWrkData[cbDataLen - 1] == 0))  
    736                         --cbDataLen; // trimming the extra terminators: bug 990 
     746                        --cbDataLen; // trimming the extra terminators: bug 990 
    737747            } 
    738748                         
     
    775785                m_papszColValues[iCol] = (char *)  
    776786                    CPLRealloc( m_papszColValues[iCol],  
    777                                 m_panColValueLengths[iCol] + nChunkLen + 1 ); 
     787                                m_panColValueLengths[iCol] + nChunkLen + 2 ); 
    778788                memcpy( m_papszColValues[iCol] + m_panColValueLengths[iCol],  
    779789                        szWrkData, nChunkLen ); 
    780790                m_panColValueLengths[iCol] += nChunkLen; 
    781791                m_papszColValues[iCol][m_panColValueLengths[iCol]] = '\0'; 
     792                m_papszColValues[iCol][m_panColValueLengths[iCol]+1] = '\0'; 
    782793            } 
    783794        } 
     
    785796        { 
    786797            m_panColValueLengths[iCol] = cbDataLen; 
    787             m_papszColValues[iCol] = (char *) CPLMalloc(cbDataLen+1); 
     798            m_papszColValues[iCol] = (char *) CPLMalloc(cbDataLen+2); 
    788799            memcpy( m_papszColValues[iCol], szWrkData, cbDataLen ); 
    789800            m_papszColValues[iCol][cbDataLen] = '\0'; 
     801            m_papszColValues[iCol][cbDataLen+1] = '\0'; 
    790802        } 
    791803 
     
    798810            while ( iEnd > 0 && pszTarget[iEnd - 1] == ' ' ) 
    799811                pszTarget[--iEnd] = '\0'; 
     812        } 
     813 
     814        // Convert WCHAR to UTF-8, assuming the WCHAR is UCS-2. 
     815        if( nFetchType == SQL_C_WCHAR && m_papszColValues[iCol] != NULL  
     816            && m_panColValueLengths[iCol] > 0 ) 
     817        { 
     818#ifdef _MSC_VER 
     819            wchar_t *pwszSrc = (wchar_t *) m_papszColValues[iCol]; 
     820            int  nMaxChars = m_panColValueLengths[iCol]+1; 
     821            size_t nOutChars; 
     822 
     823            m_papszColValues[iCol] = (char *) CPLMalloc( nMaxChars ); 
     824 
     825            nOutChars = WideCharToMultiByte( CP_UTF8, 0, pwszSrc, -1, 
     826                                             m_papszColValues[iCol], nMaxChars, 
     827                                             NULL, NULL ); 
     828            if( nOutChars == ((size_t) -1) || nOutChars == 0 ) 
     829            { 
     830                CPLDebug( "ODBC",  
     831                          "WideCharToMultiByte(%S/%d) failed!: %d / %s",  
     832                          pwszSrc, 
     833                          m_panColValueLengths[iCol] / 2, 
     834                          (int) nOutChars,  
     835                          m_papszColValues[iCol] ); 
     836 
     837                CPLFree( m_papszColValues[iCol] ); 
     838                m_papszColValues[iCol] = NULL; 
     839                m_panColValueLengths[iCol] = 0; 
     840            } 
     841            else 
     842                m_panColValueLengths[iCol] = nOutChars; 
     843 
     844            CPLFree( pwszSrc ); 
     845 
     846#endif /* def _MSC_VER */ 
    800847        } 
    801848    } 
     
    15101557        case SQL_VARCHAR: 
    15111558        case SQL_LONGVARCHAR: 
     1559            return SQL_C_CHAR; 
     1560 
    15121561        case SQL_WCHAR: 
    15131562        case SQL_WVARCHAR: 
    15141563        case SQL_WLONGVARCHAR: 
    1515             return SQL_C_CHAR; 
     1564            return SQL_C_WCHAR; 
    15161565 
    15171566        case SQL_DECIMAL: