OGRErr OGRMILayerAttrIndex::Initialize( const char *pszIndexPathIn, OGRLayer *poLayerIn ) { if( poLayerIn == poLayer ) return OGRERR_NONE; /* -------------------------------------------------------------------- */ /* Capture input information and form static pathnames. */ /* -------------------------------------------------------------------- */ poLayer = poLayerIn; pszIndexPath = CPLStrdup( pszIndexPathIn ); pszMetadataFilename = CPLStrdup( CPLResetExtension( pszIndexPathIn, "idm" ) ); pszMIINDFilename = CPLStrdup(CPLResetExtension( pszIndexPathIn, "ind" )); /* -------------------------------------------------------------------- */ /* If a metadata file already exists, load it. */ /* -------------------------------------------------------------------- */ OGRErr eErr; VSIStatBuf sStat; if( VSIStat( pszMetadataFilename, &sStat ) == 0 ) { eErr = LoadConfigFromXML(); if( eErr != OGRERR_NONE ) return eErr; } return OGRERR_NONE; }
OGRErr OGRMILayerAttrIndex::LoadConfigFromXML() { FILE *fp; int nXMLSize; char *pszRawXML; CPLAssert( poINDFile == NULL ); /* -------------------------------------------------------------------- */ /* Read the XML file. */ /* -------------------------------------------------------------------- */ fp = VSIFOpen( pszMetadataFilename, "rb" ); if( fp == NULL ) return OGRERR_NONE; VSIFSeek( fp, 0, SEEK_END ); nXMLSize = VSIFTell( fp ); VSIFSeek( fp, 0, SEEK_SET ); pszRawXML = (char *) CPLMalloc(nXMLSize+1); pszRawXML[nXMLSize] = '\0'; VSIFRead( pszRawXML, nXMLSize, 1, fp ); VSIFClose( fp ); OGRErr eErr = LoadConfigFromXML(pszRawXML); CPLFree(pszRawXML); return eErr; }
OGRErr OGRMILayerAttrIndex::LoadConfigFromXML() { VSILFILE *fp; vsi_l_offset nXMLSize; char *pszRawXML; CPLAssert( poINDFile == NULL ); /* -------------------------------------------------------------------- */ /* Read the XML file. */ /* -------------------------------------------------------------------- */ fp = VSIFOpenL( pszMetadataFilename, "rb" ); if( fp == NULL ) return OGRERR_FAILURE; if( VSIFSeekL( fp, 0, SEEK_END ) != 0 ) { VSIFCloseL(fp); return OGRERR_FAILURE; } nXMLSize = VSIFTellL( fp ); if( nXMLSize > 10 * 1024 * 1024 || VSIFSeekL( fp, 0, SEEK_SET ) != 0 ) { VSIFCloseL(fp); return OGRERR_FAILURE; } pszRawXML = (char *) CPLMalloc((size_t)nXMLSize+1); pszRawXML[nXMLSize] = '\0'; if( VSIFReadL( pszRawXML, (size_t)nXMLSize, 1, fp ) != 1 ) { VSIFCloseL(fp); return OGRERR_FAILURE; } VSIFCloseL( fp ); OGRErr eErr = LoadConfigFromXML(pszRawXML); CPLFree(pszRawXML); return eErr; }
OGRErr OGRMILayerAttrIndex::LoadConfigFromXML() { CPLAssert( poINDFile == nullptr ); /* -------------------------------------------------------------------- */ /* Read the XML file. */ /* -------------------------------------------------------------------- */ VSILFILE *fp = VSIFOpenL( pszMetadataFilename, "rb" ); if( fp == nullptr ) return OGRERR_FAILURE; if( VSIFSeekL( fp, 0, SEEK_END ) != 0 ) { VSIFCloseL(fp); return OGRERR_FAILURE; } const vsi_l_offset nXMLSize = VSIFTellL( fp ); if( nXMLSize > 10 * 1024 * 1024 || VSIFSeekL( fp, 0, SEEK_SET ) != 0 ) { VSIFCloseL(fp); return OGRERR_FAILURE; } char *pszRawXML = static_cast<char *>(CPLMalloc(static_cast<size_t>(nXMLSize)+1)); pszRawXML[nXMLSize] = '\0'; if( VSIFReadL( pszRawXML, static_cast<size_t>(nXMLSize), 1, fp ) != 1 ) { VSIFCloseL(fp); return OGRERR_FAILURE; } VSIFCloseL( fp ); OGRErr eErr = LoadConfigFromXML(pszRawXML); CPLFree(pszRawXML); return eErr; }