comparison mercurial/appendfile.py @ 2075:343aeefb553b

Make the appendfile class inline-data index friendly The appendfile class needs a few changes to make it work with interleaved index files. It needs to support the tell() method, opening in a+ mode, and it needs to delay the checkinlinesize call until after the append file is written. Given that open(file, "a+") doesn't always seek to the end of the file, this adds seek operations to appendfile that understand whence args
author mason@suse.com
date Tue, 04 Apr 2006 16:38:43 -0400
parents 94d3170399e1
children 856f0ba200bc
comparison
equal deleted inserted replaced
2074:01ee43dda681 2075:343aeefb553b
40 self.offset = fp.tell() 40 self.offset = fp.tell()
41 # real file is not written by anyone else. cache its size so 41 # real file is not written by anyone else. cache its size so
42 # seek and read can be fast. 42 # seek and read can be fast.
43 self.fpsize = os.fstat(fp.fileno()).st_size 43 self.fpsize = os.fstat(fp.fileno()).st_size
44 44
45 def seek(self, offset): 45 def end(self):
46 self.tmpfp.flush() # make sure the stat is correct
47 return self.fpsize + os.fstat(self.tmpfp.fileno()).st_size
48
49 def seek(self, offset, whence=0):
46 '''virtual file offset spans real file and temp file.''' 50 '''virtual file offset spans real file and temp file.'''
47 self.offset = offset 51 if whence == 0:
52 self.offset = offset
53 elif whence == 1:
54 self.offset += offset
55 elif whence == 2:
56 self.offset = self.end() + offset
57
48 if self.offset < self.fpsize: 58 if self.offset < self.fpsize:
49 self.realfp.seek(self.offset) 59 self.realfp.seek(self.offset)
50 else: 60 else:
51 self.tmpfp.seek(self.offset - self.fpsize) 61 self.tmpfp.seek(self.offset - self.fpsize)
52 62
101 111
102 def __init__(self, fp): 112 def __init__(self, fp):
103 self.fp = fp 113 self.fp = fp
104 self.offset = 0 114 self.offset = 0
105 115
106 def seek(self, offset): 116 def tell(self):
107 self.offset = offset 117 return self.offset
118
119 def seek(self, offset, whence=0):
120 if whence == 0:
121 self.offset = offset
122 elif whence == 1:
123 self.offset += offset
124 elif whence == 2:
125 self.offset = self.fp.end() + offset
108 126
109 def read(self, count=-1): 127 def read(self, count=-1):
110 try: 128 try:
111 if self.offset != self.fp.offset: 129 if self.offset != self.fp.offset:
112 self.fp.seek(self.offset) 130 self.fp.seek(self.offset)
141 159
142 def __call__(self, name, mode='r'): 160 def __call__(self, name, mode='r'):
143 '''open file. return same cached appendfile object for every 161 '''open file. return same cached appendfile object for every
144 later call.''' 162 later call.'''
145 163
146 assert mode in 'ra' 164 assert mode in 'ra+'
147 fp = self.fps.get(name) 165 fp = self.fps.get(name)
148 if fp is None: 166 if fp is None:
149 fp = appendfile(self.realopener(name, 'a+')) 167 fp = appendfile(self.realopener(name, 'a+'))
150 self.fps[name] = fp 168 self.fps[name] = fp
151 return sharedfile(fp) 169 return sharedfile(fp)
163 181
164 class appendchangelog(changelog.changelog, appendopener): 182 class appendchangelog(changelog.changelog, appendopener):
165 def __init__(self, opener): 183 def __init__(self, opener):
166 appendopener.__init__(self, opener) 184 appendopener.__init__(self, opener)
167 changelog.changelog.__init__(self, self) 185 changelog.changelog.__init__(self, self)
186 def checkinlinesize(self, fp, tr):
187 return
168 188
169 class appendmanifest(manifest.manifest, appendopener): 189 class appendmanifest(manifest.manifest, appendopener):
170 def __init__(self, opener): 190 def __init__(self, opener):
171 appendopener.__init__(self, opener) 191 appendopener.__init__(self, opener)
172 manifest.manifest.__init__(self, self) 192 manifest.manifest.__init__(self, self)
193 def checkinlinesize(self, fp, tr):
194 return