Skip to content

Commit 4413a7d

Browse files
committedJan 15, 2012
[FEATURE] Add support to edit views that have triggers. Fixes #4787
1 parent 10dbb6a commit 4413a7d

File tree

2 files changed

+23
-3
lines changed

2 files changed

+23
-3
lines changed
 

‎src/providers/spatialite/qgsspatialiteprovider.cpp

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -443,7 +443,7 @@ QgsSpatiaLiteProvider::QgsSpatiaLiteProvider( QString const &uri )
443443
return;
444444
}
445445
enabledCapabilities = QgsVectorDataProvider::SelectAtId | QgsVectorDataProvider::SelectGeometryAtId;
446-
if ( mTableBased && !mReadOnly )
446+
if (( mTableBased | mViewBased ) && !mReadOnly )
447447
{
448448
// enabling editing only for Tables [excluding Views and VirtualShapes]
449449
enabledCapabilities |= QgsVectorDataProvider::DeleteFeatures;
@@ -650,6 +650,23 @@ void QgsSpatiaLiteProvider::loadFields()
650650
}
651651
}
652652

653+
bool QgsSpatiaLiteProvider::hasTriggers()
654+
{
655+
int ret;
656+
char **results;
657+
int rows;
658+
int columns;
659+
char *errMsg = NULL;
660+
QString sql;
661+
662+
sql = QString( "SELECT * FROM sqlite_master WHERE type='trigger' AND tbl_name=%1" )
663+
.arg( quotedIdentifier( mTableName ) );
664+
665+
ret = sqlite3_get_table( sqliteHandle, sql.toUtf8().constData(), &results, &rows, &columns, &errMsg );
666+
sqlite3_free_table( results );
667+
return ( ret == SQLITE_OK && rows > 0 );
668+
}
669+
653670

654671
QString QgsSpatiaLiteProvider::storageType() const
655672
{
@@ -4217,7 +4234,7 @@ bool QgsSpatiaLiteProvider::checkLayerType()
42174234
else if ( type == "view" )
42184235
{
42194236
mViewBased = true;
4220-
mReadOnly = true;
4237+
mReadOnly = !hasTriggers();
42214238
}
42224239
count++;
42234240
}
@@ -4321,7 +4338,7 @@ bool QgsSpatiaLiteProvider::checkLayerType()
43214338
if ( ret == SQLITE_OK && rows == 1 )
43224339
{
43234340
mViewBased = true;
4324-
mReadOnly = true;
4341+
mReadOnly = !hasTriggers();
43254342
count++;
43264343
}
43274344
if ( errMsg )

‎src/providers/spatialite/qgsspatialiteprovider.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,9 @@ class QgsSpatiaLiteProvider: public QgsVectorDataProvider
276276
/** loads fields from input file to member attributeFields */
277277
void loadFields();
278278

279+
/** Check if a table/view has any triggers. Triggers can be used on views to make them editable.*/
280+
bool hasTriggers();
281+
279282
/** convert a QgsField to work with SL */
280283
static bool convertField( QgsField &field );
281284

0 commit comments

Comments
 (0)
Please sign in to comment.