@@ -582,7 +582,7 @@ QgsSpatiaLiteProvider::QgsSpatiaLiteProvider( QString const &uri )
582
582
return ;
583
583
}
584
584
585
- if ( mTableBased && hasRowid () )
585
+ if ( mTableBased && hasRowid () && mPrimaryKey . isEmpty () )
586
586
{
587
587
mPrimaryKey = QStringLiteral ( " ROWID" );
588
588
}
@@ -860,39 +860,65 @@ void QgsSpatiaLiteProvider::fetchConstraints()
860
860
861
861
Q_FOREACH ( int fieldIdx, mPrimaryKeyAttrs )
862
862
{
863
- // primary keys are unique, not null
864
863
QgsFieldConstraints constraints = mAttributeFields .at ( fieldIdx ).constraints ();
865
864
constraints.setConstraint ( QgsFieldConstraints::ConstraintUnique, QgsFieldConstraints::ConstraintOriginProvider );
866
865
constraints.setConstraint ( QgsFieldConstraints::ConstraintNotNull, QgsFieldConstraints::ConstraintOriginProvider );
867
866
mAttributeFields [ fieldIdx ].setConstraints ( constraints );
867
+
868
+ if ( mAttributeFields [ fieldIdx ].name () == mPrimaryKey )
869
+ {
870
+ QString sql = QStringLiteral ( " SELECT sql FROM sqlite_master WHERE tbl_name=%1" ).arg ( quotedIdentifier ( mTableName ) );
871
+ int ret = sqlite3_get_table ( mSqliteHandle , sql.toUtf8 ().constData (), &results, &rows, &columns, &errMsg );
872
+ if ( ret != SQLITE_OK )
873
+ {
874
+ handleError ( sql, errMsg );
875
+ return ;
876
+ }
877
+
878
+ if ( rows >= 1 )
879
+ {
880
+ QString tableSql = QString::fromUtf8 ( results[ 1 ] );
881
+ QRegularExpression rx ( QStringLiteral ( " [(,]\\ s*%1\\ s+INTEGER PRIMARY KEY AUTOINCREMENT" ).arg ( mPrimaryKey ), QRegularExpression::CaseInsensitiveOption );
882
+ if ( tableSql.contains ( rx ) )
883
+ {
884
+ mPrimaryKeyAutoIncrement = true ;
885
+ insertDefaultValue ( fieldIdx, tr ( " Autogenerate" ) );
886
+ }
887
+ }
888
+ sqlite3_free_table ( results );
889
+ }
868
890
}
869
891
}
870
892
871
893
void QgsSpatiaLiteProvider::insertDefaultValue ( int fieldIndex, QString defaultVal )
872
894
{
873
895
if ( !defaultVal.isEmpty () )
874
896
{
875
- QVariant defaultVariant;
876
- switch ( mAttributeFields .at ( fieldIndex ).type () )
897
+ QVariant defaultVariant = defaultVal;
898
+
899
+ if ( mAttributeFields .at ( fieldIndex ).name () != mPrimaryKey || ( mAttributeFields .at ( fieldIndex ).name () == mPrimaryKey && !mPrimaryKeyAutoIncrement ) )
877
900
{
878
- case QVariant::LongLong:
879
- defaultVariant = defaultVal.toLongLong ();
880
- break ;
901
+ switch ( mAttributeFields .at ( fieldIndex ).type () )
902
+ {
903
+ case QVariant::LongLong:
904
+ defaultVariant = defaultVal.toLongLong ();
905
+ break ;
881
906
882
- case QVariant::Double:
883
- defaultVariant = defaultVal.toDouble ();
884
- break ;
907
+ case QVariant::Double:
908
+ defaultVariant = defaultVal.toDouble ();
909
+ break ;
885
910
886
- default :
887
- {
888
- if ( defaultVal.startsWith ( ' \' ' ) )
889
- defaultVal = defaultVal.remove ( 0 , 1 );
890
- if ( defaultVal.endsWith ( ' \' ' ) )
891
- defaultVal.chop ( 1 );
892
- defaultVal.replace ( QLatin1String ( " ''" ), QLatin1String ( " '" ) );
911
+ default :
912
+ {
913
+ if ( defaultVal.startsWith ( ' \' ' ) )
914
+ defaultVal = defaultVal.remove ( 0 , 1 );
915
+ if ( defaultVal.endsWith ( ' \' ' ) )
916
+ defaultVal.chop ( 1 );
917
+ defaultVal.replace ( QLatin1String ( " ''" ), QLatin1String ( " '" ) );
893
918
894
- defaultVariant = defaultVal;
895
- break ;
919
+ defaultVariant = defaultVal;
920
+ break ;
921
+ }
896
922
}
897
923
}
898
924
mDefaultValues .insert ( fieldIndex, defaultVariant );
@@ -978,6 +1004,12 @@ void QgsSpatiaLiteProvider::loadFields()
978
1004
}
979
1005
sqlite3_free_table ( results );
980
1006
1007
+ if ( pkCount == 1 )
1008
+ {
1009
+ // setting the Primary Key column name
1010
+ mPrimaryKey = pkName;
1011
+ }
1012
+
981
1013
// check for constraints
982
1014
fetchConstraints ();
983
1015
@@ -986,7 +1018,6 @@ void QgsSpatiaLiteProvider::loadFields()
986
1018
{
987
1019
determineViewPrimaryKey ();
988
1020
}
989
-
990
1021
}
991
1022
else
992
1023
{
@@ -1037,12 +1068,12 @@ void QgsSpatiaLiteProvider::loadFields()
1037
1068
}
1038
1069
}
1039
1070
sqlite3_finalize ( stmt );
1040
- }
1041
1071
1042
- if ( pkCount == 1 )
1043
- {
1044
- // setting the Primary Key column name
1045
- mPrimaryKey = pkName;
1072
+ if ( pkCount == 1 )
1073
+ {
1074
+ // setting the Primary Key column name
1075
+ mPrimaryKey = pkName;
1076
+ }
1046
1077
}
1047
1078
1048
1079
updatePrimaryKeyCapabilities ();
@@ -3932,6 +3963,11 @@ bool QgsSpatiaLiteProvider::addFeatures( QgsFeatureList &flist, Flags flags )
3932
3963
{
3933
3964
++ia;
3934
3965
}
3966
+ else if ( fieldname == mPrimaryKey && mPrimaryKeyAutoIncrement && v == QVariant ( tr ( " Autogenerate" ) ) )
3967
+ {
3968
+ // use auto-generated value if user hasn't specified a unique value
3969
+ ++ia;
3970
+ }
3935
3971
else if ( v.isNull () )
3936
3972
{
3937
3973
// binding a NULL value
@@ -4379,6 +4415,20 @@ QVariant QgsSpatiaLiteProvider::defaultValue( int fieldId ) const
4379
4415
return mDefaultValues .value ( fieldId, QVariant () );
4380
4416
}
4381
4417
4418
+ bool QgsSpatiaLiteProvider::skipConstraintCheck ( int fieldIndex, QgsFieldConstraints::Constraint constraint, const QVariant &value ) const
4419
+ {
4420
+ Q_UNUSED ( constraint );
4421
+
4422
+ // If the field is the primary key, skip in case it's autog-enerated / auto-incrementing
4423
+ if ( mAttributeFields .at ( fieldIndex ).name () == mPrimaryKey && mPrimaryKeyAutoIncrement )
4424
+ {
4425
+ const QVariant defVal = mDefaultValues .value ( fieldIndex );
4426
+ return defVal.toInt () == value.toInt ();
4427
+ }
4428
+
4429
+ return false ;
4430
+ }
4431
+
4382
4432
void QgsSpatiaLiteProvider::closeDb ()
4383
4433
{
4384
4434
// trying to close the SQLite DB
0 commit comments