Changeset 14361
- Timestamp:
- 04/24/08 00:02:09 (3 months ago)
- Files:
-
- branches/1.5/gdal/port/cpl_odbc.cpp (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/1.5/gdal/port/cpl_odbc.cpp
r12531 r14361 59 59 #endif /* ndef SQLColumns_TABLE_CAT */ 60 60 61 #ifdef _MSC_VER 62 #include "windows.h" 63 #endif 64 61 65 /************************************************************************/ 62 66 /* CPLODBCDriverInstaller() */ … … 464 468 m_papszColTypeNames[iCol] = CPLStrdup((const char*)szName); 465 469 470 // CPLDebug( "ODBC", "%s %s %d", m_papszColNames[iCol], 471 // szName, m_panColType[iCol] ); 466 472 } 467 473 … … 696 702 for( iCol = 0; iCol < m_nColCount; iCol++ ) 697 703 { 698 char szWrkData[51 2];704 char szWrkData[513]; 699 705 _SQLLEN cbDataLen; 700 706 SQLSMALLINT nFetchType = GetTypeMapping( m_panColType[iCol] ); 701 707 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 704 714 nFetchType = SQL_C_CHAR; 705 715 … … 734 744 if (nFetchType == SQL_C_CHAR) 735 745 while ((cbDataLen > 1) && (szWrkData[cbDataLen - 1] == 0)) 736 --cbDataLen; // trimming the extra terminators: bug 990746 --cbDataLen; // trimming the extra terminators: bug 990 737 747 } 738 748 … … 775 785 m_papszColValues[iCol] = (char *) 776 786 CPLRealloc( m_papszColValues[iCol], 777 m_panColValueLengths[iCol] + nChunkLen + 1);787 m_panColValueLengths[iCol] + nChunkLen + 2 ); 778 788 memcpy( m_papszColValues[iCol] + m_panColValueLengths[iCol], 779 789 szWrkData, nChunkLen ); 780 790 m_panColValueLengths[iCol] += nChunkLen; 781 791 m_papszColValues[iCol][m_panColValueLengths[iCol]] = '\0'; 792 m_papszColValues[iCol][m_panColValueLengths[iCol]+1] = '\0'; 782 793 } 783 794 } … … 785 796 { 786 797 m_panColValueLengths[iCol] = cbDataLen; 787 m_papszColValues[iCol] = (char *) CPLMalloc(cbDataLen+ 1);798 m_papszColValues[iCol] = (char *) CPLMalloc(cbDataLen+2); 788 799 memcpy( m_papszColValues[iCol], szWrkData, cbDataLen ); 789 800 m_papszColValues[iCol][cbDataLen] = '\0'; 801 m_papszColValues[iCol][cbDataLen+1] = '\0'; 790 802 } 791 803 … … 798 810 while ( iEnd > 0 && pszTarget[iEnd - 1] == ' ' ) 799 811 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 */ 800 847 } 801 848 } … … 1510 1557 case SQL_VARCHAR: 1511 1558 case SQL_LONGVARCHAR: 1559 return SQL_C_CHAR; 1560 1512 1561 case SQL_WCHAR: 1513 1562 case SQL_WVARCHAR: 1514 1563 case SQL_WLONGVARCHAR: 1515 return SQL_C_ CHAR;1564 return SQL_C_WCHAR; 1516 1565 1517 1566 case SQL_DECIMAL:
