Add method to convert QVariant to OGRField

This commit is contained in:
Nyall Dawson 2022-01-28 14:31:16 +10:00
parent eaba5b3efd
commit 44844bc736
3 changed files with 98 additions and 0 deletions

View File

@ -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;

View File

@ -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<OGRField> variantToOGRField( const QVariant &value );
/**
* Reads an OGR feature and converts it to a QgsFeature.
* \param ogrFet OGR feature handle

View File

@ -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<OGRField> 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<int>( "ogrType" );