package org.basex.io.out; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import org.basex.data.MetaData; import org.basex.io.IO; import org.basex.util.list.IntList; /** * This class allows a blockwise output of the database table. * * @author BaseX Team 2005-12, BSD License * @author Christian Gruen * @author Tim Petrowsky */ public final class TableOutput extends OutputStream { /** Buffer. */ private final byte[] buffer = new byte[IO.BLOCKSIZE]; /** Index entries. */ private final IntList firstPres = new IntList(); /** Index entries. */ private final IntList blocks = new IntList(); /** The underlying output stream. */ private final OutputStream os; /** Meta data. */ private final MetaData meta; /** Current filename. */ private final String file; /** Position inside buffer. */ private int pos; /** Block count. */ private int bcount; /** First pre value of current block. */ private int fpre; /** * Initializes the output. * The database suffix will be added to all filenames. * @param md meta data * @param fn the file to be written to * @throws IOException I/O exception */ public TableOutput(final MetaData md, final String fn) throws IOException { os = new FileOutputStream(md.dbfile(fn).file()); meta = md; file = fn; } @Override public void write(final int b) throws IOException { if(pos == IO.BLOCKSIZE) flush(); buffer[pos++] = (byte) b; } @Override public void flush() throws IOException { if(pos == 0) return; os.write(buffer); firstPres.add(fpre); blocks.add(bcount++); fpre += pos >>> IO.NODEPOWER; pos = 0; } @Override public void close() throws IOException { flush(); os.close(); DataOutput dt = null; try { dt = new DataOutput(meta.dbfile(file + 'i')); dt.writeNum(bcount); dt.writeNum(bcount); dt.writeNums(firstPres.toArray()); dt.writeNums(blocks.toArray()); } finally { if(dt != null) try { dt.close(); } catch(final IOException ex) { } } } }