@@ -206,7 +206,8 @@ void QgsGrassProvider::update ( void )
206
206
#endif
207
207
208
208
mValid = false ;
209
- // TODO check if reopened map is valid
209
+
210
+ if ( ! mMaps [mLayers [mLayerId ].mapId ].valid ) return ;
210
211
211
212
// Getting the total number of features in the layer
212
213
// It may happen that the field disappeares from the map (deleted features, new map without that field)
@@ -289,7 +290,7 @@ QgsFeature *QgsGrassProvider::getFirstFeature(bool fetchAttributes)
289
290
std::cout << " QgsGrassProvider::getFirstFeature()" << std::endl;
290
291
#endif
291
292
292
- if ( isEdited () || isFrozen () )
293
+ if ( isEdited () || isFrozen () || ! mValid )
293
294
return 0 ;
294
295
295
296
if ( mCidxFieldIndex < 0 ) return 0 ; // No features, no features in this layer
@@ -309,7 +310,7 @@ bool QgsGrassProvider::getNextFeature(QgsFeature &feature, bool fetchAttributes)
309
310
std::cout << " QgsGrassProvider::getNextFeature()" << std::endl;
310
311
#endif
311
312
312
- if ( isEdited () || isFrozen () )
313
+ if ( isEdited () || isFrozen () || ! mValid )
313
314
return 0 ;
314
315
315
316
if ( mCidxFieldIndex < 0 ) return 0 ; // No features, no features in this layer
@@ -330,7 +331,7 @@ QgsFeature *QgsGrassProvider::getNextFeature(bool fetchAttributes)
330
331
<< " fetchAttributes = " << fetchAttributes << std::endl;
331
332
#endif
332
333
333
- if ( isEdited () || isFrozen () )
334
+ if ( isEdited () || isFrozen () || ! mValid )
334
335
return 0 ;
335
336
336
337
if ( mCidxFieldIndex < 0 ) return 0 ; // No features, no features in this layer
@@ -357,7 +358,7 @@ QgsFeature* QgsGrassProvider::getNextFeature(std::list<int> const& attlist, int
357
358
std::cout << " QgsGrassProvider::getNextFeature( attlist )" << std::endl;
358
359
#endif
359
360
360
- if ( isEdited () || isFrozen () )
361
+ if ( isEdited () || isFrozen () || ! mValid )
361
362
return 0 ;
362
363
363
364
if ( mCidxFieldIndex < 0 ) return 0 ; // No features, no features in this layer
@@ -471,6 +472,7 @@ void QgsGrassProvider::resetSelection( bool sel)
471
472
#ifdef QGISDEBUG
472
473
std::cout << " QgsGrassProvider::resetSelection()" << std::endl;
473
474
#endif
475
+ if ( !mValid ) return ;
474
476
memset ( mSelection , (int ) sel, mSelectionSize );
475
477
mNextCidx = 0 ;
476
478
}
@@ -486,7 +488,7 @@ void QgsGrassProvider::select(QgsRect *rect, bool useIntersect)
486
488
std::cout << " QgsGrassProvider::select() useIntersect = " << useIntersect << std::endl;
487
489
#endif
488
490
489
- if ( isEdited () || isFrozen () )
491
+ if ( isEdited () || isFrozen () || ! mValid )
490
492
return ;
491
493
492
494
// check if outdated and update if necessary
@@ -560,7 +562,7 @@ std::vector<QgsFeature>& QgsGrassProvider::identify(QgsRect * rect)
560
562
561
563
// TODO: does not return vector of features! Should it?
562
564
563
- if ( !isEdited () && !isFrozen () ) {
565
+ if ( !isEdited () && !isFrozen () && mValid ) {
564
566
select (rect, true );
565
567
}
566
568
}
@@ -614,7 +616,7 @@ int QgsGrassProvider::keyField()
614
616
615
617
void QgsGrassProvider::reset ()
616
618
{
617
- if ( isEdited () || isFrozen () )
619
+ if ( isEdited () || isFrozen () || ! mValid )
618
620
return ;
619
621
620
622
int mapId = mLayers [mLayerId ].mapId ;
@@ -757,6 +759,10 @@ void QgsGrassProvider::loadAttributes ( GLAYER &layer )
757
759
std::cerr << " QgsGrassProvider::loadLayerSourcesFromMap" << std::endl;
758
760
#endif
759
761
762
+ // TODO: free old attributes
763
+
764
+ if ( !layer.map ) return ;
765
+
760
766
// Get field info
761
767
layer.fieldInfo = Vect_get_field ( layer.map , layer.field ); // should work also with field = 0
762
768
@@ -1116,6 +1122,7 @@ void QgsGrassProvider::updateMap ( int mapId )
1116
1122
/* Close map */
1117
1123
GMAP *map = &(mMaps [mapId]);
1118
1124
1125
+ bool closeMap = map->valid ;
1119
1126
map->valid = false ;
1120
1127
map->version ++;
1121
1128
@@ -1125,7 +1132,7 @@ void QgsGrassProvider::updateMap ( int mapId )
1125
1132
// TODO: Is it necessary for close ?
1126
1133
G__setenv ( " MAPSET" , (char *) map->mapset .ascii () );
1127
1134
1128
- Vect_close ( map->map );
1135
+ if ( closeMap ) Vect_close ( map->map );
1129
1136
1130
1137
QFileInfo di ( map->gisdbase + " /" + map->location + " /" + map->mapset + " /vector/" + map->mapName );
1131
1138
map->lastModified = di.lastModified ();
@@ -1180,8 +1187,11 @@ void QgsGrassProvider::closeMap( int mapId )
1180
1187
" you can expect crash soon." );
1181
1188
}
1182
1189
1190
+ if ( mMaps [mapId].valid )
1191
+ {
1192
+ Vect_close ( mMaps [mapId].map );
1193
+ }
1183
1194
mMaps [mapId].valid = false ;
1184
- Vect_close ( mMaps [mapId].map );
1185
1195
}
1186
1196
}
1187
1197
0 commit comments