validate method
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);
}