private void closeIndexResources() throws JasDBStorageException { try { if(channel != null) { BtreeIndexHeader.createHeader(dataBlockFactory.getHeaderBlock(), pageSize, recordCount.get(), keyInfo); persister.close(); dataBlockFactory.close(); this.fileLock.release(); this.channel.close(); this.randomAccess.close(); state = IndexState.CLOSED; closed = true; } } catch(IOException e) { throw new JasDBStorageException("Unable to cleanly close index", e); } }
indexHeader = BtreeIndexHeader.createHeader(headerBlock, pageSize, 0, keyInfo); createNew = true; } else { createNew = false; indexHeader = BtreeIndexHeader.loadAndValidateHeader(headerBlock, keyInfo); recordCount.set(indexHeader.count());
public static IndexHeader loadAndValidateHeader(DataBlock dataBlock, KeyInfo keyInfo) throws JasDBStorageException, IOException { DataBlockHeader dataBlockHeader = dataBlock.getHeader(); int version = dataBlockHeader.getInt(VERSION_HEADER_INDEX); int type = dataBlockHeader.getInt(TYPE_HEADER_INDEX); int pageSize = dataBlockHeader.getInt(PAGE_SIZE_INDEX); long count = dataBlockHeader.getLong(COUNT_INDEX); DataBlockResult<byte[]> keyResult = dataBlock.loadBytes(0); DataBlockResult<byte[]> keyValueResult = dataBlock.loadBytes(keyResult.getNextOffset()); if(Arrays.binarySearch(supportedVersions, version) == -1) { throw new JasDBStorageException("Version of found index is not supported by this version"); } else if(type != BTREE_INDEX_TYPE_ID) { throw new JasDBStorageException("Index type is not supported or invalid"); } else if(!keyInfo.keyAsHeader().equals(new String(keyResult.getValue()))) { throw new JasDBStorageException("Key information in index does not match specification on the storage metadata"); } else if(!keyInfo.valueAsHeader().equals(new String(keyValueResult.getValue()))) { throw new JasDBStorageException("Key information in index does not match specification on the storage metadata"); } else { return new BtreeIndexHeader(version, pageSize, dataBlock.size(), keyInfo, count); } }
public static IndexHeader createHeader(DataBlock headerBlock, int pageSize, long count, KeyInfo keyInfo) throws JasDBStorageException, IOException { String headerInfo = keyInfo.keyAsHeader(); byte[] headerInfoBytes = headerInfo.getBytes(); String valueHeaderInfo = keyInfo.valueAsHeader(); byte[] valueHeaderInfoBytes = valueHeaderInfo.getBytes(); DataBlockHeader dataBlockHeader = headerBlock.getHeader(); dataBlockHeader.putInt(VERSION_HEADER_INDEX, INDEX_VERSION); dataBlockHeader.putInt(TYPE_HEADER_INDEX, BTREE_INDEX_TYPE_ID); dataBlockHeader.putInt(PAGE_SIZE_INDEX, pageSize); dataBlockHeader.putLong(COUNT_INDEX, count); headerBlock.reset(); headerBlock.writeBytes(headerInfoBytes); headerBlock.writeBytes(valueHeaderInfoBytes); headerBlock.flush(); return new BtreeIndexHeader(INDEX_VERSION, pageSize, headerBlock.size(), keyInfo, count); }