/* * 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 SoftwareFoundation, Inc. * 59 Temple Place, Suite 330 * Boston, MA 02111-1307 USA * * @author Scott Ferguson */ package com.caucho.eswrap.java.sql; import com.caucho.es.Call; import com.caucho.es.ESBase; import com.caucho.es.Global; import com.caucho.util.NullIterator; import java.io.InputStream; import java.math.BigDecimal; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Types; import java.util.Iterator; import java.util.logging.Logger; public class ResultSetEcmaWrap { private static final Logger log = Logger.getLogger(ResultSet.class.getName()); public static String getString(ResultSet rs, ESBase col) throws Throwable { ESBase key = col.toPrimitive(); if (key.isString()) return rs.getString(key.toString()); else return rs.getString((int) key.toNum()); } public static boolean getBoolean(ResultSet rs, ESBase col) throws Throwable { ESBase key = col.toPrimitive(); if (key.isString()) return rs.getBoolean(key.toString()); else return rs.getBoolean((int) key.toNum()); } public static byte getByte(ResultSet rs, ESBase col) throws Throwable { ESBase key = col.toPrimitive(); if (key.isString()) return rs.getByte(key.toString()); else return rs.getByte((int) key.toNum()); } public static short getShort(ResultSet rs, ESBase col) throws Throwable { ESBase key = col.toPrimitive(); if (key.isString()) return rs.getShort(key.toString()); else return rs.getShort((int) key.toNum()); } public static int getInt(ResultSet rs, ESBase col) throws Throwable { ESBase key = col.toPrimitive(); if (key.isString()) return rs.getInt(key.toString()); else return rs.getInt((int) key.toNum()); } public static long getLong(ResultSet rs, ESBase col) throws Throwable { ESBase key = col.toPrimitive(); if (key.isString()) return rs.getLong(key.toString()); else return rs.getLong((int) key.toNum()); } public static float getFloat(ResultSet rs, ESBase col) throws Throwable { ESBase key = col.toPrimitive(); if (key.isString()) return rs.getFloat(key.toString()); else return rs.getFloat((int) key.toNum()); } public static double getDouble(ResultSet rs, ESBase col) throws Throwable { ESBase key = col.toPrimitive(); if (key.isString()) return rs.getDouble(key.toString()); else return rs.getDouble((int) key.toNum()); } public static BigDecimal getBigDecimal(ResultSet rs, ESBase col, int i) throws Throwable { ESBase key = col.toPrimitive(); if (key.isString()) return rs.getBigDecimal(key.toString(), i); else return rs.getBigDecimal((int) key.toNum(), i); } public static byte[] getBytes(ResultSet rs, ESBase col) throws Throwable { ESBase key = col.toPrimitive(); if (key.isString()) return rs.getBytes(key.toString()); else return rs.getBytes((int) key.toNum()); } public static ESBase getDate(ResultSet rs, Call call, int len) throws Throwable { ESBase col = call.getArg(0, len); ESBase key = col.toPrimitive(); java.util.Date date; if (key.isString()) date = rs.getDate(key.toString()); else date = rs.getDate((int) key.toNum()); return call.createDate(date.getTime()); } public static ESBase getTime(ResultSet rs, Call call, int len) throws Throwable { ESBase col = call.getArg(0, len); ESBase key = col.toPrimitive(); java.util.Date date; if (key.isString()) date = rs.getTime(key.toString()); else date = rs.getTime((int) key.toNum()); return call.createDate(date.getTime()); } public static ESBase getTimestamp(ResultSet rs, Call call, int len) throws Throwable { ESBase col = call.getArg(0, len); ESBase key = col.toPrimitive(); java.util.Date date; if (key.isString()) date = rs.getTimestamp(key.toString()); else date = rs.getTimestamp((int) key.toNum()); return call.createDate(date.getTime()); } public static InputStream getAsciiStream(ResultSet rs, ESBase col) throws Throwable { ESBase key = col.toPrimitive(); if (key.isString()) return rs.getAsciiStream(key.toString()); else return rs.getAsciiStream((int) key.toNum()); } public static InputStream getUnicodeStream(ResultSet rs, ESBase col) throws Throwable { ESBase key = col.toPrimitive(); if (key.isString()) return rs.getUnicodeStream(key.toString()); else return rs.getUnicodeStream((int) key.toNum()); } public static InputStream getBinaryStream(ResultSet rs, ESBase col) throws Throwable { ESBase key = col.toPrimitive(); if (key.isString()) return rs.getBinaryStream(key.toString()); else return rs.getBinaryStream((int) key.toNum()); } public static Object getObject(ResultSet rs, ESBase col) throws Throwable { ESBase key = col.toPrimitive(); if (key.isString()) return rs.getObject(key.toString()); else return rs.getObject((int) key.toNum()); } public static String getByname(ResultSet rs, String string) throws SQLException { return rs.getString(string); } public static Object get(ResultSet rs, String key) throws Throwable { return get(rs, rs.findColumn(key)); } public static Object get(ResultSet rs, int index) throws Throwable { ResultSetMetaData md = rs.getMetaData(); switch (md.getColumnType(index)) { case Types.BIT: return new Boolean(rs.getInt(index) == 1); case Types.TINYINT: case Types.SMALLINT: case Types.INTEGER: case Types.FLOAT: case Types.REAL: case Types.DOUBLE: return new Double(rs.getDouble(index)); case Types.CHAR: case Types.VARCHAR: return rs.getString(index); case Types.NULL: return null; // XXX: the following are bogus case Types.BIGINT: case Types.NUMERIC: case Types.DECIMAL: return rs.getString(index); case Types.LONGVARCHAR: return rs.getAsciiStream(index); case Types.DATE: return rs.getDate(index); case Types.TIME: return rs.getTime(index); case Types.TIMESTAMP: return rs.getTimestamp(index); case Types.BINARY: case Types.VARBINARY: return rs.getBytes(index); case Types.LONGVARBINARY: return rs.getBinaryStream(index); default: return rs.getString(index); } } public static Object toObject(ResultSet rs, Call call, int length) throws Throwable { ResultSetMetaData md; md = rs.getMetaData(); Global global = Global.getGlobalProto(); ESBase obj; if (length > 0) obj = call.getArg(0, length); else obj = global.createObject(); int nColumns = md.getColumnCount(); for (int i = 0; i < nColumns; i++) { String name = md.getColumnName(i + 1); Object value = get(rs, i + 1); obj.setProperty(name, global.wrap(value)); } return obj; } public static Iterator keys(ResultSet rs) { try { return new ResultSetIterator(rs); } catch (Exception e) { return NullIterator.create(); } } static class ResultSetIterator implements Iterator { ResultSet rs; ResultSetMetaData md; int nColumns; int i; public boolean hasNext() { return i < nColumns; } public Object next() { try { return md.getColumnName(++i); } catch (SQLException e) { return null; } } public void remove() { throw new UnsupportedOperationException(); } ResultSetIterator(ResultSet rs) throws SQLException { this.rs = rs; this.md = rs.getMetaData(); nColumns = md.getColumnCount(); } } private ResultSetEcmaWrap() { } }