/**
* This file is part of Waarp Project.
*
* Copyright 2009, Frederic Bregier, and individual contributors by the @author tags. See the
* COPYRIGHT.txt in the distribution for a full listing of individual contributors.
*
* All Waarp Project 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 3 of
* the License, or (at your option) any later version.
*
* Waarp 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. See the GNU General
* Public License for more details.
*
* You should have received a copy of the GNU General Public License along with Waarp . If not, see
* <http://www.gnu.org/licenses/>.
*/
package org.waarp.common.database.data;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.sql.Date;
import java.sql.Timestamp;
import java.sql.Types;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import org.waarp.common.database.exception.WaarpDatabaseSqlException;
import org.waarp.common.utility.WaarpStringUtils;
/**
* Database Value to help getting and setting value from and to database
*
* @author Frederic Bregier
*
*/
public class DbValue {
/**
* Real value
*/
private Object value;
/**
* Data Type
*/
int type;
/**
* Column name
*/
private String column;
public DbValue(String value) {
this.setValue(value);
type = Types.VARCHAR;
}
public DbValue(String value, boolean LONG) {
this.setValue(value);
type = Types.LONGVARCHAR;
}
public DbValue(boolean value) {
this.setValue(value);
type = Types.BIT;
}
public DbValue(byte value) {
this.setValue(value);
type = Types.TINYINT;
}
public DbValue(short value) {
this.setValue(value);
type = Types.SMALLINT;
}
public DbValue(int value) {
this.setValue(value);
type = Types.INTEGER;
}
public DbValue(long value) {
this.setValue(value);
type = Types.BIGINT;
}
public DbValue(float value) {
this.setValue(value);
type = Types.REAL;
}
public DbValue(double value) {
this.setValue(value);
type = Types.DOUBLE;
}
public DbValue(byte[] value) {
this.setValue(value);
type = Types.VARBINARY;
}
public DbValue(Date value) {
this.setValue(value);
type = Types.DATE;
}
public DbValue(Timestamp value) {
this.setValue(value);
type = Types.TIMESTAMP;
}
public DbValue(java.util.Date value) {
this.setValue(new Timestamp(value.getTime()));
type = Types.TIMESTAMP;
}
public DbValue(String value, String name) {
this.setValue(value);
type = Types.VARCHAR;
setColumn(name);
}
public DbValue(String value, String name, boolean LONG) {
this.setValue(value);
type = Types.LONGVARCHAR;
setColumn(name);
}
public DbValue(boolean value, String name) {
this.setValue(value);
type = Types.BIT;
setColumn(name);
}
public DbValue(byte value, String name) {
this.setValue(value);
type = Types.TINYINT;
setColumn(name);
}
public DbValue(short value, String name) {
this.setValue(value);
type = Types.SMALLINT;
setColumn(name);
}
public DbValue(int value, String name) {
this.setValue(value);
type = Types.INTEGER;
setColumn(name);
}
public DbValue(long value, String name) {
this.setValue(value);
type = Types.BIGINT;
setColumn(name);
}
public DbValue(float value, String name) {
this.setValue(value);
type = Types.REAL;
setColumn(name);
}
public DbValue(double value, String name) {
this.setValue(value);
type = Types.DOUBLE;
setColumn(name);
}
public DbValue(byte[] value, String name) {
this.setValue(value);
type = Types.VARBINARY;
setColumn(name);
}
public DbValue(Date value, String name) {
this.setValue(value);
type = Types.DATE;
setColumn(name);
}
public DbValue(Timestamp value, String name) {
this.setValue(value);
type = Types.TIMESTAMP;
setColumn(name);
}
public DbValue(java.util.Date value, String name) {
this.setValue(new Timestamp(value.getTime()));
type = Types.TIMESTAMP;
setColumn(name);
}
public DbValue(Reader value, String name) {
this.setValue(value);
type = Types.CLOB;
setColumn(name);
}
public DbValue(InputStream value, String name) {
this.setValue(value);
type = Types.BLOB;
setColumn(name);
}
public void setValue(String value) {
this.value = value;
}
public void setValue(boolean value) {
this.value = value;
}
public void setValue(byte value) {
this.value = value;
}
public void setValue(short value) {
this.value = value;
}
public void setValue(int value) {
this.value = value;
}
public void setValue(long value) {
this.value = value;
}
public void setValue(float value) {
this.value = value;
}
public void setValue(double value) {
this.value = value;
}
public void setValue(byte[] value) {
this.value = value;
}
public void setValue(Date value) {
this.value = value;
}
public void setValue(Timestamp value) {
this.value = value;
}
public void setValue(java.util.Date value) {
this.value = new Timestamp(value.getTime());
}
public void setValue(Reader value) {
this.value = value;
}
public void setValue(InputStream value) {
this.value = value;
}
public void setValue(Object value) {
this.value = value;
}
/**
*
* @return the type in full string format
*/
public String getType() {
switch (type) {
case Types.VARCHAR:
return "VARCHAR";
case Types.LONGVARCHAR:
return "LONGVARCHAR";
case Types.BIT:
return "BIT";
case Types.TINYINT:
return "TINYINT";
case Types.SMALLINT:
return "SMALLINT";
case Types.INTEGER:
return "INTEGER";
case Types.BIGINT:
return "BIGINT";
case Types.REAL:
return "REAL";
case Types.DOUBLE:
return "DOUBLE";
case Types.VARBINARY:
return "VARBINARY";
case Types.DATE:
return "DATE";
case Types.TIMESTAMP:
return "TIMESTAMP";
case Types.CLOB:
return "CLOB";
case Types.BLOB:
return "BLOB";
default:
return "UNKNOWN:" + type;
}
}
public Object getValue() throws IllegalAccessError {
switch (type) {
case Types.VARCHAR:
case Types.LONGVARCHAR:
case Types.BIT:
case Types.TINYINT:
case Types.SMALLINT:
case Types.INTEGER:
case Types.BIGINT:
case Types.REAL:
case Types.DOUBLE:
case Types.VARBINARY:
case Types.DATE:
case Types.TIMESTAMP:
case Types.CLOB:
case Types.BLOB:
return value;
default:
throw new IllegalAccessError("Type unknown: " + type);
}
}
public String getValueAsString() throws WaarpDatabaseSqlException {
switch (type) {
case Types.VARCHAR:
case Types.LONGVARCHAR:
return (String) getValue();
case Types.BIT:
return ((Boolean) getValue()).toString();
case Types.TINYINT:
return ((Byte) getValue()).toString();
case Types.SMALLINT:
return ((Short) getValue()).toString();
case Types.INTEGER:
return ((Integer) getValue()).toString();
case Types.BIGINT:
return ((Long) getValue()).toString();
case Types.REAL:
return ((Float) getValue()).toString();
case Types.DOUBLE:
return ((Double) getValue()).toString();
case Types.VARBINARY:
return new String((byte[]) getValue(), WaarpStringUtils.UTF8);
case Types.DATE:
return ((Date) getValue()).toString();
case Types.TIMESTAMP:
return ((Timestamp) getValue()).toString();
case Types.CLOB: {
StringBuilder sBuilder = new StringBuilder();
Reader reader = ((Reader) getValue());
char[] cbuf = new char[4096];
int len;
try {
len = reader.read(cbuf);
while (len > 0) {
sBuilder.append(cbuf, 0, len);
len = reader.read(cbuf);
}
} catch (IOException e) {
throw new WaarpDatabaseSqlException("Error while reading Clob as String", e);
}
return sBuilder.toString();
}
case Types.BLOB: {
StringBuilder sBuilder = new StringBuilder();
Reader reader = ((Reader) getValue());
char[] cbuf = new char[4096];
int len;
try {
len = reader.read(cbuf);
while (len > 0) {
sBuilder.append(cbuf, 0, len);
len = reader.read(cbuf);
}
} catch (IOException e) {
throw new WaarpDatabaseSqlException("Error while reading Clob as String", e);
}
return sBuilder.toString();
}
default:
throw new WaarpDatabaseSqlException("Type unknown: " + type);
}
}
public void setValueFromString(String svalue) throws WaarpDatabaseSqlException {
switch (type) {
case Types.VARCHAR:
case Types.LONGVARCHAR:
setValue(svalue);
break;
case Types.BIT:
setValue(Boolean.parseBoolean(svalue));
break;
case Types.TINYINT:
setValue(Byte.parseByte(svalue));
break;
case Types.SMALLINT:
setValue(Short.parseShort(svalue));
break;
case Types.INTEGER:
setValue(Integer.parseInt(svalue));
break;
case Types.BIGINT:
setValue(Long.parseLong(svalue));
break;
case Types.REAL:
setValue(Float.parseFloat(svalue));
break;
case Types.DOUBLE:
setValue(Double.parseDouble(svalue));
break;
case Types.VARBINARY:
setValue(svalue.getBytes(WaarpStringUtils.UTF8));
break;
case Types.DATE:
try {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
setValue(format.parse(svalue));
} catch (ParseException e) {
try {
setValue(DateFormat.getDateTimeInstance().parse(svalue));
} catch (ParseException e1) {
throw new WaarpDatabaseSqlException("Error in Date: " + svalue, e);
}
}
break;
case Types.TIMESTAMP:
try {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
setValue(new Timestamp(format.parse(svalue).getTime()));
} catch (ParseException e) {
try {
setValue(new Timestamp(DateFormat.getDateTimeInstance().parse(svalue).getTime()));
} catch (ParseException e1) {
throw new WaarpDatabaseSqlException("Error in Timestamp: " + svalue, e);
}
}
break;
case Types.CLOB:
try {
setValue(new InputStreamReader(new FileInputStream(svalue), WaarpStringUtils.UTF8));
} catch (FileNotFoundException e) {
throw new WaarpDatabaseSqlException("Error in CLOB: " + svalue, e);
}
break;
case Types.BLOB:
try {
setValue(new FileInputStream(svalue));
} catch (FileNotFoundException e) {
throw new WaarpDatabaseSqlException("Error in BLOB: " + svalue, e);
}
break;
default:
throw new WaarpDatabaseSqlException("Type unknown: " + type);
}
}
/**
* @return the column
*/
public String getColumn() {
return column;
}
/**
* @param column the column to set
*/
private void setColumn(String column) {
this.column = column;
}
}