1.1 --- a/iixr/files.py Tue Feb 08 00:08:27 2011 +0100
1.2 +++ b/iixr/files.py Thu Feb 10 01:19:13 2011 +0100
1.3 @@ -32,7 +32,7 @@
1.4 self.f = f
1.5 self.data = array('B') # master buffer
1.6 self.record = array('B') # record buffer
1.7 - self.reset()
1.8 + self.data_start = 0
1.9
1.10 def reset(self):
1.11
1.12 @@ -45,7 +45,7 @@
1.13 self.reset()
1.14
1.15 def rewind(self):
1.16 - self.f.seek(0)
1.17 + self.f.seek(self.data_start)
1.18 self.reset()
1.19
1.20 def close(self):
1.21 @@ -57,17 +57,24 @@
1.22
1.23 "Writing basic data types to files."
1.24
1.25 + def __init__(self, f):
1.26 + File.__init__(self, f)
1.27 + self.written = 0
1.28 +
1.29 def tell(self):
1.30 # NOTE: Will not be accurate within the current record.
1.31 - return self.f.tell() + len(self.data)
1.32 + return self.written
1.33
1.34 def begin_record(self):
1.35 pass
1.36
1.37 def end_record(self):
1.38 if self.record:
1.39 - vint_to_array(len(self.record), self.data)
1.40 - self.data += self.record
1.41 + length = len(self.record)
1.42 + size = vint(length)
1.43 + self.f.write(size)
1.44 + self.record.tofile(self.f)
1.45 + self.written += len(size) + length
1.46 self.record = array('B')
1.47
1.48 def write_number(self, number):
1.49 @@ -116,21 +123,21 @@
1.50 length = len(s)
1.51 self.record.fromstring("".join([flag, vint(length), s]))
1.52
1.53 - def write_sequence_value(self, value):
1.54 - sequence_to_array(value, self.record)
1.55 + def write_sequence_value(self, value, size):
1.56 + sequence_to_array(value, size, self.record)
1.57
1.58 - def write_sequence_values(self, values):
1.59 + def write_sequence_values(self, values, size):
1.60 vint_to_array(len(values), self.record)
1.61 for value in values:
1.62 - self.write_sequence_value(value)
1.63 + self.write_sequence_value(value, size)
1.64
1.65 - def write_delta_sequence(self, values):
1.66 + def write_delta_sequence(self, values, size):
1.67 convert_sequence(values, get_subtractor(values[0]))
1.68 - self.write_sequence_values(values)
1.69 + self.write_sequence_values(values, size)
1.70
1.71 - def write_monotonic_sequence(self, values):
1.72 + def write_monotonic_sequence(self, values, size):
1.73 convert_sequence(values, get_monotonic_subtractor(values[0]))
1.74 - self.write_sequence_values(values)
1.75 + self.write_sequence_values(values, size)
1.76
1.77 def flush(self):
1.78 if self.f is not None:
1.79 @@ -146,6 +153,20 @@
1.80
1.81 "Reading basic data types from files."
1.82
1.83 + def __init__(self, f):
1.84 + File.__init__(self, f)
1.85 + self.begin()
1.86 +
1.87 + def tell(self):
1.88 + # NOTE: Will not be accurate within the current record.
1.89 + return self.f.tell()
1.90 +
1.91 + def begin(self):
1.92 +
1.93 + "Initialise file-wide parameters."
1.94 +
1.95 + pass
1.96 +
1.97 def begin_record(self):
1.98 self.record = array('B')
1.99 self.start = 0
1.100 @@ -185,6 +206,14 @@
1.101 n, self.start = vint_from_array_start(self.record, self.start)
1.102 return n
1.103
1.104 + def read_numbers(self, n):
1.105 + l = []
1.106 + i = 0
1.107 + while i < n:
1.108 + l.append(self.read_number())
1.109 + i += 1
1.110 + return l
1.111 +
1.112 def read_string(self, decompress=0):
1.113
1.114 """
1.115 @@ -214,26 +243,26 @@
1.116
1.117 return unicode(s, "utf-8")
1.118
1.119 - def read_sequence_value(self):
1.120 - value, self.start = sequence_from_array(self.record, self.start)
1.121 + def read_sequence_value(self, size):
1.122 + value, self.start = sequence_from_array(self.record, size, self.start)
1.123 return value
1.124
1.125 - def read_sequences(self):
1.126 + def read_sequences(self, size):
1.127 values = []
1.128 length = self.read_number()
1.129 i = 0
1.130 while i < length:
1.131 - values.append(self.read_sequence_value())
1.132 + values.append(self.read_sequence_value(size))
1.133 i += 1
1.134 return values
1.135
1.136 - def read_delta_sequence(self):
1.137 - values = self.read_sequences()
1.138 + def read_delta_sequence(self, size):
1.139 + values = self.read_sequences(size)
1.140 convert_sequence(values, get_adder(values[0]))
1.141 return values
1.142
1.143 - def read_monotonic_sequence(self):
1.144 - values = self.read_sequences()
1.145 + def read_monotonic_sequence(self, size):
1.146 + values = self.read_sequences(size)
1.147 convert_sequence(values, get_monotonic_adder(values[0]))
1.148 return values
1.149