src.com.ibm.as400.access.SQLConversionSettings Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jt400-jdk9 Show documentation
Show all versions of jt400-jdk9 Show documentation
The Open Source version of the IBM Toolbox for Java
///////////////////////////////////////////////////////////////////////////////
//
// JTOpen (IBM Toolbox for Java - OSS version)
//
// Filename: SQLConversionSettings.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-2001 International Business Machines Corporation and
// others. All rights reserved.
//
///////////////////////////////////////////////////////////////////////////////
package com.ibm.as400.access;
import java.sql.SQLException;
/**
This class keeps track of the current data formatting options.
Storing these in a single object not only makes it more convenient
to pass around, but also enables the settings to be changed
on-the-fly and be reflected in existing data.
To reduce the number of these objects, this has been changed to be an immutable object.
If a value is to be changed, then a new instance needs to be created. @H4A
**/
class SQLConversionSettings
{
static final String copyright = "Copyright (C) 1997-2001 International Business Machines Corporation and others.";
// Formatting constants. Using constants makes
// quick comparisons and switch-case statements easier.
// All constant values correspond directly to the index
// of the string in the JDProperties class.
public static final int DATE_FORMAT_JULIAN = 0;
public static final int DATE_FORMAT_MDY = 1;
public static final int DATE_FORMAT_DMY = 2;
public static final int DATE_FORMAT_YMD = 3;
public static final int DATE_FORMAT_USA = 4;
public static final int DATE_FORMAT_ISO = 5;
public static final int DATE_FORMAT_EUR = 6;
public static final int DATE_FORMAT_JIS = 7;
public static final int TIME_FORMAT_HMS = 0;
public static final int TIME_FORMAT_USA = 1;
public static final int TIME_FORMAT_ISO = 2;
public static final int TIME_FORMAT_EUR = 3;
public static final int TIME_FORMAT_JIS = 4;
public static final int TIMESTAMP_FORMAT_ISO = 0;
public static final int TIMESTAMP_FORMAT_IBMSQL = 1;
// Private data.
private int dateFormat_;
private String dateSeparator_;
private String decimalSeparator_;
private int maxFieldSize_;
private int timeFormat_;
private int timestampFormat_;
private String timeSeparator_;
private boolean useBigDecimal_; // @E0A
private int bidiStringType_; // @E1A
private boolean bidiImplicitReordering_; // @KBA
private boolean bidiNumericOrdering_; // @KBA
private boolean translateBoolean_; // @PDA
/*
* For now, just cache a single object and reused it if possible. @H4a
*/
private static Object cachedConversionSettingsLock_ = new Object();
private static SQLConversionSettings cachedConversionSettings_ = null;
/**
* Get the current conversion settings for a connection.
* @return SQLConversionSettings object
* @throws SQLException If a database error occurs.
*/
/*@H4A*/
static SQLConversionSettings getConversionSettings(
AS400JDBCConnection connection) throws SQLException {
synchronized (cachedConversionSettingsLock_) {
if (cachedConversionSettings_ != null) {
if (cachedConversionSettings_.matches(connection)) {
return cachedConversionSettings_;
}
}
cachedConversionSettings_ = new SQLConversionSettings(connection);
return cachedConversionSettings_;
}
}
static SQLConversionSettings getConversionSettingsWithMaxFieldSize(SQLConversionSettings oldSettings,
int maxFieldSize) {
if (oldSettings.maxFieldSize_ == maxFieldSize) {
return oldSettings;
} else {
return new SQLConversionSettings(oldSettings, maxFieldSize);
}
}
/**
Constructs a SQLConversionSettings object.
@param connection Connection to the system.
**/
private SQLConversionSettings (AS400JDBCConnection connection)
throws SQLException
{
JDProperties properties = connection.getProperties ();
dateFormat_ = properties.getIndex (JDProperties.DATE_FORMAT);
dateSeparator_ = properties.getString (JDProperties.DATE_SEPARATOR);
decimalSeparator_ = properties.getString (JDProperties.DECIMAL_SEPARATOR);
timeFormat_ = properties.getIndex (JDProperties.TIME_FORMAT);
timestampFormat_ = properties.getIndex (JDProperties.TIMESTAMP_FORMAT);
timeSeparator_ = properties.getString (JDProperties.TIME_SEPARATOR);
bidiStringType_ = getInt(properties.getString (JDProperties.BIDI_STRING_TYPE)); // @E1A
bidiImplicitReordering_ = properties.getBoolean(JDProperties.BIDI_IMPLICIT_REORDERING); //@KBA
bidiNumericOrdering_ = properties.getBoolean(JDProperties.BIDI_NUMERIC_ORDERING); //@KBA
if (dateSeparator_.equalsIgnoreCase (JDProperties.DATE_SEPARATOR_SPACE))
dateSeparator_ = " ";
if (timeSeparator_.equalsIgnoreCase (JDProperties.TIME_SEPARATOR_SPACE))
timeSeparator_ = " ";
maxFieldSize_ = 0;
useBigDecimal_ = properties.getBoolean(JDProperties.BIG_DECIMAL); // @E0A
translateBoolean_ = properties.getBoolean(JDProperties.TRANSLATE_BOOLEAN); // @PDA
}
/* Create a new SQLConversionSettings object, changing the maxFieldSize */
/* @H4A*/
private SQLConversionSettings (SQLConversionSettings oldSettings, int maxFieldSize) {
dateFormat_ = oldSettings.dateFormat_;
dateSeparator_ = oldSettings.dateSeparator_;
decimalSeparator_ = oldSettings.decimalSeparator_;
timeFormat_ = oldSettings.timeFormat_;
timeSeparator_ = oldSettings.timeSeparator_;
timestampFormat_ = oldSettings.timestampFormat_;
bidiStringType_ = oldSettings.bidiStringType_;
bidiImplicitReordering_ = oldSettings.bidiImplicitReordering_;
bidiNumericOrdering_ = oldSettings.bidiNumericOrdering_;
dateSeparator_ = oldSettings.dateSeparator_;
timeSeparator_ = oldSettings.timeSeparator_;
maxFieldSize_ = maxFieldSize;
useBigDecimal_ = oldSettings.useBigDecimal_;
translateBoolean_ = oldSettings.translateBoolean_;
}
private boolean stringRefsEqual(String s1, String s2) {
if (s1 == null) {
if (s2 == null) {
return true;
} else {
return false;
}
} else {
if (s2 == null) {
return false;
} else {
return s1.equals(s2);
}
}
}
/**
* Does the current object settings match the default connection settings
*
*/
/*@H4A*/
private boolean matches (AS400JDBCConnection connection) throws SQLException
{
JDProperties properties = connection.getProperties ();
if (dateFormat_ != properties.getIndex (JDProperties.DATE_FORMAT)) {
return false;
}
String dateSeparatorCompare = dateSeparator_;
if (dateSeparatorCompare != null) {
if (dateSeparatorCompare == " ") {
dateSeparatorCompare = JDProperties.DATE_SEPARATOR_SPACE;
}
}
if (!(stringRefsEqual(dateSeparatorCompare,properties.getString (JDProperties.DATE_SEPARATOR)))){
return false;
}
if (!(stringRefsEqual(decimalSeparator_,properties.getString (JDProperties.DECIMAL_SEPARATOR)))){
return false;
}
if (timeFormat_ != properties.getIndex (JDProperties.TIME_FORMAT)) {
return false;
}
String timeSeparatorCompare = timeSeparator_;
if (timeSeparatorCompare != null) {
if (timeSeparatorCompare == " ") {
timeSeparatorCompare = JDProperties.TIME_SEPARATOR_SPACE;
}
}
if (timestampFormat_ != properties.getIndex (JDProperties.TIMESTAMP_FORMAT)) {
return false;
}
if (!(stringRefsEqual(timeSeparatorCompare, properties.getString (JDProperties.TIME_SEPARATOR)))){
return false;
}
if (bidiStringType_ != getInt(properties.getString (JDProperties.BIDI_STRING_TYPE))){
return false;
}
if ( bidiImplicitReordering_ != properties.getBoolean(JDProperties.BIDI_IMPLICIT_REORDERING)) {
return false;
}
if (bidiNumericOrdering_ != properties.getBoolean(JDProperties.BIDI_NUMERIC_ORDERING)) {
return false;
}
if (maxFieldSize_ != 0 ) {
return false;
}
if (useBigDecimal_ != properties.getBoolean(JDProperties.BIG_DECIMAL)) {
return false;
}
if (translateBoolean_ != properties.getBoolean(JDProperties.TRANSLATE_BOOLEAN)) {
return false;
}
return true;
}
//@E1A
/**
Get int value of bidiString property which is a string. Return -1 if empty string
(property not set) since 0 is BidiStringType.DEFAULT.
@return The int value of a string bidiString property.
**/
int getInt (String value)
{
try {
return Integer.parseInt (value);
}
catch (NumberFormatException e) {
return -1;
}
}
//@E1A
/**
Returns the bidi string type.
@return The bidi string type.
**/
int getBidiStringType ()
{
return bidiStringType_;
}
//@KBA
boolean getBidiImplicitReordering()
{
return bidiImplicitReordering_;
}
//@KBA
boolean getBidiNumericOrdering()
{
return bidiNumericOrdering_;
}
//@PDA
boolean getTranslateBoolean()
{
return translateBoolean_;
}
/**
Returns the current date format.
@return The date format.
**/
int getDateFormat ()
{
return dateFormat_;
}
/**
Returns the current date separator.
@return The date separator.
**/
String getDateSeparator ()
{
return dateSeparator_;
}
/**
Returns the current decimal separator.
@return The decimal separator.
**/
String getDecimalSeparator ()
{
return decimalSeparator_;
}
/**
Returns the current max field size.
@return The max field size (in bytes).
**/
int getMaxFieldSize ()
{
return maxFieldSize_;
}
/**
Returns the current time format.
@return The time format.
**/
int getTimeFormat ()
{
return timeFormat_;
}
/**
Returns the current time separator.
@return The time separator.
**/
String getTimeSeparator ()
{
return timeSeparator_;
}
/**
Returns the current timestamp format.
@return The timestamp format.
**/
int getTimestampFormat ()
{
return timestampFormat_;
}
// @E0A
/**
Indicates if packed/zoned decimal conversions should
use a BigDecimal.
@return true of packed/zoned decimal conversions should
use a BigDecimal, false otherwise.
**/
boolean useBigDecimal()
{
return useBigDecimal_;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy