Esempio n. 1
0
 def try_append(self, item):
     if item.kind == 'content':
         data = [ b'\xdd' ]
         data.append(valuecodecs.make_varuint(len(item.cid)))
         data.append(valuecodecs.make_varuint(len(item.checksum)))
         if item.cid.startswith(item.checksum):
             data.append(item.cid)
         else:
             if not item.checksum.startswith(item.cid):
                 raise InvalidDataError('cid and checksum mismatch')
             data.append(item.checksum)
         data.append(valuecodecs.make_uint32(item.first))
         if hasattr(item, 'last'):
             self._logger.warn('deprecated', 'item.last')
         # The "last" data item in the file is obsoleted, so just
         # fill it with the first seen time instead.
         data.append(valuecodecs.make_uint32(item.first))
         if hasattr(item, 'updates'):
             self._logger.warn('deprecated', 'item.updates')
         data = b''.join(data)
         if (self._blockdatasize is not None and
                 self._datasize + len(data) > self._blockdatasize):
             return False
         self.modified = True
         self._items.append((data, item))
         self._datasize += len(data)
         return True
     raise InvalidDataError('Unknown item type: ' + item.kind)
Esempio n. 2
0
    def try_append(self, item):
        if item.kind == 'directory':
            if item.extra_data:
                data = [ b'\x92' ]
            else:
                data = [ b'\x90' ]
            data.append(valuecodecs.make_varuint(item.dirid))
            data.append(valuecodecs.make_varuint(item.parent))
            data.append(valuecodecs.make_varuint(len(item.name)))
            data.append(item.name)
            if item.extra_data:
                data.append(valuecodecs.make_varuint(item.extra_data))
            data = b''.join(data)
        elif item.kind.startswith('file'):
            if item.kind == 'file':
                if item.extra_data:
                    data = [ b'\x93' ]
                else:
                    data = [ b'\x91' ]
            else:
                data = [ b'\x94' ]
            data.append(valuecodecs.make_varuint(item.parent))
            data.append(valuecodecs.make_varuint(len(item.name)))
            data.append(item.name)
            data.append(valuecodecs.make_varuint(len(item.cid)))
            data.append(item.cid)
            data.append(valuecodecs.make_varuint(item.size))
            year = item.mtime_year
            second = item.mtime_second
            ns = item.mtime_ns
            if year < 1000 or year > 9999:
                raise InvalidDataError(
                    'Unreasonable last-modified year: ' + str(year))
            if second < 0 or second > 31622399:
                # Not checking for December 32 in non-leap years
                raise InvalidDataError(
                    'Unreasonable last-modifed second of year: ' + str(second))
            if ns < 0 or ns > 999999999:
                raise InvalidDataError(
                    'Unreasonable last-modified nanosecond: ' + str(ns))
            mtime = bytes((
                item.mtime_year & 0xff, (item.mtime_year >> 8),
                item.mtime_second & 0xff, (item.mtime_second >> 8) & 0xff,
                (item.mtime_second >> 16) & 0xff,
                ((item.mtime_second >> 17) & 0x80) + (item.mtime_ns & 0x3f),
                (item.mtime_ns >> 6) & 0xff, (item.mtime_ns >> 14) & 0xff,
                item.mtime_ns >> 22))
            data.append(mtime)
            if item.kind != 'file':
                filetypechar = self._filetypechars.get(item.kind)
                if filetypechar is None:
                    raise AssertionError('Unknown file type: ' + item.kind)
                data.append(filetypechar)
            if item.kind != 'file' or item.extra_data:
                data.append(valuecodecs.make_varuint(item.extra_data))
            data = b''.join(data)
        elif item.kind == 'key-value':
            assert b':' not in item.key
            data = [ ]
            data.append(valuecodecs.make_varuint(item.kvid))
            data.append(item.key)
            data.append(b':')
            data.append(item.value)
            data = b''.join(data)
            data = b'\x21' + valuecodecs.make_varuint(len(data)) + data
        elif item.kind == 'extradef':
            data = [ ]
            data.append(valuecodecs.make_varuint(item.xid))
            for kvid in item.kvids:
                data.append(valuecodecs.make_varuint(kvid))
            data = b''.join(data)
            data = b'\x22' + valuecodecs.make_varuint(len(data)) + data
        else:
            raise InvalidDataError('Unknown item type: ' + item.kind)

        if (self._blockdatasize is not None and
                self._datasize + len(data) > self._blockdatasize):
            return False
        self.modified = True
        self._items.append((data, item))
        self._datasize += len(data)
        return True