package railo.runtime.type.sql;
import java.io.ByteArrayInputStream;
import java.io.Serializable;
import java.sql.Blob;
import java.sql.SQLException;
import railo.runtime.exp.PageException;
import railo.runtime.op.Caster;
/**
* Implementation of the Interface java.sql.Blob
*/
public final class BlobImpl implements java.sql.Blob, Serializable {
byte[] binaryData = null;
/**
* constructor of the class
* @param data
*/
private BlobImpl(byte[] data) {
binaryData = data;
}
@Override
public long length() throws SQLException {
return binaryData.length;
}
@Override
public byte[] getBytes(long pos, int length) throws SQLException {
byte[] newData = new byte[length];
System.arraycopy(binaryData, (int) (pos - 1), newData, 0, length);
return newData;
}
@Override
public java.io.InputStream getBinaryStream() throws SQLException {
return new ByteArrayInputStream(binaryData);
}
@Override
public java.io.InputStream getBinaryStream(long pos, long length) {
// TODO impl this
return new ByteArrayInputStream(binaryData);
}
@Override
public long position(byte pattern[], long start) throws SQLException {
return (new String(binaryData)).indexOf(new String(pattern), (int) start);
}
@Override
public long position(java.sql.Blob pattern, long start) throws SQLException {
return position(pattern.getBytes(0, (int) pattern.length()), start);
}
@Override
public int setBytes(long pos, byte[] bytes) throws SQLException {
// TODO impl.
throw new SQLException("JDBC 3.0 Method setBytes not implemented");
}
@Override
public int setBytes(long pos, byte[] bytes, int offset, int len) throws SQLException {
// TODO impl.
throw new SQLException("JDBC 3.0 Method setBytes not implemented");
}
@Override
public java.io.OutputStream setBinaryStream(long pos) throws SQLException {
// TODO impl.
throw new SQLException("JDBC 3.0 Method setBinaryStream not implemented");
}
@Override
public void truncate(long len) throws SQLException {
// TODO impl.
throw new SQLException("JDBC 3.0 Method truncate not implemented");
}
public static Blob toBlob(Object value) throws PageException {
if(value instanceof Blob) return (Blob)value;
return new BlobImpl(Caster.toBinary(value));
}
/*public static Blob toBlob(byte[] value) {
Class blobClass = ClassUtil.loadClass("oracle.sql.BLOB",null);
if(blobClass!=null){
try {
//BLOB blob = BLOB.getEmptyBLOB();
Method getEmptyBLOB = blobClass.getMethod("getEmptyBLOB",new Class[]{});
Object blob = getEmptyBLOB.invoke(null, ArrayUtil.OBJECT_EMPTY);
//blob.setBytes(value);
Method setBytes = blobClass.getMethod("setBytes", new Class[]{byte[].class});
setBytes.invoke(blob, new Object[]{value});
return (Blob) blob;
}
catch (Exception e) {}
}
return new BlobImpl(value);
}*/
public void free() {
binaryData=new byte[0];
}
}