Skip to content

Commit a3e527d

Browse files
committedJun 1, 2018
[OGR provider] Advertize correct supported data types, length and with for GPKG; and advertize Date, Time, DateTime based on driver capabilities
1 parent bad1ab4 commit a3e527d

File tree

1 file changed

+52
-12
lines changed

1 file changed

+52
-12
lines changed
 

‎src/providers/ogr/qgsogrprovider.cpp

Lines changed: 52 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -449,20 +449,60 @@ QgsOgrProvider::QgsOgrProvider( QString const &uri, const ProviderOptions &optio
449449
450450
open( OpenModeInitial );
451451
452+
int nMaxIntLen = 11;
453+
int nMaxInt64Len = 21;
454+
int nMaxDoubleLen = 20;
455+
int nMaxDoublePrec = 15;
456+
int nDateLen = 8;
457+
if ( mGDALDriverName == QLatin1String( "GPKG" ) )
458+
{
459+
// GPKG only supports field length for text (and binary)
460+
nMaxIntLen = 0;
461+
nMaxInt64Len = 0;
462+
nMaxDoubleLen = 0;
463+
nMaxDoublePrec = 0;
464+
nDateLen = 0;
465+
}
466+
452467
QList<NativeType> nativeTypes;
453468
nativeTypes
454-
<< QgsVectorDataProvider::NativeType( tr( "Whole number (integer)" ), QStringLiteral( "integer" ), QVariant::Int, 0, 11 )
455-
<< QgsVectorDataProvider::NativeType( tr( "Whole number (integer 64 bit)" ), QStringLiteral( "integer64" ), QVariant::LongLong, 0, 21 )
456-
<< QgsVectorDataProvider::NativeType( tr( "Decimal number (real)" ), QStringLiteral( "double" ), QVariant::Double, 0, 20, 0, 15 )
457-
<< QgsVectorDataProvider::NativeType( tr( "Text (string)" ), QStringLiteral( "string" ), QVariant::String, 0, 65535 )
458-
<< QgsVectorDataProvider::NativeType( tr( "Date" ), QStringLiteral( "date" ), QVariant::Date, 8, 8 );
469+
<< QgsVectorDataProvider::NativeType( tr( "Whole number (integer)" ), QStringLiteral( "integer" ), QVariant::Int, 0, nMaxIntLen )
470+
<< QgsVectorDataProvider::NativeType( tr( "Whole number (integer 64 bit)" ), QStringLiteral( "integer64" ), QVariant::LongLong, 0, nMaxInt64Len )
471+
<< QgsVectorDataProvider::NativeType( tr( "Decimal number (real)" ), QStringLiteral( "double" ), QVariant::Double, 0, nMaxDoubleLen, 0, nMaxDoublePrec )
472+
<< QgsVectorDataProvider::NativeType( tr( "Text (string)" ), QStringLiteral( "string" ), QVariant::String, 0, 65535 );
473+
474+
bool supportsDate = true;
475+
bool supportsTime = mGDALDriverName != QLatin1String( "ESRI Shapefile" ) && mGDALDriverName != QLatin1String( "GPKG" );
476+
bool supportsDateTime = mGDALDriverName != QLatin1String( "ESRI Shapefile" );
477+
const char *pszDataTypes = nullptr;
478+
if ( mOgrOrigLayer )
479+
{
480+
pszDataTypes = GDALGetMetadataItem( mOgrOrigLayer->driver(), GDAL_DMD_CREATIONFIELDDATATYPES, nullptr );
481+
}
482+
// For drivers that advertize their data type, use that instead of the
483+
// above hardcoded defaults.
484+
if ( pszDataTypes )
485+
{
486+
char **papszTokens = CSLTokenizeString2( pszDataTypes, " ", 0 );
487+
supportsDate = CSLFindString( papszTokens, "Date" ) >= 0;
488+
supportsTime = CSLFindString( papszTokens, "Time" ) >= 0;
489+
supportsDateTime = CSLFindString( papszTokens, "DateTime" ) >= 0;
490+
CSLDestroy( papszTokens );
491+
}
459492

460-
// Some drivers do not support datetime type
461-
// Please help to fill this list
462-
if ( mGDALDriverName != QLatin1String( "ESRI Shapefile" ) )
493+
if ( supportsDate )
494+
{
495+
nativeTypes
496+
<< QgsVectorDataProvider::NativeType( tr( "Date" ), QStringLiteral( "date" ), QVariant::Date, nDateLen, nDateLen );
497+
}
498+
if ( supportsTime )
499+
{
500+
nativeTypes
501+
<< QgsVectorDataProvider::NativeType( tr( "Time" ), QStringLiteral( "time" ), QVariant::Time );
502+
}
503+
if ( supportsDateTime )
463504
{
464505
nativeTypes
465-
<< QgsVectorDataProvider::NativeType( tr( "Time" ), QStringLiteral( "time" ), QVariant::Time, -1, -1 )
466506
<< QgsVectorDataProvider::NativeType( tr( "Date & Time" ), QStringLiteral( "datetime" ), QVariant::DateTime );
467507
}
468508

@@ -471,8 +511,8 @@ QgsOgrProvider::QgsOgrProvider( QString const &uri, const ProviderOptions &optio
471511
#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(2,3,0)
472512
if ( mOgrOrigLayer )
473513
{
474-
const char *pszDataTypes = GDALGetMetadataItem( mOgrOrigLayer->driver(), GDAL_DMD_CREATIONFIELDDATASUBTYPES, nullptr );
475-
if ( pszDataTypes && strstr( pszDataTypes, "Boolean" ) )
514+
const char *pszDataSubTypes = GDALGetMetadataItem( mOgrOrigLayer->driver(), GDAL_DMD_CREATIONFIELDDATASUBTYPES, nullptr );
515+
if ( pszDataSubTypes && strstr( pszDataSubTypes, "Boolean" ) )
476516
supportsBoolean = true;
477517
}
478518
#else
@@ -492,7 +532,7 @@ QgsOgrProvider::QgsOgrProvider( QString const &uri, const ProviderOptions &optio
492532
{
493533
// boolean data type
494534
nativeTypes
495-
<< QgsVectorDataProvider::NativeType( tr( "Boolean" ), QStringLiteral( "bool" ), QVariant::Bool, -1, -1, -1, -1 );
535+
<< QgsVectorDataProvider::NativeType( tr( "Boolean" ), QStringLiteral( "bool" ), QVariant::Bool );
496536
}
497537

498538
setNativeTypes( nativeTypes );

0 commit comments

Comments
 (0)