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 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: 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_;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy