def __init__(self, **kwargs): buffer = kwargs.get("buffer", None) self.flags = kwargs.get("flags", b'\x00') self.pageCapacity = kwargs.get("pageCapacity", len(buffer)) self.tupleSize = kwargs.get("tupleSize", None) self.bitmap = kwargs.get("bitmap", None) if buffer == None: raise ValueError( "No backing buffer supplied for SlottedPageHeader") if self.bitmap == None: headerSizeWithoutBitmap = struct.Struct("cHHH").size tupleCapacity = math.floor( (8 * (self.pageCapacity - headerSizeWithoutBitmap)) / (1 + (8 * self.tupleSize))) bString = '0b' + ('0' * tupleCapacity) self.bitmap = BitArray(bString) self.binrepr = struct.Struct("cHHH" + str(math.ceil(len(self.bitmap))) + 's') self.size = self.binrepr.size self.freeSpaceOffset = self.size buffer[0:self.size] = self.pack()
def unpack(cls, buffer): binrepr1 = struct.Struct("cHHH") values1 = binrepr1.unpack_from(buffer) headerSizeWithoutBitmap = binrepr1.size tupleCapacity = math.floor( (8 * (values1[3] - headerSizeWithoutBitmap)) / (1 + (8 * values1[1]))) binrepr2 = struct.Struct("cHHH" + str(math.ceil(tupleCapacity)) + 's') values2 = binrepr2.unpack_from(buffer) bString = '0b' + ('0' * tupleCapacity) bitmap = BitArray(bString) index = 0 for bit in values2[4]: if index >= tupleCapacity: break if bit: bitmap[index] = '0b1' else: bitmap[index] = '0b0' index = index + 1 if len(values2) == 5: return cls(buffer=buffer, flags=values2[0], tupleSize=values2[1], freeSpaceOffset=values2[2], pageCapacity=values2[3], bitmap=bitmap)