SegmentInfos.cs
上传用户:zhangkuixh
上传日期:2013-09-30
资源大小:5473k
文件大小:4k
源码类别:

搜索引擎

开发平台:

C#

  1. /*
  2.  * Copyright 2004 The Apache Software Foundation
  3.  * 
  4.  * Licensed under the Apache License, Version 2.0 (the "License");
  5.  * you may not use this file except in compliance with the License.
  6.  * You may obtain a copy of the License at
  7.  * 
  8.  * http://www.apache.org/licenses/LICENSE-2.0
  9.  * 
  10.  * Unless required by applicable law or agreed to in writing, software
  11.  * distributed under the License is distributed on an "AS IS" BASIS,
  12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13.  * See the License for the specific language governing permissions and
  14.  * limitations under the License.
  15.  */
  16. using System;
  17. using Directory = Lucene.Net.Store.Directory;
  18. using IndexInput = Lucene.Net.Store.IndexInput;
  19. using IndexOutput = Lucene.Net.Store.IndexOutput;
  20. using Constants = Lucene.Net.Util.Constants;
  21. namespace Lucene.Net.Index
  22. {
  23. [Serializable]
  24. public sealed class SegmentInfos : System.Collections.ArrayList
  25. {
  26. /// <summary>The file format version, a negative number. </summary>
  27. /* Works since counter, the old 1st entry, is always >= 0 */
  28. public const int FORMAT = - 1;
  29. public int counter = 0; // used to name new segments
  30. /// <summary> counts how often the index has been changed by adding or deleting docs.
  31. /// starting with the current time in milliseconds forces to create unique version numbers.
  32. /// </summary>
  33. private long version = System.DateTime.Now.Ticks;
  34. public SegmentInfo Info(int i)
  35. {
  36. return (SegmentInfo) this[i];
  37. }
  38. public void  Read(Directory directory)
  39. {
  40. IndexInput input = directory.OpenInput(IndexFileNames.SEGMENTS);
  41. try
  42. {
  43. int format = input.ReadInt();
  44. if (format < 0)
  45. {
  46. // file contains explicit format info
  47. // check that it is a format we can understand
  48. if (format < FORMAT)
  49. throw new System.IO.IOException("Unknown format version: " + format);
  50. version = input.ReadLong(); // read version
  51. counter = input.ReadInt(); // read counter
  52. }
  53. else
  54. {
  55. // file is in old format without explicit format info
  56. counter = format;
  57. }
  58. for (int i = input.ReadInt(); i > 0; i--)
  59. {
  60. // read segmentInfos
  61. SegmentInfo si = new SegmentInfo(input.ReadString(), input.ReadInt(), directory);
  62. Add(si);
  63. }
  64. if (format >= 0)
  65. {
  66. // in old format the version number may be at the end of the file
  67. if (input.GetFilePointer() >= input.Length())
  68. version = (System.DateTime.Now.Ticks - 621355968000000000) / 10000;
  69. // old file format without version number
  70. else
  71. version = input.ReadLong(); // read version
  72. }
  73. }
  74. finally
  75. {
  76. input.Close();
  77. }
  78. }
  79. public void  Write(Directory directory)
  80. {
  81. IndexOutput output = directory.CreateOutput("segments.new");
  82. try
  83. {
  84. output.WriteInt(FORMAT); // write FORMAT
  85. output.WriteLong(++version); // every write changes the index
  86. output.WriteInt(counter); // write counter
  87. output.WriteInt(Count); // write infos
  88. for (int i = 0; i < Count; i++)
  89. {
  90. SegmentInfo si = Info(i);
  91. output.WriteString(si.name);
  92. output.WriteInt(si.docCount);
  93. }
  94. }
  95. finally
  96. {
  97. output.Close();
  98. }
  99. // install new segment info
  100. directory.RenameFile("segments.new", IndexFileNames.SEGMENTS);
  101. }
  102. /// <summary> version number when this SegmentInfos was generated.</summary>
  103. public long GetVersion()
  104. {
  105. return version;
  106. }
  107. /// <summary> Current version number from segments file.</summary>
  108. public static long ReadCurrentVersion(Directory directory)
  109. {
  110. IndexInput input = directory.OpenInput(IndexFileNames.SEGMENTS);
  111. int format = 0;
  112. long version = 0;
  113. try
  114. {
  115. format = input.ReadInt();
  116. if (format < 0)
  117. {
  118. if (format < FORMAT)
  119. throw new System.IO.IOException("Unknown format version: " + format);
  120. version = input.ReadLong(); // read version
  121. }
  122. }
  123. finally
  124. {
  125. input.Close();
  126. }
  127. if (format < 0)
  128. return version;
  129. // We cannot be sure about the format of the file.
  130. // Therefore we have to read the whole file and cannot simply seek to the version entry.
  131. SegmentInfos sis = new SegmentInfos();
  132. sis.Read(directory);
  133. return sis.GetVersion();
  134. }
  135. }
  136. }