?? simpleresultset.java
字號:
/*
* Copyright 2004-2008 H2 Group. Licensed under the H2 License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.tools;
import java.io.InputStream;
import java.io.Reader;
import java.math.BigDecimal;
import java.net.URL;
import java.sql.Array;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.Date;
import java.sql.Ref;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.SQLWarning;
import java.sql.Statement;
import java.sql.Time;
import java.sql.Timestamp;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Map;
//#ifdef JDK16
/*
import java.sql.NClob;
import java.sql.RowId;
import java.sql.SQLXML;
*/
//#endif
/**
* This class is a simple result set and meta data implementation.
* It can be used in Java functions that return a result set.
* Only the most basic methods are implemented, the others throw an exception.
* This implementation is standalone, and only relies on standard classes.
* It can be extended easily if required.
*
* An application can create a result set using the following code:
*
* <pre>
* SimpleResultSet rs = new SimpleResultSet();
* rs.addColumn("ID", Types.INTEGER, 10, 0);
* rs.addColumn("NAME", Types.VARCHAR, 255, 0);
* rs.addRow(new Object[] { new Integer(0), "Hello" });
* rs.addRow(new Object[] { new Integer(1), "World" });
* </pre>
*
*/
public class SimpleResultSet implements ResultSet, ResultSetMetaData {
private ArrayList rows;
private Object[] currentRow;
private int rowId = -1;
private boolean wasNull;
private SimpleRowSource source;
private ArrayList columns = new ArrayList();
private static class Column {
String name;
int sqlType;
int precision;
int scale;
}
/**
* A simple array implementation,
* backed by an object array
*/
private static class SimpleArray implements Array {
private Object[] value;
private SimpleArray(Object[] value) {
this.value = value;
}
/**
* Get the object array.
*
* @return the object array
*/
public Object getArray() throws SQLException {
return value;
}
/**
* INTERNAL
*/
public Object getArray(Map map) throws SQLException {
throw getUnsupportedException();
}
/**
* INTERNAL
*/
public Object getArray(long index, int count) throws SQLException {
throw getUnsupportedException();
}
/**
* INTERNAL
*/
public Object getArray(long index, int count, Map map) throws SQLException {
throw getUnsupportedException();
}
/**
* Get the base type of this array.
*
* @return Types.NULL
*/
public int getBaseType() throws SQLException {
return Types.NULL;
}
/**
* Get the base type name of this array.
*
* @return "NULL"
*/
public String getBaseTypeName() throws SQLException {
return "NULL";
}
/**
* INTERNAL
*/
public ResultSet getResultSet() throws SQLException {
throw getUnsupportedException();
}
/**
* INTERNAL
*/
public ResultSet getResultSet(Map map) throws SQLException {
throw getUnsupportedException();
}
/**
* INTERNAL
*/
public ResultSet getResultSet(long index, int count) throws SQLException {
throw getUnsupportedException();
}
/**
* INTERNAL
*/
public ResultSet getResultSet(long index, int count, Map map) throws SQLException {
throw getUnsupportedException();
}
/**
* INTERNAL
*/
public void free() throws SQLException {
}
}
/**
* This constructor is used if the result set is later populated with addRow.
*/
public SimpleResultSet() {
rows = new ArrayList();
}
/**
* This constructor is used if the result set should retrieve the rows using
* the specified row source object.
*
* @param source the row source
*/
public SimpleResultSet(SimpleRowSource source) {
this.source = source;
}
/**
* Adds a column to the result set.
*
* @param name null is replaced with C1, C2,...
* @param sqlType the value returned in getColumnType(..) (ignored internally)
* @param precision the precision
* @param scale the scale
* @throws SQLException
*/
public void addColumn(String name, int sqlType, int precision, int scale) throws SQLException {
if (rows != null && rows.size() > 0) {
throw new SQLException("Cannot add a column after adding rows", "21S02");
}
if (name == null) {
name = "C" + (columns.size() + 1);
}
Column column = new Column();
column.name = name;
column.sqlType = sqlType;
column.precision = precision;
column.scale = scale;
columns.add(column);
}
/**
* Add a new row to the result set.
*
* @param row the row as an array of objects
*/
public void addRow(Object[] row) throws SQLException {
if (rows == null) {
throw new SQLException("Cannot add a row when using RowSource", "21S02");
}
rows.add(row);
}
/**
* Returns ResultSet.CONCUR_READ_ONLY.
*
* @return CONCUR_READ_ONLY
*/
public int getConcurrency() throws SQLException {
return ResultSet.CONCUR_READ_ONLY;
}
/**
* Returns ResultSet.FETCH_FORWARD.
*
* @return FETCH_FORWARD
*/
public int getFetchDirection() throws SQLException {
return ResultSet.FETCH_FORWARD;
}
/**
* Returns 0.
*
* @return 0
*/
public int getFetchSize() throws SQLException {
return 0;
}
/**
* Returns the row number (1, 2,...) or 0 for no row.
*
* @return 0
*/
public int getRow() throws SQLException {
return rowId + 1;
}
/**
* Returns ResultSet.TYPE_FORWARD_ONLY.
*
* @return TYPE_FORWARD_ONLY
*/
public int getType() throws SQLException {
return ResultSet.TYPE_FORWARD_ONLY;
}
/**
* Closes the result set and releases the resources.
*/
public void close() throws SQLException {
currentRow = null;
rows = null;
columns = null;
rowId = -1;
if (source != null) {
source.close();
source = null;
}
}
/**
* Moves the cursor to the next row of the result set.
*
* @return true if successful, false if there are no more rows
*/
public boolean next() throws SQLException {
if (source != null) {
rowId++;
currentRow = source.readRow();
if (currentRow != null) {
return true;
}
} else if (rows != null && rowId < rows.size()) {
rowId++;
if (rowId < rows.size()) {
currentRow = (Object[]) rows.get(rowId);
return true;
}
}
close();
return false;
}
/**
* Moves the current position to before the first row, that means resets the
* result set.
*
* @throws SQLException is this method is not supported
*/
public void beforeFirst() throws SQLException {
rowId = -1;
if (source != null) {
source.reset();
}
}
/**
* Returns whether the last column accessed was null.
*
* @return true if the last column accessed was null
*/
public boolean wasNull() throws SQLException {
return wasNull;
}
/**
* Returns the value as a byte.
*
* @return the value
*/
public byte getByte(int columnIndex) throws SQLException {
Object o = get(columnIndex);
if (o != null && !(o instanceof Number)) {
o = Byte.decode(o.toString());
}
return o == null ? 0 : ((Number) o).byteValue();
}
/**
* Returns the value as an double.
*
* @return the value
*/
public double getDouble(int columnIndex) throws SQLException {
Object o = get(columnIndex);
if (o != null && !(o instanceof Number)) {
return Double.parseDouble(o.toString());
}
return o == null ? 0 : ((Number) o).doubleValue();
}
/**
* Returns the value as a float.
*
* @return the value
*/
public float getFloat(int columnIndex) throws SQLException {
Object o = get(columnIndex);
if (o != null && !(o instanceof Number)) {
return Float.parseFloat(o.toString());
}
return o == null ? 0 : ((Number) o).floatValue();
}
/**
* Returns the value as an int.
*
* @return the value
*/
public int getInt(int columnIndex) throws SQLException {
Object o = get(columnIndex);
if (o != null && !(o instanceof Number)) {
o = Integer.decode(o.toString());
}
return o == null ? 0 : ((Number) o).intValue();
}
/**
* Returns the value as a long.
*
* @return the value
*/
public long getLong(int columnIndex) throws SQLException {
Object o = get(columnIndex);
if (o != null && !(o instanceof Number)) {
o = Long.decode(o.toString());
}
return o == null ? 0 : ((Number) o).longValue();
}
/**
* Returns the value as a short.
*
* @return the value
*/
public short getShort(int columnIndex) throws SQLException {
Object o = get(columnIndex);
if (o != null && !(o instanceof Number)) {
o = Short.decode(o.toString());
}
return o == null ? 0 : ((Number) o).shortValue();
}
/**
* Returns the value as a boolean.
*
* @return the value
*/
public boolean getBoolean(int columnIndex) throws SQLException {
Object o = get(columnIndex);
if (o != null && !(o instanceof Boolean)) {
o = Boolean.valueOf(o.toString());
}
return o == null ? false : ((Boolean) o).booleanValue();
}
/**
* Returns the value as a byte array.
*
* @return the value
*/
public byte[] getBytes(int columnIndex) throws SQLException {
return (byte[]) get(columnIndex);
}
/**
* Returns the value as an Object.
*
* @return the value
*/
public Object getObject(int columnIndex) throws SQLException {
return get(columnIndex);
}
/**
* Returns the value as a String.
*
* @return the value
*/
public String getString(int columnIndex) throws SQLException {
Object o = get(columnIndex);
return o == null ? null : o.toString();
}
/**
* Returns the value as a byte.
*
* @return the value
*/
public byte getByte(String columnName) throws SQLException {
return getByte(findColumn(columnName));
}
/**
* Returns the value as a double.
*
* @return the value
*/
public double getDouble(String columnName) throws SQLException {
return getDouble(findColumn(columnName));
}
/**
* Returns the value as a float.
*
* @return the value
*/
public float getFloat(String columnName) throws SQLException {
return getFloat(findColumn(columnName));
}
/**
* Searches for a specific column in the result set. A case-insensitive
* search is made.
*
* @param columnName the name of the column label
* @return the column index (1,2,...)
* @throws SQLException if the column is not found or if the result set is
* closed
*/
public int findColumn(String columnName) throws SQLException {
for (int i = 0; columnName != null && columns != null && i < columns.size(); i++) {
if (columnName.equalsIgnoreCase(getColumn(i).name)) {
return i + 1;
}
}
throw new SQLException("Column not found: " + columnName, "42S22");
}
/**
* Returns the value as an int.
*
* @return the value
*/
public int getInt(String columnName) throws SQLException {
return getInt(findColumn(columnName));
}
/**
* Returns the value as a long.
*
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -