/// <summary> /// Constructs a bit vector from the file <code>name</code> in Directory /// <code>d</code>, as written by the <seealso cref="#write"/> method. /// </summary> public BitVector(Directory d, string name, IOContext context) { ChecksumIndexInput input = d.OpenChecksumInput(name, context); try { int firstInt = input.ReadInt(); if (firstInt == -2) { // New format, with full header & version: Version_Renamed = CodecUtil.CheckHeader(input, CODEC, VERSION_START, VERSION_CURRENT); Size_Renamed = input.ReadInt(); } else { Version_Renamed = VERSION_PRE; Size_Renamed = firstInt; } if (Size_Renamed == -1) { if (Version_Renamed >= VERSION_DGAPS_CLEARED) { ReadClearedDgaps(input); } else { ReadSetDgaps(input); } } else { ReadBits(input); } if (Version_Renamed < VERSION_DGAPS_CLEARED) { InvertAll(); } if (Version_Renamed >= VERSION_CHECKSUM) { CodecUtil.CheckFooter(input); } else { CodecUtil.CheckEOF(input); } Debug.Assert(VerifyCount()); } finally { input.Dispose(); } }
public BloomFilteredFieldsProducer(SegmentReadState state) { var bloomFileName = IndexFileNames.SegmentFileName( state.SegmentInfo.Name, state.SegmentSuffix, BLOOM_EXTENSION); ChecksumIndexInput bloomIn = null; var success = false; try { bloomIn = state.Directory.OpenChecksumInput(bloomFileName, state.Context); var version = CodecUtil.CheckHeader(bloomIn, BLOOM_CODEC_NAME, VERSION_START, VERSION_CURRENT); // Load the hash function used in the BloomFilter // hashFunction = HashFunction.forName(bloomIn.readString()); // Load the delegate postings format var delegatePostingsFormat = ForName(bloomIn.ReadString()); _delegateFieldsProducer = delegatePostingsFormat .FieldsProducer(state); var numBlooms = bloomIn.ReadInt(); for (var i = 0; i < numBlooms; i++) { var fieldNum = bloomIn.ReadInt(); var bloom = FuzzySet.Deserialize(bloomIn); var fieldInfo = state.FieldInfos.FieldInfo(fieldNum); _bloomsByFieldName.Add(fieldInfo.Name, bloom); } if (version >= VERSION_CHECKSUM) { CodecUtil.CheckFooter(bloomIn); } else { CodecUtil.CheckEOF(bloomIn); } IOUtils.Close(bloomIn); success = true; } finally { if (!success) { IOUtils.CloseWhileHandlingException(bloomIn, _delegateFieldsProducer); } } }
public override SegmentInfo Read(Directory dir, string segment, IOContext context) { string fileName = IndexFileNames.SegmentFileName(segment, "", Lucene46SegmentInfoFormat.SI_EXTENSION); ChecksumIndexInput input = dir.OpenChecksumInput(fileName, context); bool success = false; try { int codecVersion = CodecUtil.CheckHeader(input, Lucene46SegmentInfoFormat.CODEC_NAME, Lucene46SegmentInfoFormat.VERSION_START, Lucene46SegmentInfoFormat.VERSION_CURRENT); string version = input.ReadString(); int docCount = input.ReadInt(); if (docCount < 0) { throw new CorruptIndexException("invalid docCount: " + docCount + " (resource=" + input + ")"); } bool isCompoundFile = input.ReadByte() == SegmentInfo.YES; IDictionary <string, string> diagnostics = input.ReadStringStringMap(); ISet <string> files = input.ReadStringSet(); if (codecVersion >= Lucene46SegmentInfoFormat.VERSION_CHECKSUM) { CodecUtil.CheckFooter(input); } else { CodecUtil.CheckEOF(input); } SegmentInfo si = new SegmentInfo(dir, version, segment, docCount, isCompoundFile, null, diagnostics); si.Files = files; success = true; return(si); } finally { if (!success) { IOUtils.CloseWhileHandlingException(input); } else { input.Dispose(); } } }
/// <summary> Read a particular segmentFileName. Note that this may /// throw an IOException if a commit is in process. /// /// </summary> /// <param name="directory">-- directory containing the segments file /// </param> /// <param name="segmentFileName">-- segment file to load /// </param> /// <throws> CorruptIndexException if the index is corrupt </throws> /// <throws> IOException if there is a low-level IO error </throws> public void Read(Directory directory, System.String segmentFileName) { bool success = false; // Clear any previous segments: Clear(); var input = new ChecksumIndexInput(directory.OpenInput(segmentFileName)); generation = GenerationFromSegmentsFileName(segmentFileName); lastGeneration = generation; try { int format = input.ReadInt(); if (format < 0) { // file contains explicit format info // check that it is a format we can understand if (format < CURRENT_FORMAT) { throw new CorruptIndexException("Unknown format version: " + format); } version = input.ReadLong(); // read version counter = input.ReadInt(); // read counter } else { // file is in old format without explicit format info counter = format; } for (int i = input.ReadInt(); i > 0; i--) { // read segmentInfos Add(new SegmentInfo(directory, format, input)); } if (format >= 0) { // in old format the version number may be at the end of the file if (input.FilePointer >= input.Length()) { version = (DateTime.UtcNow.Ticks / TimeSpan.TicksPerMillisecond); } // old file format without version number else { version = input.ReadLong(); // read version } } if (format <= FORMAT_USER_DATA) { if (format <= FORMAT_DIAGNOSTICS) { userData = input.ReadStringStringMap(); } else if (0 != input.ReadByte()) { // TODO: Should be read-only map userData = new HashMap <string, string> { { "userData", input.ReadString() } }; } else { // TODO: Should be empty read-only map userData = new HashMap <string, string>(); } } else { // TODO: Should be empty read-only map userData = new HashMap <string, string>(); } if (format <= FORMAT_CHECKSUM) { long checksumNow = input.Checksum; long checksumThen = input.ReadLong(); if (checksumNow != checksumThen) { throw new CorruptIndexException("checksum mismatch in segments file"); } } success = true; } finally { input.Close(); if (!success) { // Clear any segment infos we had loaded so we // have a clean slate on retry: Clear(); } } }