QgsFields QgsOgrUtils::stringToFields( const QString& string, QTextCodec* encoding ) { QgsFields fields; if ( string.isEmpty() ) return fields; QString randomFileName = QString( "/vsimem/%1" ).arg( QUuid::createUuid().toString() ); // create memory file system object from buffer QByteArray ba = string.toUtf8(); VSIFCloseL( VSIFileFromMemBuffer( TO8( randomFileName ), reinterpret_cast< GByte* >( ba.data() ), static_cast< vsi_l_offset >( ba.size() ), FALSE ) ); OGRDataSourceH hDS = OGROpen( TO8( randomFileName ), false, nullptr ); if ( !hDS ) { VSIUnlink( TO8( randomFileName ) ); return fields; } OGRLayerH ogrLayer = OGR_DS_GetLayer( hDS, 0 ); if ( !ogrLayer ) { OGR_DS_Destroy( hDS ); VSIUnlink( TO8( randomFileName ) ); return fields; } OGRFeatureH oFeat; //read in the first feature only if (( oFeat = OGR_L_GetNextFeature( ogrLayer ) ) ) { fields = readOgrFields( oFeat, encoding ); OGR_F_Destroy( oFeat ); } OGR_DS_Destroy( hDS ); VSIUnlink( TO8( randomFileName ) ); return fields; }
QgsFields QgsOgrUtils::stringToFields( const QString &string, QTextCodec *encoding ) { QgsFields fields; if ( string.isEmpty() ) return fields; QString randomFileName = QStringLiteral( "/vsimem/%1" ).arg( QUuid::createUuid().toString() ); // create memory file system object from buffer QByteArray ba = string.toUtf8(); VSIFCloseL( VSIFileFromMemBuffer( randomFileName.toUtf8().constData(), reinterpret_cast< GByte * >( ba.data() ), static_cast< vsi_l_offset >( ba.size() ), FALSE ) ); gdal::ogr_datasource_unique_ptr hDS( OGROpen( randomFileName.toUtf8().constData(), false, nullptr ) ); if ( !hDS ) { VSIUnlink( randomFileName.toUtf8().constData() ); return fields; } OGRLayerH ogrLayer = OGR_DS_GetLayer( hDS.get(), 0 ); if ( !ogrLayer ) { hDS.reset(); VSIUnlink( randomFileName.toUtf8().constData() ); return fields; } gdal::ogr_feature_unique_ptr oFeat; //read in the first feature only if ( oFeat.reset( OGR_L_GetNextFeature( ogrLayer ) ), oFeat ) { fields = readOgrFields( oFeat.get(), encoding ); } hDS.reset(); VSIUnlink( randomFileName.toUtf8().constData() ); return fields; }