com.ibm.as400.access.AS400FileRecordDescriptionImplRemote 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: AS400FileRecordDescriptionImplRemote.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.math.BigDecimal;
import java.io.IOException;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Date;
/**
* Represents the record descriptions of a physical
* or logical file on the server. This class is used to retrieve the file field description
* of a physical or logical file, and to create Java source code
* for a class extending from
* RecordFormat that
* can then be compiled and used as input to the
* AS400File.setRecordFormat()
* method.
* This allows the record format to be created statically during
* development time and then reused when needed.
* The class also provides a method for returning RecordFormat objects
* that can be used as input to the AS400File.setRecordFormat() method.
* This method can be used to create the record format dynamically.
* The output from the createRecordFormatSource()
* and
* retrieveRecordFormat() methods
* contains enough information to use to describe the record format of the
* existing file from which it was generated. The record formats
* generated are not meant for creating files with the same format as the
* file from which they are retrieved. Use the IBM i "Copy File" (CPYF) command to create
* a file with the same format as an existing file.
*
* AS400FileRecordDescription objects generate the following events:
*
* - AS400FileRecordDescriptionEvent
*
The events fired are:
*
* - recordFormatRetrieved
*
- recordFormatSourceCreated
*
* - PropertyChangeEvent
*
- VetoableChangeEvent
*
**/
class AS400FileRecordDescriptionImplRemote implements AS400FileRecordDescriptionImpl
{
static final long serialVersionUID = 4L;
// File name
private String file_ = "";
// Library name
private String library_ = "";
// The IFS path name of the file
private String name_ = "";
// SequentialFile object representing the file whose record description
// is being retrieved
private AS400FileImplBase theFile_ = null; //@C0C @B5C
// The path name for the SequentialFile
// The server where the file is located
private AS400ImplRemote system_ = null; //@B5C
// Used for synchronizing the QTEMP/JT4FFD and QTEMP/JT4FD files across threads
private static Object lockJT4FFD_ = new Object(); //@E0A
private static Object lockJT4FD_ = new Object(); //@E0A
/**
*Adds a field description to the specified RecordFormat object. The field description
*is created with information extracted from the Record object provided.
*@param rf The record format to which to add the field description.
*@param record The record from which to obtain the field information.
*@exception UnsupportedEncodingException If an error occurs during conversion.
**/
void addFieldDescription(RecordFormat rf, Record record)
throws UnsupportedEncodingException
{
char fieldType = ((String)record.getField("WHFLDT")).charAt(0);
FieldDescription fd = null;
int digits;
int decimalPositions;
int byteLength; //@A1A: For float field descriptions
String fieldName = ((String)record.getField("WHFLDE")).trim();
int ccsid;
switch(fieldType)
{
case 'A': // Character field
// Need to get the length in bytes of the field and the ccsid of the field
// when creating the AS400Text object. The name of the field is set to be
// the DDS name of the field (which causes the DDS name of the field description
// to be the DDS name as well).
ccsid = ((BigDecimal)record.getField("WHCCSID")).intValue();
if(ccsid == 65535)
{
// 65535 is not a valid ccsid, retrieve the default system ccsid
ccsid = system_.getCcsid();
}
fd = new CharacterFieldDescription(
new AS400Text((((String)record.getField("WHVARL")).equals("Y"))?
((BigDecimal)record.getField("WHFLDB")).intValue() - 2:
((BigDecimal)record.getField("WHFLDB")).intValue(),
ccsid, system_), //@D0C
fieldName);
if(((String)record.getField("WHVARL")).equals("Y"))
{
if(((BigDecimal)record.getField("WHALLC")).intValue() > 0)
{ // A length was specified on the VARLEN keyword
((CharacterFieldDescription)fd).setVARLEN(((BigDecimal)record.getField("WHALLC")).intValue());
}
else
{ // No length was specified on the VARLEN keyword
((CharacterFieldDescription)fd).setVariableLength(true);
}
}
// Set the DFT keyword value if specified
if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0)
{
// Need to strip off the beginning and ending apostrophes
String dft = (String)record.getField("WHDFT");
// @B0C
// Check for any special values that could be specified as the default.
// Handle *NULL
if(dft.indexOf("*NULL") != -1)
{
((CharacterFieldDescription)fd).setDFTNull();
}
// Handle 'value'
else if(dft.indexOf("'") != -1)
{
String adjDft = dft.substring(dft.indexOf("'") + 1, dft.lastIndexOf("'"));
((CharacterFieldDescription)fd).setDFT(adjDft);
}
// Do nothing if a special value was present and we didn't know what
// it was.
}
break;
case 'B': // Binary field
digits = ((BigDecimal)record.getField("WHFLDO")).intValue();
// if (digits < 6)
if(digits < 5) // @A2C
{
fd = new BinaryFieldDescription(new AS400Bin2(),
fieldName,
fieldName,
digits);
// Set the DFT keyword value if specified
if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0)
{
String dft = ((String)record.getField("WHDFT")).trim();
if(dft.charAt(0) == '+')
{
dft = dft.substring(1);
}
// @B0C
// Check for any special values that could be specified as the default.
// Handle *NULL
if(dft.indexOf("*NULL") != -1)
{
((BinaryFieldDescription)fd).setDFTNull();
}
// Handle value
else
{
((BinaryFieldDescription)fd).setDFT(Short.valueOf(dft));
}
}
}
else if (digits < 10) //@F0C
{
fd = new BinaryFieldDescription(new AS400Bin4(),
fieldName,
fieldName,
digits);
// Set the DFT keyword value if specified
if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0)
{
String dft = ((String)record.getField("WHDFT")).trim();
if(dft.charAt(0) == '+')
{
dft = dft.substring(1);
}
// @B0C
// Check for any special values that could be specified as the default.
// Handle *NULL
if(dft.indexOf("*NULL") != -1)
{
((BinaryFieldDescription)fd).setDFTNull();
}
// Handle value
else
{
((BinaryFieldDescription)fd).setDFT(Integer.valueOf(dft));
}
}
}
else //@F0A
{
fd = new BinaryFieldDescription(new AS400Bin8(),
fieldName,
fieldName,
digits);
// Set the DFT keyword value if specified
if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0)
{
String dft = ((String)record.getField("WHDFT")).trim();
if(dft.charAt(0) == '+')
{
dft = dft.substring(1);
}
// @B0C
// Check for any special values that could be specified as the default.
// Handle *NULL
if(dft.indexOf("*NULL") != -1)
{
((BinaryFieldDescription)fd).setDFTNull();
}
// Handle value
else
{
((BinaryFieldDescription)fd).setDFT(Long.valueOf(dft));
}
}
}
break;
case 'E': // DBCS-Either field
// Need to get the length in bytes of the field and the ccsid of the field
// when creating the AS400Text object. The name of the field is set to be
// the DDS name of the field (which causes the DDS name of the field description
// to be the DDS name as well).
ccsid = ((BigDecimal)record.getField("WHCCSID")).intValue();
if(ccsid == 65535)
{
// 65535 is not a valid ccsid, retrieve the default system ccsid
ccsid = system_.getCcsid();
}
fd = new DBCSEitherFieldDescription(
new AS400Text((((String)record.getField("WHVARL")).equals("Y"))?
((BigDecimal)record.getField("WHFLDB")).intValue() - 2:
((BigDecimal)record.getField("WHFLDB")).intValue(),
ccsid, system_), //@D0C
fieldName);
if(((String)record.getField("WHVARL")).equals("Y"))
{
if(((BigDecimal)record.getField("WHALLC")).intValue() > 0)
{ // A length was specified on the VARLEN keyword
((DBCSEitherFieldDescription)fd).setVARLEN(((BigDecimal)record.getField("WHALLC")).intValue());
}
else
{ // No length was specified on the VARLEN keyword
((DBCSEitherFieldDescription)fd).setVariableLength(true);
}
}
// Set the DFT keyword value if specified
if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0)
{
// Need to strip off the beginning and ending apostrophes
String dft = (String)record.getField("WHDFT");
// @B0C
// Check for any special values that could be specified as the default.
// Handle *NULL
if(dft.indexOf("*NULL") != -1)
{
((DBCSEitherFieldDescription)fd).setDFTNull();
}
// Handle 'value'
else if(dft.indexOf("'") != -1)
{
String adjDft = dft.substring(dft.indexOf("'") + 1, dft.lastIndexOf("'"));
((DBCSEitherFieldDescription)fd).setDFT(adjDft);
}
// Do nothing if a special value was present and we didn't know what
// it was.
}
break;
case 'F': // Float field
digits = ((BigDecimal)record.getField("WHFLDO")).intValue();
decimalPositions = ((BigDecimal)record.getField("WHFLDP")).intValue();
//@A1A: Retrieve byte length to determine if field is single or double
// precision
byteLength = ((BigDecimal)record.getField("WHFLDB")).intValue(); //@A1A
if(byteLength == 4) //@A1A
{
fd = new FloatFieldDescription(new AS400Float4(),
fieldName,
fieldName,
digits,
decimalPositions);
// Set the DFT keyword value if specified
if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0)
{
String dft = ((String)record.getField("WHDFT")).trim();
if(dft.charAt(0) == '+')
{
dft = dft.substring(1);
}
// @B0C
// Check for any special values that could be specified as the default.
// Handle *NULL
if(dft.indexOf("*NULL") != -1)
{
((FloatFieldDescription)fd).setDFTNull();
}
// Handle value
else
{
((FloatFieldDescription)fd).setDFT(Float.valueOf(dft));
}
}
}
else if(byteLength == 8) //@A1A
{
fd = new FloatFieldDescription(new AS400Float8(),
fieldName,
fieldName,
digits,
decimalPositions);
// Set the FLTPCN keyword to *DOUBLE
((FloatFieldDescription)fd).setFLTPCN("*DOUBLE");
// Set the DFT keyword value if specified
if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0)
{
String dft = ((String)record.getField("WHDFT")).trim();
if(dft.charAt(0) == '+')
{
dft = dft.substring(1);
}
// @B0C
// Check for any special values that could be specified as the default.
// Handle *NULL
if(dft.indexOf("*NULL") != -1)
{
((FloatFieldDescription)fd).setDFTNull();
}
// Handle value
else
{
((FloatFieldDescription)fd).setDFT(Double.valueOf(dft));
}
}
}
else //@A1A: This should never occur, but for completeness....
{
//@A1A
Trace.log(Trace.ERROR, "FloatFieldDescription error in byte length"); //@A1A
throw new InternalErrorException(InternalErrorException.UNKNOWN); //@A1A
} //@A1A
break;
case 'G': // DBCS-Graphic field
// Need to get the length in bytes of the field and the ccsid of the field
// when creating the AS400Text object. The name of the field is set to be
// the DDS name of the field (which causes the DDS name of the field description
// to be the DDS name as well).
ccsid = ((BigDecimal)record.getField("WHCCSID")).intValue();
if(ccsid == 65535)
{
// 65535 is not a valid ccsid, retrieve the default system ccsid
ccsid = system_.getCcsid();
}
fd = new DBCSGraphicFieldDescription(
new AS400Text((((String)record.getField("WHVARL")).equals("Y"))?
((BigDecimal)record.getField("WHFLDB")).intValue() - 2:
((BigDecimal)record.getField("WHFLDB")).intValue(),
ccsid, system_), //@D0C
fieldName);
if(((String)record.getField("WHVARL")).equals("Y"))
{
if(((BigDecimal)record.getField("WHALLC")).intValue() > 0)
{ // A length was specified on the VARLEN keyword
((DBCSGraphicFieldDescription)fd).setVARLEN(((BigDecimal)record.getField("WHALLC")).intValue());
}
else
{ // No length was specified on the VARLEN keyword
((DBCSGraphicFieldDescription)fd).setVariableLength(true);
}
}
// Set the DFT keyword value if specified
if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0)
{
// Need to strip off the beginning and ending apostrophes
String dft = (String)record.getField("WHDFT");
// @B0C
// Check for any special values that could be specified as the default.
// Handle *NULL
if(dft.indexOf("*NULL") != -1)
{
((DBCSGraphicFieldDescription)fd).setDFTNull();
}
// Handle 'value'
else if(dft.indexOf("'") != -1)
{
String adjDft = dft.substring(dft.indexOf("'") + 1, dft.lastIndexOf("'"));
((DBCSGraphicFieldDescription)fd).setDFT(adjDft);
}
// Do nothing if a special value was present and we didn't know what
// it was.
}
break;
case 'H': // Hex field
case '5': // SQL Binary type
// Need to get the length in bytes of the field
// when creating the AS400ByteArray object. The name of the field is set to be
// the DDS name of the field (which causes the DDS name of the field description
// to be the DDS name as well).
fd = new HexFieldDescription(
new AS400ByteArray((((String)record.getField("WHVARL")).equals("Y"))?
((BigDecimal)record.getField("WHFLDB")).intValue() - 2 :
((BigDecimal)record.getField("WHFLDB")).intValue()), fieldName);
if(((String)record.getField("WHVARL")).equals("Y"))
{
if(((BigDecimal)record.getField("WHALLC")).intValue() > 0)
{ // A length was specified on the VARLEN keyword
((HexFieldDescription)fd).setVARLEN(((BigDecimal)record.getField("WHALLC")).intValue());
}
else
{ // No length was specified on the VARLEN keyword
((HexFieldDescription)fd).setVariableLength(true);
}
}
// @B0A: Set the DFT keyword value if specified
if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0)
{
// Need to strip off the beginning and ending apostrophes
String dft = (String)record.getField("WHDFT");
// Check for any special values that could be specified as the default.
// Handle *NULL
if(dft.indexOf("*NULL") != -1)
{
((HexFieldDescription)fd).setDFTNull();
}
// Handle 'value'
else if(dft.indexOf("'") != -1)
{
String adjDft = dft.substring(dft.indexOf("'") + 1, dft.lastIndexOf("'"));
byte[] dftBytes = adjDft.getBytes();
((HexFieldDescription)fd).setDFT(dftBytes);
}
// Do nothing if a special value was present and we didn't know what
// it was.
}
break;
case 'J': // DBCS-Only field
// Need to get the length in bytes of the field and the ccsid of the field
// when creating the AS400Text object. The name of the field is set to be
// the DDS name of the field (which causes the DDS name of the field description
// to be the DDS name as well).
ccsid = ((BigDecimal)record.getField("WHCCSID")).intValue();
if(ccsid == 65535)
{
// 65535 is not a valid ccsid, retrieve the default system ccsid
ccsid = system_.getCcsid();
}
fd = new DBCSOnlyFieldDescription(
new AS400Text((((String)record.getField("WHVARL")).equals("Y"))?
((BigDecimal)record.getField("WHFLDB")).intValue() - 2:
((BigDecimal)record.getField("WHFLDB")).intValue(),
ccsid, system_), //@D0C
fieldName);
if(((String)record.getField("WHVARL")).equals("Y"))
{
if(((BigDecimal)record.getField("WHALLC")).intValue() > 0)
{ // A length was specified on the VARLEN keyword
((DBCSOnlyFieldDescription)fd).setVARLEN(((BigDecimal)record.getField("WHALLC")).intValue());
}
else
{ // No length was specified on the VARLEN keyword
((DBCSOnlyFieldDescription)fd).setVariableLength(true);
}
}
// Set the DFT keyword value if specified
if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0)
{
// Need to strip off the beginning and ending apostrophes
String dft = (String)record.getField("WHDFT");
// @B0C
// Check for any special values that could be specified as the default.
// Handle *NULL
if(dft.indexOf("*NULL") != -1)
{
((DBCSOnlyFieldDescription)fd).setDFTNull();
}
// Handle 'value'
else if(dft.indexOf("'") != -1)
{
String adjDft = dft.substring(dft.indexOf("'") + 1, dft.lastIndexOf("'"));
((DBCSOnlyFieldDescription)fd).setDFT(adjDft);
}
// Do nothing if a special value was present and we didn't know what
// it was.
}
break;
case 'L': // Date field
ccsid = ((BigDecimal)record.getField("WHCCSID")).intValue();
if(ccsid == 65535)
{
// 65535 is not a valid ccsid, retrieve the default system ccsid
ccsid = system_.getCcsid();
}
fd = new DateFieldDescription(
new AS400Text(((BigDecimal)record.getField("WHFLDB")).intValue(),
ccsid, system_), //@D0C
fieldName);
// Set date format and date separator values
((DateFieldDescription)fd).setDATFMT((String)record.getField("WHFMT"));
if(!((String)record.getField("WHFMT")).equals(" "))
{
((DateFieldDescription)fd).setDATSEP((String)record.getField("WHSEP"));
}
// Set the DFT keyword value if specified
if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0)
{
// Need to strip off the beginning and ending apostrophes
String dft = (String)record.getField("WHDFT");
// @B0C
// Check for any special values that could be specified as the default.
// Handle *NULL
if(dft.indexOf("*NULL") != -1)
{
((DateFieldDescription)fd).setDFTNull();
}
// Handle CURRENT_DATE (an SQL special value)
else if(dft.indexOf("CURRENT_DATE") != -1)
{
((DateFieldDescription)fd).setDFTCurrent();
}
// Handle 'value'
else if(dft.indexOf("'") != -1)
{
String adjDft = dft.substring(dft.indexOf("'") + 1, dft.lastIndexOf("'"));
((DateFieldDescription)fd).setDFT(adjDft);
}
// Do nothing if a special value was present and we didn't know what
// it was.
}
break;
case 'O': // DBCS-Open field
// Need to get the length in bytes of the field and the ccsid of the field
// when creating the AS400Text object. The name of the field is set to be
// the DDS name of the field (which causes the DDS name of the field description
// to be the DDS name as well).
ccsid = ((BigDecimal)record.getField("WHCCSID")).intValue();
if(ccsid == 65535)
{
// 65535 is not a valid ccsid, retrieve the default system ccsid
ccsid = system_.getCcsid();
}
fd = new DBCSOpenFieldDescription(
new AS400Text((((String)record.getField("WHVARL")).equals("Y"))?
((BigDecimal)record.getField("WHFLDB")).intValue() - 2:
((BigDecimal)record.getField("WHFLDB")).intValue(),
ccsid, system_), //@D0C
fieldName);
if(((String)record.getField("WHVARL")).equals("Y"))
{
if(((BigDecimal)record.getField("WHALLC")).intValue() > 0)
{ // A length was specified on the VARLEN keyword
((DBCSOpenFieldDescription)fd).setVARLEN(((BigDecimal)record.getField("WHALLC")).intValue());
}
else
{ // No length was specified on the VARLEN keyword
((DBCSOpenFieldDescription)fd).setVariableLength(true);
}
}
// Set the DFT keyword value if specified
if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0)
{
// Need to strip off the beginning and ending apostrophes
String dft = (String)record.getField("WHDFT");
// @B0C
// Check for any special values that could be specified as the default.
// Handle *NULL
if(dft.indexOf("*NULL") != -1)
{
((DBCSOpenFieldDescription)fd).setDFTNull();
}
// Handle 'value'
else if(dft.indexOf("'") != -1)
{
String adjDft = dft.substring(dft.indexOf("'") + 1, dft.lastIndexOf("'"));
((DBCSOpenFieldDescription)fd).setDFT(adjDft);
}
// Do nothing if a special value was present and we didn't know what
// it was.
}
break;
case 'P': // Packed decimal field
digits = ((BigDecimal)record.getField("WHFLDO")).intValue();
decimalPositions = ((BigDecimal)record.getField("WHFLDP")).intValue();
fd = new PackedDecimalFieldDescription(new AS400PackedDecimal(digits, decimalPositions),
fieldName);
// Set the DFT keyword value if specified
if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0)
{
String dft = ((String)record.getField("WHDFT")).trim();
if(dft.charAt(0) == '+')
{
dft = dft.substring(1);
}
// @B0C
// Check for any special values that could be specified as the default.
// Handle *NULL
if(dft.indexOf("*NULL") != -1)
{
((PackedDecimalFieldDescription)fd).setDFTNull();
}
// Handle value
else
{
((PackedDecimalFieldDescription)fd).setDFT(new BigDecimal(dft));
}
}
break;
case 'S': // Zoned decimal field
digits = ((BigDecimal)record.getField("WHFLDO")).intValue();
decimalPositions = ((BigDecimal)record.getField("WHFLDP")).intValue();
fd = new ZonedDecimalFieldDescription(new AS400ZonedDecimal(digits, decimalPositions),
fieldName);
// Set the DFT keyword value if specified
if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0)
{
String dft = ((String)record.getField("WHDFT")).trim();
if(dft.charAt(0) == '+')
{
dft = dft.substring(1);
}
// @B0C
// Check for any special values that could be specified as the default.
// Handle *NULL
if(dft.indexOf("*NULL") != -1)
{
((ZonedDecimalFieldDescription)fd).setDFTNull();
}
// Handle value
else
{
((ZonedDecimalFieldDescription)fd).setDFT(new BigDecimal(dft));
}
}
break;
case 'T': // Time field
ccsid = ((BigDecimal)record.getField("WHCCSID")).intValue();
if(ccsid == 65535)
{
// 65535 is not a valid ccsid, retrieve the default system ccsid
ccsid = system_.getCcsid();
}
fd = new TimeFieldDescription(
new AS400Text(((BigDecimal)record.getField("WHFLDB")).intValue(),
ccsid, system_), //@D0C
fieldName);
// Set date format and date separator values
((TimeFieldDescription)fd).setTIMFMT((String)record.getField("WHFMT"));
if(!((String)record.getField("WHSEP")).equals(" "))
{
((TimeFieldDescription)fd).setTIMSEP((String)record.getField("WHSEP"));
}
// Set the DFT keyword value if specified
if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0)
{
// Need to strip off the beginning and ending apostrophes
String dft = (String)record.getField("WHDFT");
// @B0C
// Check for any special values that could be specified as the default.
// Handle *NULL
if(dft.indexOf("*NULL") != -1)
{
((TimeFieldDescription)fd).setDFTNull();
}
// Handle CURRENT_TIME (an SQL special value)
else if(dft.indexOf("CURRENT_TIME") != -1)
{
((TimeFieldDescription)fd).setDFTCurrent();
}
// Handle 'value'
else if(dft.indexOf("'") != -1)
{
String adjDft = dft.substring(dft.indexOf("'") + 1, dft.lastIndexOf("'"));
((TimeFieldDescription)fd).setDFT(adjDft);
}
// Do nothing if a special value was present and we didn't know what
// it was.
}
break;
case 'Z': // Timestamp field
ccsid = ((BigDecimal)record.getField("WHCCSID")).intValue();
if(ccsid == 65535)
{
// 65535 is not a valid ccsid, retrieve the default system ccsid
ccsid = system_.getCcsid();
}
fd = new TimestampFieldDescription(
new AS400Text(((BigDecimal)record.getField("WHFLDB")).intValue(),
ccsid, system_), //@D0C
fieldName);
// Set the DFT keyword value if specified
if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0)
{
// Need to strip off the beginning and ending apostrophes
String dft = (String)record.getField("WHDFT");
// @B0C
// Check for any special values that could be specified as the default.
// Handle *NULL
if(dft.indexOf("*NULL") != -1)
{
((TimestampFieldDescription)fd).setDFTNull();
}
// Handle CURRENT_TIMESTAMP (an SQL special value)
else if(dft.indexOf("CURRENT_TIMESTAMP") != -1)
{
((TimestampFieldDescription)fd).setDFTCurrent();
}
// Handle 'value'
else if(dft.indexOf("'") != -1)
{
String adjDft = dft.substring(dft.indexOf("'") + 1, dft.lastIndexOf("'"));
((TimestampFieldDescription)fd).setDFT(adjDft);
}
// Do nothing if a special value was present and we didn't know what
// it was.
}
break;
default:
Trace.log(Trace.ERROR, "Unrecognized field type: " + fieldType);
throw new InternalErrorException(InternalErrorException.UNKNOWN);
}
// Set if null values are allowed
if(((String)record.getField("WHNULL")).equals("Y"))
{
fd.setALWNULL(true);
}
// Set the field text
fd.setTEXT(((String)record.getField("WHFTXT")).trim());
String value;
// Set the ALIAS
value = ((String)record.getField("WHALIS")).trim();
if(value.length() != 0) fd.setALIAS(value);
// Set the REFFIL (reference file)
value = ((String)record.getField("WHRFIL")).trim();
if(value.length() != 0) fd.setREFFIL(value);
// Set the REFFLD (reference field)
value = ((String)record.getField("WHRFLD")).trim();
if(value.length() != 0) fd.setREFFLD(value);
// Set the REFFMT (reference record format)
value = ((String)record.getField("WHRFMT")).trim();
if(value.length() != 0) fd.setREFFMT(value);
// Set the REFLIB (reference library)
value = ((String)record.getField("WHRLIB")).trim();
if(value.length() != 0) fd.setREFLIB(value);
// Set the COLHDG (column heading)
String colHdg1 = ((String)record.getField("WHCHD1")).trim();
String colHdg2 = ((String)record.getField("WHCHD2")).trim();
String colHdg3 = ((String)record.getField("WHCHD3")).trim();
if (colHdg1.length() == 0 &&
colHdg2.length() == 0 &&
colHdg3.length() == 0)
{} // nothing to set
else
{
// Concatenate the 3 "column heading" fields into a single string.
// Delimit each part by single-quotes.
// For example: "'FIRST PART' 'SECOND PART' 'THIRD PART'"
StringBuffer sb = new StringBuffer();
if (colHdg1.length() == 0) sb.append("''");
else sb.append("'" + colHdg1 + "'");
if (colHdg2.length() == 0) {
if (colHdg3.length() == 0) {}
else sb.append(" ''");
}
else sb.append(" '" + colHdg2 + "'");
if (colHdg3.length() == 0) {}
else sb.append(" '" + colHdg3 + "'");
fd.setCOLHDG(sb.toString());
}
// Add the field description
rf.addFieldDescription(fd);
}
/**
*Retrieves the file description for the file, and creates a file containing the Java source for
*a class extending from RecordFormat that represents the record format for the file. If the
*file contains more than one record format (for example, is a multiple format logical file), a Java
*source file for each record format in the file is created; each file will contain the class
*definition for a single record format.
*The name of the class is the name of the record format retrieved with the string "Format"
*appended to it. The name of the file is the name of the class with the extension .java.
*The source files generated can be compiled and used as input to the
*AS400File.setRecordFormat() method.
*The server to which to connect, and the integrated file system
*pathname for the file, must be set prior to invoking this method.
*@see AS400FileRecordDescription#AS400FileRecordDescription(com.ibm.as400.access.AS400, java.lang.String)
*@see AS400FileRecordDescription#setPath
*@see AS400FileRecordDescription#setSystem
*@param packageName The name of the package in which the class belongs. The packageName
*is used to specify the package statement in the source code for the class.
* If this value is null, no package statement is specified in the source code for the class.
*@exception AS400Exception If the system returns an error message.
*@exception AS400SecurityException If a security or authority error occurs.
*@exception ConnectionDroppedException If the connection is dropped unexpectedly.
*@exception IOException If an error occurs while communicating with the
*server.
*@exception InterruptedException If this thread is interrupted.
*@exception ServerStartupException If the host server cannot be started.
*@return An array of Strings: { rfName0, contents0, rfName1, contents1, etc... }.
**/
public /*@E0D synchronized */ String[] createRecordFormatSource(String packageName) //@C0C
throws AS400Exception,
AS400SecurityException,
IOException,
InterruptedException
{
// ------------------------------------------------------------
// Retrieve the field information for the file
// ------------------------------------------------------------
// Generate file on the server containing the file field description
// ------------------------------------------------------------
String cmd = "DSPFFD FILE(" + library_ + "/" + file_ + ") OUTPUT(*OUTFILE) OUTFILE(QTEMP/JT4FFD)";
//@B5D theFile_.chooseImpl();
Record[] records = null; //@E0A
synchronized(lockJT4FFD_) //@E0A
{ //@E0A
AS400Message[] msgs = theFile_.execute(cmd); //@B5C
if(msgs.length > 0)
{
if(!(msgs[0].getID().equals("CPF9861") || msgs[0].getID().equals("CPF3030")))
{
throw new AS400Exception(msgs);
}
}
else
{ // Unexpected reply
Trace.log(Trace.ERROR, "DSPFFD failed to return success message", cmd);
throw new InternalErrorException(InternalErrorException.UNKNOWN);
}
// Read all the records from the file so we can extract the field information locally
//@B5D SequentialFile dspffd = new SequentialFile(system_, "/QSYS.LIB/QTEMP.LIB/JT4FFD.FILE");
AS400FileImplBase tempFile = (AS400FileImplBase)system_.loadImpl("com.ibm.as400.access.AS400FileImplNative", //@B5A
"com.ibm.as400.access.AS400FileImplRemote"); //@B5A
tempFile.setAll(system_, "/QSYS.LIB/QTEMP.LIB/JT4FFD.FILE", //@B5A
new QWHDRFFDFormat(system_.getCcsid()), false, false, false); //@B5A
//@B5D try
//@B5D {
//@B5D dspffd.setRecordFormat(new QWHDRFFDFormat(system_.getCcsid()));
//@B5D }
//@B5D catch(PropertyVetoException e)
//@B5D { // Quiet the compiler
//@B5D }
records = tempFile.readAll("seq", 100); //@B5C @D1C @E0C
tempFile.delete(); //@E0A
} //@E0A
// ------------------------------------------------------------
// Retrieve the key field information for the file
// ------------------------------------------------------------
// Generate file on the server containing the key field description
cmd = "DSPFD FILE(" + library_ + "/" + file_ + ") TYPE(*ACCPTH) OUTPUT(*OUTFILE) OUTFILE(QTEMP/JT4FD)";
Record[] keyRecords = null; //@E0A
synchronized(lockJT4FD_) //@E0A
{ //@E0A
AS400Message[] msgs = theFile_.execute(cmd); //@B5C @E0C
if(msgs.length > 0)
{
if(!(msgs[0].getID().equals("CPF9861") || msgs[0].getID().equals("CPF3030")))
{
throw new AS400Exception(msgs);
}
}
else
{ // Unexpected reply
Trace.log(Trace.ERROR, "DSPFD failed to return success message", cmd);
throw new InternalErrorException(InternalErrorException.UNKNOWN);
}
// Read all the records from the file so we can extract the key field information locally
//@B5D dspffd = new SequentialFile(system_, "/QSYS.LIB/QTEMP.LIB/JT4FD.FILE");
AS400FileImplBase tempFile = (AS400FileImplBase)system_.loadImpl("com.ibm.as400.access.AS400FileImplNative", //@B5A @E0C
"com.ibm.as400.access.AS400FileImplRemote"); //@B5A
tempFile.setAll(system_, "/QSYS.LIB/QTEMP.LIB/JT4FD.FILE", //@B5A
new QWHFDACPFormat(system_.getCcsid()), false, false, false); //@B5A
//@B5D try
//@B5D {
//@B5D dspffd.setRecordFormat(new QWHFDACPFormat(system_.getCcsid()));
//@B5D }
//@B5D catch(PropertyVetoException e)
//@B5D { // Quiet the compiler
//@B5D }
keyRecords = tempFile.readAll("key", 100); //@B5C @D1C @E0C
tempFile.delete(); //@E0A
} //@E0A
// Determine the number of record formats contained in the file
int numberOfRecordFormats = ((BigDecimal)records[0].getField("WHCNT")).intValue();
int numberOfFields = 0;
int numberOfKeyFields = 0;
int recordNumber = 0;
int keyRecordNumber = 0;
PrintWriter sourceFile;
StringWriter sourceString; //@C0A
String rfNameUntrimmed;
String rfName;
String[] filesToWrite = new String[numberOfRecordFormats*2]; //@C0A
for(int i = 0; i < numberOfRecordFormats; ++i)
{ // Create source file for a particular record format
// Determine the name of the record format and hence the name of the file and class
rfNameUntrimmed = (String)records[recordNumber].getField("WHNAME");
// If the record format is a quoted name, replace the quotes with blanks
rfName = rfNameUntrimmed.replace('"', ' ').trim();
filesToWrite[i] = rfName + "Format.java"; //@C0A
sourceString = new StringWriter(/* 3000 */); //@C0A
sourceFile = new PrintWriter(sourceString); //@C0C
// Write the initial information to the file:
// Nonexclusive license, diclaimer and copyright
// Prolog
// package statement
// import statements
// beginning of class definition
sourceFile.println("/*******************************************************************************");
sourceFile.println(" This source is an example of the Java source necessary ");
sourceFile.println(" to generate a RecordFormat subclass for file " + name_ + ".");
sourceFile.println(" IBM grants you a nonexclusive license to use this source.");
sourceFile.println(" You may change and use this souce as necessary.");
sourceFile.println();
sourceFile.println();
sourceFile.println(" DISCLAIMER");
sourceFile.println(" ----------");
sourceFile.println();
sourceFile.println(" This source code is provided by IBM for illustrative purposes only.");
sourceFile.println(" The source has not been thoroughly tested under all conditions.");
sourceFile.println(" IBM, therefore, cannot guarantee or imply reliability, serviceability,");
sourceFile.println(" or function of the source. All source contained herein are provided to you \"AS IS\"");
sourceFile.println(" without any warranties of any kind.");
sourceFile.println(" ALL WARRANTIES, INCLUDING BUT NOT LIMITED TO THE IMPLIED");
sourceFile.println(" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR");
sourceFile.println(" PURPOSE, ARE EXPRESSLY DISCLAIMED.");
sourceFile.println();
sourceFile.println();
sourceFile.println(" Your license to this source code provides you no right or licenses to");
sourceFile.println(" any IBM patents. IBM has no obligation to defend or indemnify against");
sourceFile.println(" any claim of infringement, including but not limited to: patents,");
sourceFile.println(" copyright, trade secret, or intellectual property rights of any kind.");
sourceFile.println();
sourceFile.println();
sourceFile.println(" COPYRIGHT");
sourceFile.println(" ---------");
sourceFile.println("Copyright (C) 1997-1999 International Business Machines Corporation and others.");
sourceFile.println("All rights reserved.");
sourceFile.println("US Government Users Restricted Rights -");
sourceFile.println("Use, duplication or disclosure restricted");
sourceFile.println("by GSA ADP Schedule Contract with IBM Corp.");
sourceFile.println("Licensed Material - Property of IBM");
sourceFile.println("********************************************************************************/");
sourceFile.println();
sourceFile.println("// Created by AS400FileRecordDescription on " + new Date());
sourceFile.println();
if(packageName != null)
{
sourceFile.println("package " + packageName + ";");
}
sourceFile.println();
sourceFile.println("import java.math.BigDecimal;");
sourceFile.println("import com.ibm.as400.access.RecordFormat;");
sourceFile.println("import com.ibm.as400.access.AS400Bin2;");
sourceFile.println("import com.ibm.as400.access.AS400Bin4;");
sourceFile.println("import com.ibm.as400.access.AS400Bin8;"); //@F0A
sourceFile.println("import com.ibm.as400.access.AS400ByteArray;");
sourceFile.println("import com.ibm.as400.access.AS400Float4;");
sourceFile.println("import com.ibm.as400.access.AS400Float8;");
sourceFile.println("import com.ibm.as400.access.AS400PackedDecimal;");
sourceFile.println("import com.ibm.as400.access.AS400Text;");
sourceFile.println("import com.ibm.as400.access.AS400ZonedDecimal;");
sourceFile.println("import com.ibm.as400.access.BinaryFieldDescription;");
sourceFile.println("import com.ibm.as400.access.CharacterFieldDescription;");
sourceFile.println("import com.ibm.as400.access.DateFieldDescription;");
sourceFile.println("import com.ibm.as400.access.DBCSEitherFieldDescription;");
sourceFile.println("import com.ibm.as400.access.DBCSGraphicFieldDescription;");
sourceFile.println("import com.ibm.as400.access.DBCSOnlyFieldDescription;");
sourceFile.println("import com.ibm.as400.access.DBCSOpenFieldDescription;");
sourceFile.println("import com.ibm.as400.access.FieldDescription;");
sourceFile.println("import com.ibm.as400.access.FloatFieldDescription;");
sourceFile.println("import com.ibm.as400.access.HexFieldDescription;");
sourceFile.println("import com.ibm.as400.access.PackedDecimalFieldDescription;");
sourceFile.println("import com.ibm.as400.access.TimeFieldDescription;");
sourceFile.println("import com.ibm.as400.access.TimestampFieldDescription;");
sourceFile.println("import com.ibm.as400.access.ZonedDecimalFieldDescription;");
sourceFile.println();
// Determine the name of the class from the file name
sourceFile.println("public class " + rfName + "Format extends RecordFormat");
sourceFile.println("{");
sourceFile.println();
sourceFile.println(" public " + rfName + "Format()");
sourceFile.println(" {");
// Write out the call to super with the record format name
sourceFile.println(" super(\"" + rfName + "\");");
// Get the field descriptions.
numberOfFields = ((BigDecimal)records[recordNumber].getField("WHNFLD")).intValue();
if(numberOfFields > 0)
{ // Number of fields is greater than 0
sourceFile.println(" // Add field descriptions to this record format");
for(int j = 0; j < numberOfFields; ++j, ++recordNumber)
{ // Add a field description to the record format
writeFieldDescription(sourceFile, records[recordNumber]);
}
}
// Get the key field descriptions for this record format if there are any
numberOfKeyFields = ((BigDecimal)keyRecords[keyRecordNumber].getField("APNKYF")).intValue();
if(numberOfKeyFields > 0)
{ // Number of key fields is greater than 0
sourceFile.println(" // Add key field descriptions to this record format");
for(int j = 0; j < numberOfKeyFields; ++j, ++keyRecordNumber)
{ // Add a key field description to the record format
sourceFile.println(" addKeyFieldDescription(\"" + ((String)keyRecords[keyRecordNumber].getField("APKEYF")).trim() + "\");");
}
}
// End the class
sourceFile.println(" }");
sourceFile.println("}");
if(sourceFile.checkError())
{
sourceFile.close();
Trace.log(Trace.ERROR, "Error writing to sourceFile.");
throw new InternalErrorException(InternalErrorException.UNKNOWN);
}
sourceFile.close();
filesToWrite[i+1] = sourceString.toString(); //@C0A
}
return filesToWrite; //@C0A
}
/**
*Returns the attributes of a save file, as a record with format SaveFileAttrFormat.
*This method is provided for exclusive use by the SaveFile class.
*@return The save file's attributes.
*@exception AS400Exception If the server returns an error message.
*@exception AS400SecurityException If a security or authority error occurs.
*@exception IOException If an error occurs while communicating with the
*server.
*@exception InterruptedException If this thread is interrupted.
**/
Record getSavefileAttributes()
throws AS400Exception,
AS400SecurityException,
InterruptedException,
IOException
{
// Generate a file on the server, containing the basic attrs description.
String cmd = "DSPFD FILE(" + library_ + "/" + file_ + ") TYPE(*ATR) FILEATR(*SAVF) OUTPUT(*OUTFILE) OUTFILE(QTEMP/JT4FD)";
Record[] attrRecords = null;
synchronized(lockJT4FD_)
{
AS400Message[] msgs = theFile_.execute(cmd);
if(msgs.length > 0)
{
if(!(msgs[0].getID().equals("CPF9861") || msgs[0].getID().equals("CPF3030")))
{
throw new AS400Exception(msgs);
}
}
else
{ // Unexpected reply
Trace.log(Trace.ERROR, "DSPFD failed to return success message", cmd);
throw new InternalErrorException(InternalErrorException.UNKNOWN);
}
// Read all the records from the file so we can extract the key field information locally
AS400FileImplBase tempFile = (AS400FileImplBase)system_.loadImpl("com.ibm.as400.access.AS400FileImplNative",
"com.ibm.as400.access.AS400FileImplRemote");
tempFile.setAll(system_, "/QSYS.LIB/QTEMP.LIB/JT4FD.FILE",
new SaveFileAttrFormat(system_.getCcsid()), false, false, false);
attrRecords = tempFile.readAll("seq", 100);
if (attrRecords.length == 0) {
Trace.log(Trace.ERROR, "No records were returned from command " + cmd);
throw new InternalErrorException(InternalErrorException.UNKNOWN);
}
// Implementation note: I tried using read() and read(0) instead of readAll(), but some needed logic is missing along those paths; so we'll just use what works.
tempFile.delete();
}
return attrRecords[0];
}
//@B5A
/**
* Used internally to parse the pathname and set the individual
* library, filename, and member strings.
**/
private void parseName(String name)
{
// Construct a QSYSObjectPathName object and parse out the library,
// file and member names
QSYSObjectPathName ifs = new QSYSObjectPathName(name);
if(!(ifs.getObjectType().equals("FILE") || ifs.getObjectType().equals("MBR")))
{ // Invalid object type
throw new IllegalPathNameException(name, IllegalPathNameException.OBJECT_TYPE_NOT_VALID);
}
// Set the instance data as appropriate
library_ = ifs.getLibraryName();
file_ = ifs.getObjectName();
name_ = name;
}
/**
*Retrieves the file description for the file, and creates a RecordFormat
*object for each record format, which can be used as input to the
*AS400File.setRecordFormat()
*method. If the file is a physical file, the RecordFormat array returned
*contains one
*RecordFormat object. If the file is a multiple format logical file, the
*RecordFormat array may contain
*more than one RecordFormat object.
*The server to which to connect and the integrated file system
*pathname for the file must be set prior to invoking this method.
*@see AS400FileRecordDescription#AS400FileRecordDescription(com.ibm.as400.access.AS400, java.lang.String)
*@see AS400FileRecordDescription#setPath
*@see AS400FileRecordDescription#setSystem
*@return The record format(s) for the file.
*@exception AS400Exception If the server returns an error message.
*@exception AS400SecurityException If a security or authority error occurs.
*@exception ConnectionDroppedException If the connection is dropped unexpectedly.
*@exception IOException If an error occurs while communicating with the
*server.
*@exception InterruptedException If this thread is interrupted.
*@exception ServerStartupException If the host server cannot be started.
**/
public /*@E0D synchronized */ RecordFormat[] retrieveRecordFormat()
throws AS400Exception,
AS400SecurityException,
InterruptedException,
IOException
{
// ------------------------------------------------------------
// Retrieve the field information for the file
// ------------------------------------------------------------
// Generate file on the server containing the file field description
// ------------------------------------------------------------
String cmd = "DSPFFD FILE(" + library_ + "/" + file_ + ") OUTPUT(*OUTFILE) OUTFILE(QTEMP/JT4FFD)";
//@B5D theFile_.chooseImpl();
Record[] records = null; //@E0A
boolean neededToResetCcsid = false;
synchronized(lockJT4FFD_) //@E0A
{ //@E0A
AS400FileImplBase tempFile = null;
boolean done = false;
for (int i=0; !done && i<2; i++) // no more than two tries
{
AS400Message[] msgs = theFile_.execute(cmd); //@B5C
if(msgs.length > 0)
{
if(!(msgs[0].getID().equals("CPF9861") || // "Output file ... created in library ..."
msgs[0].getID().equals("CPF3030"))) // "... records added to member ... in file ..."
{
throw new AS400Exception(msgs);
}
}
else
{ // Unexpected reply
Trace.log(Trace.ERROR, "DSPFFD failed to return success message", cmd);
throw new InternalErrorException(InternalErrorException.UNKNOWN);
}
// Read all the records from the file so we can extract the field information locally
//@B5D SequentialFile dspffd = new SequentialFile(system_, "/QSYS.LIB/QTEMP.LIB/JT4FFD.FILE");
if (tempFile == null)
{
tempFile = (AS400FileImplBase)system_.loadImpl("com.ibm.as400.access.AS400FileImplNative", //@B5A
"com.ibm.as400.access.AS400FileImplRemote"); //@B5A
tempFile.setAll(system_, "/QSYS.LIB/QTEMP.LIB/JT4FFD.FILE", //@B5A
new QWHDRFFDFormat(system_.getCcsid()), false, false, false); //@B5A
}
//@B5D try
//@B5D {
//@B5D dspffd.setRecordFormat(new QWHDRFFDFormat(system_.getCcsid()));
//@B5D }
//@B5D catch(PropertyVetoException e)
//@B5D { // Quiet the compiler
//@B5D }
records = tempFile.readAll("seq", 100); //@B5C @D1C @E0C
if (records.length == 0)
{
// We got no records back. Assume that it's because the default CCSID for the outfile was incompatible with the CCSID for the file's format.
// Reset the outfile's CCSID and try again.
done = false;
neededToResetCcsid = true;
int ccsid = system_.getCcsid();
if (Trace.traceOn_) Trace.log(Trace.DIAGNOSTIC, "No records were returned from command " + cmd + "; system CCSID is: " + ccsid + ". Resetting CCSID of DSPFFD OUTFILE to " + ccsid);
resetOutfileCCSID("QTEMP", "JT4FFD", ccsid);
}
else done = true;
} // 'for' loop
tempFile.delete(); //@E0A
} // 'synchronized' block
if (records.length == 0)
{
Trace.log(Trace.ERROR, "No records were returned from command " + cmd);
throw new InternalErrorException(InternalErrorException.UNKNOWN);
}
// ------------------------------------------------------------
// Retrieve the key field information for the file
// ------------------------------------------------------------
// Generate file on the server containing the key field description
cmd = "DSPFD FILE(" + library_ + "/" + file_ + ") TYPE(*ACCPTH) OUTPUT(*OUTFILE) OUTFILE(QTEMP/JT4FD)";
Record[] keyRecords = null; //@E0A
synchronized(lockJT4FD_) //@E0A
{ //@E0A
AS400FileImplBase tempFile = null;
boolean done = false;
for (int i=0; !done && i<2; i++) // no more than two tries
{
AS400Message[] msgs = theFile_.execute(cmd); //@B5C @E0C
if(msgs.length > 0)
{
if(!(msgs[0].getID().equals("CPF9861") || msgs[0].getID().equals("CPF3030")))
{
throw new AS400Exception(msgs);
}
}
else
{ // Unexpected reply
Trace.log(Trace.ERROR, "DSPFD failed to return success message", cmd);
throw new InternalErrorException(InternalErrorException.UNKNOWN);
}
// Read all the records from the file so we can extract the key field information locally
//@B5D dspffd = new SequentialFile(system_, "/QSYS.LIB/QTEMP.LIB/JT4FD.FILE");
if (tempFile == null)
{
tempFile = (AS400FileImplBase)system_.loadImpl("com.ibm.as400.access.AS400FileImplNative", //@B5A @E0C
"com.ibm.as400.access.AS400FileImplRemote"); //@B5A
tempFile.setAll(system_, "/QSYS.LIB/QTEMP.LIB/JT4FD.FILE", //@B5A
new QWHFDACPFormat(system_.getCcsid()), false, false, false); //@B5A
}
//@B5D try
//@B5D {
//@B5D dspffd.setRecordFormat(new QWHFDACPFormat(system_.getCcsid()));
//@B5D }
//@B5D catch(PropertyVetoException e)
//@B5D { // Quiet the compiler
//@B5D }
keyRecords = tempFile.readAll("key", 100); //@B5C @D1C @E0C
// If we needed to reset the CCSID of the DSPFD temp file, we probably also need to reset the CCSID of the DSPFD temp file.
if (keyRecords.length == 0 && neededToResetCcsid)
{
// We got no records back. Assume that it's because the default CCSID for the outfile was incompatible with the CCSID for the file's format.
// Reset the outfile's CCSID and try again.
done = false;
int ccsid = system_.getCcsid();
if (Trace.traceOn_) Trace.log(Trace.DIAGNOSTIC, "No key records were returned from command " + cmd + "; system CCSID is: " + ccsid + ". Resetting CCSID of DSPFD OUTFILE to " + ccsid);
resetOutfileCCSID("QTEMP", "JT4FD", ccsid);
}
else done = true;
} // 'for' loop
tempFile.delete(); //@E0A
} //@E0A
// Determine the number of record formats contained in the file
int numberOfRecordFormats = ((BigDecimal)records[0].getField("WHCNT")).intValue();
int numberOfFields = 0;
int numberOfKeyFields = 0;
int recordNumber = 0;
int keyRecordNumber = 0;
String rfNameUntrimmed;
String rfName;
RecordFormat[] rfs = new RecordFormat[numberOfRecordFormats];
for(int i = 0; i < numberOfRecordFormats; ++i)
{ // Create source file for a particular record format
// Determine the name of the record format and hence the name of the file and class
rfNameUntrimmed = (String)records[recordNumber].getField("WHNAME");
rfName = rfNameUntrimmed.trim();
rfs[i] = new RecordFormat(rfName);
// Get the field descriptions.
numberOfFields = ((BigDecimal)records[recordNumber].getField("WHNFLD")).intValue();
if(numberOfFields > 0)
{ // Number of fields is greater than 0
for(int j = 0; j < numberOfFields; ++j, ++recordNumber)
{ // Add a field description to the record format
addFieldDescription(rfs[i], records[recordNumber]);
}
}
// Get the key field descriptions for this record format if there are any
numberOfKeyFields = ((BigDecimal)keyRecords[keyRecordNumber].getField("APNKYF")).intValue();
if(numberOfKeyFields > 0)
{ // Number of key fields is greater than 0
for(int j = 0; j < numberOfKeyFields; ++j, ++keyRecordNumber)
{ // Add a key field description to the record format
rfs[i].addKeyFieldDescription(((String)keyRecords[keyRecordNumber].getField("APKEYF")).trim());
}
}
}
return rfs;
}
private final void resetOutfileCCSID(String library, String file, int ccsid)
throws AS400Exception,
AS400SecurityException,
InterruptedException,
IOException
{
String cmd = "CHGPF FILE(" + library + "/" + file + ") SRCFILE(*NONE) CCSID("+ccsid+")";
AS400Message[] msgs = theFile_.execute(cmd);
if(msgs.length > 0)
{
if(!(msgs[0].getID().equals("CPD3238") || // "A new format was created for file ..."
msgs[0].getID().equals("CPC7303"))) // "File JT4FFD in library QTEMP changed"
{
throw new AS400Exception(msgs);
}
}
else
{ // Unexpected reply
Trace.log(Trace.ERROR, "CHGPF failed to return success message", cmd);
throw new InternalErrorException(InternalErrorException.UNKNOWN);
}
}
/**
*Sets the integrated file system path name for
*the file.
*@param name The integrated file system path name
*of the file. If a member is not specified in name, the first
*member of the file is used.
**/
public void setPath(String name)
{
if(theFile_ != null) //@B5A
{
theFile_.setPath(name);
}
parseName(name); //@B5A
name_ = name;
}
/**
*Sets the system to which to connect.
*@param system The system to which to conenct.
**/
public void setSystem(AS400Impl system) //@B5C
{
if(theFile_ == null) //@B5A
{
theFile_ = (AS400FileImplBase)((AS400ImplRemote)system).loadImpl("com.ibm.as400.access.AS400FileImplNative", //@B5A
"com.ibm.as400.access.AS400FileImplRemote"); //@B5A
if(!name_.equals("")) //@B5A
{
theFile_.setPath(name_); //@B5A
}
}
theFile_.setSystem(system);
system_ = (AS400ImplRemote)system; //@B5C
}
/**
*Writes a field description to the specified file. The field description
*is created with information extracted from the Record object provided.
*@param sourceFile The file to which to write the field description.
*@param record The record from which to obtain the field information.
* @throws UnsupportedEncodingException If an error occurs during conversion.
**/
public void writeFieldDescription(PrintWriter sourceFile, Record record)
throws UnsupportedEncodingException
{
char fieldType = ((String)record.getField("WHFLDT")).charAt(0);
FieldDescription fd = null;
int digits;
int decimalPositions;
int byteLength; //@A1A: For float field descriptions
String fieldName = ((String)record.getField("WHFLDE")).trim();
int ccsid;
switch(fieldType)
{
case 'A': // Character field
// Need to get the length in bytes of the field and the ccsid of the field
// when creating the AS400Text object. The name of the field is set to be
// the DDS name of the field (which causes the DDS name of the field description
// to be the DDS name as well).
ccsid = ((BigDecimal)record.getField("WHCCSID")).intValue();
if(ccsid == 65535)
{
// 65535 is not a valid ccsid, retrieve the default system ccsid
ccsid = system_.getCcsid();
}
sourceFile.println(" addFieldDescription(new CharacterFieldDescription(new AS400Text(" + String.valueOf((((String)record.getField("WHVARL")).equals("Y"))?
((BigDecimal)record.getField("WHFLDB")).intValue() - 2 :
((BigDecimal)record.getField("WHFLDB")).intValue()) + ", " +
ccsid + "), \"" +
fieldName + "\"));");
if(((String)record.getField("WHVARL")).equals("Y"))
{
if(((BigDecimal)record.getField("WHALLC")).intValue() > 0)
{ // A length was specified on the VARLEN keyword
sourceFile.println(" ((CharacterFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setVARLEN(" + ((BigDecimal)record.getField("WHALLC")).intValue() + ");");
}
else
{ // No length was specified on the VARLEN keyword
sourceFile.println(" ((CharacterFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setVariableLength(true);");
}
}
// Set if null values are allowed
if(((String)record.getField("WHNULL")).equals("Y"))
{
sourceFile.println(" getFieldDescription(\"" +
fieldName + "\").setALWNULL(true);");
}
// Set the DFT keyword value if specified
if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0)
{
// Need to strip off the beginning and ending apostrophes
String dft = (String)record.getField("WHDFT");
// @B0C
// Check for any special values that could be specified as the default.
// Handle *NULL
if(dft.indexOf("*NULL") != -1)
{
sourceFile.println(" ((CharacterFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDFTNull();");
}
// Handle 'value'
else if(dft.indexOf("'") != -1)
{
String adjDft = dft.substring(dft.indexOf("'") + 1, dft.lastIndexOf("'"));
sourceFile.println(" ((CharacterFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDFT(\"" + adjDft + "\");");
}
// Do nothing if a special value was present and we didn't know what
// it was.
}
break;
case 'B': // Binary field
digits = ((BigDecimal)record.getField("WHFLDO")).intValue();
// if (digits < 6)
if(digits < 5) // @A2C
{
sourceFile.println(" addFieldDescription(new BinaryFieldDescription(new AS400Bin2(), \"" +
fieldName + "\", \"" +
fieldName + "\", " + String.valueOf(digits) + "));");
// Set the DFT keyword value if specified
if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0)
{
String dft = ((String)record.getField("WHDFT")).trim();
if(dft.charAt(0) == '+')
{
dft = dft.substring(1);
}
// @B0C
// Check for any special values that could be specified as the default.
// Handle *NULL
if(dft.indexOf("*NULL") != -1)
{
sourceFile.println(" ((BinaryFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDFTNull();");
}
// Handle value
else
{
sourceFile.println(" ((BinaryFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDFT(new Short(\"" + dft + "\"));");
}
}
}
else if (digits < 10) //@F0C
{
sourceFile.println(" addFieldDescription(new BinaryFieldDescription(new AS400Bin4(), \"" +
fieldName + "\", \"" +
fieldName + "\", " + String.valueOf(digits) + "));");
// Set the DFT keyword value if specified
if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0)
{
String dft = ((String)record.getField("WHDFT")).trim();
if(dft.charAt(0) == '+')
{
dft = dft.substring(1);
}
// @B0C
// Check for any special values that could be specified as the default.
// Handle *NULL
if(dft.indexOf("*NULL") != -1)
{
sourceFile.println(" ((BinaryFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDFTNull();");
}
// Handle value
else
{
sourceFile.println(" ((BinaryFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDFT(Integer.valueOf(\"" + dft + "\"));");
}
}
}
else //@F0A
{
sourceFile.println(" addFieldDescription(new BinaryFieldDescription(new AS400Bin8(), \"" +
fieldName + "\", \"" +
fieldName + "\", " + String.valueOf(digits) + "));");
// Set the DFT keyword value if specified
if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0)
{
String dft = ((String)record.getField("WHDFT")).trim();
if(dft.charAt(0) == '+')
{
dft = dft.substring(1);
}
// @B0C
// Check for any special values that could be specified as the default.
// Handle *NULL
if(dft.indexOf("*NULL") != -1)
{
sourceFile.println(" ((BinaryFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDFTNull();");
}
// Handle value
else
{
sourceFile.println(" ((BinaryFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDFT(new Long(\"" + dft + "\"));");
}
}
}
// Set if null values are allowed
if(((String)record.getField("WHNULL")).equals("Y"))
{
sourceFile.println(" getFieldDescription(\"" +
fieldName + "\").setALWNULL(true);");
}
break;
case 'E': // DBCS-Either field
// Need to get the length in bytes of the field and the ccsid of the field
// when creating the AS400Text object. The name of the field is set to be
// the DDS name of the field (which causes the DDS name of the field description
// to be the DDS name as well).
ccsid = ((BigDecimal)record.getField("WHCCSID")).intValue();
if(ccsid == 65535)
{
// 65535 is not a valid ccsid, retrieve the default system ccsid
ccsid = system_.getCcsid();
}
sourceFile.println(" addFieldDescription(new DBCSEitherFieldDescription(new AS400Text("
+ String.valueOf((((String)record.getField("WHVARL")).equals("Y"))?
((BigDecimal)record.getField("WHFLDB")).intValue() - 2 :
((BigDecimal)record.getField("WHFLDB")).intValue()) + ", " +
ccsid + "), \"" +
fieldName + "\"));");
// Set if variable length
if(((String)record.getField("WHVARL")).equals("Y"))
{
if(((BigDecimal)record.getField("WHALLC")).intValue() > 0)
{ // A length was specified on the VARLEN keyword
sourceFile.println(" ((DBCSEitherFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setVARLEN(" + ((BigDecimal)record.getField("WHALLC")).intValue() + ");");
}
else
{ // No length was specified on the VARLEN keyword
sourceFile.println(" ((DBCSEitherFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setVariableLength(true);");
}
}
// Set if null values are allowed
if(((String)record.getField("WHNULL")).equals("Y"))
{
sourceFile.println(" getFieldDescription(\"" +
fieldName + "\").setALWNULL(true);");
}
// Set the DFT keyword value if specified
if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0)
{
// Need to strip off the beginning and ending apostrophes
String dft = (String)record.getField("WHDFT");
// @B0C
// Check for any special values that could be specified as the default.
// Handle *NULL
if(dft.indexOf("*NULL") != -1)
{
sourceFile.println(" ((DBCSEitherFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDFTNull();");
}
// Handle 'value'
else if(dft.indexOf("'") != -1)
{
String adjDft = dft.substring(dft.indexOf("'") + 1, dft.lastIndexOf("'"));
sourceFile.println(" ((DBCSEitherFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDFT(\"" + adjDft + "\");");
}
// Do nothing if a special value was present and we didn't know what
// it was.
}
break;
case 'F': // Float field
digits = ((BigDecimal)record.getField("WHFLDO")).intValue();
decimalPositions = ((BigDecimal)record.getField("WHFLDP")).intValue();
//@A1A: Retrieve byte length to determine if field is single or double
// precision
byteLength = ((BigDecimal)record.getField("WHFLDB")).intValue(); //@A1A
if(byteLength == 4) //@A1A
{
sourceFile.println(" addFieldDescription(new FloatFieldDescription(new AS400Float4(), \"" +
fieldName + "\", \"" +
fieldName + "\", " + String.valueOf(digits) +
", " + String.valueOf(decimalPositions) + "));");
// Set the DFT keyword value if specified
if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0)
{
String dft = ((String)record.getField("WHDFT")).trim();
if(dft.charAt(0) == '+')
{
dft = dft.substring(1);
}
// @B0C
// Check for any special values that could be specified as the default.
// Handle *NULL
if(dft.indexOf("*NULL") != -1)
{
sourceFile.println(" ((FloatFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDFTNull();");
}
// Handle value
else
{
sourceFile.println(" ((FloatFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDFT(new Float(\"" + dft + "\"));");
}
}
}
else if(byteLength == 8) //@A1A
{
sourceFile.println(" addFieldDescription(new FloatFieldDescription(new AS400Float8(), \"" +
fieldName + "\", \"" +
fieldName + "\", " + String.valueOf(digits) +
", " + String.valueOf(decimalPositions) + "));");
// Set the FLTPCN keyword to *DOUBLE
sourceFile.println(" ((FloatFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setFLTPCN(\"*DOUBLE\");");
// Set the DFT keyword value if specified
if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0)
{
String dft = ((String)record.getField("WHDFT")).trim();
if(dft.charAt(0) == '+')
{
dft = dft.substring(1);
}
// @B0C
// Check for any special values that could be specified as the default.
// Handle *NULL
if(dft.indexOf("*NULL") != -1)
{
sourceFile.println(" ((FloatFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDFTNull();");
}
// Handle value
else
{
sourceFile.println(" ((FloatFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDFT(new Double(\"" + dft + "\"));");
}
}
}
else //@A1A: This should never occur, but for completeness....
{
//@A1A
Trace.log(Trace.ERROR, "FloatFieldDescription error in byte length");
throw new InternalErrorException(InternalErrorException.UNKNOWN); //@A1A
} //@A1A
// Set if null values are allowed
if(((String)record.getField("WHNULL")).equals("Y"))
{
sourceFile.println(" getFieldDescription(\"" +
fieldName + "\").setALWNULL(true);");
}
break;
case 'G': // DBCS-Graphic field
// Need to get the length in bytes of the field and the ccsid of the field
// when creating the AS400Text object. The name of the field is set to be
// the DDS name of the field (which causes the DDS name of the field description
// to be the DDS name as well).
ccsid = ((BigDecimal)record.getField("WHCCSID")).intValue();
if(ccsid == 65535)
{
// 65535 is not a valid ccsid, retrieve the default system ccsid
ccsid = system_.getCcsid();
}
sourceFile.println(" addFieldDescription(new DBCSGraphicFieldDescription(new AS400Text("
+ String.valueOf((((String)record.getField("WHVARL")).equals("Y"))?
((BigDecimal)record.getField("WHFLDB")).intValue() - 2 :
((BigDecimal)record.getField("WHFLDB")).intValue()) + ", " +
ccsid + "), \"" +
fieldName + "\"));");
// Set if variable length
if(((String)record.getField("WHVARL")).equals("Y"))
{
if(((BigDecimal)record.getField("WHALLC")).intValue() > 0)
{ // A length was specified on the VARLEN keyword
sourceFile.println(" ((DBCSGraphicFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setVARLEN(" + ((BigDecimal)record.getField("WHALLC")).intValue() + ");");
}
else
{ // No length was specified on the VARLEN keyword
sourceFile.println(" ((DBCSGraphicFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setVariableLength(true);");
}
}
// Set if null values are allowed
if(((String)record.getField("WHNULL")).equals("Y"))
{
sourceFile.println(" getFieldDescription(\"" +
fieldName + "\").setALWNULL(true);");
}
// Set the DFT keyword value if specified
if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0)
{
// Need to strip off the beginning and ending apostrophes
String dft = (String)record.getField("WHDFT");
// @B0C
// Check for any special values that could be specified as the default.
// Handle *NULL
if(dft.indexOf("*NULL") != -1)
{
sourceFile.println(" ((DBCSGraphicFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDFTNull();");
}
// Handle 'value'
else if(dft.indexOf("'") != -1)
{
String adjDft = dft.substring(dft.indexOf("'") + 1, dft.lastIndexOf("'"));
sourceFile.println(" ((DBCSGraphicFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDFT(\"" + adjDft + "\");");
}
// Do nothing if a special value was present and we didn't know what
// it was.
}
break;
case 'H': // Hex field
// Need to get the length in bytes of the field
// when creating the AS400ByteArray object. The name of the field is set to be
// the DDS name of the field (which causes the DDS name of the field description
// to be the DDS name as well).
sourceFile.println(" addFieldDescription(new HexFieldDescription(new AS400ByteArray("
+ String.valueOf((((String)record.getField("WHVARL")).equals("Y"))?
((BigDecimal)record.getField("WHFLDB")).intValue() - 2 :
((BigDecimal)record.getField("WHFLDB")).intValue()) + "), \"" +
fieldName + "\"));");
// Set if variable length
if(((String)record.getField("WHVARL")).equals("Y"))
{
if(((BigDecimal)record.getField("WHALLC")).intValue() > 0)
{ // A length was specified on the VARLEN keyword
sourceFile.println(" ((HexFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setVARLEN(" + ((BigDecimal)record.getField("WHALLC")).intValue() + ");");
}
else
{ // No length was specified on the VARLEN keyword
sourceFile.println(" ((HexFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setVariableLength(true);");
}
}
// Set if null values are allowed
if(((String)record.getField("WHNULL")).equals("Y"))
{
sourceFile.println(" getFieldDescription(\"" +
fieldName + "\").setALWNULL(true);");
}
// @B0A: Set the DFT keyword value if specified
if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0)
{
// Need to strip off the beginning and ending apostrophes
String dft = (String)record.getField("WHDFT");
// Check for any special values that could be specified as the default.
// Handle *NULL
if(dft.indexOf("*NULL") != -1)
{
sourceFile.println(" ((HexFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDFTNull();");
}
// Handle 'value'
else if(dft.indexOf("'") != -1)
{
String adjDft = dft.substring(dft.indexOf("'") + 1, dft.lastIndexOf("'"));
byte[] byteDft = adjDft.getBytes();
sourceFile.print(" ((HexFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDFT(new byte[] { ");
sourceFile.print(byteDft[0]);
for(int i=1; i 0)
{ // A length was specified on the VARLEN keyword
sourceFile.println(" ((DBCSOnlyFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setVARLEN(" + ((BigDecimal)record.getField("WHALLC")).intValue() + ");");
}
else
{ // No length was specified on the VARLEN keyword
sourceFile.println(" ((DBCSOnlyFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setVariableLength(true);");
}
}
// Set if null values are allowed
if(((String)record.getField("WHNULL")).equals("Y"))
{
sourceFile.println(" getFieldDescription(\"" +
fieldName + "\").setALWNULL(true);");
}
// Set the DFT keyword value if specified
if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0)
{
// Need to strip off the beginning and ending apostrophes
String dft = (String)record.getField("WHDFT");
// @B0C
// Check for any special values that could be specified as the default.
// Handle *NULL
if(dft.indexOf("*NULL") != -1)
{
sourceFile.println(" ((DBCSOnlyFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDFTNull();");
}
// Handle 'value'
else if(dft.indexOf("'") != -1)
{
String adjDft = dft.substring(dft.indexOf("'") + 1, dft.lastIndexOf("'"));
sourceFile.println(" ((DBCSOnlyFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDFT(\"" + adjDft + "\");");
}
// Do nothing if a special value was present and we didn't know what
// it was.
}
break;
case 'L': // Date field
ccsid = ((BigDecimal)record.getField("WHCCSID")).intValue();
if(ccsid == 65535)
{
// 65535 is not a valid ccsid, retrieve the default system ccsid
ccsid = system_.getCcsid();
}
sourceFile.println(" addFieldDescription(new DateFieldDescription(new AS400Text("
+ String.valueOf(((BigDecimal)record.getField("WHFLDB")).intValue()) + ", " +
ccsid + "), \"" +
fieldName + "\"));");
// Set date format and date separator values
sourceFile.println(" ((DateFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDATFMT(\"" + (String)record.getField("WHFMT") + "\");");
if(!((String)record.getField("WHSEP")).equals(" "))
{
sourceFile.println(" ((DateFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDATSEP(\"" + (String)record.getField("WHSEP") + "\");");
}
// Set if null values are allowed
if(((String)record.getField("WHNULL")).equals("Y"))
{
sourceFile.println(" getFieldDescription(\"" +
fieldName + "\").setALWNULL(true);");
}
// Set the DFT keyword value if specified
if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0)
{
// Need to strip off the beginning and ending apostrophes
String dft = (String)record.getField("WHDFT");
// @B0C
// Check for any special values that could be specified as the default.
// Handle *NULL
if(dft.indexOf("*NULL") != -1)
{
sourceFile.println(" ((DateFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDFTNull();");
}
// Handle CURRENT_DATE (an SQL special value)
else if(dft.indexOf("CURRENT_DATE") != -1)
{
sourceFile.println(" ((DateFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDFTCurrent();");
}
// Handle 'value'
else if(dft.indexOf("'") != -1)
{
String adjDft = dft.substring(dft.indexOf("'") + 1, dft.lastIndexOf("'"));
sourceFile.println(" ((DateFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDFT(\"" + adjDft + "\");");
}
}
break;
case 'O': // DBCS-Open field
// Need to get the length in bytes of the field and the ccsid of the field
// when creating the AS400Text object. The name of the field is set to be
// the DDS name of the field (which causes the DDS name of the field description
// to be the DDS name as well).
ccsid = ((BigDecimal)record.getField("WHCCSID")).intValue();
if(ccsid == 65535)
{
// 65535 is not a valid ccsid, retrieve the default system ccsid
ccsid = system_.getCcsid();
}
sourceFile.println(" addFieldDescription(new DBCSOpenFieldDescription(new AS400Text("
+ String.valueOf((((String)record.getField("WHVARL")).equals("Y"))?
((BigDecimal)record.getField("WHFLDB")).intValue() - 2 :
((BigDecimal)record.getField("WHFLDB")).intValue()) + ", " +
ccsid + "), \"" +
fieldName + "\"));");
// Set if variable length
if(((String)record.getField("WHVARL")).equals("Y"))
{
if(((BigDecimal)record.getField("WHALLC")).intValue() > 0)
{ // A length was specified on the VARLEN keyword
sourceFile.println(" ((DBCSOpenFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setVARLEN(" + ((BigDecimal)record.getField("WHALLC")).intValue() + ");");
}
else
{ // No length was specified on the VARLEN keyword
sourceFile.println(" ((DBCSOpenFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setVariableLength(true);");
}
}
// Set if null values are allowed
if(((String)record.getField("WHNULL")).equals("Y"))
{
sourceFile.println(" getFieldDescription(\"" +
fieldName + "\").setALWNULL(true);");
}
// Set the DFT keyword value if specified
if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0)
{
// Need to strip off the beginning and ending apostrophes
String dft = (String)record.getField("WHDFT");
// @B0C
// Check for any special values that could be specified as the default.
// Handle *NULL
if(dft.indexOf("*NULL") != -1)
{
sourceFile.println(" ((DBCSOpenFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDFTNull();");
}
// Handle 'value'
else if(dft.indexOf("'") != -1)
{
String adjDft = dft.substring(dft.indexOf("'") + 1, dft.lastIndexOf("'"));
sourceFile.println(" ((DBCSOpenFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDFT(\"" + adjDft + "\");");
}
// Do nothing if a special value was present and we didn't know what
// it was.
}
break;
case 'P': // Packed decimal field
digits = ((BigDecimal)record.getField("WHFLDO")).intValue();
decimalPositions = ((BigDecimal)record.getField("WHFLDP")).intValue();
sourceFile.println(" addFieldDescription(new PackedDecimalFieldDescription(new AS400PackedDecimal(" +
String.valueOf(digits) + ", " + String.valueOf(decimalPositions) + "), \"" +
fieldName + "\"));");
// Set if null values are allowed
if(((String)record.getField("WHNULL")).equals("Y"))
{
sourceFile.println(" getFieldDescription(\"" +
fieldName + "\").setALWNULL(true);");
}
// Set the DFT keyword value if specified
if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0)
{
String dft = ((String)record.getField("WHDFT")).trim();
if(dft.charAt(0) == '+')
{
dft = dft.substring(1);
}
// @B0C
// Check for any special values that could be specified as the default.
// Handle *NULL
if(dft.indexOf("*NULL") != -1)
{
sourceFile.println(" ((PackedDecimalFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDFTNull();");
}
// Handle value
else
{
sourceFile.println(" ((PackedDecimalFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDFT(new BigDecimal(\"" + dft + "\"));");
}
}
break;
case 'S': // Zoned decimal field
digits = ((BigDecimal)record.getField("WHFLDO")).intValue();
decimalPositions = ((BigDecimal)record.getField("WHFLDP")).intValue();
sourceFile.println(" addFieldDescription(new ZonedDecimalFieldDescription(new AS400ZonedDecimal(" +
String.valueOf(digits) + ", " + String.valueOf(decimalPositions) + "), \"" +
fieldName + "\"));");
// Set if null values are allowed
if(((String)record.getField("WHNULL")).equals("Y"))
{
sourceFile.println(" getFieldDescription(\"" +
fieldName + "\").setALWNULL(true);");
}
// Set the DFT keyword value if specified
if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0)
{
String dft = ((String)record.getField("WHDFT")).trim();
if(dft.charAt(0) == '+')
{
dft = dft.substring(1);
}
// @B0C
// Check for any special values that could be specified as the default.
// Handle *NULL
if(dft.indexOf("*NULL") != -1)
{
sourceFile.println(" ((ZonedDecimalFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDFTNull();");
}
// Handle value
else
{
sourceFile.println(" ((ZonedDecimalFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDFT(new BigDecimal(\"" + dft + "\"));");
}
}
break;
case 'T': // Time field
ccsid = ((BigDecimal)record.getField("WHCCSID")).intValue();
if(ccsid == 65535)
{
// 65535 is not a valid ccsid, retrieve the default system ccsid
ccsid = system_.getCcsid();
}
sourceFile.println(" addFieldDescription(new TimeFieldDescription(new AS400Text("
+ String.valueOf(((BigDecimal)record.getField("WHFLDB")).intValue()) + ", " +
ccsid + "), \"" +
fieldName + "\"));");
// Set date format and date separator values
sourceFile.println(" ((TimeFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setTIMFMT(\"" + (String)record.getField("WHFMT") + "\");");
if(!((String)record.getField("WHSEP")).equals(" "))
{
sourceFile.println(" ((TimeFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setTIMSEP(\"" + (String)record.getField("WHSEP") + "\");");
}
// Set if null values are allowed
if(((String)record.getField("WHNULL")).equals("Y"))
{
sourceFile.println(" getFieldDescription(\"" +
fieldName + "\").setALWNULL(true);");
}
// Set the DFT keyword value if specified
if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0)
{
// Need to strip off the beginning and ending apostrophes
String dft = (String)record.getField("WHDFT");
// @B0C
// Check for any special values that could be specified as the default.
// Handle *NULL
if(dft.indexOf("*NULL") != -1)
{
sourceFile.println(" ((TimeFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDFTNull();");
}
// Handle CURRENT_TIME (an SQL special value)
else if(dft.indexOf("CURRENT_TIME") != -1)
{
sourceFile.println(" ((TimeFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDFTCurrent();");
}
// Handle 'value'
else if(dft.indexOf("'") != -1)
{
String adjDft = dft.substring(dft.indexOf("'") + 1, dft.lastIndexOf("'"));
sourceFile.println(" ((TimeFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDFT(\"" + adjDft + "\");");
}
}
break;
case 'Z': // Timestamp field
ccsid = ((BigDecimal)record.getField("WHCCSID")).intValue();
if(ccsid == 65535)
{
// 65535 is not a valid ccsid, retrieve the default system ccsid
ccsid = system_.getCcsid();
}
sourceFile.println(" addFieldDescription(new TimestampFieldDescription(new AS400Text("
+ String.valueOf(((BigDecimal)record.getField("WHFLDB")).intValue()) + ", " +
ccsid + "), \"" +
fieldName + "\"));");
// Set if null values are allowed
if(((String)record.getField("WHNULL")).equals("Y"))
{
sourceFile.println(" getFieldDescription(\"" +
fieldName + "\").setALWNULL(true);");
}
// Set the DFT keyword value if specified
if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0)
{
// Need to strip off the beginning and ending apostrophes
String dft = (String)record.getField("WHDFT");
// @B0C
// Check for any special values that could be specified as the default.
// Handle *NULL
if(dft.indexOf("*NULL") != -1)
{
sourceFile.println(" ((TimestampFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDFTNull();");
}
// Handle CURRENT_TIMESTAMP (an SQL special value)
else if(dft.indexOf("CURRENT_TIMESTAMP") != -1)
{
sourceFile.println(" ((TimestampFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDFTCurrent();");
}
// Handle 'value'
else if(dft.indexOf("'") != -1)
{
String adjDft = dft.substring(dft.indexOf("'") + 1, dft.lastIndexOf("'"));
sourceFile.println(" ((TimestampFieldDescription)getFieldDescription(\"" +
fieldName + "\")).setDFT(\"" + adjDft + "\");");
}
}
break;
}
}
}
/**
*Class representing the record format of the data returned from the
*DSPFD command (Display File Description) when the type of data requested
*is *ACCPTH. *ACCPTH returns data describing the key fields of the file
*if any exist.
**/
class QWHFDACPFormat extends RecordFormat
{
static final long serialVersionUID = 4L; // @B6A
QWHFDACPFormat(int ccsid)
{
super("QWHFDACP");
AS400Text txt1 = new AS400Text(1, ccsid);
AS400Text txt3 = new AS400Text(3, ccsid);
AS400Text txt4 = new AS400Text(4, ccsid);
AS400Text txt6 = new AS400Text(6, ccsid);
AS400Text txt8 = new AS400Text(8, ccsid);
AS400Text txt10 = new AS400Text(10, ccsid);
AS400PackedDecimal p30 = new AS400PackedDecimal(3, 0);
addFieldDescription(new CharacterFieldDescription(txt1, "APRCEN"));
addFieldDescription(new CharacterFieldDescription(txt6, "APRDAT"));
addFieldDescription(new CharacterFieldDescription(txt6, "APRTIM"));
addFieldDescription(new CharacterFieldDescription(txt10, "APFILE"));
addFieldDescription(new CharacterFieldDescription(txt10, "APLIB"));
addFieldDescription(new CharacterFieldDescription(txt1, "APFTYP"));
addFieldDescription(new CharacterFieldDescription(txt4, "APFILA"));
addFieldDescription(new CharacterFieldDescription(txt3, "APMXD"));
addFieldDescription(new CharacterFieldDescription(txt6, "APFATR"));
addFieldDescription(new CharacterFieldDescription(txt8, "APSYSN"));
addFieldDescription(new PackedDecimalFieldDescription(p30, "APASP"));
addFieldDescription(new CharacterFieldDescription(txt4, "APRES"));
addFieldDescription(new CharacterFieldDescription(txt1, "APMANT"));
addFieldDescription(new CharacterFieldDescription(txt1, "APUNIQ"));
addFieldDescription(new CharacterFieldDescription(txt1, "APKEYO"));
addFieldDescription(new CharacterFieldDescription(txt1, "APSELO"));
addFieldDescription(new CharacterFieldDescription(txt1, "APACCP"));
addFieldDescription(new PackedDecimalFieldDescription(p30, "APNSCO"));
addFieldDescription(new CharacterFieldDescription(txt10, "APBDF"));
addFieldDescription(new CharacterFieldDescription(txt10, "APBOL"));
addFieldDescription(new CharacterFieldDescription(txt10, "APBOLF"));
addFieldDescription(new PackedDecimalFieldDescription(p30, "APNKYF"));
addFieldDescription(new CharacterFieldDescription(txt10, "APKEYF"));
addFieldDescription(new CharacterFieldDescription(txt1, "APKSEQ"));
addFieldDescription(new CharacterFieldDescription(txt1, "APKSIN"));
addFieldDescription(new CharacterFieldDescription(txt1, "APKZD"));
addFieldDescription(new CharacterFieldDescription(txt1, "APKASQ"));
addFieldDescription(new PackedDecimalFieldDescription(p30, "APKEYN"));
addFieldDescription(new CharacterFieldDescription(txt1, "APJOIN"));
addFieldDescription(new CharacterFieldDescription(txt1, "APACPJ"));
addFieldDescription(new CharacterFieldDescription(txt1, "APRIKY"));
}
}
/**
*Class representing the record format of the data returned from the
*DSPFD command (Display File Description) when the type of data requested
*is *RCDFMT. *RCDFMT returns data describing the record format of the file.
**/
class QWHFDFMTFormat extends RecordFormat
{
static final long serialVersionUID = 4L; // @B6A
QWHFDFMTFormat(int ccsid)
{
super("QWHFDFMT");
AS400Text txt1 = new AS400Text(1, ccsid);
AS400Text txt4 = new AS400Text(4, ccsid);
AS400Text txt6 = new AS400Text(6, ccsid);
AS400Text txt8 = new AS400Text(8, ccsid);
AS400Text txt10 = new AS400Text(10, ccsid);
AS400Text txt13 = new AS400Text(13, ccsid);
AS400Text txt50 = new AS400Text(50, ccsid);
AS400PackedDecimal p30 = new AS400PackedDecimal(3, 0);
AS400PackedDecimal p31 = new AS400PackedDecimal(3, 1);
AS400PackedDecimal p41 = new AS400PackedDecimal(4, 1);
AS400PackedDecimal p40 = new AS400PackedDecimal(4, 0);
AS400PackedDecimal p50 = new AS400PackedDecimal(5, 0);
addFieldDescription(new CharacterFieldDescription(txt1, "RFRCEN"));
addFieldDescription(new CharacterFieldDescription(txt6, "RFRDAT"));
addFieldDescription(new CharacterFieldDescription(txt6, "RFRTIM"));
addFieldDescription(new CharacterFieldDescription(txt10, "RFFILE"));
addFieldDescription(new CharacterFieldDescription(txt10, "RFLIB"));
addFieldDescription(new CharacterFieldDescription(txt1, "RFFTYP"));
addFieldDescription(new CharacterFieldDescription(txt4, "RFFILA"));
addFieldDescription(new CharacterFieldDescription(txt1, "RFMXDD"));
addFieldDescription(new CharacterFieldDescription(txt1, "RFMXDC"));
addFieldDescription(new CharacterFieldDescription(txt1, "RFMXDB"));
addFieldDescription(new CharacterFieldDescription(txt6, "RFFATR"));
addFieldDescription(new CharacterFieldDescription(txt8, "RFSYSN"));
addFieldDescription(new PackedDecimalFieldDescription(p30, "RFASP"));
addFieldDescription(new CharacterFieldDescription(txt4, "RFRES"));
addFieldDescription(new PackedDecimalFieldDescription(p40, "RFTOTF"));
addFieldDescription(new CharacterFieldDescription(txt10, "RFNAME"));
addFieldDescription(new PackedDecimalFieldDescription(p50, "RFFLDN"));
addFieldDescription(new PackedDecimalFieldDescription(p50, "RFLEN"));
addFieldDescription(new CharacterFieldDescription(txt13, "RFID"));
addFieldDescription(new CharacterFieldDescription(txt1, "RFTYPE"));
addFieldDescription(new CharacterFieldDescription(txt10, "RFASFN"));
addFieldDescription(new CharacterFieldDescription(txt50, "RFFTXT"));
addFieldDescription(new PackedDecimalFieldDescription(p40, "RFHIGH"));
addFieldDescription(new PackedDecimalFieldDescription(p50, "RFWIDE"));
addFieldDescription(new CharacterFieldDescription(txt10, "RFFONT"));
addFieldDescription(new PackedDecimalFieldDescription(p30, "RFPGRT"));
addFieldDescription(new PackedDecimalFieldDescription(p31, "RFLPI"));
addFieldDescription(new PackedDecimalFieldDescription(p31, "RFCHWD"));
addFieldDescription(new PackedDecimalFieldDescription(p31, "RFCHHI"));
addFieldDescription(new PackedDecimalFieldDescription(p41, "RFPNTS"));
addFieldDescription(new CharacterFieldDescription(txt1, "RFWIN"));
addFieldDescription(new CharacterFieldDescription(txt10, "RFFCSN"));
addFieldDescription(new CharacterFieldDescription(txt10, "RFFCSL"));
addFieldDescription(new CharacterFieldDescription(txt10, "RFFCPN"));
addFieldDescription(new CharacterFieldDescription(txt10, "RFFCPL"));
addFieldDescription(new CharacterFieldDescription(txt10, "RFCDFN"));
addFieldDescription(new CharacterFieldDescription(txt10, "RFCDFL"));
addFieldDescription(new CharacterFieldDescription(txt10, "RFDCDF"));
addFieldDescription(new CharacterFieldDescription(txt10, "RFDCDL"));
addFieldDescription(new CharacterFieldDescription(txt1, "RFMNB"));
addFieldDescription(new CharacterFieldDescription(txt1, "RFPLD"));
}
}
/**
*Class representing the record format of the data returned from the
*DSPFFD command (Display File Field Description).
**/
class QWHDRFFDFormat extends RecordFormat
{
static final long serialVersionUID = 4L; // @B6A
QWHDRFFDFormat(int ccsid)
{
super("QWHDRFFD");
AS400Text txt1 = new AS400Text(1, ccsid);
AS400Text txt2 = new AS400Text(2, ccsid);
AS400Text txt4 = new AS400Text(4, ccsid);
AS400Text txt7 = new AS400Text(7, ccsid);
AS400Text txt8 = new AS400Text(8, ccsid);
AS400Text txt10 = new AS400Text(10, ccsid);
AS400Text txt13 = new AS400Text(13, ccsid);
AS400Text txt20 = new AS400Text(20, ccsid);
AS400Text txt30 = new AS400Text(30, ccsid);
AS400Text txt32 = new AS400Text(32, ccsid);
AS400Text txt50 = new AS400Text(50, ccsid);
AS400PackedDecimal p30 = new AS400PackedDecimal(3, 0);
AS400PackedDecimal p50 = new AS400PackedDecimal(5, 0);
AS400PackedDecimal p41 = new AS400PackedDecimal(4, 1);
AS400ZonedDecimal z20 = new AS400ZonedDecimal(2, 0);
AS400ZonedDecimal z30 = new AS400ZonedDecimal(3, 0);
AS400ZonedDecimal z40 = new AS400ZonedDecimal(4, 0);
AS400ZonedDecimal z50 = new AS400ZonedDecimal(5, 0);
AS400ZonedDecimal z31 = new AS400ZonedDecimal(3, 1);
addFieldDescription(new CharacterFieldDescription(txt10, "WHFILE"));
addFieldDescription(new CharacterFieldDescription(txt10, "WHLIB"));
addFieldDescription(new CharacterFieldDescription(txt7, "WHCRTD"));
addFieldDescription(new CharacterFieldDescription(txt1, "WHFTYP"));
addFieldDescription(new ZonedDecimalFieldDescription(z50, "WHCNT"));
addFieldDescription(new CharacterFieldDescription(txt13, "WHDTTM"));
// Record format name
addFieldDescription(new CharacterFieldDescription(txt10, "WHNAME"));
addFieldDescription(new CharacterFieldDescription(txt13, "WHSEQ"));
addFieldDescription(new CharacterFieldDescription(txt50, "WHTEXT"));
addFieldDescription(new ZonedDecimalFieldDescription(z50, "WHFLDN"));
addFieldDescription(new ZonedDecimalFieldDescription(z50, "WHRLEN"));
addFieldDescription(new CharacterFieldDescription(txt10, "WHFLDI"));
// External field name
addFieldDescription(new CharacterFieldDescription(txt10, "WHFLDE"));
addFieldDescription(new ZonedDecimalFieldDescription(z50, "WHFOBO"));
addFieldDescription(new ZonedDecimalFieldDescription(z50, "WHFIBO"));
// Field length in bytes
addFieldDescription(new ZonedDecimalFieldDescription(z50, "WHFLDB"));
// Number of digits
addFieldDescription(new ZonedDecimalFieldDescription(z20, "WHFLDO"));
// Number of decimal positions
addFieldDescription(new ZonedDecimalFieldDescription(z20, "WHFLDP"));
// Field text description
addFieldDescription(new CharacterFieldDescription(txt50, "WHFTXT"));
addFieldDescription(new ZonedDecimalFieldDescription(z30, "WHRCDE"));
// Reference file
addFieldDescription(new CharacterFieldDescription(txt10, "WHRFIL"));
// Reference library
addFieldDescription(new CharacterFieldDescription(txt10, "WHRLIB"));
// Reference record format
addFieldDescription(new CharacterFieldDescription(txt10, "WHRFMT"));
// Reference field
addFieldDescription(new CharacterFieldDescription(txt10, "WHRFLD"));
// Column heading 1
addFieldDescription(new CharacterFieldDescription(txt20, "WHCHD1"));
// Column heading 2
addFieldDescription(new CharacterFieldDescription(txt20, "WHCHD2"));
// Column heading 3
addFieldDescription(new CharacterFieldDescription(txt20, "WHCHD3"));
// Field type
addFieldDescription(new CharacterFieldDescription(txt1, "WHFLDT"));
addFieldDescription(new CharacterFieldDescription(txt1, "WHFIOB"));
addFieldDescription(new CharacterFieldDescription(txt2, "WHECDE"));
addFieldDescription(new CharacterFieldDescription(txt32, "WHEWRD"));
addFieldDescription(new ZonedDecimalFieldDescription(z40, "WHVCNE"));
// Number of fields
addFieldDescription(new ZonedDecimalFieldDescription(z50, "WHNFLD"));
addFieldDescription(new ZonedDecimalFieldDescription(z20, "WHNIND"));
addFieldDescription(new CharacterFieldDescription(txt1, "WHSHFT"));
addFieldDescription(new CharacterFieldDescription(txt1, "WHALTY"));
// ALIAS
addFieldDescription(new CharacterFieldDescription(txt30, "WHALIS"));
addFieldDescription(new ZonedDecimalFieldDescription(z20, "WHJREF"));
addFieldDescription(new ZonedDecimalFieldDescription(z20, "WHDFTL"));
// Default value
addFieldDescription(new CharacterFieldDescription(txt30, "WHDFT"));
addFieldDescription(new CharacterFieldDescription(txt1, "WHCHRI"));
addFieldDescription(new CharacterFieldDescription(txt1, "WHCTNT"));
addFieldDescription(new CharacterFieldDescription(txt10, "WHFONT"));
addFieldDescription(new ZonedDecimalFieldDescription(z31, "WHCSWD"));
addFieldDescription(new ZonedDecimalFieldDescription(z31, "WHCSHI"));
addFieldDescription(new CharacterFieldDescription(txt10, "WHBCNM"));
addFieldDescription(new ZonedDecimalFieldDescription(z31, "WHBCHI"));
addFieldDescription(new CharacterFieldDescription(txt1, "WHMAP"));
addFieldDescription(new ZonedDecimalFieldDescription(z50, "WHMAPS"));
addFieldDescription(new ZonedDecimalFieldDescription(z50, "WHMAPL"));
addFieldDescription(new CharacterFieldDescription(txt8, "WHSYSN"));
addFieldDescription(new CharacterFieldDescription(txt2, "WHRES1"));
addFieldDescription(new CharacterFieldDescription(txt1, "WHSQLT"));
addFieldDescription(new CharacterFieldDescription(txt1, "WHHEX"));
addFieldDescription(new PackedDecimalFieldDescription(p41, "WHPNTS"));
// CCSID
addFieldDescription(new PackedDecimalFieldDescription(p50, "WHCCSID"));
// Date/time format
addFieldDescription(new CharacterFieldDescription(txt4, "WHFMT"));
// Date/time separator
addFieldDescription(new CharacterFieldDescription(txt1, "WHSEP"));
// Variable length field
addFieldDescription(new CharacterFieldDescription(txt1, "WHVARL"));
addFieldDescription(new PackedDecimalFieldDescription(p50, "WHALLC"));
// Allow null value
addFieldDescription(new CharacterFieldDescription(txt1, "WHNULL"));
addFieldDescription(new CharacterFieldDescription(txt10, "WHFCSN"));
addFieldDescription(new CharacterFieldDescription(txt10, "WHFCSL"));
addFieldDescription(new CharacterFieldDescription(txt10, "WHFCPN"));
addFieldDescription(new CharacterFieldDescription(txt10, "WHFCPL"));
addFieldDescription(new CharacterFieldDescription(txt10, "WHCDFN"));
addFieldDescription(new CharacterFieldDescription(txt10, "WHCDFL"));
addFieldDescription(new CharacterFieldDescription(txt10, "WHDCDF"));
addFieldDescription(new CharacterFieldDescription(txt10, "WHDCDL"));
addFieldDescription(new PackedDecimalFieldDescription(p30, "WHTXRT"));
addFieldDescription(new ZonedDecimalFieldDescription(z50, "WHFLDG"));
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy