com.ibm.as400.access.SQLNChar 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: SQLNChar.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) 2006-2006 International Business Machines Corporation and
// others. All rights reserved.
//
///////////////////////////////////////////////////////////////////////////////
package com.ibm.as400.access;
import java.io.CharConversionException;
import java.io.InputStream;
import java.io.Reader;
import java.io.StringReader;
import java.sql.Blob;
import java.sql.Clob;
/* 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;
import java.net.URL;
/* ifdef JDBC42
import java.time.LocalTime;
import java.time.LocalDate;
import java.time.LocalDateTime;
endif */
//@PDA jdbc40 new class
final class SQLNChar
extends SQLDataBase
{
// Private data.
private int maxLength_;
private String value_;
private String originalValue_;
private int ccsid_; //@cca1
SQLNChar(int maxLength, SQLConversionSettings settings)
{
super(settings);
maxLength_ = maxLength;
truncated_ = 0; outOfBounds_ = false;
value_ = "";
originalValue_ = "";
ccsid_ = 1200;
}
public Object clone()
{
return new SQLNChar(maxLength_,settings_);
}
//---------------------------------------------------------//
// //
// CONVERSION TO AND FROM RAW BYTES //
// //
//---------------------------------------------------------//
public void convertFromRawBytes(byte[] rawBytes, int offset, ConvTable ccsidConverter, boolean ignoreConversionErrors)
throws SQLException
{
int bidiStringType = settings_.getBidiStringType();
// if bidiStringType is not set by user, use ccsid to get value
if(bidiStringType == -1)
bidiStringType = ccsidConverter.bidiStringType_;
BidiConversionProperties bidiConversionProperties = new BidiConversionProperties(bidiStringType);
bidiConversionProperties.setBidiImplicitReordering(settings_.getBidiImplicitReordering());
bidiConversionProperties.setBidiNumericOrderingRoundTrip(settings_.getBidiNumericOrdering());
value_ = ccsidConverter.byteArrayToString(rawBytes, offset, maxLength_, bidiConversionProperties);
originalValue_ = value_;
}
public void convertToRawBytes(byte[] rawBytes, int offset, ConvTable ccsidConverter)
throws SQLException
{
int bidiStringType = settings_.getBidiStringType();
// if bidiStringType is not set by user, use ccsid to get value
if(bidiStringType == -1)
bidiStringType = ccsidConverter.bidiStringType_;
BidiConversionProperties bidiConversionProperties = new BidiConversionProperties(bidiStringType);
bidiConversionProperties.setBidiImplicitReordering(settings_.getBidiImplicitReordering());
bidiConversionProperties.setBidiNumericOrderingRoundTrip(settings_.getBidiNumericOrdering());
try
{
// check for truncation after conversion @H2C
truncated_ = ccsidConverter.stringToByteArray(value_, rawBytes, offset, maxLength_, bidiConversionProperties);
}
catch(CharConversionException e)
{
maxLength_ = ccsidConverter.stringToByteArray(value_, bidiConversionProperties).length;
JDError.throwSQLException(this, JDError.EXC_INTERNAL, e);
}
}
//---------------------------------------------------------//
// //
// SET METHODS //
// //
//---------------------------------------------------------//
public void set(Object object, Calendar calendar, int scale)
throws SQLException
{
String value = null;
if(object instanceof String)
value = (String)object;
else if(object instanceof Character)
value = object.toString();
else if(object instanceof Number)
value = object.toString();
else if(object instanceof Boolean)
{
// if "translate boolean" == false, then use "0" and "1" values to match native driver
if(settings_.getTranslateBoolean() == true)
value = object.toString(); //"true" or "false"
else
value = ((Boolean)object).booleanValue() == true ? "1" : "0";
}
else if(object instanceof Time)
value = SQLTime.timeToString((Time)object, settings_, calendar);
else if(object instanceof Timestamp)
value = SQLTimestamp.timestampToStringTrimTrailingZeros((Timestamp)object, calendar, settings_);
else if(object instanceof java.util.Date)
value = SQLDate.dateToString((java.util.Date)object, settings_, calendar);
else if(object instanceof URL)
value = object.toString();
else if( object instanceof Clob)
{
Clob clob = (Clob)object;
value = clob.getSubString(1, (int)clob.length());
}
else if(object instanceof Reader)
{
value = getStringFromReader((Reader) object, ALL_READER_BYTES, this);
}
/* ifdef JDBC40 */
else if(object instanceof SQLXML) //@PDA jdbc40
{
SQLXML xml = (SQLXML)object;
value = xml.getString();
}
/* endif */
/* ifdef JDBC42
else if(object instanceof java.time.LocalDate)
{
value = SQLDate.localDateToString((java.time.LocalDate)object, settings_, calendar);
}
else if(object instanceof LocalTime) {
value = SQLTime.localTimeToString((LocalTime)object, settings_, calendar);
}
else if(object instanceof LocalDateTime) {
value = SQLTimestamp.localDateTimeToStringTrimTrailingZeros((LocalDateTime)object, calendar, settings_);
}
endif */
if(value == null) {
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);
}
value_ = value;
originalValue_ = value;
// Set to the exact length.
int valueLength = value_.length();
int exactLength = getDisplaySize();
if(valueLength < exactLength)
{
StringBuffer buffer = new StringBuffer(value_);
char c = '\u0020';
for(int i = valueLength; i < exactLength; ++i)
buffer.append(c);
value_ = buffer.toString();
truncated_ = 0; outOfBounds_ = false;
}
else if(valueLength > exactLength)
{
value_ = value_.substring(0, exactLength);
originalValue_ = value_;
truncated_ = valueLength - exactLength;
outOfBounds_ = false;
}
else
truncated_ = 0; outOfBounds_ = false;
}
//---------------------------------------------------------//
// //
// DESCRIPTION OF SQL TYPE //
// //
//---------------------------------------------------------//
public int getSQLType()
{
return SQLData.NCHAR;
}
public String getCreateParameters()
{
return AS400JDBCDriver.getResource("MAXLENGTH",null);
}
public int getDisplaySize()
{
return maxLength_ / 2;
}
// JDBC 3.0
public String getJavaClassName()
{
return "java.lang.String";
}
public String getLiteralPrefix()
{
return "\'";
}
public String getLiteralSuffix()
{
return "\'";
}
public String getLocalName()
{
return "NCHAR";
}
public int getMaximumPrecision()
{
return 16382;
}
public int getMaximumScale()
{
return 0;
}
public int getMinimumScale()
{
return 0;
}
public int getNativeType()
{
return 468;
}
public int getPrecision()
{
return maxLength_ / 2;
}
public int getRadix()
{
return 0;
}
public int getScale()
{
return 0;
}
public int getType()
{
/* ifdef JDBC40 */
return java.sql.Types.NCHAR;
/* endif */
/* ifndef JDBC40
return java.sql.Types.CHAR;
endif */
}
public String getTypeName()
{
/* ifdef JDBC40 */
return "NCHAR";
/* endif */
/* ifndef JDBC40
return "CHAR";
endif */
}
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 getBinaryStream()
throws SQLException
{
truncated_ = 0; outOfBounds_ = false;
return new HexReaderInputStream(new StringReader(getString()));
}
public Blob getBlob()
throws SQLException
{
truncated_ = 0; outOfBounds_ = false;
try
{
return new AS400JDBCBlob(BinaryConverter.stringToBytes(getString()), maxLength_);
}
catch(NumberFormatException nfe)
{
// this field contains non-hex characters
JDError.throwSQLException(this, JDError.EXC_DATA_TYPE_MISMATCH, nfe);
return null;
}
}
public byte[] getBytes()
throws SQLException
{
truncated_ = 0; outOfBounds_ = false;
try
{
return BinaryConverter.stringToBytes(getString());
}
catch(NumberFormatException nfe)
{
// this field contains non-hex characters
JDError.throwSQLException(this, JDError.EXC_DATA_TYPE_MISMATCH, nfe);
return null;
}
}
public Object getBatchableObject() throws SQLException {
// Return the object that has not yet been padded
return originalValue_;
}
public Object getObject()
throws SQLException
{
truncated_ = 0; outOfBounds_ = false;
// This is written in terms of getString(), since it will
// handle truncating to the max field size if needed.
return getString();
}
public String getString()
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))
{
return value_.substring(0, maxFieldSize);
}
else
{
return value_;
}
}
// Added method trim() to trim the string.
public void trim()
{
value_ = value_.trim();
originalValue_ = value_;
}
public String getNString() throws SQLException
{
// 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))
{
return value_.substring(0, maxFieldSize);
}
else
{
return value_;
}
}
/* ifdef JDBC40 */
public RowId getRowId() throws SQLException
{
//truncated_ = 0; outOfBounds_ = false;
//try
//{
// return new AS400JDBCRowId(BinaryConverter.stringToBytes(value_));
//}
//catch(NumberFormatException nfe)
//{
// this string contains non-hex characters
// JDError.throwSQLException(this, JDError.EXC_DATA_TYPE_MISMATCH, nfe);
// return null;
//}
//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 to a
//valid rowid that is useful.
JDError.throwSQLException(this, JDError.EXC_DATA_TYPE_MISMATCH);
return null;
}
public SQLXML getSQLXML() throws SQLException
{
//This is written in terms of getString(), since it will
// handle truncating to the max field size if needed.
truncated_ = 0; outOfBounds_ = false;
return new AS400JDBCSQLXML(getString());
}
/* endif */
public void saveValue() {
savedValue_ = originalValue_;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy