/* * 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.db.sql; import java.io.InputStream; import com.caucho.db.table.Column; import com.caucho.db.table.Column.ColumnType; import com.caucho.util.QDate; public class Data { private Column _column; private ColumnType _type = ColumnType.NONE; private boolean _booleanData; private String _stringData; private int _intData; private long _longData; private double _doubleData; // private Expr _expr; private InputStream _binaryStream; private int _streamLength; private byte []_bytes; public void clear() { _type = ColumnType.NONE; } public void setColumn(Column column) { _column = column; } public Column getColumn() { return _column; } public ColumnType getType() { return _type; } /** * Returns true for a null value. */ public boolean isNull() { return _type == ColumnType.NONE; } /** * Sets the value as a string. */ public void setString(String value) { if (value == null) _type = ColumnType.NONE; else { _type = ColumnType.VARCHAR; _stringData = value; } } public void setDate(long value) { _type = ColumnType.DATE; _longData = value; } public boolean isBinaryStream() { return _type == ColumnType.BLOB; } /** * Sets the value as a stream. */ public void setBinaryStream(InputStream is, int length) { _type = ColumnType.BLOB; _binaryStream = is; _streamLength = length; } public InputStream getBinaryStream() { switch (_type) { case NONE: return null; case BLOB: return _binaryStream; default: throw new UnsupportedOperationException(String.valueOf(_type)); } } public void setBytes(byte []bytes) { _type = ColumnType.BINARY; _bytes = bytes; } public byte []getBytes() { switch (_type) { case NONE: return null; case BINARY: return _bytes; default: throw new UnsupportedOperationException(_type + " " + toString()); } } /** * Returns the value as a string. */ public String getString() { switch (_type) { case NONE: return null; case BOOLEAN: return _booleanData ? "true" : "false"; case INT: return String.valueOf(_intData); case LONG: return String.valueOf(_longData); case DOUBLE: return String.valueOf(_doubleData); case VARCHAR: return _stringData; case DATE: return QDate.formatISO8601(_longData); case BINARY: { StringBuilder sb = new StringBuilder(); int len = _bytes.length; for (int i = 0; i < len; i++) { sb.append((char) (_bytes[i] & 0xff)); } return sb.toString(); } default: throw new UnsupportedOperationException(String.valueOf(_type)); } } /** * Sets the value as a boolean. */ public void setBoolean(boolean value) { _type = ColumnType.BOOLEAN; _booleanData = value; } /** * Returns the value as a boolean */ public int getBoolean() { switch (_type) { case NONE: return Expr.UNKNOWN; case BOOLEAN: return _booleanData ? Expr.TRUE : Expr.FALSE; case INT: return _intData != 0 ? Expr.TRUE : Expr.FALSE; case LONG: return _longData != 0 ? Expr.TRUE : Expr.FALSE; case DOUBLE: return _doubleData != 0 ? Expr.TRUE : Expr.FALSE; case VARCHAR: return _stringData.equalsIgnoreCase("y") ? Expr.TRUE : Expr.FALSE; default: throw new UnsupportedOperationException(); } } /** * Sets the value as an integer. */ public void setInt(int value) { _type = ColumnType.INT; _intData = value; } /** * Returns the value as an integer. */ public int getInt() { switch (_type) { case NONE: return 0; case BOOLEAN: return _booleanData ? 1 : 0; case INT: return _intData; case LONG: return (int) _longData; case DOUBLE: return (int) _doubleData; case VARCHAR: return Integer.parseInt(_stringData); default: throw new UnsupportedOperationException(); } } /** * Sets the value as a long. */ public void setLong(long value) { _type = ColumnType.LONG; _longData = value; } /** * Returns the value as a long. */ public long getLong() { switch (_type) { case NONE: return 0; case BOOLEAN: return _booleanData ? 1 : 0; case INT: return _intData; case LONG: return _longData; case DOUBLE: return (long) _doubleData; case VARCHAR: return Long.parseLong(_stringData); default: throw new UnsupportedOperationException(); } } /** * Returns the value as a date. */ public long getDate() { switch (_type) { case NONE: return 0; case BOOLEAN: return _booleanData ? 1 : 0; case INT: return _intData; case LONG: return _longData; case DOUBLE: return (long) _doubleData; case VARCHAR: return Long.parseLong(_stringData); default: throw new UnsupportedOperationException(); } } /** * Sets the value as a double. */ public void setDouble(double value) { _type = ColumnType.DOUBLE; _doubleData = value; } /** * Returns the value as a double. */ public double getDouble() { if (_type == null) return 0; switch (_type) { case NONE: return 0; case BOOLEAN: return _booleanData ? 1 : 0; case INT: return _intData; case LONG: return _longData; case DOUBLE: return _doubleData; case VARCHAR: return Double.parseDouble(_stringData); default: throw new UnsupportedOperationException(); } } /** * Returns the value as a double. */ public void copyTo(Data dst) { switch (_type) { case NONE: dst.setString(null); break; case BOOLEAN: dst.setBoolean(_booleanData); break; case INT: dst.setInt(_intData); break; case LONG: dst.setLong(_longData); break; case DOUBLE: dst.setDouble(_doubleData); break; case VARCHAR: dst.setString(_stringData); break; default: throw new UnsupportedOperationException(); } } /* public int evalToBuffer(byte []buffer, int offset) { if (_type == BYTES) { System.arraycopy(_bytes, 0, buffer, offset, _bytes.length); return _bytes.length; } else return evalToBuffer(buffer, offset, _type); } */ /** * Evaluates the expression to a buffer * * @param result the result buffer * * @return the length of the result */ /* private int evalToBuffer(byte []buffer, int offset, int typecode) throws SQLException { if (_type == BYTES) { System.arraycopy(_bytes, 0, buffer, offset, _bytes.length); return _bytes.length; } else if (_type == NULL) { return -1; } else return super.evalToBuffer(context, buffer, offset, typecode); } */ /** * Returns a hash code */ public int hashCode() { switch (_type) { case NONE: return 17; case BOOLEAN: return _booleanData ? 1 : 0; case INT: return _intData; case LONG: return (int) _longData; case DOUBLE: return (int) _doubleData; case VARCHAR: return _stringData.hashCode(); default: return 97; } } /** * Returns the equality test. */ public boolean equals(Object o) { if (this == o) return true; else if (! getClass().equals(o.getClass())) return false; Data data = (Data) o; if (_type != data._type) return false; switch (_type) { case NONE: return false; case BOOLEAN: return _booleanData == data._booleanData; case INT: return _intData == data._intData; case LONG: return _longData == data._longData; case DOUBLE: return _doubleData == data._doubleData; case VARCHAR: return _stringData.equals(data._stringData); default: return false; } } @Override public String toString() { return getClass().getSimpleName() + "[" + getString() + "]"; } }