32
32
33
33
34
34
QgsOgrFeatureIterator::QgsOgrFeatureIterator ( QgsOgrProvider* p, const QgsFeatureRequest& request )
35
- : QgsAbstractFeatureIterator( request ), P( p )
35
+ : QgsAbstractFeatureIterator( request ), P( p ), ogrDataSource( 0 ), ogrLayer( 0 ), ogrDriver( 0 )
36
36
{
37
- // make sure that only one iterator is active
38
- if ( P->mActiveIterator )
37
+
38
+ ogrDataSource = OGROpen ( TO8F ( P->filePath () ), false , &ogrDriver );
39
+
40
+ if ( P->layerName ().isNull () )
41
+ {
42
+ ogrLayer = OGR_DS_GetLayer ( ogrDataSource, P->layerIndex () );
43
+ }
44
+ else
39
45
{
40
- QgsMessageLog::logMessage ( QObject::tr ( " Already active iterator on this provider was closed." ), QObject::tr ( " OGR" ) );
41
- P->mActiveIterator ->close ();
46
+ ogrLayer = OGR_DS_GetLayerByName ( ogrDataSource, TO8 ( p->layerName () ) );
42
47
}
43
- P->mActiveIterator = this ;
44
48
45
49
mFeatureFetched = false ;
46
50
@@ -56,12 +60,12 @@ QgsOgrFeatureIterator::QgsOgrFeatureIterator( QgsOgrProvider* p, const QgsFeatur
56
60
57
61
OGR_G_CreateFromWkt (( char ** )&wktText, NULL , &filter );
58
62
QgsDebugMsg ( " Setting spatial filter using " + wktExtent );
59
- OGR_L_SetSpatialFilter ( P-> ogrLayer , filter );
63
+ OGR_L_SetSpatialFilter ( ogrLayer, filter );
60
64
OGR_G_DestroyGeometry ( filter );
61
65
}
62
66
else
63
67
{
64
- OGR_L_SetSpatialFilter ( P-> ogrLayer , 0 );
68
+ OGR_L_SetSpatialFilter ( ogrLayer, 0 );
65
69
}
66
70
67
71
// start with first feature
@@ -94,7 +98,7 @@ bool QgsOgrFeatureIterator::nextFeature( QgsFeature& feature )
94
98
95
99
if ( mRequest .filterType () == QgsFeatureRequest::FilterFid )
96
100
{
97
- OGRFeatureH fet = OGR_L_GetFeature ( P-> ogrLayer , FID_TO_NUMBER ( mRequest .filterFid () ) );
101
+ OGRFeatureH fet = OGR_L_GetFeature ( ogrLayer, FID_TO_NUMBER ( mRequest .filterFid () ) );
98
102
if ( !fet )
99
103
{
100
104
close ();
@@ -111,7 +115,7 @@ bool QgsOgrFeatureIterator::nextFeature( QgsFeature& feature )
111
115
112
116
OGRFeatureH fet;
113
117
114
- while (( fet = OGR_L_GetNextFeature ( P-> ogrLayer ) ) )
118
+ while (( fet = OGR_L_GetNextFeature ( ogrLayer ) ) )
115
119
{
116
120
if ( !readFeature ( fet, feature ) )
117
121
continue ;
@@ -135,7 +139,7 @@ bool QgsOgrFeatureIterator::rewind()
135
139
if ( mClosed )
136
140
return false ;
137
141
138
- OGR_L_ResetReading ( P-> ogrLayer );
142
+ OGR_L_ResetReading ( ogrLayer );
139
143
140
144
return true ;
141
145
}
@@ -146,10 +150,11 @@ bool QgsOgrFeatureIterator::close()
146
150
if ( mClosed )
147
151
return false ;
148
152
149
- // tell provider that this iterator is not active anymore
150
- P-> mActiveIterator = 0 ;
153
+ OGR_DS_ReleaseResultSet ( ogrDataSource, ogrLayer );
154
+ OGR_DS_Destroy ( ogrDataSource ) ;
151
155
152
156
mClosed = true ;
157
+ ogrDataSource = 0 ;
153
158
return true ;
154
159
}
155
160
0 commit comments