From: alexander s. <a1...@us...> - 2010-12-14 11:00:29
|
Update of /cvsroot/dbfpy/dbfpy/dbfpy In directory sfp-cvsdas-3.v30.ch3.sourceforge.com:/tmp/cvs-serv15461 Modified Files: memo.py Log Message: debug Index: memo.py =================================================================== RCS file: /cvsroot/dbfpy/dbfpy/dbfpy/memo.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** memo.py 13 Dec 2010 08:48:21 -0000 1.1 --- memo.py 14 Dec 2010 11:00:21 -0000 1.2 *************** *** 1,10 **** """Memo file support. - Note: current implementation works with FPT files. - DBT files (dBASE III+) have version number (03h) - in the 16th (zero-based) byte of the header - and do not have value type/length at start - of data blocks. - """ """History (most recent first): --- 1,4 ---- *************** *** 19,22 **** --- 13,17 ---- import os + import struct class MemoData(str): *************** *** 36,39 **** --- 31,39 ---- type = TYPE_MEMO + def __new__(cls, value, type=TYPE_MEMO): + _obj = super(MemoData, cls).__new__(cls, value) + _obj.type = type + return _obj + class MemoFile(object): *************** *** 67,71 **** """ ! self.isFpt = fpt if isinstance(f, basestring): # a filename --- 67,71 ---- """ ! self.is_fpt = fpt if isinstance(f, basestring): # a filename *************** *** 81,101 **** self.stream.seek(0) if new: ! self.tail = 1 ! if self.isFpt: ! self.blocksize = blocksize ! else: self.blocksize = 512 self.stream.write( ! struct.pack(">LH>H", self.tail, 0, self.blocksize) + "\0" * 8 + "\x03" + "\0" * 495) else: ! (self.tail, _zero, self.blocksize) = struct.unpack(">LH>H", self.stream.read(8)) ! if not self.isFpt: # In DBT files, block size is fixed to 512 bytes self.blocksize = 512 @staticmethod ! def fptFileName(name, isFpt=True): """Return Memo file name for given DBF file name --- 81,106 ---- self.stream.seek(0) if new: ! if not self.is_fpt: self.blocksize = 512 + # http://msdn.microsoft.com/en-US/library/d6e1ah7y%28v=VS.80%29.aspx + elif blocksize == 0: + self.blocksize = 1 + elif blocksize <= 32: + self.blocksize = 512 * blocksize + else: + self.blocksize = blocksize + self.tail = 512 / self.blocksize self.stream.write( ! struct.pack(">LHH", self.tail, 0, self.blocksize) + "\0" * 8 + "\x03" + "\0" * 495) else: ! (self.tail, _zero, self.blocksize) = struct.unpack(">LHH", self.stream.read(8)) ! if not self.is_fpt: # In DBT files, block size is fixed to 512 bytes self.blocksize = 512 @staticmethod ! def memoFileName(name, isFpt=True): """Return Memo file name for given DBF file name *************** *** 125,131 **** """ self.stream.seek(self.blocksize * blocknum) ! if self.isFpt: ! (_type, _len) = struct.unpack(">L>L", self.stream.read(8)) if _type == MemoData.TYPE_NULL: _value = '' --- 130,137 ---- """ + print ("SEEK", self.blocksize, blocknum) self.stream.seek(self.blocksize * blocknum) ! if self.is_fpt: ! (_type, _len) = struct.unpack(">LL", self.stream.read(8)) if _type == MemoData.TYPE_NULL: _value = '' *************** *** 139,143 **** _value += self.stream.read(self.blocksize) _value = _value[:_value.find(self.EOT)] ! return (_value, _type) def write(self, value): --- 145,149 ---- _value += self.stream.read(self.blocksize) _value = _value[:_value.find(self.EOT)] ! return MemoData(_value, _type) def write(self, value): *************** *** 150,163 **** _rv = self.tail self.stream.seek(self.blocksize * _rv) ! _length = len(value) + 2 ! if self.isFpt: ! _length += 8 _type = getattr(value, "type", MemoData.TYPE_MEMO) ! self.stream.write(struct.pack(">L>L", _type, len(value)) ! + value + self.EOT) else: self.stream.write(value + self.EOT) ! self.tail += ceil(float(_length) / self.blocksize) return _rv # vim: et sts=4 sw=4 : --- 156,177 ---- _rv = self.tail self.stream.seek(self.blocksize * _rv) ! if self.is_fpt: ! _length = len(value) + 8 _type = getattr(value, "type", MemoData.TYPE_MEMO) ! self.stream.write(struct.pack(">LL", _type, len(value)) + value) else: + _length = len(value) + 2 self.stream.write(value + self.EOT) ! #_cnt = int(math.ceil(float(_length) / self.blocksize)) ! _cnt = (_length + self.blocksize - 1) / self.blocksize ! self.stream.write("\0" * (_cnt * self.blocksize - _length)) ! self.tail += _cnt ! self.stream.seek(0) ! self.stream.write(struct.pack(">L", self.tail)) return _rv + def flush(self): + """Flush data to the associated stream.""" + self.stream.flush() + # vim: et sts=4 sw=4 : |