/*
* Copyright (c) 1998-2011 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.sql;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.SQLException;
import com.caucho.db.blob.BlobInputStream;
import com.caucho.db.block.BlockStore;
import com.caucho.db.table.TableIterator;
import com.caucho.db.table.Column.ColumnType;
import com.caucho.sql.SQLExceptionWrapper;
import com.caucho.util.CharBuffer;
import com.caucho.util.FreeList;
import com.caucho.util.IntArray;
import com.caucho.util.L10N;
import com.caucho.util.QDate;
import com.caucho.vfs.TempBuffer;
public class SelectCursor {
private static final L10N L = new L10N(SelectCursor.class);
private static final FreeList<SelectCursor> _freeList
= new FreeList<SelectCursor>(32);
private static final int SIZE = TempBuffer.SIZE;
private CharBuffer _cb = new CharBuffer();
private byte []_blob = new byte[128];
private Expr []_exprs;
private BlockStore []_stores = new BlockStore[32];
private TableIterator []_rows = new TableIterator[16];
private int _row;
private int _offset;
private int _rowOffset;
private int _columnOffset;
private int _column;
private boolean _wasNull;
private boolean _isStart;
private SelectQuery _query;
private QueryContext _context;
public SelectCursor(Expr []exprs,
SelectQuery query,
QueryContext context)
{
init(exprs);
_query = query;
_context = context;
}
/**
* Initialize the iterator.
*/
TableIterator []initRows(FromItem []fromItems)
{
if (_rows.length < fromItems.length)
_rows = new TableIterator[fromItems.length];
for (int i = 0; i < fromItems.length; i++) {
if (_rows[i] == null)
_rows[i] = new TableIterator();
_rows[i].init(fromItems[i].getTable());
}
return _rows;
}
TableIterator []getRows()
{
return _rows;
}
/**
* Initialize based on the exprs.
*/
private void init(Expr []exprs)
{
_exprs = exprs;
if (_stores.length < _exprs.length) {
_stores = new BlockStore[exprs.length];
}
for (int i = 0; i < exprs.length; i++)
_stores[i] = exprs[i].getTable();
}
void initRead()
throws SQLException
{
_row = -1;
_offset = 0;
_column = 0;
_rowOffset = 0;
_columnOffset = 0;
}
/**
* Returns the expressions.
*/
public Expr []getExprs()
{
return _exprs;
}
/**
* Returns the column index with the given name.
*/
public int findColumnIndex(String name)
throws SQLException
{
for (int i = 0; i < _exprs.length; i++) {
if (_exprs[i].getName().equals(name))
return i + 1;
}
throw new SQLException(L.l("column `{0}' does not exist.", name));
}
public boolean next()
throws SQLException
{
if (! _isStart) {
_isStart = true;
return true;
}
return _query.nextCursor(_rows, _context, _context.getTransaction());
}
public String getString(int i)
throws SQLException
{
return _exprs[i].evalString(_context);
}
public void updateString(int i, String value)
throws SQLException
{
_exprs[i].updateString(_context, value);
}
public int getInt(int i)
throws SQLException
{
return (int) _exprs[i].evalLong(_context);
}
public void updateInt(int i, int value)
throws SQLException
{
_exprs[i].updateLong(_context, value);
}
public long getLong(int i)
throws SQLException
{
return _exprs[i].evalLong(_context);
}
public void updateLong(int i, long value)
throws SQLException
{
_exprs[i].updateLong(_context, value);
}
public double getDouble(int i)
throws SQLException
{
return _exprs[i].evalDouble(_context);
}
public void updateDouble(int i, double value)
throws SQLException
{
_exprs[i].updateDouble(_context, value);
}
public byte []getBytes(int i)
throws SQLException
{
return _exprs[i].evalBytes(_context);
}
public void updateRow()
{
}
public void close()
{
}
}