1.1 --- a/iixr/fields.py Mon Feb 07 02:05:38 2011 +0100
1.2 +++ b/iixr/fields.py Tue Feb 08 00:08:27 2011 +0100
1.3 @@ -29,6 +29,7 @@
1.4 "Writing field data to files."
1.5
1.6 def reset(self):
1.7 + self.end_record()
1.8 self.last_docnum = None
1.9 self.subtractor = None
1.10
1.11 @@ -47,8 +48,6 @@
1.12 self.subtractor = get_subtractor(docnum)
1.13 docnum_seq = docnum
1.14
1.15 - self.begin_record()
1.16 -
1.17 # Write the document number.
1.18
1.19 self.write_sequence_value(docnum_seq)
1.20 @@ -63,8 +62,6 @@
1.21 self.write_number(i)
1.22 self.write_string(field, 1) # compress
1.23
1.24 - self.end_record()
1.25 -
1.26 self.last_docnum = docnum
1.27
1.28 class FieldReader(FileReader):
1.29 @@ -74,6 +71,7 @@
1.30 def reset(self):
1.31 self.last_docnum = None
1.32 self.adder = None
1.33 + self.begin_record()
1.34
1.35 def read_fields(self):
1.36
1.37 @@ -82,8 +80,6 @@
1.38 number and a list of field (identifier, value) pairs.
1.39 """
1.40
1.41 - self.begin_record()
1.42 -
1.43 # Read the document number.
1.44
1.45 docnum = self.read_sequence_value()
1.46 @@ -109,8 +105,6 @@
1.47 fields.append((identifier, value))
1.48 i += 1
1.49
1.50 - self.end_record()
1.51 -
1.52 return self.last_docnum, fields
1.53
1.54 def read_document_fields(self, docnum, offset):
1.55 @@ -131,6 +125,7 @@
1.56 "Writing field index details to files."
1.57
1.58 def reset(self):
1.59 + self.end_record()
1.60 self.last_docnum = None
1.61 self.subtractor = None
1.62 self.last_offset = 0
1.63 @@ -150,8 +145,6 @@
1.64 self.subtractor = get_subtractor(docnum)
1.65 docnum_seq = docnum
1.66
1.67 - self.begin_record()
1.68 -
1.69 # Write the document number.
1.70
1.71 self.write_sequence_value(docnum_seq)
1.72 @@ -159,7 +152,6 @@
1.73 # Write the offset delta.
1.74
1.75 self.write_number(offset - self.last_offset)
1.76 - self.end_record()
1.77
1.78 self.last_docnum = docnum
1.79 self.last_offset = offset
1.80 @@ -172,13 +164,12 @@
1.81 self.last_docnum = None
1.82 self.adder = None
1.83 self.last_offset = 0
1.84 + self.begin_record()
1.85
1.86 def read_document(self):
1.87
1.88 "Read a document number and field file offset."
1.89
1.90 - self.begin_record()
1.91 -
1.92 # Read the document number.
1.93
1.94 docnum = self.read_sequence_value()
1.95 @@ -192,7 +183,6 @@
1.96 # Read the offset.
1.97
1.98 self.last_offset += self.read_number()
1.99 - self.end_record()
1.100
1.101 return self.last_docnum, self.last_offset
1.102
1.103 @@ -211,6 +201,7 @@
1.104 "Write details of the document with the given 'docnum' and 'fields'."
1.105
1.106 if self.entry % self.interval == 0:
1.107 + self.field_writer.reset()
1.108 offset = self.field_writer.tell()
1.109 self.field_writer.write_fields(docnum, fields)
1.110 self.field_index_writer.write_document(docnum, offset)
1.111 @@ -230,6 +221,7 @@
1.112 def __init__(self, field_reader, field_index_reader):
1.113 self.field_reader = field_reader
1.114 self.field_index_reader = field_index_reader
1.115 + self.entry = 0
1.116
1.117 self.cache = {}
1.118 self.docs = []
1.119 @@ -267,7 +259,17 @@
1.120
1.121 "Return the next document number and fields."
1.122
1.123 - return self.field_reader.read_fields()
1.124 + try:
1.125 + return self.field_reader.read_fields()
1.126 + except EOFError:
1.127 + self.entry += 1
1.128 + try:
1.129 + found_docnum, offset = self.docs[self.entry]
1.130 + except IndexError:
1.131 + raise EOFError
1.132 + else:
1.133 + self.field_reader.reset()
1.134 + return self.field_reader.read_fields()
1.135
1.136 # Random access methods.
1.137