protected void updateRecord(T record, PersistenceWindow window) { int id = record.getId(); Buffer buffer = window.getOffsettedBuffer(id); if (record.inUse()) { buffer.put(Record.IN_USE.byteValue()); writeRecord(record, buffer); } else { buffer.put(Record.NOT_IN_USE.byteValue()); if (!isInRecoveryMode()) { freeId(id); } } }
protected T getRecord(int id, PersistenceWindow window, boolean force) { Buffer buffer = window.getOffsettedBuffer(id); byte inUseByte = buffer.get(); boolean inUse = (inUseByte == Record.IN_USE.byteValue()); if (!inUse && !force) { throw new InvalidRecordException("Record[" + id + "] not in use"); } if (inUseByte != Record.IN_USE.byteValue() && inUseByte != Record.NOT_IN_USE.byteValue()) { throw new InvalidRecordException("Record[" + id + "] unknown in use flag[" + inUse + "]"); } T record = newRecord(id); record.setInUse(inUse); readRecord(record, buffer); return record; }