tableiterator.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 460 行

JAVA
460
字号
/* * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source 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 2 of the License, or * (at your option) any later version. * * Resin Open Source 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, or any warranty * of NON-INFRINGEMENT.  See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * *   Free Software Foundation, Inc. *   59 Temple Place, Suite 330 *   Boston, MA 02111-1307  USA * * @author Scott Ferguson */package com.caucho.db.table;import com.caucho.db.sql.QueryContext;import com.caucho.db.sql.SelectResult;import com.caucho.db.store.Block;import com.caucho.db.store.Store;import com.caucho.db.store.Transaction;import com.caucho.util.L10N;import java.io.IOException;import java.sql.SQLException;/** * Iterates over a table's rows. */public class TableIterator {  private static final L10N L = new L10N(TableIterator.class);    private final static byte []_nullBuffer = new byte[256];    private Table _table;  private Column []_columns;    private Transaction _xa;  private QueryContext _queryContext;  private long _blockId;  private int _rowLength;  private int _rowEnd;  private int _rowOffset;  private Block _block;  private byte []_buffer;  public TableIterator()  {  }  TableIterator(Table table)  {    init(table);  }  public void init(Table table)  {    _table = table;        if (table.getId() == 0) {      throw new IllegalStateException(L.l("iterating with closed table."));    }          _columns = table.getColumns();    _rowLength = table.getRowLength();    _rowEnd = table.getRowEnd();    _rowOffset = _rowEnd;    _blockId = 0;  }  /**   * Returns the table of the iterator.   */  public Table getTable()  {    return _table;  }  /**   * Returns the current block id of the iterator.   */  public final long getBlockId()  {    return _blockId;  }  /**   * Sets the current block id of the iterator.   */  public final void setBlockId(long blockId)  {    _blockId = blockId;  }  /**   * Returns the current address.   */  public final long getRowAddress()  {    return _table.blockIdToAddress(_blockId) + _rowOffset;  }  /**   * Returns the current row offset of the iterator.   */  public final int getRowOffset()  {    return _rowOffset;  }  /**   * Sets the current row offset of the iterator.   */  public final void setRowOffset(int rowOffset)  {    _rowOffset = rowOffset;  }  /**   * Gets the current block.   */  public final byte []getBuffer()  {    return _buffer;  }  /**   * Returns the transaction for the iterator.   */  public Transaction getTransaction()  {    return _xa;  }  /**   * Returns the query context for the iterator.   */  public QueryContext getQueryContext()  {    return _queryContext;  }  public void init(QueryContext queryContext)    throws SQLException  {    init(queryContext.getTransaction());    _queryContext = queryContext;  }  public void init(Transaction xa)    throws SQLException  {    Block block = _block;    _block = null;    _buffer = null;    if (block != null)      block.free();        _blockId = 0;    _rowOffset = Integer.MAX_VALUE / 2;    _queryContext = null;    _xa = xa;    // XXX:    /*    if (! _xa.isAutoCommit())      _xa.lockRead(_table.getLock());    */  }  public void initRow()    throws IOException  {    _rowOffset = -_rowLength;  }	     public void prevRow()  {    _rowOffset -= _rowLength;  }  /**   * Sets the row.   */  void setRow(Block block, int rowOffset)  {    _block = block;    _buffer = block.getBuffer();    _blockId = block.getBlockId();    _rowOffset = rowOffset;  }  public Block getBlock()  {    return _block;  }  /**   * Returns the next tuple in the current row.   *   * @return true if a tuple is found,   * or false if the block has no more tuples   */  public boolean nextRow()    throws IOException  {    int rowOffset = _rowOffset;    int rowLength = _rowLength;    int rowEnd = _rowEnd;    byte []buffer = _buffer;    rowOffset += rowLength;    for (; rowOffset < rowEnd; rowOffset += rowLength) {      if ((buffer[rowOffset] & Table.ROW_VALID) != 0) {	_rowOffset = rowOffset;	return true;      }    }    _rowOffset = rowOffset;    return false;  }  /**   * Returns the next row.   */  public boolean next()    throws IOException  {    do {      if (nextRow())	return true;    } while (nextBlock());    return false;  }  /**   * Returns the following block.   */  public boolean nextBlock()    throws IOException  {    byte []buffer = _buffer;    Block block = _block;    _block = null;    _buffer = null;    if (block != null)      block.free();    _blockId = _table.firstRow(_blockId + Table.BLOCK_SIZE);    if (_blockId < 0) {      return false;    }    block = _xa.readBlock(_table, _blockId);    buffer = block.getBuffer();    _block = block;    _buffer = buffer;    _rowOffset = 0;    return true;  }  /**   * Sets the next row.   */  public void setRow(long rowAddr)    throws IOException  {    long blockId = _table.addressToBlockId(rowAddr);    if (blockId != _blockId) {      _blockId = blockId;          Block block = _block;      _block = null;      _buffer = null;      if (block != null)	block.free();      _block = _xa.readBlock(_table, _blockId);      _buffer = _block.getBuffer();    }        _rowOffset = (int) (rowAddr & Store.BLOCK_OFFSET_MASK);  }  /**   * Sets the next row.   */  public void initNullRow()    throws IOException  {    Block block = _block;    _block = null;    _buffer = null;    if (block != null)      block.free();    _rowOffset = 0;    _buffer = _nullBuffer;  }  /**   * Returns true for the null for (for OUTER JOINs)   */  public boolean isNullRow()  {    return _buffer == _nullBuffer;  }  /**   * Returns true if the column is null.   */  public boolean isNull(Column column)    throws SQLException  {    return column.isNull(_buffer, _rowOffset);  }  /**   * Returns the string for the column at the given index.   */  public String getString(Column column)    throws SQLException  {    return column.getString(_buffer, _rowOffset);  }  /**   * Returns the column's value as an integer   *   * @param index column index in the row   *   * @return the integer value   */  public int getInteger(Column column)    throws SQLException  {    return column.getInteger(_buffer, _rowOffset);  }  /**   * Returns the column's long value.   *   * @param index column index in the row   *   * @return the long value   */  public long getLong(Column column)    throws SQLException  {    return column.getLong(_buffer, _rowOffset);  }  /**   * Returns the column's double value.   *   * @param index column index in the row   *   * @return the double value   */  public double getDouble(Column column)    throws SQLException  {    return column.getDouble(_buffer, _rowOffset);  }  public boolean isEqual(Column column, byte []matchBuffer)    throws SQLException  {    return column.isEqual(_buffer, _rowOffset,			  matchBuffer, 0, matchBuffer.length);  }  public boolean isEqual(Column column, byte []matchBuffer, int matchLength)    throws SQLException  {    return column.isEqual(_buffer, _rowOffset,			  matchBuffer, 0, matchLength);  }  public boolean isEqual(Column column, String string)    throws SQLException  {    return column.isEqual(_buffer, _rowOffset, string);  }  /**   * Evaluates the row to the result.   */  public int getBuffer(Column column, byte []buffer, int offset)    throws SQLException  {    return column.evalToBuffer(_buffer, _rowOffset, buffer, offset);  }  /**   * Evaluates the row to the result.   */  public void evalToResult(Column column, SelectResult result)    throws SQLException  {    column.evalToResult(_buffer, _rowOffset, result);  }  public void delete()    throws SQLException  {    setDirty();    _table.delete(_xa, _block, _buffer, _rowOffset);  }    public void setDirty()    throws SQLException  {    _xa.addUpdateBlock(_block);    _block.setDirty(getRowOffset(), getRowOffset() + _rowLength);  }  public void free()  {    Block block = _block;    _block = null;    if (block != null)      block.free();  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?