Index: ogr/ogrsf_frmts/sde/ogrsdelayer.cpp =================================================================== --- ogr/ogrsf_frmts/sde/ogrsdelayer.cpp (revision 16528) +++ ogr/ogrsf_frmts/sde/ogrsdelayer.cpp (working copy) @@ -972,6 +972,27 @@ return OGRERR_FAILURE; } } + + else if( poFieldDefn->GetType() == OFTWideString ) + { + const int nstring_size = SE_QUALIFIED_COLUMN_LEN; + SE_WCHAR * pszTempStringUTF16 = (SE_WCHAR * ) CPLMalloc (nstring_size * sizeof(SE_WCHAR )); + std::string std_s = poField->String; + for (int i = 0; (i < std_s.size()) && (i < nstring_size); i++) { + pszTempStringUTF16[i] = std_s[i]; + } + + nSDEErr = SE_stream_set_nstring( hStream, iCurColNum++, pszTempStringUTF16 ); + CPLFree( pszTempStringUTF16 ); + if( nSDEErr != SE_SUCCESS ) + { + poDS->IssueSDEError( nSDEErr, "SE_stream_set_nstring" ); + CSLDestroy( papszInsertCols ); + CPLFree( paiColToDefMap ); + return OGRERR_FAILURE; + } + + } else if( poFieldDefn->GetType() == OFTDate || poFieldDefn->GetType() == OFTDateTime ) @@ -1782,12 +1803,42 @@ else if( nSDEErr != SE_NULL_VALUE ) { poDS->IssueSDEError( nSDEErr, "SE_stream_get_string" ); + CPLFree( pszTempString ); return NULL; } CPLFree( pszTempString ); } break; + case SE_NSTRING_TYPE: + { + const int nstring_size = SE_QUALIFIED_COLUMN_LEN; + SE_WCHAR * pszTempStringUTF16 = (SE_WCHAR * ) CPLMalloc (nstring_size * sizeof(SE_WCHAR )); + + nSDEErr = SE_stream_get_nstring( hStream, anFieldMap[i]+1, pszTempStringUTF16 ); + + if( nSDEErr == SE_SUCCESS ) { + int field_width = poFieldDef->GetWidth() +1; + std::string field_value; + for (int c = 0; c < nstring_size; c++) { + char c_char = pszTempStringUTF16[c]; + + field_value += c_char; + if (c_char == '\0') + break; + + } + poFeat->SetField( i, field_value.c_str()); + } else if( nSDEErr != SE_NULL_VALUE ) + { + poDS->IssueSDEError( nSDEErr, "SE_stream_get_nstring" ); + CPLFree( pszTempStringUTF16); + + return NULL; + } + CPLFree( pszTempStringUTF16); + } + break; #ifdef SE_UUID_TYPE case SE_UUID_TYPE: @@ -2198,6 +2249,10 @@ else if( oField.GetType() == OFTString ) sColumnDef.sde_type = SE_STRING_TYPE; + else if( oField.GetType() == OFTWideString ) + sColumnDef.sde_type = SE_NSTRING_TYPE; + + else if( oField.GetType() == OFTDate || oField.GetType() == OFTTime || oField.GetType() == OFTDateTime Index: ogr/ogrfeature.cpp =================================================================== --- ogr/ogrfeature.cpp (revision 16528) +++ ogr/ogrfeature.cpp (working copy) @@ -128,6 +128,12 @@ VSIFree( pauFields[i].String ); break; + case OFTWideString: + if( pauFields[i].String != NULL ) + VSIFree( pauFields[i].String ); + break; + + case OFTBinary: if( pauFields[i].Binary.paData != NULL ) VSIFree( pauFields[i].Binary.paData ); @@ -710,6 +716,10 @@ CPLFree( pauFields[iField].String ); break; + case OFTWideString: + CPLFree( pauFields[iField].String ); + break; + case OFTBinary: CPLFree( pauFields[iField].Binary.paData ); break; @@ -837,7 +847,15 @@ return 0; else return atoi(pauFields[iField].String); + } else if( poFDefn->GetType() == OFTWideString ) + { + if( pauFields[iField].String == NULL ) + return 0; + else + return atoi(pauFields[iField].String); } + + else return 0; } @@ -923,6 +941,15 @@ else return atof(pauFields[iField].String); } + else if( poFDefn->GetType() == OFTWideString ) + { + if( pauFields[iField].String == NULL ) + return 0; + else + return atof(pauFields[iField].String); + } + + else return 0.0; } @@ -1028,8 +1055,9 @@ if( !IsFieldSet(iField) ) return ""; - - if( poFDefn->GetType() == OFTString ) + + + if(( poFDefn->GetType() == OFTString) || (poFDefn->GetType() == OFTWideString)) { if( pauFields[iField].String == NULL ) return ""; @@ -1697,7 +1725,7 @@ { pauFields[iField].Real = nValue; } - else if( poFDefn->GetType() == OFTString ) + else if( (poFDefn->GetType() == OFTString) || (poFDefn->GetType() == OFTWideString)) { char szTempBuffer[64]; @@ -1708,6 +1736,8 @@ pauFields[iField].String = CPLStrdup( szTempBuffer ); } + + else /* do nothing for other field types */; } @@ -1775,7 +1805,7 @@ pauFields[iField].Integer = (int) dfValue; pauFields[iField].Set.nMarker2 = 0; } - else if( poFDefn->GetType() == OFTString ) + else if( (poFDefn->GetType() == OFTString) || (poFDefn->GetType() == OFTWideString )) { char szTempBuffer[128]; @@ -1850,6 +1880,13 @@ pauFields[iField].String = CPLStrdup( pszValue ); } + else if( poFDefn->GetType() == OFTWideString ) + { + if( IsFieldSet(iField) ) + CPLFree( pauFields[iField].String ); + + pauFields[iField].String = CPLStrdup( pszValue ); + } else if( poFDefn->GetType() == OFTInteger ) { pauFields[iField].Integer = atoi(pszValue); @@ -2726,6 +2763,10 @@ SetField( iDstField, poSrcFeature->GetFieldAsString( iField ) ); break; + case OFTWideString: + SetField( iDstField, poSrcFeature->GetFieldAsString( iField ) ); + break; + case OFTDate: case OFTDateTime: case OFTTime: