OGRFeature * OGRBNALayer::GetFeature( long nFID ) { OGRFeature *poFeature; BNARecord* record; int ok; if (nFID < 0) return NULL; FastParseUntil(nFID); if (nFID >= nFeatures) return NULL; VSIFSeekL( fpBNA, offsetAndLineFeaturesTable[nFID].offset, SEEK_SET ); curLine = offsetAndLineFeaturesTable[nFID].line; record = BNA_GetNextRecord(fpBNA, &ok, &curLine, TRUE, bnaFeatureType); poFeature = BuildFeatureFromBNARecord(record, nFID); BNA_FreeRecord(record); return poFeature; }
OGRFeature * OGRBNALayer::GetFeature( GIntBig nFID ) { if (nFID < 0 || !CPL_INT64_FITS_ON_INT32(nFID)) return NULL; FastParseUntil( static_cast<int>( nFID ) ); if (nFID >= nFeatures) return NULL; int ok; if( VSIFSeekL( fpBNA, offsetAndLineFeaturesTable[nFID].offset, SEEK_SET ) < 0 ) return NULL; curLine = offsetAndLineFeaturesTable[nFID].line; BNARecord* record = BNA_GetNextRecord(fpBNA, &ok, &curLine, TRUE, bnaFeatureType); OGRFeature *poFeature = BuildFeatureFromBNARecord(record, (int)nFID); BNA_FreeRecord(record); return poFeature; }
OGRFeature *OGRBNALayer::GetNextFeature() { OGRFeature *poFeature; BNARecord* record; int offset, line; if (failed || eof) return NULL; while(1) { int ok = FALSE; offset = (int) VSIFTellL(fpBNA); line = curLine; if (nNextFID < nFeatures) { VSIFSeekL( fpBNA, offsetAndLineFeaturesTable[nNextFID].offset, SEEK_SET ); curLine = offsetAndLineFeaturesTable[nNextFID].line; } record = BNA_GetNextRecord(fpBNA, &ok, &curLine, TRUE, bnaFeatureType); if (ok == FALSE) { BNA_FreeRecord(record); failed = TRUE; return NULL; } if (record == NULL) { /* end of file */ eof = TRUE; /* and we have finally build the whole index table */ partialIndexTable = FALSE; return NULL; } if (record->featureType == bnaFeatureType) { if (nNextFID >= nFeatures) { nFeatures++; offsetAndLineFeaturesTable = (OffsetAndLine*)CPLRealloc(offsetAndLineFeaturesTable, nFeatures * sizeof(OffsetAndLine)); offsetAndLineFeaturesTable[nFeatures-1].offset = offset; offsetAndLineFeaturesTable[nFeatures-1].line = line; } poFeature = BuildFeatureFromBNARecord(record, nNextFID++); BNA_FreeRecord(record); if( (m_poFilterGeom == NULL || FilterGeometry( poFeature->GetGeometryRef() ) ) && (m_poAttrQuery == NULL || m_poAttrQuery->Evaluate( poFeature )) ) { return poFeature; } delete poFeature; } else { BNA_FreeRecord(record); } } }