package org.wonderdb.types.record; import java.util.ArrayList; import java.util.List; import java.util.Set; import org.wonderdb.block.Block; import org.wonderdb.block.BlockManager; import org.wonderdb.block.ListBlock; import org.wonderdb.serialize.record.RecordSerializer; import org.wonderdb.types.ColumnSerializerMetadata; import org.wonderdb.types.DBType; import org.wonderdb.types.ExtendedColumn; import org.wonderdb.types.RecordId; import org.wonderdb.types.TableRecordMetadata; public class RecordManager { private static RecordManager instance = new RecordManager(); private RecordManager() { } public static RecordManager getInstance() { return instance; } public BlockAndRecord getTableRecordAndLock(RecordId recordId, List<Integer> columnIds, TableRecordMetadata meta, Set<Object> pinnedBlocks) { ListBlock block = (ListBlock) BlockManager.getInstance().getBlock(recordId.getPtr(), meta, pinnedBlocks); block.readLock(); try { TableRecord record = (TableRecord) block.getRecord(recordId.getPosn()); if (record == null) { return null; } int currentResourceCount = record.getResourceCount(); if (record instanceof ExtendedTableRecord && (record.getColumnMap() == null || record.getColumnMap().size() == 0)) { RecordSerializer.getInstance().readFull(record, meta); } if (columnIds == null) { columnIds = new ArrayList<Integer>(meta.getColumnIdTypeMap().keySet()); } for (int i = 0; i < columnIds.size(); i++) { int columnId = columnIds.get(i); DBType column = record.getColumnMap().get(columnId); if (column instanceof ExtendedColumn) { ((ExtendedColumn) column).getValue(new ColumnSerializerMetadata(meta.getColumnIdTypeMap().get(columnId))); } } BlockAndRecord bar = new BlockAndRecord(); bar.block = block; if (record != null) { bar.record = (TableRecord) record.copyOf(); } block.adjustResourceCount(record.getResourceCount()-currentResourceCount); return bar; } finally { if (block != null) { block.readUnlock(); } } } public static class BlockAndRecord { public Block block = null; public Record record = null; } }