@@ -449,20 +449,60 @@ QgsOgrProvider::QgsOgrProvider( QString const &uri, const ProviderOptions &optio
449
449
450
450
open( OpenModeInitial );
451
451
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
+
452
467
QList<NativeType> nativeTypes;
453
468
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
+ }
459
492
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 )
463
504
{
464
505
nativeTypes
465
- << QgsVectorDataProvider::NativeType ( tr ( " Time" ), QStringLiteral ( " time" ), QVariant::Time, -1 , -1 )
466
506
<< QgsVectorDataProvider::NativeType ( tr ( " Date & Time" ), QStringLiteral ( " datetime" ), QVariant::DateTime );
467
507
}
468
508
@@ -471,8 +511,8 @@ QgsOgrProvider::QgsOgrProvider( QString const &uri, const ProviderOptions &optio
471
511
#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(2,3,0)
472
512
if ( mOgrOrigLayer )
473
513
{
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" ) )
476
516
supportsBoolean = true ;
477
517
}
478
518
#else
@@ -492,7 +532,7 @@ QgsOgrProvider::QgsOgrProvider( QString const &uri, const ProviderOptions &optio
492
532
{
493
533
// boolean data type
494
534
nativeTypes
495
- << QgsVectorDataProvider::NativeType ( tr ( " Boolean" ), QStringLiteral ( " bool" ), QVariant::Bool, - 1 , - 1 , - 1 , - 1 );
535
+ << QgsVectorDataProvider::NativeType ( tr ( " Boolean" ), QStringLiteral ( " bool" ), QVariant::Bool );
496
536
}
497
537
498
538
setNativeTypes ( nativeTypes );
0 commit comments