/* -*- tab-width: 4 -*- * * Electric(tm) VLSI Design System * * File: BTree.java * * Copyright (c) 2009 Sun Microsystems and Static Free Software * * Electric(tm) is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * Electric(tm) is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Electric(tm); see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, * Boston, Mass 02111-1307, USA. */ package com.sun.electric.database.geometry.btree; import java.io.*; /** * PageStorage implemented via a RandomAccessFile. No * PageStorage(RandomAccessFile) constructor is provided because the * on-disk format is not yet stable. */ public class FilePageStorage extends PageStorage { /** * Create a new FilePageStorage; no PageStorage(RandomAccessFile) * constructor is provided because the on-disk format is not yet * stable. */ public static FilePageStorage create() { return new FilePageStorage(); } // just a guess; should be some multiple of the system block size private static final int BLOCK_SIZE = 4096 * 4; ////////////////////////////////////////////////////////////////////////////// private RandomAccessFile raf; private int numpages; public synchronized int getNumPages() { return numpages; } private FilePageStorage() { super(BLOCK_SIZE); this.raf = null; this.numpages = 0; } /** private because the file format is not yet finalized */ private FilePageStorage(RandomAccessFile raf) { super(BLOCK_SIZE); try { this.raf = raf; numpages = (int)(raf.length() % (long)getPageSize()); } catch (IOException e) { throw new RuntimeException(e); } } public synchronized int createPage() { if (raf == null) try { // FEATURE: consider "rws" or "rwd" this.raf = new RandomAccessFile(File.createTempFile("pagestorage", ".ebtree"), "rw"); } catch (Exception e) { throw new RuntimeException(e); } // note, any pages created but not written will vanish when the file is closed return numpages++; } public void writePage(int pageid, byte[] buf, int ofs) { try { raf.seek(pageid * getPageSize()); raf.write(buf, ofs, getPageSize()); } catch (IOException e) { throw new RuntimeException(e); } } public void readPage(int pageid, byte[] buf, int ofs) { try { raf.seek(pageid * getPageSize()); raf.readFully(buf, ofs, getPageSize()); } catch (IOException e) { throw new RuntimeException(e); } } public void fsync(int pageid) { // FIXME: ugly fsync(); } public void fsync() { // do nothing because we currently make no guarantees about when things hit the disk } public synchronized void close() { } }