diff --git a/src/core/qgsogrutils.cpp b/src/core/qgsogrutils.cpp index 962f63b3c2f..200fd5bfef6 100644 --- a/src/core/qgsogrutils.cpp +++ b/src/core/qgsogrutils.cpp @@ -184,6 +184,71 @@ QVariant QgsOgrUtils::OGRFieldtoVariant( const OGRField *value, OGRFieldType typ return QVariant(); } +std::unique_ptr< OGRField > QgsOgrUtils::variantToOGRField( const QVariant &value ) +{ + std::unique_ptr< OGRField > res = std::make_unique< OGRField >(); + + switch ( value.type() ) + { + case QVariant::Invalid: + OGR_RawField_SetUnset( res.get() ); + break; + case QVariant::Bool: + res->Integer = value.toBool() ? 1 : 0; + break; + case QVariant::Int: + res->Integer = value.toInt(); + break; + case QVariant::LongLong: + res->Integer64 = value.toLongLong(); + break; + case QVariant::Double: + res->Real = value.toDouble(); + break; + case QVariant::Char: + case QVariant::String: + res->String = CPLStrdup( value.toString().toUtf8().constData() ); + break; + case QVariant::Date: + { + const QDate date = value.toDate(); + res->Date.Day = date.day(); + res->Date.Month = date.month(); + res->Date.Year = date.year(); + res->Date.TZFlag = 0; + break; + } + case QVariant::Time: + { + const QTime time = value.toTime(); + res->Date.Hour = time.hour(); + res->Date.Minute = time.minute(); + res->Date.Second = time.second() + static_cast< double >( time.msec() ) / 1000; + res->Date.TZFlag = 0; + break; + } + case QVariant::DateTime: + { + const QDateTime dateTime = value.toDateTime(); + res->Date.Day = dateTime.date().day(); + res->Date.Month = dateTime.date().month(); + res->Date.Year = dateTime.date().year(); + res->Date.Hour = dateTime.time().hour(); + res->Date.Minute = dateTime.time().minute(); + res->Date.Second = dateTime.time().second() + static_cast< double >( dateTime.time().msec() ) / 1000; + res->Date.TZFlag = 0; + break; + } + + default: + QgsDebugMsg( "Unhandled variant type in variantToOGRField" ); + OGR_RawField_SetUnset( res.get() ); + break; + } + + return res; +} + QgsFeature QgsOgrUtils::readOgrFeature( OGRFeatureH ogrFet, const QgsFields &fields, QTextCodec *encoding ) { QgsFeature feature; diff --git a/src/core/qgsogrutils.h b/src/core/qgsogrutils.h index 3d13dfe84b4..40475c74bbd 100644 --- a/src/core/qgsogrutils.h +++ b/src/core/qgsogrutils.h @@ -173,6 +173,13 @@ class CORE_EXPORT QgsOgrUtils */ static QVariant OGRFieldtoVariant( const OGRField *value, OGRFieldType type ); + /** + * Converts a QVariant to an OGRField value. + * + * \since QGIS 3.26 + */ + static std::unique_ptr variantToOGRField( const QVariant &value ); + /** * Reads an OGR feature and converts it to a QgsFeature. * \param ogrFet OGR feature handle diff --git a/tests/src/core/testqgsogrutils.cpp b/tests/src/core/testqgsogrutils.cpp index 6179608a194..bef49079bc2 100644 --- a/tests/src/core/testqgsogrutils.cpp +++ b/tests/src/core/testqgsogrutils.cpp @@ -65,6 +65,7 @@ class TestQgsOgrUtils: public QObject void convertStyleString(); void ogrCrsConversion(); void ogrFieldToVariant(); + void variantToOgrField(); void testOgrFieldTypeToQVariantType_data(); void testOgrFieldTypeToQVariantType(); void testVariantTypeToOgrFieldType_data(); @@ -813,6 +814,31 @@ void TestQgsOgrUtils::ogrFieldToVariant() OGR_DS_Destroy( hDS ); } +void TestQgsOgrUtils::variantToOgrField() +{ + std::unique_ptr field( QgsOgrUtils::variantToOGRField( QVariant() ) ); + QCOMPARE( QgsOgrUtils::OGRFieldtoVariant( field.get(), OFTInteger ), QVariant() ); + + field = QgsOgrUtils::variantToOGRField( QVariant( true ) ); + QCOMPARE( QgsOgrUtils::OGRFieldtoVariant( field.get(), OFTInteger ), QVariant( 1 ) ); + field = QgsOgrUtils::variantToOGRField( QVariant( false ) ); + QCOMPARE( QgsOgrUtils::OGRFieldtoVariant( field.get(), OFTInteger ), QVariant( 0 ) ); + field = QgsOgrUtils::variantToOGRField( QVariant( 11 ) ); + QCOMPARE( QgsOgrUtils::OGRFieldtoVariant( field.get(), OFTInteger ), QVariant( 11 ) ); + field = QgsOgrUtils::variantToOGRField( QVariant( 11LL ) ); + QCOMPARE( QgsOgrUtils::OGRFieldtoVariant( field.get(), OFTInteger64 ), QVariant( 11LL ) ); + field = QgsOgrUtils::variantToOGRField( QVariant( 5.5 ) ); + QCOMPARE( QgsOgrUtils::OGRFieldtoVariant( field.get(), OFTReal ), QVariant( 5.5 ) ); + field = QgsOgrUtils::variantToOGRField( QVariant( QStringLiteral( "abc" ) ) ); + QCOMPARE( QgsOgrUtils::OGRFieldtoVariant( field.get(), OFTString ), QVariant( QStringLiteral( "abc" ) ) ); + field = QgsOgrUtils::variantToOGRField( QVariant( QDate( 2021, 2, 3 ) ) ); + QCOMPARE( QgsOgrUtils::OGRFieldtoVariant( field.get(), OFTDate ), QVariant( QDate( 2021, 2, 3 ) ) ); + field = QgsOgrUtils::variantToOGRField( QVariant( QTime( 12, 13, 14, 50 ) ) ); + QCOMPARE( QgsOgrUtils::OGRFieldtoVariant( field.get(), OFTTime ), QVariant( QTime( 12, 13, 14, 50 ) ) ); + field = QgsOgrUtils::variantToOGRField( QVariant( QDateTime( QDate( 2021, 2, 3 ), QTime( 12, 13, 14, 50 ) ) ) ); + QCOMPARE( QgsOgrUtils::OGRFieldtoVariant( field.get(), OFTDateTime ), QVariant( QDateTime( QDate( 2021, 2, 3 ), QTime( 12, 13, 14, 50 ) ) ) ); +} + void TestQgsOgrUtils::testOgrFieldTypeToQVariantType_data() { QTest::addColumn( "ogrType" );