com.ibm.as400.access.SQLBinary Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jt400 Show documentation
Show all versions of jt400 Show documentation
The Open Source version of the IBM Toolbox for Java
The newest version!
///////////////////////////////////////////////////////////////////////////////
//
// JTOpen (IBM Toolbox for Java - OSS version)
//
// Filename: SQLBinary.java
//
// The source code contained herein is licensed under the IBM Public License
// Version 1.0, which has been approved by the Open Source Initiative.
// Copyright (C) 1997-2006 International Business Machines Corporation and
// others. All rights reserved.
//
///////////////////////////////////////////////////////////////////////////////
package com.ibm.as400.access;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.Date;
/* ifdef JDBC40 */
import java.sql.NClob;
import java.sql.RowId;
/* endif */
import java.sql.SQLException;
/* ifdef JDBC40 */
import java.sql.SQLXML;
/* endif */
import java.sql.Time;
import java.sql.Timestamp;
import java.util.Calendar;
final class SQLBinary
extends SQLDataBase
{
static final String copyright = "Copyright (C) 1997-2006 International Business Machines Corporation and others.";
private int maxLength_;
private AS400ByteArray typeConverter_;
private byte[] value_;
SQLBinary(int maxLength, SQLConversionSettings settings)
{
super(settings);
maxLength_ = maxLength;
typeConverter_ = new AS400ByteArray(maxLength);
value_ = new byte[maxLength];
}
public Object clone()
{
return new SQLBinary(maxLength_, settings_);
}
//---------------------------------------------------------//
// //
// CONVERSION TO AND FROM RAW BYTES //
// //
//---------------------------------------------------------//
public void convertFromRawBytes(byte[] rawBytes, int offset, ConvTable ccsidConverter, boolean ignoreConversionErrors)
throws SQLException
{
value_ = (byte[])typeConverter_.toObject(rawBytes, offset);
}
public void convertToRawBytes(byte[] rawBytes, int offset, ConvTable ccsidConverter)
throws SQLException
{
typeConverter_.toBytes(value_, rawBytes, offset);
}
//---------------------------------------------------------//
// //
// SET METHODS //
// //
//---------------------------------------------------------//
public void set(Object object, Calendar calendar, int scale)
throws SQLException
{
if(object instanceof String)
{
try
{
value_ = BinaryConverter.stringToBytes((String)object);
}
catch(NumberFormatException nfe)
{
// we throw a data type mismatch exception here because the
// value of the Clob contained characters that were not valid hex
JDError.throwSQLException(this, JDError.EXC_DATA_TYPE_MISMATCH, nfe);
}
}
else if(object instanceof byte[])
value_ = (byte[])object;
else if(object instanceof InputStream)
{
//value_ = JDUtilities.streamToBytes((InputStream)object, scale);
int length = scale; // hack to get the length into the set method
if(length >= 0)
{
InputStream stream = (InputStream)object;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int blockSize = length < AS400JDBCPreparedStatement.LOB_BLOCK_SIZE ? length : AS400JDBCPreparedStatement.LOB_BLOCK_SIZE;
byte[] byteBuffer = new byte[blockSize];
try
{
int totalBytesRead = 0;
int bytesRead = stream.read(byteBuffer, 0, blockSize);
while(bytesRead > -1 && totalBytesRead < length)
{
baos.write(byteBuffer, 0, bytesRead);
totalBytesRead += bytesRead;
int bytesRemaining = length - totalBytesRead;
if(bytesRemaining < blockSize)
{
blockSize = bytesRemaining;
}
bytesRead = stream.read(byteBuffer, 0, blockSize);
}
}
catch(IOException ie)
{
JDError.throwSQLException(this, JDError.EXC_INTERNAL, ie);
}
value_ = baos.toByteArray();
if(value_.length < length)
{
// a length longer than the stream was specified
JDError.throwSQLException(this, JDError.EXC_DATA_TYPE_MISMATCH);
}
}
else if((length == ALL_READER_BYTES) || (length == -1)) //@readerlen new else-if block (read all data)
{
InputStream stream = (InputStream)object;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int blockSize = AS400JDBCPreparedStatement.LOB_BLOCK_SIZE;
byte[] byteBuffer = new byte[blockSize];
try
{
int totalBytesRead = 0;
int bytesRead = stream.read(byteBuffer, 0, blockSize);
while(bytesRead > -1)
{
baos.write(byteBuffer, 0, bytesRead);
totalBytesRead += bytesRead;
bytesRead = stream.read(byteBuffer, 0, blockSize);
}
}
catch(IOException ie)
{
JDError.throwSQLException(this, JDError.EXC_INTERNAL, ie);
}
value_ = baos.toByteArray();
}
else
{
if (JDTrace.isTraceOn()) {
if (object == null) {
JDTrace.logInformation(this, "Unable to assign null object");
} else {
JDTrace.logInformation(this, "Unable to assign object("+object+") of class("+object.getClass().toString()+")");
}
}
JDError.throwSQLException(this, JDError.EXC_DATA_TYPE_MISMATCH);
}
}
else if(object instanceof Reader)
{
// value_ = SQLBinary.stringToBytes(JDUtilities.readerToString((Reader)object, scale));
int length = scale; // hack to get the length into the set method
if(length >= 0)
{
try
{
int blockSize = length < AS400JDBCPreparedStatement.LOB_BLOCK_SIZE ? length : AS400JDBCPreparedStatement.LOB_BLOCK_SIZE;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
HexReaderInputStream stream = new HexReaderInputStream((Reader)object);
byte[] byteBuffer = new byte[blockSize];
int totalBytesRead = 0;
int bytesRead = stream.read(byteBuffer, 0, blockSize);
while(bytesRead > -1 && totalBytesRead < length)
{
baos.write(byteBuffer, 0, bytesRead);
totalBytesRead += bytesRead;
int bytesRemaining = length - totalBytesRead;
if(bytesRemaining < blockSize)
{
blockSize = bytesRemaining;
}
bytesRead = stream.read(byteBuffer, 0, blockSize);
}
value_ = baos.toByteArray();
if(value_.length < length)
{
// a length longer than the stream was specified
JDError.throwSQLException(this, JDError.EXC_DATA_TYPE_MISMATCH);
}
stream.close(); //@scan1
}
catch(ExtendedIOException eie)
{
// the Reader contains non-hex characters
JDError.throwSQLException(this, JDError.EXC_DATA_TYPE_MISMATCH, eie);
}
catch(IOException ie)
{
JDError.throwSQLException(this, JDError.EXC_INTERNAL, ie);
}
}
else if((length == ALL_READER_BYTES) || (length == -1)) //@readerlen new else-if block (read all data)
{
try
{
int blockSize = AS400JDBCPreparedStatement.LOB_BLOCK_SIZE;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
HexReaderInputStream stream = new HexReaderInputStream((Reader)object);
byte[] byteBuffer = new byte[blockSize];
int totalBytesRead = 0;
int bytesRead = stream.read(byteBuffer, 0, blockSize);
while(bytesRead > -1)
{
baos.write(byteBuffer, 0, bytesRead);
totalBytesRead += bytesRead;
bytesRead = stream.read(byteBuffer, 0, blockSize);
}
value_ = baos.toByteArray();
stream.close(); //@scan1
}
catch(ExtendedIOException eie)
{
// the Reader contains non-hex characters
JDError.throwSQLException(this, JDError.EXC_DATA_TYPE_MISMATCH, eie);
}
catch(IOException ie)
{
JDError.throwSQLException(this, JDError.EXC_INTERNAL, ie);
}
}
else
{
JDError.throwSQLException(this, JDError.EXC_DATA_TYPE_MISMATCH);
}
}
else if( object instanceof Blob)
value_ = ((Blob)object).getBytes(1, (int)((Blob)object).length());
else if( object instanceof Clob)
{
try
{
value_ = BinaryConverter.stringToBytes(((Clob)object).getSubString(1, (int)((Clob)object).length()));
}
catch(NumberFormatException nfe)
{
// we throw a data type mismatch exception here because the
// value of the Clob contained characters that were not valid hex
JDError.throwSQLException(this, JDError.EXC_DATA_TYPE_MISMATCH, nfe);
}
}
else
JDError.throwSQLException(this, JDError.EXC_DATA_TYPE_MISMATCH);
// Set to the exact length.
int valueLength = value_.length;
if(valueLength < maxLength_)
{
byte[] newValue = new byte[maxLength_];
System.arraycopy(value_, 0, newValue, 0, valueLength);
value_ = newValue;
truncated_ = 0; outOfBounds_ = false;
}
else if(valueLength > maxLength_)
{
byte[] newValue = new byte[maxLength_];
System.arraycopy(value_, 0, newValue, 0, maxLength_);
value_ = newValue;
truncated_ = valueLength - maxLength_;
}
else
truncated_ = 0; outOfBounds_ = false;
}
//---------------------------------------------------------//
// //
// DESCRIPTION OF SQL TYPE //
// //
//---------------------------------------------------------//
public int getSQLType()
{
return SQLData.BINARY;
}
public String getCreateParameters()
{
return AS400JDBCDriver.getResource("MAXLENGTH",null);
}
public int getDisplaySize()
{
return maxLength_;
}
public String getLiteralPrefix()
{
return "BINARY(X\'"; //@5WXVJX changed from x'
}
public String getLiteralSuffix()
{
return "\')"; //@5WXVJX changed from '
}
public String getLocalName()
{
return "BINARY";
}
public int getMaximumPrecision()
{
return 32765;
}
public int getMaximumScale()
{
return 0;
}
public int getMinimumScale()
{
return 0;
}
public int getNativeType()
{
return 912;
}
public int getPrecision()
{
return maxLength_;
}
public int getRadix()
{
return 0;
}
public int getScale()
{
return 0;
}
public int getType()
{
return java.sql.Types.BINARY;
}
public String getTypeName()
{
return "BINARY";
}
public boolean isSigned()
{
return false;
}
public boolean isText()
{
return true;
}
public int getActualSize()
{
return value_.length;
}
public String getJavaClassName()
{
return "[B";
}
public int getTruncated()
{
return truncated_;
}
public boolean getOutOfBounds() {
return outOfBounds_;
}
//---------------------------------------------------------//
// //
// CONVERSIONS TO JAVA TYPES //
// //
//---------------------------------------------------------//
public InputStream getAsciiStream()
throws SQLException
{
// This is written in terms of toBytes(), since it will
// handle truncating to the max field size if needed.
try
{
return new ByteArrayInputStream(ConvTable.getTable(819, null).stringToByteArray(BinaryConverter.bytesToHexString(getBytes())));
}
catch(UnsupportedEncodingException e)
{
JDError.throwSQLException(this, JDError.EXC_INTERNAL, e);
return null;
}
}
public BigDecimal getBigDecimal(int scale)
throws SQLException
{
JDError.throwSQLException(this, JDError.EXC_DATA_TYPE_MISMATCH);
return null;
}
public InputStream getBinaryStream()
throws SQLException
{
// This is written in terms of toBytes(), since it will
// handle truncating to the max field size if needed.
return new ByteArrayInputStream(getBytes());
}
public Blob getBlob()
throws SQLException
{
// This is written in terms of toBytes(), since it will
// handle truncating to the max field size if needed.
return new AS400JDBCBlob(getBytes(), maxLength_);
}
public boolean getBoolean()
throws SQLException
{
JDError.throwSQLException(this, JDError.EXC_DATA_TYPE_MISMATCH);
return false;
}
public byte getByte()
throws SQLException
{
JDError.throwSQLException(this, JDError.EXC_DATA_TYPE_MISMATCH);
return -1;
}
public byte[] getBytes()
{
// Truncate to the max field size if needed.
// Do not signal a DataTruncation per the spec.
int maxFieldSize = settings_.getMaxFieldSize();
if((value_.length > maxFieldSize) && (maxFieldSize > 0))
{
byte[] truncatedValue = new byte[maxFieldSize];
System.arraycopy(value_, 0, truncatedValue, 0, maxFieldSize);
return truncatedValue;
}
else
{
return value_;
}
}
public Reader getCharacterStream()
throws SQLException
{
// This is written in terms of toBytes(), since it will
// handle truncating to the max field size if needed.
return new StringReader(BinaryConverter.bytesToHexString(getBytes()));
}
public Clob getClob()
throws SQLException
{
// This is written in terms of getBytes(), since it will
// handle truncating to the max field size if needed.
return new AS400JDBCClob(BinaryConverter.bytesToHexString(getBytes()), maxLength_);
}
public Date getDate(Calendar calendar)
throws SQLException
{
JDError.throwSQLException(this, JDError.EXC_DATA_TYPE_MISMATCH);
return null;
}
public double getDouble()
throws SQLException
{
JDError.throwSQLException(this, JDError.EXC_DATA_TYPE_MISMATCH);
return -1;
}
public float getFloat()
throws SQLException
{
JDError.throwSQLException(this, JDError.EXC_DATA_TYPE_MISMATCH);
return -1;
}
public int getInt()
throws SQLException
{
JDError.throwSQLException(this, JDError.EXC_DATA_TYPE_MISMATCH);
return -1;
}
public long getLong()
throws SQLException
{
JDError.throwSQLException(this, JDError.EXC_DATA_TYPE_MISMATCH);
return -1;
}
public Object getObject()
throws SQLException
{
// This is written in terms of getBytes(), since it will
// handle truncating to the max field size if needed.
return getBytes();
}
public short getShort()
throws SQLException
{
JDError.throwSQLException(this, JDError.EXC_DATA_TYPE_MISMATCH);
return -1;
}
public String getString()
throws SQLException
{
// This is written in terms of getBytes(), since it will
// handle truncating to the max field size if needed.
return BinaryConverter.bytesToHexString(getBytes());
}
public Time getTime(Calendar calendar)
throws SQLException
{
JDError.throwSQLException(this, JDError.EXC_DATA_TYPE_MISMATCH);
return null;
}
public Timestamp getTimestamp(Calendar calendar)
throws SQLException
{
JDError.throwSQLException(this, JDError.EXC_DATA_TYPE_MISMATCH);
return null;
}
public InputStream getUnicodeStream()
throws SQLException
{
// This is written in terms of getBytes(), since it will
// handle truncating to the max field size if needed.
try
{
return new ByteArrayInputStream(ConvTable.getTable(13488, null).stringToByteArray(BinaryConverter.bytesToHexString(getBytes())));
}
catch(UnsupportedEncodingException e)
{
JDError.throwSQLException(this, JDError.EXC_INTERNAL, e);
return null;
}
}
//@PDA jdbc40
public Reader getNCharacterStream() throws SQLException
{
// This is written in terms of getBytes(), since it will
// handle truncating to the max field size if needed.
return new StringReader(BinaryConverter.bytesToHexString(getBytes()));
}
//@PDA jdbc40
/* ifdef JDBC40 */
public NClob getNClob() throws SQLException
{
// This is written in terms of getBytes(), since it will
// handle truncating to the max field size if needed.
return new AS400JDBCNClob(BinaryConverter.bytesToHexString(getBytes()), maxLength_);
}
/* endif */
//@PDA jdbc40
public String getNString() throws SQLException
{
// This is written in terms of getBytes(), since it will
// handle truncating to the max field size if needed.
return BinaryConverter.bytesToHexString(getBytes());
}
//@PDA jdbc40
/* ifdef JDBC40 */
public RowId getRowId() throws SQLException
{
//Decided this is of no use because rowid is so specific to the dbms internals.
//And there are issues in length and difficulties in converting a binary to a
//valid rowid that is useful.
JDError.throwSQLException(this, JDError.EXC_DATA_TYPE_MISMATCH);
return null;
}
/* endif */
//@PDA jdbc40
/* ifdef JDBC40 */
public SQLXML getSQLXML() throws SQLException
{
JDError.throwSQLException(this, JDError.EXC_DATA_TYPE_MISMATCH);
return null;
}
/* endif */
public void saveValue() {
savedValue_ = value_;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy