src.com.ibm.as400.access.SQLRowID Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jt400-jdk8 Show documentation
Show all versions of jt400-jdk8 Show documentation
The Open Source version of the IBM Toolbox for Java
The newest version!
///////////////////////////////////////////////////////////////////////////////
//
// JTOpen (IBM Toolbox for Java - OSS version)
//
// Filename: SQLRowID.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-2003 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 SQLRowID extends SQLDataBase
{
static final String copyright = "Copyright (C) 1997-2003 International Business Machines Corporation and others.";
// Private data.
private static final byte[] default_ = new byte[0];
private int length_;
private byte[] value_;
SQLRowID(SQLConversionSettings settings)
{
super(settings);
length_ = 0;
value_ = default_;
}
public Object clone()
{
return new SQLRowID(settings_);
}
//---------------------------------------------------------//
// //
// CONVERSION TO AND FROM RAW BYTES //
// //
//---------------------------------------------------------//
public void convertFromRawBytes(byte[] rawBytes, int offset, ConvTable ccsidConverter, boolean ignoreConversionErrors)
throws SQLException {
length_ = BinaryConverter.byteArrayToUnsignedShort(rawBytes, offset);
value_ = new byte[length_];
System.arraycopy(rawBytes, offset+2, value_, 0, length_);
}
public void convertToRawBytes(byte[] rawBytes, int offset, ConvTable ccsidConverter)
throws SQLException {
BinaryConverter.unsignedShortToByteArray(length_, rawBytes, offset);
int len = (value_.length < rawBytes.length) ? value_.length : rawBytes.length;
System.arraycopy(value_, 0, rawBytes, offset + 2, len);
// pad rawBytes with zeros if it has room
for(int i=(offset + 2 + len); i= 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();
int objectLength = value_.length;
if(value_.length > 40)
{
byte[] newValue = new byte[40];
System.arraycopy(value_, 0, newValue, 0, 40);
value_ = newValue;
}
truncated_ = objectLength - value_.length;
outOfBounds_ = false;
}
else
{
JDError.throwSQLException(this, JDError.EXC_DATA_TYPE_MISMATCH);
}
}
else if(object instanceof Reader)
{
// value_ = BinaryConverter.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();
int objectLength = value_.length;
if(value_.length > 40)
{
byte[] newValue = new byte[40];
System.arraycopy(value_, 0, newValue, 0, 40);
value_ = newValue;
}
stream.close(); //@scan1
truncated_ = objectLength - value_.length;
outOfBounds_ = false;
}
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 (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 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)
{
// the Clob contains non-hex characters
JDError.throwSQLException(this, JDError.EXC_DATA_TYPE_MISMATCH, nfe);
}
}
else {
if (JDTrace.isTraceOn()) {
JDTrace.logInformation(this, "Unable to assign object(" + object
+ ") of class(" + object.getClass().toString() + ")");
}
JDError.throwSQLException(this, JDError.EXC_DATA_TYPE_MISMATCH);
}
// Truncate if necessary.
int valueLength = value_.length;
if(valueLength > 40)
{
byte[] newValue = new byte[40];
System.arraycopy(value_, 0, newValue, 0, 40);
value_ = newValue;
truncated_ = valueLength - 40;
outOfBounds_ = false;
}
else
truncated_ = 0; outOfBounds_ = false;
length_ = value_.length;
}
//---------------------------------------------------------//
// //
// DESCRIPTION OF SQL TYPE //
// //
//---------------------------------------------------------//
public int getSQLType()
{
return SQLData.ROWID;
}
public String getCreateParameters()
{
return null;
}
public int getDisplaySize()
{
return 40;
}
public String getJavaClassName()
{
return "[B";
}
public String getLiteralPrefix()
{
return null;
}
public String getLiteralSuffix()
{
return null;
}
public String getLocalName()
{
return "ROWID";
}
public int getMaximumPrecision()
{
return 40;
}
public int getMaximumScale()
{
return 0;
}
public int getMinimumScale()
{
return 0;
}
public int getNativeType()
{
return 904;
}
public int getPrecision()
{
return 40;
}
public int getRadix()
{
return 0;
}
public int getScale()
{
return 0;
}
public int getType()
{
/* ifdef JDBC40
return java.sql.Types.ROWID;
endif */
/* ifndef JDBC40 */
return java.sql.Types.BINARY;
/* endif */
}
public String getTypeName()
{
return "ROWID";
}
public boolean isSigned()
{
return false;
}
public boolean isText()
{
return true;
}
public int getActualSize()
{
return value_.length;
}
public int getTruncated()
{
return truncated_;
}
public boolean getOutOfBounds() {
return outOfBounds_;
}
//---------------------------------------------------------//
// //
// CONVERSIONS TO JAVA TYPES //
// //
//---------------------------------------------------------//
public InputStream getAsciiStream()
throws SQLException
{
truncated_ = 0; outOfBounds_ = false;
// 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(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
{
truncated_ = 0; outOfBounds_ = false;
// This is written in terms of getBytes(), since it will
// handle truncating to the max field size if needed.
return new ByteArrayInputStream(getBytes());
}
public Blob getBlob()
throws SQLException
{
truncated_ = 0; outOfBounds_ = false;
// This is written in terms of getBytes(), since it will
// handle truncating to the max field size if needed.
byte[] bytes = getBytes();
return new AS400JDBCBlob(bytes, bytes.length);
}
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()
throws SQLException
{
truncated_ = 0; outOfBounds_ = false;
// 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
{
truncated_ = 0; outOfBounds_ = false;
// 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()));
}
public Clob getClob()
throws SQLException
{
truncated_ = 0; outOfBounds_ = false;
// This is written in terms of getBytes(), since it will
// handle truncating to the max field size if needed.
String string = BinaryConverter.bytesToHexString(getBytes());
return new AS400JDBCClob(string, string.length());
}
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
{
truncated_ = 0; outOfBounds_ = false;
// This is written in terms of getBytes(), since it will
// handle truncating to the max field size if needed.
/* ifdef JDBC40
return new AS400JDBCRowId(getBytes()); //@PDC
endif */
/* ifndef JDBC40 */
return getBytes();
/* endif */
}
public short getShort()
throws SQLException
{
JDError.throwSQLException(this, JDError.EXC_DATA_TYPE_MISMATCH);
return -1;
}
public String getString()
throws SQLException
{
truncated_ = 0; outOfBounds_ = false;
// 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
{
truncated_ = 0; outOfBounds_ = false;
// 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
{
truncated_ = 0; outOfBounds_ = false;
// 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
{
truncated_ = 0; outOfBounds_ = false;
// This is written in terms of getBytes(), since it will
// handle truncating to the max field size if needed.
String string = BinaryConverter.bytesToHexString(getBytes());
return new AS400JDBCNClob(string, string.length());
}
endif */
//@PDA jdbc40
public String getNString() throws SQLException
{
truncated_ = 0; outOfBounds_ = false;
// This is written in terms of getBytes(), since it will
// handle truncating to the max field size if needed.
return BinaryConverter.bytesToHexString(getBytes());
}
/* ifdef JDBC40
//@PDA jdbc40
public RowId getRowId() throws SQLException
{
// This is written in terms of getBytes(), since it will
// handle truncating to the max field size if needed.
truncated_ = 0; outOfBounds_ = false;
return new AS400JDBCRowId(getBytes());
}
//@PDA jdbc40
public SQLXML getSQLXML() throws SQLException
{
JDError.throwSQLException(this, JDError.EXC_DATA_TYPE_MISMATCH);
return null;
}
endif */
public void saveValue() throws SQLException {
savedValue_ = value_;
}
}