validate method

PageValidation validate()

Implementation

PageValidation validate() {
  if (magic != PageConst.magic) {
    return PageValidation(PageValStatus.badMagic);
  }
  if (storedId != pageId) {
    return PageValidation(PageValStatus.idMismatch);
  }
  // All-zero beyond header → uninitialized
  bool allZero = true;
  for (int i = PageConst.headerSize; i < PageConst.pageSize && allZero; i++) {
    if (_buf[i] != 0) allZero = false;
  }
  if (allZero && slotCount == 0) {
    return PageValidation(PageValStatus.uninitialized);
  }
  // Verify checksum
  final stored = checksum;
  _recomputeChecksum(); // temporarily recompute
  // restore? no — we just recomputed into the buffer, so stored == fresh now
  // We need to compare before recomputing. Let's compute separately:
  // Reset checksum field to 0 for computation
  _bd.setUint32(28, 0, Endian.little);
  int crc = 0xFFFFFFFF;
  for (int i = 0; i < 28; i++) {
    crc = PageCrc32._t[(crc ^ _buf[i]) & 0xFF] ^ (crc >>> 8);
  }
  for (int i = 0; i < slotCount; i++) {
    final off = _slotTupleOffset(i);
    final len = _slotTupleLength(i);
    for (int j = off; j < off + len; j++) {
      crc = PageCrc32._t[(crc ^ _buf[j]) & 0xFF] ^ (crc >>> 8);
    }
  }
  crc = (crc ^ 0xFFFFFFFF) & 0xFFFFFFFF;
  // Restore
  _bd.setUint32(28, stored, Endian.little);
  if (crc != stored) return PageValidation(PageValStatus.checksumFail);
  return PageValidation(PageValStatus.ok);
}