jtopenlite.com.ibm.jtopenlite.database.DatabaseConnection Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jt400-jdk8 Show documentation
Show all versions of jt400-jdk8 Show documentation
The Open Source version of the IBM Toolbox for Java
///////////////////////////////////////////////////////////////////////////////
//
// JTOpenLite
//
// Filename: DatabaseConnection.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) 2011-2012 International Business Machines Corporation and
// others. All rights reserved.
//
///////////////////////////////////////////////////////////////////////////////
//
// Major Change Log
// Version Date Description
// ------- ---------- ---------------------------------------
// 1.7 2012.10.04 Moved counting of bytes actually read from the
// datastream to the in_ object. This removed a lot of
// the counting logic that was added to deal with
// compression.
//
///////////////////////////////////////////////////////////////////////////////
package com.ibm.jtopenlite.database;
import com.ibm.jtopenlite.*;
import java.io.*;
import java.net.*;
import javax.net.ssl.SSLSocketFactory;
/**
* Represents a TCP/IP socket connection to the System i Database host server (QUSRWRK/QZDASOINIT job).
**/
public class DatabaseConnection extends HostServerConnection implements OperationalResultBitmap
{
private final byte[] byteBuffer_ = new byte[1024];
private char[] charBuffer_ = new char[1024];
private static final boolean DEBUG = false;
public static final int DEFAULT_DATABASE_SERVER_PORT = 8471;
public static final int DEFAULT_SSL_DATABASE_SERVER_PORT = 9471;
private static final int TYPE_CALL = 3;
private int correlationID_ = 1;
private int currentRPB_;
private boolean compress_ = true;
private int newCorrelationID()
{
if (correlationID_ == 0x7FFFFFFF) correlationID_ = 0;
return ++correlationID_;
}
private DatabaseWarningCallback warningCallback_;
private DatabaseSQLCommunicationsAreaCallback sqlcaCallback_;
private boolean returnMessageInfo_ = false;
private DatabaseConnection(SystemInfo info, Socket socket, HostInputStream in, HostOutputStream out, String user, String jobName)
{
super(info, user, jobName, socket, in, out);
// When we run locally on the iSeries, don't use data stream compression, it slows us down.
InetAddress i = socket.getInetAddress();
if (i.isLoopbackAddress())
{
compress_ = false;
}
else
{
String sys = info.getSystem();
if (sys.equalsIgnoreCase("localhost") || sys.equalsIgnoreCase("127.0.0.1"))
{
compress_ = false;
}
else
{
try
{
if (i.equals(InetAddress.getLocalHost()))
{
compress_ = false;
}
}
catch (Throwable t)
{
}
}
}
}
/**
* Indicates if the MESSAGE_ID, FIRST_LEVEL_TEXT, and SECOND_LEVEL_TEXT bits are set on
* the operational result bitmap for a database request.
**/
public boolean isMessageInfoReturned()
{
return returnMessageInfo_;
}
public void setMessageInfoReturned(boolean b)
{
returnMessageInfo_ = b;
}
public void setDebug(boolean b)
{
in_.setDebug(b);
out_.setDebug(b);
}
public void setWarningCallback(DatabaseWarningCallback warningCallback)
{
warningCallback_ = warningCallback;
}
public void setSQLCommunicationsAreaCallback(DatabaseSQLCommunicationsAreaCallback callback)
{
sqlcaCallback_ = callback;
}
protected void sendEndJobRequest() throws IOException
{
// Header.
out_.writeInt(40); // Length is 40 if server ID is E004.
out_.writeShort(0); // Header ID.
out_.writeShort(0xE004); // Server ID.
out_.writeInt(0); // CS instance.
out_.writeInt(0); // Correlation ID.
out_.writeShort(0); // Template length.
out_.writeShort(0x1FFF); // ReqRep ID for database server.
// Template.
out_.writeInt(0);
out_.writeInt(0);
out_.writeInt(0);
out_.writeInt(0);
out_.writeInt(0);
}
public static DatabaseConnection getConnection(String system, String user, String password) throws IOException
{
return getConnection(false, system, user, password);
}
public static DatabaseConnection getConnection(final boolean isSSL, String system, String user, String password) throws IOException
{
SignonConnection conn = SignonConnection.getConnection(isSSL, system, user, password);
try
{
return getConnection(isSSL, conn.getInfo(), user, password);
}
finally
{
conn.close();
}
}
public static DatabaseConnection getConnection(SystemInfo info, String user, String password) throws IOException
{
return getConnection(false, info, user, password);
}
public static DatabaseConnection getConnection(final boolean isSSL, SystemInfo info, String user, String password) throws IOException
{
return getConnection(isSSL, info, user, password, isSSL ? DEFAULT_SSL_DATABASE_SERVER_PORT : DEFAULT_DATABASE_SERVER_PORT);
}
public static DatabaseConnection getConnection(SystemInfo info, String user, String password, int databasePort) throws IOException
{
return getConnection(false, info, user, password, databasePort);
}
public static DatabaseConnection getConnection(final boolean isSSL, SystemInfo info, String user, String password, int databasePort) throws IOException
{
if (databasePort < 0 || databasePort > 65535)
{
throw new IOException("Bad database port: "+databasePort);
}
DatabaseConnection conn = null;
Socket databaseServer = isSSL? SSLSocketFactory.getDefault().createSocket(info.getSystem(), databasePort) : new Socket(info.getSystem(), databasePort);
// databaseServer.setKeepAlive(false);
// databaseServer.setReceiveBufferSize(8192);
// databaseServer.setSendBufferSize(8192);
// databaseServer.setSoLinger(true, 0);
// databaseServer.setSoTimeout(0);
// databaseServer.setTcpNoDelay(false);
databaseServer.setPerformancePreferences(0,1,2);
InputStream in = databaseServer.getInputStream();
OutputStream out = databaseServer.getOutputStream();
try
{
// Exchange random seeds.
HostOutputStream dout = new HostOutputStream(new BufferedOutputStream(out, 1024));
HostInputStream din = new HostInputStream(new BufferedInputStream(in, 32768));
String jobName = connect(info, dout, din, 0xE004, user, password);
// din.setDebug(true);
// dout.setDebug(true);
conn = new DatabaseConnection(info, databaseServer, din, dout, user, jobName);
return conn;
}
finally
{
if (conn == null)
{
in.close();
out.close();
databaseServer.close();
}
}
}
private void readFullReply(String name) throws IOException
{
int length = readReplyHeader(name);
skipBytes(length-40);
in_.end();
}
public int getCurrentRequestParameterBlockID()
{
return currentRPB_;
}
/**
* Sets the current RPB handle to use for all actions, excluding those that accept an rpbID as a parameter.
**/
public void setCurrentRequestParameterBlockID(final int rpbID)
{
currentRPB_ = rpbID;
}
/**
* Sends a request to create an RPB and sets the current RPB ID to be the one specified.
**/
public void createRequestParameterBlock(DatabaseCreateRequestParameterBlockAttributes attribs, int rpbID) throws IOException
{
sendCreateSQLRPBRequest(attribs, true, rpbID);
out_.flush();
readFullReply("createSQLRPB");
currentRPB_ = rpbID;
}
public void deleteRequestParameterBlock(DatabaseDeleteRequestParameterBlockAttributes attribs, int rpbID) throws IOException
{
sendDeleteSQLRPBRequest(attribs, rpbID);
out_.flush();
readFullReply("deleteSQLRPB");
}
/**
* Sends a request to reset an RPB and sets the current RPB ID to be the one specified.
**/
public void resetRequestParameterBlock(DatabaseCreateRequestParameterBlockAttributes attribs, int rpbID) throws IOException
{
sendResetSQLRPBRequest(attribs, true, rpbID);
out_.flush();
readFullReply("resetSQLRPB");
currentRPB_ = rpbID;
}
public void prepare(DatabasePrepareAttributes attribs) throws IOException
{
sendPrepareRequest(attribs);
out_.flush();
readFullReply("prepare");
}
public void prepareAndDescribe(DatabasePrepareAndDescribeAttributes attribs, DatabaseDescribeCallback listener, DatabaseParameterMarkerCallback pmListener) throws IOException
{
sendPrepareAndDescribeRequest(attribs);
out_.flush();
parseReply("prepareAndDescribe", listener, null, null, pmListener, null);
}
public void prepareAndExecute(DatabasePrepareAndExecuteAttributes attribs, DatabaseDescribeCallback listener) throws IOException
{
sendPrepareAndExecuteRequest(attribs);
out_.flush();
parseReply("prepareAndExecute", listener, null);
}
private void sendPrepareAndExecuteRequest(DatabasePrepareAndExecuteAttributes attribs) throws IOException
{
int length = 40;
int parms = 0;
if (attribs != null)
{
if (attribs.isPrepareStatementNameSet())
{
length += getPrepareStatementNameLength(attribs);
++parms;
}
if (attribs.isSQLStatementTextSet())
{
length += getSQLStatementTextLength(attribs);
++parms;
}
if (attribs.isSQLStatementTypeSet())
{
length += getSQLStatementTypeLength(attribs);
++parms;
}
if (attribs.isPrepareOptionSet())
{
length += getPrepareOptionLength(attribs);
++parms;
}
if (attribs.isOpenAttributesSet())
{
length += getOpenAttributesLength(attribs);
++parms;
}
if (attribs.isDescribeOptionSet())
{
++parms;
length += getDescribeOptionLength(attribs);
}
if (attribs.isCursorNameSet())
{
++parms;
length += getCursorNameLength(attribs);
}
if (attribs.isBlockingFactorSet())
{
++parms;
length += getBlockingFactorLength(attribs);
}
if (attribs.isScrollableCursorFlagSet())
{
++parms;
length += getScrollableCursorFlagLength(attribs);
}
if (attribs.isSQLParameterMarkerDataSet())
{
++parms;
length += getSQLParameterMarkerDataLength(attribs);
}
if (attribs.isSQLExtendedParameterMarkerDataSet())
{
++parms;
length += getSQLExtendedParameterMarkerDataLength(attribs);
}
if (attribs.isSQLParameterMarkerBlockIndicatorSet())
{
++parms;
length += getSQLParameterMarkerBlockIndicatorLength(attribs);
}
if (attribs.isPackageNameSet())
{
length += getPackageNameLength(attribs);
++parms;
}
if (attribs.isPackageLibrarySet())
{
length += getPackageLibraryLength(attribs);
++parms;
}
if (attribs.isTranslateIndicatorSet())
{
length += getTranslateIndicatorLength(attribs);
++parms;
}
if (attribs.isRLECompressedFunctionParametersSet())
{
length += getRLECompressedFunctionParametersLength(attribs);
++parms;
}
if (attribs.isExtendedColumnDescriptorOptionSet())
{
length += getExtendedColumnDescriptorOptionLength(attribs);
++parms;
}
if (attribs.isExtendedSQLStatementTextSet())
{
length += getExtendedSQLStatementTextLength(attribs);
++parms;
}
}
writeHeader(length, 0x180D);
writeTemplate(parms);
if (attribs != null)
{
if (attribs.isPrepareStatementNameSet())
{
writePrepareStatementName(attribs);
}
if (attribs.isSQLStatementTextSet())
{
writeSQLStatementText(attribs);
}
if (attribs.isSQLStatementTypeSet())
{
writeSQLStatementType(attribs);
}
if (attribs.isPrepareOptionSet())
{
writePrepareOption(attribs);
}
if (attribs.isOpenAttributesSet())
{
writeOpenAttributes(attribs);
}
if (attribs.isDescribeOptionSet())
{
writeDescribeOption(attribs);
}
if (attribs.isCursorNameSet())
{
writeCursorName(attribs);
}
if (attribs.isBlockingFactorSet())
{
writeBlockingFactor(attribs);
}
if (attribs.isScrollableCursorFlagSet())
{
writeScrollableCursorFlag(attribs);
}
if (attribs.isSQLParameterMarkerDataSet())
{
writeSQLParameterMarkerData(attribs);
}
if (attribs.isSQLExtendedParameterMarkerDataSet())
{
writeSQLExtendedParameterMarkerData(attribs);
}
if (attribs.isSQLParameterMarkerBlockIndicatorSet())
{
writeSQLParameterMarkerBlockIndicator(attribs);
}
if (attribs.isPackageNameSet())
{
writePackageName(attribs);
}
if (attribs.isPackageLibrarySet())
{
writePackageLibrary(attribs);
}
if (attribs.isTranslateIndicatorSet())
{
writeTranslateIndicator(attribs);
}
if (attribs.isRLECompressedFunctionParametersSet())
{
writeRLECompressedFunctionParameters(attribs);
}
if (attribs.isExtendedColumnDescriptorOptionSet())
{
writeExtendedColumnDescriptorOption(attribs);
}
if (attribs.isExtendedSQLStatementTextSet())
{
writeExtendedSQLStatementText(attribs);
}
}
}
private int getPackageLibraryLength(AttributePackageLibrary a)
{
return 10+a.getPackageLibrary().length();
}
private void writePackageLibrary(AttributePackageLibrary a) throws IOException
{
String lib = a.getPackageLibrary();
out_.writeInt(10+lib.length());
out_.writeShort(0x3801);
out_.writeShort(37);
out_.writeShort(lib.length());
writePadEBCDIC(lib, lib.length(), out_);
}
private int getPackageNameLength(AttributePackageName a)
{
return 10+a.getPackageName().length();
}
private void writePackageName(AttributePackageName a) throws IOException
{
String name = a.getPackageName();
out_.writeInt(10+name.length());
out_.writeShort(0x3804);
out_.writeShort(37);
out_.writeShort(name.length());
writePadEBCDIC(name, name.length(), out_);
}
private int getPrepareStatementNameLength(AttributePrepareStatementName a)
{
return 10+a.getPrepareStatementName().length();
}
private void writePrepareStatementName(AttributePrepareStatementName a) throws IOException
{
String name = a.getPrepareStatementName();
out_.writeInt(10+name.length());
out_.writeShort(0x3806);
out_.writeShort(37);
out_.writeShort(name.length());
writePadEBCDIC(name, name.length(), out_);
}
private int getSQLStatementTextLength(AttributeSQLStatementText a)
{
return 10+(a.getSQLStatementText().length()*2);
// return 10 + a.getSQLStatementText().length();
}
private void writeSQLStatementText(AttributeSQLStatementText a) throws IOException
{
String text = a.getSQLStatementText();
out_.writeInt(10+(text.length()*2));
// out_.writeInt(10+text.length());
out_.writeShort(0x3807);
out_.writeShort(13488);
// out_.writeShort(37);
// byte[] b = text.getBytes("Cp037");
// out_.writeShort(b.length);
// out_.write(b);
out_.writeShort(text.length()*2);
writeStringToUnicodeBytes(text, out_);
}
private int getSQLStatementTypeLength(AttributeSQLStatementType a)
{
return 8;
}
private void writeSQLStatementType(AttributeSQLStatementType a) throws IOException
{
out_.writeInt(8);
out_.writeShort(0x3812);
out_.writeShort(a.getSQLStatementType());
}
private int getPrepareOptionLength(AttributePrepareOption a)
{
return 7;
}
private void writePrepareOption(AttributePrepareOption a) throws IOException
{
out_.writeInt(7);
out_.writeShort(0x3808);
out_.writeByte(a.getPrepareOption());
}
private int getOpenAttributesLength(AttributeOpenAttributes a)
{
return 7;
}
private void writeOpenAttributes(AttributeOpenAttributes a) throws IOException
{
out_.writeInt(7);
out_.writeShort(0x3809);
out_.writeByte(a.getOpenAttributes());
}
private int getTranslateIndicatorLength(AttributeTranslateIndicator a)
{
return 7;
}
private void writeTranslateIndicator(AttributeTranslateIndicator a) throws IOException
{
out_.writeInt(7);
out_.writeShort(0x3805);
out_.writeByte(a.getTranslateIndicator());
}
private int getRLECompressedFunctionParametersLength(AttributeRLECompressedFunctionParameters a)
{
return 10+a.getRLECompressedFunctionParameters().length;
}
private void writeRLECompressedFunctionParameters(AttributeRLECompressedFunctionParameters a) throws IOException
{
byte[] data = a.getRLECompressedFunctionParameters();
out_.writeInt(10+data.length);
out_.writeShort(0x3832);
out_.writeInt(data.length);
out_.write(data);
}
private int getExtendedColumnDescriptorOptionLength(AttributeExtendedColumnDescriptorOption a)
{
return 7;
}
private void writeExtendedColumnDescriptorOption(AttributeExtendedColumnDescriptorOption a) throws IOException
{
out_.writeInt(7);
out_.writeShort(0x3829);
out_.writeByte(a.getExtendedColumnDescriptorOption());
}
private int getExtendedSQLStatementTextLength(AttributeExtendedSQLStatementText a)
{
return 12+(a.getExtendedSQLStatementText().length()*2);
}
private void writeExtendedSQLStatementText(AttributeExtendedSQLStatementText a) throws IOException
{
String text = a.getExtendedSQLStatementText();
out_.writeInt(12+(text.length()*2));
out_.writeShort(0x3831);
out_.writeShort(13488);
out_.writeInt(text.length()*2);
writeStringToUnicodeBytes(text, out_);
}
private int getSyncPointCountLength(AttributeSyncPointCount a)
{
return 10;
}
private void writeSyncPointCount(AttributeSyncPointCount a) throws IOException
{
out_.writeInt(10);
out_.writeShort(0x3816);
out_.writeInt(a.getSyncPointCount());
}
private void sendPrepareRequest(DatabasePrepareAttributes attribs) throws IOException
{
int length = 40;
int parms = 0;
if (attribs != null)
{
if (attribs.isPrepareStatementNameSet())
{
length += getPrepareStatementNameLength(attribs);
++parms;
}
if (attribs.isSQLStatementTextSet())
{
length += getSQLStatementTextLength(attribs);
++parms;
}
if (attribs.isSQLStatementTypeSet())
{
length += getSQLStatementTypeLength(attribs);
++parms;
}
if (attribs.isPrepareOptionSet())
{
length += getPrepareOptionLength(attribs);
++parms;
}
if (attribs.isOpenAttributesSet())
{
length += getOpenAttributesLength(attribs);
++parms;
}
if (attribs.isPackageNameSet())
{
length += getPackageNameLength(attribs);
++parms;
}
if (attribs.isPackageLibrarySet())
{
length += getPackageLibraryLength(attribs);
++parms;
}
if (attribs.isTranslateIndicatorSet())
{
length += getTranslateIndicatorLength(attribs);
++parms;
}
if (attribs.isRLECompressedFunctionParametersSet())
{
length += getRLECompressedFunctionParametersLength(attribs);
++parms;
}
if (attribs.isExtendedColumnDescriptorOptionSet())
{
length += getExtendedColumnDescriptorOptionLength(attribs);
++parms;
}
if (attribs.isExtendedSQLStatementTextSet())
{
length += getExtendedSQLStatementTextLength(attribs);
++parms;
}
}
writeHeader(length, 0x1800);
int template = SEND_REPLY_IMMED;
writeTemplate(parms, template);
if (attribs != null)
{
if (attribs.isPrepareStatementNameSet())
{
writePrepareStatementName(attribs);
}
if (attribs.isSQLStatementTextSet())
{
writeSQLStatementText(attribs);
}
if (attribs.isSQLStatementTypeSet())
{
writeSQLStatementType(attribs);
}
if (attribs.isPrepareOptionSet())
{
writePrepareOption(attribs);
}
if (attribs.isOpenAttributesSet())
{
writeOpenAttributes(attribs);
}
if (attribs.isPackageLibrarySet())
{
writePackageLibrary(attribs);
}
if (attribs.isPackageNameSet())
{
writePackageName(attribs);
}
if (attribs.isTranslateIndicatorSet())
{
writeTranslateIndicator(attribs);
}
if (attribs.isRLECompressedFunctionParametersSet())
{
writeRLECompressedFunctionParameters(attribs);
}
if (attribs.isExtendedColumnDescriptorOptionSet())
{
writeExtendedColumnDescriptorOption(attribs);
}
if (attribs.isExtendedSQLStatementTextSet())
{
writeExtendedSQLStatementText(attribs);
}
}
}
private void sendStreamFetchRequest(DatabaseStreamFetchAttributes attribs) throws IOException
{
int length = 40;
int parms = 0;
if (attribs != null)
{
if (attribs.isPrepareStatementNameSet())
{
length += getPrepareStatementNameLength(attribs);
++parms;
}
if (attribs.isSQLStatementTextSet())
{
length += getSQLStatementTextLength(attribs);
++parms;
}
if (attribs.isSQLStatementTypeSet())
{
length += getSQLStatementTypeLength(attribs);
++parms;
}
if (attribs.isPackageNameSet())
{
length += getPackageNameLength(attribs);
++parms;
}
if (attribs.isPackageLibrarySet())
{
length += getPackageLibraryLength(attribs);
++parms;
}
if (attribs.isTranslateIndicatorSet())
{
length += getTranslateIndicatorLength(attribs);
++parms;
}
if (attribs.isSyncPointCountSet())
{
length += getSyncPointCountLength(attribs);
++parms;
}
if (attribs.isRLECompressedFunctionParametersSet())
{
length += getRLECompressedFunctionParametersLength(attribs);
++parms;
}
if (attribs.isExtendedSQLStatementTextSet())
{
length += getExtendedSQLStatementTextLength(attribs);
++parms;
}
}
writeHeader(length, 0x180C);
int template = SEND_REPLY_IMMED | RESULT_DATA;
writeTemplate(parms, template);
if (attribs != null)
{
if (attribs.isPrepareStatementNameSet())
{
writePrepareStatementName(attribs);
}
if (attribs.isSQLStatementTextSet())
{
writeSQLStatementText(attribs);
}
if (attribs.isSQLStatementTypeSet())
{
writeSQLStatementType(attribs);
}
if (attribs.isPackageLibrarySet())
{
writePackageLibrary(attribs);
}
if (attribs.isPackageNameSet())
{
writePackageName(attribs);
}
if (attribs.isTranslateIndicatorSet())
{
writeTranslateIndicator(attribs);
}
if (attribs.isSyncPointCountSet())
{
writeSyncPointCount(attribs);
}
if (attribs.isRLECompressedFunctionParametersSet())
{
writeRLECompressedFunctionParameters(attribs);
}
if (attribs.isExtendedSQLStatementTextSet())
{
writeExtendedSQLStatementText(attribs);
}
}
}
private void sendEndStreamFetchRequest(DatabaseEndStreamFetchAttributes attribs) throws IOException
{
int length = 40;
int parms = 0;
if (attribs != null)
{
if (attribs.isTranslateIndicatorSet())
{
length += getTranslateIndicatorLength(attribs);
++parms;
}
if (attribs.isRLECompressedFunctionParametersSet())
{
length += getRLECompressedFunctionParametersLength(attribs);
++parms;
}
}
writeHeader(length, 0x1813);
int template = SEND_REPLY_IMMED; // | MESSAGE_ID | FIRST_LEVEL_TEXT | SECOND_LEVEL_TEXT;
writeTemplate(parms, template);
if (attribs != null)
{
if (attribs.isTranslateIndicatorSet())
{
writeTranslateIndicator(attribs);
}
if (attribs.isRLECompressedFunctionParametersSet())
{
writeRLECompressedFunctionParameters(attribs);
}
}
}
private void writeHeader(final int length, final int reqRepID) throws IOException
{
out_.writeInt(length); // Length.
// out_.writeShort(0); // Header ID.
// out_.writeShort(0xE004); // Server ID.
out_.writeInt(0x0000E004); // Header ID and Server ID.
out_.writeInt(0); // CS instance.
out_.writeInt(newCorrelationID()); // Correlation ID.
out_.writeShort(20); // Template length.
out_.writeShort(reqRepID); // ReqRep ID.
}
private void writeTemplate(final int parms) throws IOException
{
int template = SEND_REPLY_IMMED; // | MESSAGE_ID | FIRST_LEVEL_TEXT | SECOND_LEVEL_TEXT;
writeTemplate(parms, template);
}
private void writeTemplate(final int parms, final int orsBitmap) throws IOException
{
writeTemplate(parms, orsBitmap, 0);
}
private void writeTemplate(final int parms, final int orsBitmap, final int pmHandle) throws IOException
{
writeTemplate(parms, orsBitmap, pmHandle, currentRPB_);
}
/** writes the template, adding the SQLCA, REPLY_RELCOMPRESSED, and MESSAGE_ID bits if needed
*
*/
private void writeTemplate(final int parms, final int orsBitmap, final int pmHandle, final int rpbHandle) throws IOException
{
int bitmap = sqlcaCallback_ != null ? (orsBitmap | SQLCA) : orsBitmap;
if (compress_) bitmap = bitmap | REPLY_RLE_COMPRESSED;
if (returnMessageInfo_) bitmap = bitmap | MESSAGE_ID | FIRST_LEVEL_TEXT | SECOND_LEVEL_TEXT;
out_.writeInt(bitmap); // Operational result (ORS) bitmap.
out_.writeInt(0); // Reserved.
// out_.writeShort(1); // Return ORS handle - after operation completes.
// out_.writeShort(1); // Fill ORS handle.
out_.writeInt(0x00010001); // Return ORS handle, Fill ORS handle.
out_.writeShort(0); // Based on ORS handle.
out_.writeShort(rpbHandle); // Request parameter block (RPB) handle.
// out_.writeInt(0x00000001); // Based on ORS handle, Request parameter block (RPB) handle.
out_.writeShort(pmHandle); // Parameter marker descriptor handle.
out_.writeShort(parms); // Parameter count.
}
private int getSQLParameterMarkerDataLength(AttributeSQLParameterMarkerData a)
{
return 6+a.getSQLParameterMarkerData().length;
}
private void writeSQLParameterMarkerData(AttributeSQLParameterMarkerData a) throws IOException
{
byte[] data = a.getSQLParameterMarkerData();
out_.writeInt(6+data.length);
out_.writeShort(0x3811);
out_.write(data);
}
private int getSQLExtendedParameterMarkerDataLength(AttributeSQLExtendedParameterMarkerData a)
{
return 6+a.getSQLExtendedParameterMarkerData().length;
}
private void writeSQLExtendedParameterMarkerData(AttributeSQLExtendedParameterMarkerData a) throws IOException
{
byte[] data = a.getSQLExtendedParameterMarkerData();
out_.writeInt(6+data.length);
out_.writeShort(0x381F);
out_.write(data);
}
private int getSQLParameterMarkerBlockIndicatorLength(AttributeSQLParameterMarkerBlockIndicator a)
{
return 8;
}
private void writeSQLParameterMarkerBlockIndicator(AttributeSQLParameterMarkerBlockIndicator a) throws IOException
{
out_.writeInt(8);
out_.writeShort(0x3814);
out_.writeShort(a.getSQLParameterMarkerBlockIndicator());
}
private void sendFetchRequest(DatabaseFetchAttributes attribs) throws IOException
{
int length = 40;
int parms = 0;
if (attribs != null)
{
if (attribs.isCursorNameSet())
{
++parms;
length += getCursorNameLength(attribs);
}
if (attribs.isVariableFieldCompressionSet())
{
++parms;
length += getVariableFieldCompressionLength(attribs);
}
if (attribs.isBlockingFactorSet())
{
++parms;
length += getBlockingFactorLength(attribs);
}
if (attribs.isFetchScrollOptionSet())
{
++parms;
length += getFetchScrollOptionLength(attribs);
}
if (attribs.isTranslateIndicatorSet())
{
++parms;
length += getTranslateIndicatorLength(attribs);
}
if (attribs.isRLECompressedFunctionParametersSet())
{
++parms;
length += getRLECompressedFunctionParametersLength(attribs);
}
if (attribs.isFetchBufferSizeSet())
{
++parms;
length += getFetchBufferSizeLength(attribs);
}
}
writeHeader(length, 0x180B);
// writeTemplate(parms, compress_ ? 0x84040000 : 0x84000000);
// Note: The new writeTemplate adds compression if needed.
int template = SEND_REPLY_IMMED | RESULT_DATA;
writeTemplate(parms, template);
if (attribs != null)
{
if (attribs.isCursorNameSet())
{
writeCursorName(attribs);
}
if (attribs.isVariableFieldCompressionSet())
{
writeVariableFieldCompression(attribs);
}
if (attribs.isBlockingFactorSet())
{
writeBlockingFactor(attribs);
}
if (attribs.isFetchScrollOptionSet())
{
writeFetchScrollOption(attribs);
}
if (attribs.isTranslateIndicatorSet())
{
writeTranslateIndicator(attribs);
}
if (attribs.isRLECompressedFunctionParametersSet())
{
writeRLECompressedFunctionParameters(attribs);
}
if (attribs.isFetchBufferSizeSet())
{
writeFetchBufferSize(attribs);
}
}
}
private void sendPackageRequest(DatabasePackageAttributes attribs, boolean createOrDelete) throws IOException
{
int length = 40;
int parms = 0;
if (attribs != null)
{
if (attribs.isPackageNameSet())
{
++parms;
length += getPackageNameLength(attribs);
}
if (attribs.isPackageLibrarySet())
{
++parms;
length += getPackageLibraryLength(attribs);
}
if (attribs.isTranslateIndicatorSet())
{
++parms;
length += getTranslateIndicatorLength(attribs);
}
if (attribs.isRLECompressedFunctionParametersSet())
{
++parms;
length += getRLECompressedFunctionParametersLength(attribs);
}
}
writeHeader(length, createOrDelete ? 0x180F : 0x1811);
// writeTemplate(parms, 0xF2000000);
int template = SEND_REPLY_IMMED | SQLCA;
writeTemplate(parms, template);
if (attribs != null)
{
if (attribs.isPackageNameSet())
{
writePackageName(attribs);
}
if (attribs.isPackageLibrarySet())
{
writePackageLibrary(attribs);
}
if (attribs.isTranslateIndicatorSet())
{
writeTranslateIndicator(attribs);
}
if (attribs.isRLECompressedFunctionParametersSet())
{
writeRLECompressedFunctionParameters(attribs);
}
}
}
private int getReturnSizeLength(AttributeReturnSize a)
{
return 10;
}
private void writeReturnSize(AttributeReturnSize a) throws IOException
{
out_.writeInt(10);
out_.writeShort(0x3815);
out_.writeInt(a.getReturnSize());
}
private void sendRetrievePackageRequest(DatabaseRetrievePackageAttributes attribs) throws IOException
{
int length = 40;
int parms = 0;
if (attribs != null)
{
if (attribs.isPackageNameSet())
{
++parms;
length += getPackageNameLength(attribs);
}
if (attribs.isPackageLibrarySet())
{
++parms;
length += getPackageLibraryLength(attribs);
}
if (attribs.isTranslateIndicatorSet())
{
++parms;
length += getTranslateIndicatorLength(attribs);
}
if (attribs.isReturnSizeSet())
{
++parms;
length += getReturnSizeLength(attribs);
}
if (attribs.isRLECompressedFunctionParametersSet())
{
++parms;
length += getRLECompressedFunctionParametersLength(attribs);
}
}
writeHeader(length, 0x1815);
// writeTemplate(parms, 0x80100000);
int template = SEND_REPLY_IMMED | PACKAGE_INFORMATION;
writeTemplate(parms, template);
if (attribs != null)
{
if (attribs.isPackageNameSet())
{
writePackageName(attribs);
}
if (attribs.isPackageLibrarySet())
{
writePackageLibrary(attribs);
}
if (attribs.isTranslateIndicatorSet())
{
writeTranslateIndicator(attribs);
}
if (attribs.isReturnSizeSet())
{
writeReturnSize(attribs);
}
if (attribs.isRLECompressedFunctionParametersSet())
{
writeRLECompressedFunctionParameters(attribs);
}
}
}
private int getSQLParameterMarkerDataFormatLength(AttributeSQLParameterMarkerDataFormat a)
{
return 6+a.getSQLParameterMarkerDataFormat().length;
}
private void writeSQLParameterMarkerDataFormat(AttributeSQLParameterMarkerDataFormat a) throws IOException
{
out_.writeInt(getSQLParameterMarkerDataFormatLength(a));
out_.writeShort(0x3801);
out_.write(a.getSQLParameterMarkerDataFormat());
}
private int getExtendedSQLParameterMarkerDataFormatLength(AttributeExtendedSQLParameterMarkerDataFormat a)
{
return 6+a.getExtendedSQLParameterMarkerDataFormat().length;
}
private void writeExtendedSQLParameterMarkerDataFormat(AttributeExtendedSQLParameterMarkerDataFormat a) throws IOException
{
out_.writeInt(getExtendedSQLParameterMarkerDataFormatLength(a));
out_.writeShort(0x381E);
out_.write(a.getExtendedSQLParameterMarkerDataFormat());
}
private void sendDeleteDescriptorRequest(DatabaseDeleteDescriptorAttributes attribs, int descriptorHandle) throws IOException
{
int length = 40;
int parms = 0;
if (attribs != null)
{
if (attribs.isTranslateIndicatorSet())
{
++parms;
length += getTranslateIndicatorLength(attribs);
}
if (attribs.isRLECompressedFunctionParametersSet())
{
++parms;
length += getRLECompressedFunctionParametersLength(attribs);
}
}
writeHeader(length, 0x1E01);
// writeTemplate(parms, 0x80800000, descriptorHandle);
int template = SEND_REPLY_IMMED | PARAMETER_MARKER_FORMAT;
writeTemplate(parms, template, descriptorHandle);
if (attribs != null)
{
if (attribs.isTranslateIndicatorSet())
{
writeTranslateIndicator(attribs);
}
if (attribs.isRLECompressedFunctionParametersSet())
{
writeRLECompressedFunctionParameters(attribs);
}
}
}
private void sendChangeDescriptorRequest(DatabaseChangeDescriptorAttributes attribs, int descriptorHandle) throws IOException
{
int length = 40;
int parms = 0;
if (attribs != null)
{
if (attribs.isSQLParameterMarkerDataFormatSet())
{
++parms;
length += getSQLParameterMarkerDataFormatLength(attribs);
}
if (attribs.isTranslateIndicatorSet())
{
++parms;
length += getTranslateIndicatorLength(attribs);
}
if (attribs.isExtendedSQLParameterMarkerDataFormatSet())
{
++parms;
length += getExtendedSQLParameterMarkerDataFormatLength(attribs);
}
if (attribs.isRLECompressedFunctionParametersSet())
{
++parms;
length += getRLECompressedFunctionParametersLength(attribs);
}
}
writeHeader(length, 0x1E00);
// writeTemplate(parms, 0x00040000, descriptorHandle);
int template = REPLY_RLE_COMPRESSED;
writeTemplate(parms, template, descriptorHandle);
if (attribs != null)
{
if (attribs.isSQLParameterMarkerDataFormatSet())
{
writeSQLParameterMarkerDataFormat(attribs);
}
if (attribs.isTranslateIndicatorSet())
{
writeTranslateIndicator(attribs);
}
if (attribs.isExtendedSQLParameterMarkerDataFormatSet())
{
writeExtendedSQLParameterMarkerDataFormat(attribs);
}
if (attribs.isRLECompressedFunctionParametersSet())
{
writeRLECompressedFunctionParameters(attribs);
}
}
}
private void sendDescribeParameterMarkerRequest(DatabaseDescribeParameterMarkerAttributes attribs) throws IOException
{
int length = 40;
int parms = 0;
if (attribs != null)
{
if (attribs.isPackageNameSet())
{
++parms;
length += getPackageNameLength(attribs);
}
if (attribs.isPackageLibrarySet())
{
++parms;
length += getPackageLibraryLength(attribs);
}
if (attribs.isTranslateIndicatorSet())
{
++parms;
length += getTranslateIndicatorLength(attribs);
}
if (attribs.isRLECompressedFunctionParametersSet())
{
++parms;
length += getRLECompressedFunctionParametersLength(attribs);
}
if (attribs.isPrepareStatementNameSet())
{
++parms;
length += getPrepareStatementNameLength(attribs);
}
}
writeHeader(length, 0x1802);
// writeTemplate(parms, 0xF0800000);
int template = SEND_REPLY_IMMED | PARAMETER_MARKER_FORMAT; // | MESSAGE_ID | FIRST_LEVEL_TEXT | SECOND_LEVEL_TEXT | PARAMETER_MARKER_FORMAT;
writeTemplate(parms, template);
if (attribs != null)
{
if (attribs.isPackageNameSet())
{
writePackageName(attribs);
}
if (attribs.isPackageLibrarySet())
{
writePackageLibrary(attribs);
}
if (attribs.isTranslateIndicatorSet())
{
writeTranslateIndicator(attribs);
}
if (attribs.isRLECompressedFunctionParametersSet())
{
writeRLECompressedFunctionParameters(attribs);
}
if (attribs.isPrepareStatementNameSet())
{
writePrepareStatementName(attribs);
}
}
}
private void sendDescribeRequest(DatabaseDescribeAttributes attribs) throws IOException
{
int length = 40;
int parms = 0;
if (attribs != null)
{
if (attribs.isPrepareStatementNameSet())
{
++parms;
length += getPrepareStatementNameLength(attribs);
}
if (attribs.isDescribeOptionSet())
{
++parms;
length += getDescribeOptionLength(attribs);
}
if (attribs.isPackageNameSet())
{
++parms;
length += getPackageNameLength(attribs);
}
if (attribs.isPackageLibrarySet())
{
++parms;
length += getPackageLibraryLength(attribs);
}
if (attribs.isTranslateIndicatorSet())
{
++parms;
length += getTranslateIndicatorLength(attribs);
}
if (attribs.isRLECompressedFunctionParametersSet())
{
++parms;
length += getRLECompressedFunctionParametersLength(attribs);
}
}
writeHeader(length, 0x1801);
// writeTemplate(parms, 0x88000000);
int template = SEND_REPLY_IMMED | DATA_FORMAT;
writeTemplate(parms, template);
if (attribs != null)
{
if (attribs.isPrepareStatementNameSet())
{
writePrepareStatementName(attribs);
}
if (attribs.isDescribeOptionSet())
{
writeDescribeOption(attribs);
}
if (attribs.isPackageNameSet())
{
writePackageName(attribs);
}
if (attribs.isPackageLibrarySet())
{
writePackageLibrary(attribs);
}
if (attribs.isTranslateIndicatorSet())
{
writeTranslateIndicator(attribs);
}
if (attribs.isRLECompressedFunctionParametersSet())
{
writeRLECompressedFunctionParameters(attribs);
}
}
}
private void sendOpenAndDescribeRequest(DatabaseOpenAndDescribeAttributes attribs, int pmDescriptorHandle) throws IOException
{
int length = 40;
int parms = 0;
if (attribs != null)
{
if (attribs.isPrepareStatementNameSet())
{
++parms;
length += getPrepareStatementNameLength(attribs);
}
if (attribs.isCursorNameSet())
{
++parms;
length += getCursorNameLength(attribs);
}
if (attribs.isOpenAttributesSet())
{
++parms;
length += getOpenAttributesLength(attribs);
}
if (attribs.isVariableFieldCompressionSet())
{
++parms;
length += getVariableFieldCompressionLength(attribs);
}
if (attribs.isDescribeOptionSet())
{
++parms;
length += getDescribeOptionLength(attribs);
}
if (attribs.isBlockingFactorSet())
{
++parms;
length += getBlockingFactorLength(attribs);
}
if (attribs.isScrollableCursorFlagSet())
{
++parms;
length += getScrollableCursorFlagLength(attribs);
}
if (attribs.isSQLParameterMarkerDataSet())
{
++parms;
length += getSQLParameterMarkerDataLength(attribs);
}
if (attribs.isSQLExtendedParameterMarkerDataSet())
{
++parms;
length += getSQLExtendedParameterMarkerDataLength(attribs);
}
if (attribs.isSQLParameterMarkerBlockIndicatorSet())
{
++parms;
length += getSQLParameterMarkerBlockIndicatorLength(attribs);
}
if (attribs.isPackageNameSet())
{
++parms;
length += getPackageNameLength(attribs);
}
if (attribs.isPackageLibrarySet())
{
++parms;
length += getPackageLibraryLength(attribs);
}
if (attribs.isTranslateIndicatorSet())
{
++parms;
length += getTranslateIndicatorLength(attribs);
}
if (attribs.isRLECompressedFunctionParametersSet())
{
++parms;
length += getRLECompressedFunctionParametersLength(attribs);
}
if (attribs.isResultSetHoldabilityOptionSet())
{
++parms;
length += getResultSetHoldabilityOptionLength(attribs);
}
}
writeHeader(length, 0x1804);
// writeTemplate(parms, 0xF8000000, pmDescriptorHandle);
// writeTemplate(parms, 0x86040000, pmDescriptorHandle);
// writeTemplate(parms, 0xFE040000, pmDescriptorHandle);
// Statement before update to use constants.
// writeTemplate(parms, 0xF8040000, pmDescriptorHandle);
int template = SEND_REPLY_IMMED | DATA_FORMAT | REPLY_RLE_COMPRESSED; // | MESSAGE_ID | FIRST_LEVEL_TEXT | SECOND_LEVEL_TEXT | DATA_FORMAT | REPLY_RLE_COMPRESSED;
writeTemplate(parms, template, pmDescriptorHandle);
if (attribs != null)
{
if (attribs.isPrepareStatementNameSet())
{
writePrepareStatementName(attribs);
}
if (attribs.isCursorNameSet())
{
writeCursorName(attribs);
}
if (attribs.isOpenAttributesSet())
{
writeOpenAttributes(attribs);
}
if (attribs.isVariableFieldCompressionSet())
{
writeVariableFieldCompression(attribs);
}
if (attribs.isDescribeOptionSet())
{
writeDescribeOption(attribs);
}
if (attribs.isBlockingFactorSet())
{
writeBlockingFactor(attribs);
}
if (attribs.isScrollableCursorFlagSet())
{
writeScrollableCursorFlag(attribs);
}
if (attribs.isSQLParameterMarkerDataSet())
{
writeSQLParameterMarkerData(attribs);
}
if (attribs.isSQLExtendedParameterMarkerDataSet())
{
writeSQLExtendedParameterMarkerData(attribs);
}
if (attribs.isSQLParameterMarkerBlockIndicatorSet())
{
writeSQLParameterMarkerBlockIndicator(attribs);
}
if (attribs.isPackageNameSet())
{
writePackageName(attribs);
}
if (attribs.isPackageLibrarySet())
{
writePackageLibrary(attribs);
}
if (attribs.isTranslateIndicatorSet())
{
writeTranslateIndicator(attribs);
}
if (attribs.isRLECompressedFunctionParametersSet())
{
writeRLECompressedFunctionParameters(attribs);
}
if (attribs.isResultSetHoldabilityOptionSet())
{
writeResultSetHoldabilityOption(attribs);
}
}
}
private void sendExecuteOrOpenAndDescribeRequest(DatabaseExecuteOrOpenAndDescribeAttributes attribs) throws IOException
{
int length = 40;
int parms = 0;
if (attribs != null)
{
if (attribs.isPrepareStatementNameSet())
{
++parms;
length += getPrepareStatementNameLength(attribs);
}
if (attribs.isCursorNameSet())
{
++parms;
length += getCursorNameLength(attribs);
}
if (attribs.isOpenAttributesSet())
{
++parms;
length += getOpenAttributesLength(attribs);
}
if (attribs.isDescribeOptionSet())
{
++parms;
length += getDescribeOptionLength(attribs);
}
if (attribs.isBlockingFactorSet())
{
++parms;
length += getBlockingFactorLength(attribs);
}
if (attribs.isScrollableCursorFlagSet())
{
++parms;
length += getScrollableCursorFlagLength(attribs);
}
if (attribs.isSQLParameterMarkerDataSet())
{
++parms;
length += getSQLParameterMarkerDataLength(attribs);
}
if (attribs.isSQLExtendedParameterMarkerDataSet())
{
++parms;
length += getSQLExtendedParameterMarkerDataLength(attribs);
}
if (attribs.isSQLParameterMarkerBlockIndicatorSet())
{
++parms;
length += getSQLParameterMarkerBlockIndicatorLength(attribs);
}
if (attribs.isPackageNameSet())
{
++parms;
length += getPackageNameLength(attribs);
}
if (attribs.isPackageLibrarySet())
{
++parms;
length += getPackageLibraryLength(attribs);
}
if (attribs.isTranslateIndicatorSet())
{
++parms;
length += getTranslateIndicatorLength(attribs);
}
if (attribs.isRLECompressedFunctionParametersSet())
{
++parms;
length += getRLECompressedFunctionParametersLength(attribs);
}
if (attribs.isResultSetHoldabilityOptionSet())
{
++parms;
length += getResultSetHoldabilityOptionLength(attribs);
}
}
writeHeader(length, 0x1812);
// writeTemplate(parms, 0x88000000);
int template = SEND_REPLY_IMMED | DATA_FORMAT;
writeTemplate(parms, template);
if (attribs != null)
{
if (attribs.isPrepareStatementNameSet())
{
writePrepareStatementName(attribs);
}
if (attribs.isCursorNameSet())
{
writeCursorName(attribs);
}
if (attribs.isOpenAttributesSet())
{
writeOpenAttributes(attribs);
}
if (attribs.isDescribeOptionSet())
{
writeDescribeOption(attribs);
}
if (attribs.isBlockingFactorSet())
{
writeBlockingFactor(attribs);
}
if (attribs.isScrollableCursorFlagSet())
{
writeScrollableCursorFlag(attribs);
}
if (attribs.isSQLParameterMarkerDataSet())
{
writeSQLParameterMarkerData(attribs);
}
if (attribs.isSQLExtendedParameterMarkerDataSet())
{
writeSQLExtendedParameterMarkerData(attribs);
}
if (attribs.isSQLParameterMarkerBlockIndicatorSet())
{
writeSQLParameterMarkerBlockIndicator(attribs);
}
if (attribs.isPackageNameSet())
{
writePackageName(attribs);
}
if (attribs.isPackageLibrarySet())
{
writePackageLibrary(attribs);
}
if (attribs.isTranslateIndicatorSet())
{
writeTranslateIndicator(attribs);
}
if (attribs.isRLECompressedFunctionParametersSet())
{
writeRLECompressedFunctionParameters(attribs);
}
if (attribs.isResultSetHoldabilityOptionSet())
{
writeResultSetHoldabilityOption(attribs);
}
}
}
private void sendOpenDescribeFetchRequest(DatabaseOpenDescribeFetchAttributes attribs) throws IOException
{
int length = 40;
int parms = 0;
if (attribs != null)
{
if (attribs.isPrepareStatementNameSet())
{
++parms;
length += getPrepareStatementNameLength(attribs);
}
if (attribs.isCursorNameSet())
{
++parms;
length += getCursorNameLength(attribs);
}
if (attribs.isOpenAttributesSet())
{
++parms;
length += getOpenAttributesLength(attribs);
}
if (attribs.isVariableFieldCompressionSet())
{
++parms;
length += getVariableFieldCompressionLength(attribs);
}
if (attribs.isDescribeOptionSet())
{
++parms;
length += getDescribeOptionLength(attribs);
}
if (attribs.isBlockingFactorSet())
{
++parms;
length += getBlockingFactorLength(attribs);
}
if (attribs.isScrollableCursorFlagSet())
{
++parms;
length += getScrollableCursorFlagLength(attribs);
}
if (attribs.isSQLParameterMarkerDataSet())
{
++parms;
length += getSQLParameterMarkerDataLength(attribs);
}
if (attribs.isSQLExtendedParameterMarkerDataSet())
{
++parms;
length += getSQLExtendedParameterMarkerDataLength(attribs);
}
if (attribs.isSQLParameterMarkerBlockIndicatorSet())
{
++parms;
length += getSQLParameterMarkerBlockIndicatorLength(attribs);
}
if (attribs.isPackageNameSet())
{
++parms;
length += getPackageNameLength(attribs);
}
if (attribs.isPackageLibrarySet())
{
++parms;
length += getPackageLibraryLength(attribs);
}
if (attribs.isTranslateIndicatorSet())
{
++parms;
length += getTranslateIndicatorLength(attribs);
}
if (attribs.isRLECompressedFunctionParametersSet())
{
++parms;
length += getRLECompressedFunctionParametersLength(attribs);
}
if (attribs.isResultSetHoldabilityOptionSet())
{
++parms;
length += getResultSetHoldabilityOptionLength(attribs);
}
if (attribs.isFetchScrollOptionSet())
{
++parms;
length += getFetchScrollOptionLength(attribs);
}
if (attribs.isFetchBufferSizeSet())
{
++parms;
length += getFetchBufferSizeLength(attribs);
}
}
writeHeader(length, 0x180E);
// writeTemplate(parms, 0x86048000);//0x8C000000);
int template = SEND_REPLY_IMMED | RESULT_DATA | SQLCA | REPLY_RLE_COMPRESSED | RETURN_RESULT_SET_ATTRIBUTES;
writeTemplate(parms, template);//0x8C000000);
if (attribs != null)
{
if (attribs.isPrepareStatementNameSet())
{
writePrepareStatementName(attribs);
}
if (attribs.isCursorNameSet())
{
writeCursorName(attribs);
}
if (attribs.isOpenAttributesSet())
{
writeOpenAttributes(attribs);
}
if (attribs.isVariableFieldCompressionSet())
{
writeVariableFieldCompression(attribs);
}
if (attribs.isDescribeOptionSet())
{
writeDescribeOption(attribs);
}
if (attribs.isBlockingFactorSet())
{
writeBlockingFactor(attribs);
}
if (attribs.isScrollableCursorFlagSet())
{
writeScrollableCursorFlag(attribs);
}
if (attribs.isSQLParameterMarkerDataSet())
{
writeSQLParameterMarkerData(attribs);
}
if (attribs.isSQLExtendedParameterMarkerDataSet())
{
writeSQLExtendedParameterMarkerData(attribs);
}
if (attribs.isSQLParameterMarkerBlockIndicatorSet())
{
writeSQLParameterMarkerBlockIndicator(attribs);
}
if (attribs.isPackageNameSet())
{
writePackageName(attribs);
}
if (attribs.isPackageLibrarySet())
{
writePackageLibrary(attribs);
}
if (attribs.isTranslateIndicatorSet())
{
writeTranslateIndicator(attribs);
}
if (attribs.isRLECompressedFunctionParametersSet())
{
writeRLECompressedFunctionParameters(attribs);
}
if (attribs.isResultSetHoldabilityOptionSet())
{
writeResultSetHoldabilityOption(attribs);
}
if (attribs.isFetchScrollOptionSet())
{
writeFetchScrollOption(attribs);
}
if (attribs.isFetchBufferSizeSet())
{
writeFetchBufferSize(attribs);
}
}
}
public void openAndDescribe(DatabaseOpenAndDescribeAttributes attribs, DatabaseDescribeCallback listener) throws IOException
{
openAndDescribe(attribs, 0, listener);
}
public void openAndDescribe(DatabaseOpenAndDescribeAttributes attribs, int parameterMarkerDescriptorHandle, DatabaseDescribeCallback listener) throws IOException
{
sendOpenAndDescribeRequest(attribs, parameterMarkerDescriptorHandle);
out_.flush();
parseReply("openAndDescribe", listener, null);
}
public void openDescribeFetch(DatabaseOpenDescribeFetchAttributes attribs, DatabaseDescribeCallback describeListener, DatabaseFetchCallback fetchListener) throws IOException
{
sendOpenDescribeFetchRequest(attribs);
out_.flush();
parseReply("openDescribeFetch", describeListener, fetchListener);
}
public void createPackage(DatabasePackageAttributes attribs) throws IOException
{
sendPackageRequest(attribs, true);
out_.flush();
parseReply("createPackage", null, null);
}
public void deletePackage(DatabasePackageAttributes attribs) throws IOException
{
sendPackageRequest(attribs, false);
out_.flush();
parseReply("deletePackage", null, null);
}
public void retrievePackage(DatabaseRetrievePackageAttributes attribs, DatabasePackageCallback listener) throws IOException
{
sendRetrievePackageRequest(attribs);
out_.flush();
parseReply("retrievePackage", listener);
}
public void describeParameterMarker(DatabaseDescribeParameterMarkerAttributes attribs, DatabaseParameterMarkerCallback callback) throws IOException
{
sendDescribeParameterMarkerRequest(attribs);
out_.flush();
parseReply("describeParameterMarker", callback);
}
public void changeDescriptor(DatabaseChangeDescriptorAttributes attribs, int descriptorHandle) throws IOException
{
sendChangeDescriptorRequest(attribs, descriptorHandle);
out_.flush();
// parseReply("changeDescriptor", null, null);
}
public void deleteDescriptor(DatabaseDeleteDescriptorAttributes attribs, int descriptorHandle) throws IOException
{
sendDeleteDescriptorRequest(attribs, descriptorHandle);
out_.flush();
parseReply("deleteDescriptor", null, null);
}
public void describe(DatabaseDescribeAttributes attribs, DatabaseDescribeCallback listener) throws IOException
{
sendDescribeRequest(attribs);
out_.flush();
parseReply("describe", listener, null);
}
private void parseReply(String datastream, DatabaseParameterMarkerCallback callback) throws IOException
{
parseReply(datastream, null, null, null, callback, null);
}
private void parseReply(String datastream, DatabasePackageCallback callback) throws IOException
{
parseReply(datastream, null, null, callback, null, null);
}
private void parseReply(String datastream, DatabaseDescribeCallback describeCallback, DatabaseFetchCallback fetchCallback) throws IOException
{
parseReply(datastream, describeCallback, fetchCallback, null, null, null);
}
private int readCompressedInt() throws IOException
{
int b1 = readCompressedByte();
int b2 = readCompressedByte();
int b3 = readCompressedByte();
int b4 = readCompressedByte();
return(b1 << 24) | (b2 << 16) | (b3 << 8) | b4;
}
private int readCompressedShort() throws IOException
{
int b1 = readCompressedByte();
int b2 = readCompressedByte();
return(b1 << 8) | b2;
}
private void readCompressedFully(final byte[] b) throws IOException
{
for (int i=0; i 6)
{
// Message ID.
int shortBytesRead = 2;
int ccsid = readShort();
byte[] messageID = new byte[ll-8];
readFullyReturnCount(messageID);
if (ll > charBuffer_.length) {
charBuffer_ = new char[ll];
}
warningCallback_.newMessageID(Conv.ebcdicByteArrayToString(messageID, charBuffer_));
}
}
else if (cp == 0x3802 && warningCallback_ != null)
{
if (ll > 6)
{
// First level message text.
int ccsid = readShort();
int len = readShort();
byte[] firstLevelMessageText = new byte[ll-10];
readFullyReturnCount(firstLevelMessageText);
if (ll > charBuffer_.length) {
charBuffer_ = new char[ll];
}
warningCallback_.newMessageText(Conv.ebcdicByteArrayToString(firstLevelMessageText, charBuffer_));
}
}
else if (cp == 0x3803 && warningCallback_ != null)
{
if (ll > 6)
{
// Second level message text.
int ccsid = readShort();
int len = readShort();
byte[] secondLevelMessageText = new byte[ll-10];
readFullyReturnCount(secondLevelMessageText);
if (ll > charBuffer_.length) {
charBuffer_ = new char[ll];
}
warningCallback_.newSecondLevelText(Conv.ebcdicByteArrayToString(secondLevelMessageText, charBuffer_));
}
}
else if (cp == 0x3811 && describeCallback != null)
{
if (ll > 6)
{
// oldNumRead is the number of bytes processed before processing the
// current datastream parameter. As such, we subtract 6
// bytes for the header.
int oldNumRead = (int) in_.getLatestBytesReceived() -6 ;
int virtualRead = oldNumRead + 6;
// Extended column descriptors.
int numColumns = readInt();
int[] offsets = new int[numColumns];
int[] lengths = new int[numColumns];
skipBytes(6); // Reserved.
virtualRead += 10;
for (int i=0; i 0)
{
skipBytes(toSkip);
virtualRead += toSkip;
}
if (lengths[i] >= 8)
{
int descRead = 0;
while (descRead < lengths[i])
{
int oldDescRead = descRead;
int descriptorLength = readInt();
int codepoint = readShort();
descRead += 6;
virtualRead += 6;
int ccsid = 37;
int len = descriptorLength-6;
if (codepoint == 0x3902)
{
ccsid = readShort();
descRead += 2;
virtualRead += 2;
len = descriptorLength-8;
if (ccsid == 65535) {
ccsid = 37;
}
}
readFully(byteBuffer_, 0, len);
descRead += len;
virtualRead += len;
String name = Conv.ebcdicByteArrayToString(byteBuffer_, 0, len, charBuffer_, ccsid);
switch (codepoint)
{
case 0x3900: describeCallback.baseColumnName(i, name); break;
case 0x3901: describeCallback.baseTableName(i, name); break;
case 0x3902: describeCallback.columnLabel(i, name); break;
case 0x3904: describeCallback.baseSchemaName(i, name); break;
case 0x3905: describeCallback.sqlFromTable(i, name); break;
case 0x3906: describeCallback.sqlFromSchema(i, name); break;
}
int descSkip = descriptorLength-descRead+oldDescRead;
if (descSkip > 0)
{
skipBytes(descSkip);
descRead += descSkip;
virtualRead += descSkip;
}
}
}
}
int remaining = ll-virtualRead+oldNumRead;
skipBytes(remaining);
virtualRead += remaining;
}
}
else if (cp == 0x3812)
{
if (ll > 6 && describeCallback != null)
{
int oldNumRead = (int) in_.getLatestBytesReceived() - 6;
int virtualRead = oldNumRead;
virtualRead += 6;
// Super extended data format.
int consistencyToken = readInt();
int numFields = readInt();
int dateFormat = readByte();
int timeFormat = readByte();
int dateSeparator = readByte();
int timeSeparator = readByte();
int recordSize = readInt();
describeCallback.resultSetDescription(numFields, dateFormat, timeFormat, dateSeparator, timeSeparator, recordSize);
virtualRead += 16;
int[] offsets = new int[numFields];
int[] lengths = new int[numFields];
final int fixedLengthRead = 48*numFields;
for (int i=0; i 0) {
int varFieldLL = readInt();
int varFieldCP = readShort();
int varFieldCCSID = readShort(); // Always 65535?
int varFieldNameLength = varFieldLL - 8;
readFully(byteBuffer_, 0, varFieldNameLength);
virtualRead+= varFieldLL;
String varFieldName = Conv.ebcdicByteArrayToString(
byteBuffer_, 0, varFieldNameLength,
charBuffer_);
switch(varFieldCP) {
case 0x3840: describeCallback.fieldName(i, varFieldName); break;
case 0x3841: describeCallback.udtName(i, varFieldName); break;
}
varLengthRead += varFieldLL;
// adjusted above by readFully
// numRead += varFieldLL;
variableLength -= varFieldLL;
}
}
int remaining = ll-virtualRead+oldNumRead;
skipBytes(remaining);
}
else
{
skipBytes(ll-6);
}
}
else if (cp == 0x380E && fetchCallback != null)
{
int oldNumRead = (int) in_.getLatestBytesReceived() - 6;
int virtualRead = oldNumRead + 6;
if (virtualRead+20 <= length)
{
// Extended result data.
int consistencyToken = readInt();
int rowCount = readInt();
int columnCount = readShort();
int indicatorSize = readShort();
readInt(); // reserved
int rowSize = readInt();
fetchCallback.newResultData(rowCount, columnCount, rowSize);
virtualRead += 20;
final byte[] tempIndicator;
if (indicatorSize == 0) {
tempIndicator_[0] = 0;
tempIndicator_[1] = 0;
tempIndicator = tempIndicator_;
} else {
tempIndicator = indicatorSize == 2 ? tempIndicator_ : new byte[indicatorSize];
}
for (int i=0; i 0) {
readFullyReturnCount(tempIndicator);
virtualRead += indicatorSize;
}
fetchCallback.newIndicator(i, j, tempIndicator);
}
}
byte[] callbackBuffer = fetchCallback.getTempDataBuffer(rowSize);
final byte[] tempData = callbackBuffer != null && callbackBuffer.length >= rowSize ? callbackBuffer : new byte[rowSize];
final int max = ll+oldNumRead;
for (int i=0; i 0)
{
int diff = textOffsets[i]-packageOffset;
skipBytes(diff);
virtualRead += diff;
packageOffset += diff;
byte[] buf = new byte[textLengths[i]];
readFullyReturnCount(buf);
virtualRead += textLengths[i];
packageOffset += textLengths[i];
String text = Conv.unicodeByteArrayToString(buf, 0, buf.length);
packageCallback.statementText(i, text);
}
if (formatLengths[i] > 0)
{
int diff = formatOffsets[i]-packageOffset;
skipBytes(diff);
virtualRead += diff;
packageOffset += diff;
byte[] statementFormat = new byte[formatLengths[i]];
readFullyReturnCount(statementFormat);
packageOffset += formatLengths[i];
virtualRead += formatLengths[i];
packageCallback.statementDataFormat(i, statementFormat);
}
if (parameterMarkerLengths[i] > 0)
{
int diff = parameterMarkerOffsets[i]-packageOffset;
skipBytes(diff);
virtualRead += diff;
packageOffset += diff;
byte[] parameterMarkerFormat = new byte[parameterMarkerLengths[i]];
readFullyReturnCount(parameterMarkerFormat);
virtualRead += parameterMarkerLengths[i];
packageOffset += parameterMarkerLengths[i];
packageCallback.statementParameterMarkerFormat(i, parameterMarkerFormat);
}
}
int remaining = ll-virtualRead+oldNumRead;
skipBytes(remaining);
}
else if (cp == 0x3807 && sqlcaCallback_ != null)
{
// SQL CA.
readFully(byteBuffer_, 0, ll-6);
parseSQLCA();
}
else if (cp == 0x3813 && pmCallback != null)
{
// Super extended parameter marker format.
int oldNumRead = (int) in_.getLatestBytesReceived() - 6;
// The header for the 3813 is a size of virtual bytes, but may not
// match the physical bytes read. Track the physical and virtual bytes read
// separately.
int virtualRead = oldNumRead;
virtualRead += 6;
if ((oldNumRead + 6)+16 <= length && ll > 6)
{
int consistencyToken = readInt();
int numFields = readInt();
readInt(); // reserved
int recordSize = readInt();
pmCallback.parameterMarkerDescription(numFields, recordSize);
virtualRead += 16;
int[] offsets = new int[numFields];
int[] lengths = new int[numFields];
final int fixedLengthRead = 48*numFields;
for (int i=0; i 6)
{
int ccsid = readShort();
int lobLL = readInt();
lobCallback.newLOBData(ccsid, lobLL);
byte[] buffer = lobCallback.getLOBBuffer();
if (buffer == null || buffer.length == 0)
{
int max = 0x00FFFF > lobLL ? lobLL : 0x00FFFF; // 64 kB
buffer = new byte[max];
lobCallback.setLOBBuffer(buffer);
}
int remainingLob = lobLL;
int segmentLimit = buffer.length > remainingLob ? remainingLob : buffer.length;
readFully(buffer, 0, segmentLimit);
virtualRead += segmentLimit;
lobCallback.newLOBSegment(buffer, 0, segmentLimit);
remainingLob -= segmentLimit;
while (remainingLob > 0)
{
segmentLimit = buffer.length > remainingLob ? remainingLob : buffer.length;
readFully(buffer, 0, segmentLimit);
virtualRead += segmentLimit;
lobCallback.newLOBSegment(buffer, 0, segmentLimit);
remainingLob -= segmentLimit;
}
}
int remaining = ll-virtualRead+oldNumRead;
skipBytes(remaining);
}
else
{
skipBytes(ll-6);
}
}
in_.end();
}
private void parseSQLCA()
{
int sqlCode = Conv.byteArrayToInt(byteBuffer_, 12);
int updateCount = Conv.byteArrayToInt(byteBuffer_, 104);
String sqlState = Conv.ebcdicByteArrayToString(byteBuffer_, 131, 5, charBuffer_);
String generatedKey = Conv.packedDecimalToString(byteBuffer_, 72, 30, 0, charBuffer_);
int resultSetsCount = Conv.byteArrayToInt(byteBuffer_, 100);
sqlcaCallback_.newSQLCommunicationsAreaData(sqlCode, sqlState, generatedKey, updateCount, resultSetsCount);
}
public void fetch(DatabaseFetchAttributes attribs, DatabaseFetchCallback listener) throws IOException
{
sendFetchRequest(attribs);
out_.flush();
parseReply("fetch", null, listener);
}
public void streamFetch(DatabaseStreamFetchAttributes attribs, DatabaseFetchCallback listener) throws IOException
{
sendStreamFetchRequest(attribs);
out_.flush();
parseReply("streamFetch", null, listener);
}
public void endStreamFetch(DatabaseEndStreamFetchAttributes attribs) throws IOException
{
sendEndStreamFetchRequest(attribs);
out_.flush();
readFullReply("endStreamFetch");
}
public void executeImmediate(DatabaseExecuteImmediateAttributes attribs) throws IOException
{
sendExecuteImmediateRequest(attribs);
out_.flush();
if (sqlcaCallback_ != null)
{
parseReply("executeImmediate", null, null, null, null, null); // In case someone wants generated keys.
}
else
{
readFullReply("executeImmediate");
}
}
public void execute(DatabaseExecuteAttributes attribs) throws IOException
{
execute(attribs, 0);
}
public void execute(DatabaseExecuteAttributes attribs, int parameterMarkerDescriptorHandle) throws IOException
{
sendExecuteRequest(attribs, parameterMarkerDescriptorHandle);
out_.flush();
if (sqlcaCallback_ != null)
{
parseReply("execute", null, null, null, null, null); // In case someone wants generated keys.
}
else
{
readFullReply("execute");
}
}
public void executeOrOpenAndDescribe(DatabaseExecuteOrOpenAndDescribeAttributes attrib, DatabaseDescribeCallback listener) throws IOException
{
sendExecuteOrOpenAndDescribeRequest(attrib);
out_.flush();
parseReply("executeOrOpenAndDescribe", listener, null);
}
private int getScrollableCursorFlagLength(AttributeScrollableCursorFlag a)
{
return 8;
}
private void writeScrollableCursorFlag(AttributeScrollableCursorFlag a) throws IOException
{
out_.writeInt(8);
out_.writeShort(0x380D);
out_.writeShort(a.getScrollableCursorFlag());
}
private void sendExecuteImmediateRequest(DatabaseExecuteImmediateAttributes attribs) throws IOException
{
int length = 40;
int parms = 0;
if (attribs != null)
{
if (attribs.isSQLStatementTextSet())
{
++parms;
length += getSQLStatementTextLength(attribs);
}
if (attribs.isCursorNameSet())
{
++parms;
length += getCursorNameLength(attribs);
}
if (attribs.isSQLStatementTypeSet())
{
++parms;
length += getSQLStatementTypeLength(attribs);
}
if (attribs.isOpenAttributesSet())
{
++parms;
length += getOpenAttributesLength(attribs);
}
if (attribs.isDescribeOptionSet())
{
++parms;
length += getDescribeOptionLength(attribs);
}
if (attribs.isBlockingFactorSet())
{
++parms;
length += getBlockingFactorLength(attribs);
}
if (attribs.isScrollableCursorFlagSet())
{
++parms;
length += getScrollableCursorFlagLength(attribs);
}
if (attribs.isSQLParameterMarkerDataSet())
{
++parms;
length += getSQLParameterMarkerDataLength(attribs);
}
if (attribs.isSQLExtendedParameterMarkerDataSet())
{
++parms;
length += getSQLExtendedParameterMarkerDataLength(attribs);
}
if (attribs.isSQLParameterMarkerBlockIndicatorSet())
{
++parms;
length += getSQLParameterMarkerBlockIndicatorLength(attribs);
}
if (attribs.isTranslateIndicatorSet())
{
++parms;
length += getTranslateIndicatorLength(attribs);
}
if (attribs.isRLECompressedFunctionParametersSet())
{
++parms;
length += getRLECompressedFunctionParametersLength(attribs);
}
if (attribs.isExtendedSQLStatementTextSet())
{
++parms;
length += getExtendedSQLStatementTextLength(attribs);
}
if (attribs.isPrepareOptionSet()) {
++parms;
length += getPrepareOptionLength(attribs);
}
}
writeHeader(length, 0x1806);
writeTemplate(parms);
if (attribs != null)
{
if (attribs.isSQLStatementTextSet())
{
writeSQLStatementText(attribs);
}
if (attribs.isCursorNameSet())
{
writeCursorName(attribs);
}
if (attribs.isSQLStatementTypeSet())
{
writeSQLStatementType(attribs);
}
if (attribs.isOpenAttributesSet())
{
writeOpenAttributes(attribs);
}
if (attribs.isDescribeOptionSet())
{
writeDescribeOption(attribs);
}
if (attribs.isBlockingFactorSet())
{
writeBlockingFactor(attribs);
}
if (attribs.isScrollableCursorFlagSet())
{
writeScrollableCursorFlag(attribs);
}
if (attribs.isSQLParameterMarkerDataSet())
{
writeSQLParameterMarkerData(attribs);
}
if (attribs.isSQLExtendedParameterMarkerDataSet())
{
writeSQLExtendedParameterMarkerData(attribs);
}
if (attribs.isSQLParameterMarkerBlockIndicatorSet())
{
writeSQLParameterMarkerBlockIndicator(attribs);
}
if (attribs.isTranslateIndicatorSet())
{
writeTranslateIndicator(attribs);
}
if (attribs.isRLECompressedFunctionParametersSet())
{
writeRLECompressedFunctionParameters(attribs);
}
if (attribs.isExtendedSQLStatementTextSet())
{
writeExtendedSQLStatementText(attribs);
}
if (attribs.isPrepareOptionSet()) {
writePrepareOption(attribs);
}
}
}
private void sendExecuteRequest(DatabaseExecuteAttributes attribs, int pmDescriptorHandle) throws IOException
{
int length = 40;
int parms = 0;
if (attribs != null)
{
if (attribs.isPrepareStatementNameSet())
{
++parms;
length += getPrepareStatementNameLength(attribs);
}
if (attribs.isCursorNameSet())
{
++parms;
length += getCursorNameLength(attribs);
}
if (attribs.isSQLParameterMarkerDataSet())
{
++parms;
length += getSQLParameterMarkerDataLength(attribs);
}
if (attribs.isSQLExtendedParameterMarkerDataSet())
{
++parms;
length += getSQLExtendedParameterMarkerDataLength(attribs);
}
if (attribs.isSQLParameterMarkerBlockIndicatorSet())
{
++parms;
length += getSQLParameterMarkerBlockIndicatorLength(attribs);
}
if (attribs.isPackageNameSet())
{
++parms;
length += getPackageNameLength(attribs);
}
if (attribs.isPackageLibrarySet())
{
++parms;
length += getPackageLibraryLength(attribs);
}
if (attribs.isTranslateIndicatorSet())
{
++parms;
length += getTranslateIndicatorLength(attribs);
}
if (attribs.isRLECompressedFunctionParametersSet())
{
++parms;
length += getRLECompressedFunctionParametersLength(attribs);
}
if (attribs.isSQLStatementTypeSet())
{
++parms;
length += getSQLStatementTypeLength(attribs);
}
}
writeHeader(length, 0x1805);
// writeTemplate(parms, 0xF2000000, pmDescriptorHandle);
int template = SEND_REPLY_IMMED | SQLCA ;
writeTemplate(parms, template, pmDescriptorHandle);
if (attribs != null)
{
if (attribs.isPrepareStatementNameSet())
{
writePrepareStatementName(attribs);
}
if (attribs.isCursorNameSet())
{
writeCursorName(attribs);
}
if (attribs.isSQLParameterMarkerDataSet())
{
writeSQLParameterMarkerData(attribs);
}
if (attribs.isSQLExtendedParameterMarkerDataSet())
{
writeSQLExtendedParameterMarkerData(attribs);
}
if (attribs.isSQLParameterMarkerBlockIndicatorSet())
{
writeSQLParameterMarkerBlockIndicator(attribs);
}
if (attribs.isPackageNameSet())
{
writePackageName(attribs);
}
if (attribs.isPackageLibrarySet())
{
writePackageLibrary(attribs);
}
if (attribs.isTranslateIndicatorSet())
{
writeTranslateIndicator(attribs);
}
if (attribs.isRLECompressedFunctionParametersSet())
{
writeRLECompressedFunctionParameters(attribs);
}
if (attribs.isSQLStatementTypeSet())
{
writeSQLStatementType(attribs);
}
}
}
public void closeCursor(DatabaseCloseCursorAttributes attribs) throws IOException
{
sendCloseCursorRequest(attribs, true);
out_.flush();
readFullReply("closeCursor");
}
public void commit() throws IOException {
sendCommitRequest(out_);
out_.flush();
readFullReply("commit");
}
public void rollback() throws IOException {
sendRollbackRequest(out_);
out_.flush();
readFullReply("rollback");
}
public void setServerAttributes(DatabaseServerAttributes attributes) throws IOException
{
sendSetServerAttributesRequest(out_, attributes);
out_.flush();
int length = readReplyHeader("setServerAttributes");
int virtualRead = 40;
if (length > 46)
{
int ll = readInt();
int cp = readShort();
if (cp != 0x3804)
{
throw DataStreamException.badReply("setServerAttributes-reply", cp);
}
if (ll < 122)
{
throw DataStreamException.badLength("setServerAttributes-reply", ll);
}
int ccsid = readShort();
int dateFormatParserOption = readShort();
attributes.setDateFormatParserOption(dateFormatParserOption);
int dateSeparatorParserOption = readShort();
attributes.setDateSeparatorParserOption(dateSeparatorParserOption);
int timeFormatParserOption = readShort();
attributes.setTimeFormatParserOption(timeFormatParserOption);
int timeSeparatorParserOption = readShort();
attributes.setTimeSeparatorParserOption(timeSeparatorParserOption);
int decimalSeparatorParserOption = readShort();
attributes.setDecimalSeparatorParserOption(decimalSeparatorParserOption);
int namingConventionParserOption = readShort();
attributes.setNamingConventionParserOption(namingConventionParserOption);
int ignoreDecimalDataErrorParserOption = readShort();
attributes.setIgnoreDecimalDataErrorParserOption(ignoreDecimalDataErrorParserOption);
int commitmentControlLevelParserOption = readShort();
attributes.setCommitmentControlLevelParserOption(commitmentControlLevelParserOption);
int drdaPackageSize = readShort();
attributes.setDRDAPackageSize(drdaPackageSize);
int translationIndicator = readByte();
attributes.setTranslateIndicator(translationIndicator);
int serverCCSIDValue = readShort();
attributes.setServerCCSID(serverCCSIDValue);
int serverNLSSValue = readShort();
attributes.setNLSSIdentifier(serverNLSSValue);
final byte[] buf = new byte[32];
final char[] cbuf = new char[32];
readFully(buf, 0, 3);
String serverLanguageID = Conv.ebcdicByteArrayToString(buf, 0, 3, cbuf);
attributes.setNLSSIdentifierLanguageID(serverLanguageID);
readFully(buf, 0, 10);
String serverLanguageTableName = Conv.ebcdicByteArrayToString(buf, 0, 10, cbuf);
attributes.setNLSSIdentifierLanguageTableName(serverLanguageTableName);
readFully(buf, 0, 10);
String serverLanguageTableLibrary = Conv.ebcdicByteArrayToString(buf, 0, 10, cbuf);
attributes.setNLSSIdentifierLanguageTableLibrary(serverLanguageTableLibrary);
readFully(buf, 0, 4);
String serverLanguageFeatureCode = Conv.ebcdicByteArrayToString(buf, 0, 4, cbuf);
attributes.setLanguageFeatureCode(serverLanguageFeatureCode);
readFully(buf, 0, 10);
String serverFunctionalLevel = Conv.ebcdicByteArrayToString(buf, 0, 10, cbuf);
attributes.setServerFunctionalLevel(serverFunctionalLevel);
readFully(buf, 0, 18);
String relationalDBName = Conv.ebcdicByteArrayToString(buf, 0, 18, cbuf);
attributes.setRDBName(relationalDBName);
readFully(buf, 0, 10);
String defaultSQLLibraryName = Conv.ebcdicByteArrayToString(buf, 0, 10, cbuf);
attributes.setDefaultSQLLibraryName(defaultSQLLibraryName);
readFully(buf, 0, 26);
String jobName = Conv.ebcdicByteArrayToString(buf, 0, 10, cbuf);
String userName = Conv.ebcdicByteArrayToString(buf, 10, 10, cbuf);
String jobNumber = Conv.ebcdicByteArrayToString(buf, 20, 6, cbuf);
attributes.setServerJob(jobName, userName, jobNumber);
skipBytes(ll-122);
virtualRead += ll;
}
skipBytes(length-virtualRead);
in_.end();
}
public void retrieveLOBData(DatabaseRetrieveLOBDataAttributes attribs, DatabaseLOBDataCallback lobCallback) throws IOException
{
sendRetrieveLOBDataRequest(out_, attribs, currentRPB_);
out_.flush();
parseReply("retrieveLOBData", null, null, null, null, lobCallback);
}
// I don't think this is needed anymore.
/* private void sendDeleteResultSetRequest() throws IOException
{
writeHeader(40, 0x1F01);
// Write template.
out_.writeInt(0x00000000); // Operational result (ORS) bitmap.
out_.writeInt(0); // Reserved.
out_.writeShort(1); // Return ORS handle - after operation completes.
out_.writeShort(1); // Fill ORS handle.
out_.writeShort(0); // Based on ORS handle.
out_.writeShort(1); // Request parameter block (RPB) handle.
out_.writeShort(0); // Parameter marker descriptor handle.
out_.writeShort(0); // Parameter count.
}
*/
private void sendDeleteSQLRPBRequest(DatabaseDeleteRequestParameterBlockAttributes attribs, final int rpbID) throws IOException
{
int length = 40;
int parms = 0;
if (attribs != null)
{
if (attribs.isTranslateIndicatorSet())
{
length += getTranslateIndicatorLength(attribs);
++parms;
}
if (attribs.isRLECompressedFunctionParametersSet())
{
length += getRLECompressedFunctionParametersLength(attribs);
++parms;
}
}
writeHeader(length, 0x1D02);
// writeTemplate(parms, 0x80000000, 0, rpbID);
int template = SEND_REPLY_IMMED;
writeTemplate(parms, template, 0, rpbID);
// Write template.
/* out_.writeInt(0x80000000); // Operational result (ORS) bitmap.
out_.writeInt(0); // Reserved.
out_.writeShort(1); // Return ORS handle - after operation completes.
out_.writeShort(1); // Fill ORS handle.
out_.writeShort(0); // Based on ORS handle.
out_.writeShort(rpbID); // Request parameter block (RPB) handle.
out_.writeShort(0); // Parameter marker descriptor handle.
out_.writeShort(parms); // Parameter count.
*/
if (attribs != null)
{
if (attribs.isTranslateIndicatorSet())
{
writeTranslateIndicator(attribs);
}
if (attribs.isRLECompressedFunctionParametersSet())
{
writeRLECompressedFunctionParameters(attribs);
}
}
}
private int getCursorNameLength(AttributeCursorName a)
{
return 10+a.getCursorName().length();
}
private void writeCursorName(AttributeCursorName a) throws IOException
{
String name = a.getCursorName();
out_.writeInt(10+name.length());
out_.writeShort(0x380B);
out_.writeShort(37);
out_.writeShort(name.length());
writePadEBCDIC(name, name.length(), out_);
}
private int getReuseIndicatorLength(AttributeReuseIndicator a)
{
return 7;
}
private void writeReuseIndicator(AttributeReuseIndicator a) throws IOException
{
out_.writeInt(7);
out_.writeShort(0x3810);
out_.write(a.getReuseIndicator());
}
private void sendCloseCursorRequest(DatabaseCloseCursorAttributes attribs, final boolean doReply) throws IOException
{
int length = 40;
int parms = 0;
if (attribs != null)
{
if (attribs.isCursorNameSet())
{
length += getCursorNameLength(attribs);
++parms;
}
if (attribs.isReuseIndicatorSet())
{
length += getReuseIndicatorLength(attribs);
++parms;
}
if (attribs.isTranslateIndicatorSet())
{
length += getTranslateIndicatorLength(attribs);
++parms;
}
if (attribs.isRLECompressedFunctionParametersSet())
{
length += getRLECompressedFunctionParametersLength(attribs);
++parms;
}
}
writeHeader(length, 0x180A);
// Write template.
out_.writeInt(doReply ? 0x80000000 : 0x00000000); // Operational result (ORS) bitmap.
out_.writeInt(0); // Reserved.
out_.writeShort(1); // Return ORS handle - after operation completes.
out_.writeShort(1); // Fill ORS handle.
out_.writeShort(0); // Based on ORS handle.
out_.writeShort(currentRPB_); // Request parameter block (RPB) handle.
out_.writeShort(0); // Parameter marker descriptor handle.
out_.writeShort(parms); // Parameter count.
if (attribs != null)
{
if (attribs.isCursorNameSet())
{
writeCursorName(attribs);
}
if (attribs.isReuseIndicatorSet())
{
writeReuseIndicator(attribs);
}
if (attribs.isTranslateIndicatorSet())
{
writeTranslateIndicator(attribs);
}
if (attribs.isRLECompressedFunctionParametersSet())
{
writeRLECompressedFunctionParameters(attribs);
}
}
}
private int getDescribeOptionLength(AttributeDescribeOption a)
{
return 7;
}
private void writeDescribeOption(AttributeDescribeOption a) throws IOException
{
out_.writeInt(7);
out_.writeShort(0x380A);
out_.writeByte(a.getDescribeOption());
}
private int getBlockingFactorLength(AttributeBlockingFactor a)
{
return 10;
}
private void writeBlockingFactor(AttributeBlockingFactor a) throws IOException
{
out_.writeInt(10);
out_.writeShort(0x380C);
out_.writeInt((int)(a.getBlockingFactor()));
}
private int getFetchScrollOptionLength(AttributeFetchScrollOption a)
{
int option = a.getFetchScrollOption();
return(option == 0x0007 || option == 0x0008) ? 12 : 8;
}
private void writeFetchScrollOption(AttributeFetchScrollOption a) throws IOException
{
int option = a.getFetchScrollOption();
boolean relative = option == 0x0007 || option == 0x0008;
out_.writeInt(relative ? 12 : 8);
out_.writeShort(0x380E);
out_.writeShort(option);
if (relative) out_.writeInt(a.getFetchScrollOptionRelativeValue());
}
private int getFetchBufferSizeLength(AttributeFetchBufferSize a)
{
return 10;
}
private void writeFetchBufferSize(AttributeFetchBufferSize a) throws IOException
{
out_.writeInt(10);
out_.writeShort(0x3834);
out_.writeInt((int)a.getFetchBufferSize());
}
private int getHoldIndicatorLength(AttributeHoldIndicator a)
{
return 7;
}
private void writeHoldIndicator(AttributeHoldIndicator a) throws IOException
{
out_.writeInt(7);
out_.writeShort(0x380F);
out_.writeByte(a.getHoldIndicator());
}
private int getQueryTimeoutLimitLength(AttributeQueryTimeoutLimit a)
{
return 10;
}
private void writeQueryTimeoutLimit(AttributeQueryTimeoutLimit a) throws IOException
{
out_.writeInt(10);
out_.writeShort(0x3817);
out_.writeInt(a.getQueryTimeoutLimit());
}
private int getServerSideStaticCursorResultSetSizeLength(AttributeServerSideStaticCursorResultSetSize a)
{
return 10;
}
private void writeServerSideStaticCursorResultSetSize(AttributeServerSideStaticCursorResultSetSize a) throws IOException
{
out_.writeInt(10);
out_.writeShort(0x3827);
out_.writeInt(a.getServerSideStaticCursorResultSetSize());
}
private int getResultSetHoldabilityOptionLength(AttributeResultSetHoldabilityOption a)
{
return 7;
}
private void writeResultSetHoldabilityOption(AttributeResultSetHoldabilityOption a) throws IOException
{
out_.writeInt(7);
out_.writeShort(0x3830);
out_.writeByte(a.getResultSetHoldabilityOption());
}
private int getVariableFieldCompressionLength(AttributeVariableFieldCompression a)
{
return 7;
}
private void writeVariableFieldCompression(AttributeVariableFieldCompression a) throws IOException
{
out_.writeInt(7);
out_.writeShort(0x3833);
out_.writeByte(a.getVariableFieldCompression());
}
private int getReturnOptimisticLockingColumnsLength(AttributeReturnOptimisticLockingColumns a)
{
return 7;
}
private void writeReturnOptimisticLockingColumns(AttributeReturnOptimisticLockingColumns a) throws IOException
{
out_.writeInt(7);
out_.writeShort(0x3835);
out_.writeByte(a.getReturnOptimisticLockingColumns());
}
private void sendCreateSQLRPBRequest(final DatabaseCreateRequestParameterBlockAttributes attribs, final boolean doReply, final int rpbID) throws IOException
{
sendSQLRPBRequest(attribs, doReply, rpbID, 0x1D00);
}
private void sendResetSQLRPBRequest(final DatabaseCreateRequestParameterBlockAttributes attribs, final boolean doReply, final int rpbID) throws IOException
{
sendSQLRPBRequest(attribs, doReply, rpbID, 0x1D04);
}
private void sendSQLRPBRequest(final DatabaseCreateRequestParameterBlockAttributes attribs, final boolean doReply, final int rpbID, final int datastream) throws IOException
{
int length = 40;
int parms = 0;
if (attribs != null)
{
if (attribs.isPackageLibrarySet())
{
++parms;
length += getPackageLibraryLength(attribs);
}
if (attribs.isPackageNameSet())
{
++parms;
length += getPackageNameLength(attribs);
}
if (attribs.isTranslateIndicatorSet())
{
++parms;
length += getTranslateIndicatorLength(attribs);
}
if (attribs.isPrepareStatementNameSet())
{
++parms;
length += getPrepareStatementNameLength(attribs);
}
if (attribs.isSQLStatementTextSet())
{
++parms;
length += getSQLStatementTextLength(attribs);
}
if (attribs.isPrepareOptionSet())
{
++parms;
length += getPrepareOptionLength(attribs);
}
if (attribs.isOpenAttributesSet())
{
++parms;
length += getOpenAttributesLength(attribs);
}
if (attribs.isDescribeOptionSet())
{
++parms;
length += getDescribeOptionLength(attribs);
}
if (attribs.isCursorNameSet())
{
++parms;
length += getCursorNameLength(attribs);
}
if (attribs.isVariableFieldCompressionSet())
{
++parms;
length += getVariableFieldCompressionLength(attribs);
}
if (attribs.isBlockingFactorSet())
{
++parms;
length += getBlockingFactorLength(attribs);
}
if (attribs.isScrollableCursorFlagSet())
{
++parms;
length += getScrollableCursorFlagLength(attribs);
}
if (attribs.isFetchScrollOptionSet())
{
++parms;
length += getFetchScrollOptionLength(attribs);
}
if (attribs.isHoldIndicatorSet())
{
++parms;
length += getHoldIndicatorLength(attribs);
}
if (attribs.isReuseIndicatorSet())
{
++parms;
length += getReuseIndicatorLength(attribs);
}
if (attribs.isSQLStatementTypeSet())
{
++parms;
length += getSQLStatementTypeLength(attribs);
}
if (attribs.isSQLParameterMarkerBlockIndicatorSet())
{
++parms;
length += getSQLParameterMarkerBlockIndicatorLength(attribs);
}
if (attribs.isQueryTimeoutLimitSet())
{
++parms;
length += getQueryTimeoutLimitLength(attribs);
}
if (attribs.isServerSideStaticCursorResultSetSizeSet())
{
++parms;
length += getServerSideStaticCursorResultSetSizeLength(attribs);
}
if (attribs.isRLECompressedFunctionParametersSet())
{
++parms;
length += getRLECompressedFunctionParametersLength(attribs);
}
if (attribs.isExtendedColumnDescriptorOptionSet())
{
++parms;
length += getExtendedColumnDescriptorOptionLength(attribs);
}
if (attribs.isResultSetHoldabilityOptionSet())
{
++parms;
length += getResultSetHoldabilityOptionLength(attribs);
}
if (attribs.isExtendedSQLStatementTextSet())
{
++parms;
length += getExtendedSQLStatementTextLength(attribs);
}
if (attribs.isFetchBufferSizeSet())
{
++parms;
length += getFetchBufferSizeLength(attribs);
}
if (attribs.isReturnOptimisticLockingColumnsSet())
{
++parms;
length += getReturnOptimisticLockingColumnsLength(attribs);
}
}
writeHeader(length, datastream);
writeTemplate(parms, doReply ? SEND_REPLY_IMMED : 0x00000000, 0, rpbID);
if (attribs != null)
{
if (attribs.isPackageLibrarySet())
{
writePackageLibrary(attribs);
}
if (attribs.isPackageNameSet())
{
writePackageName(attribs);
}
if (attribs.isTranslateIndicatorSet())
{
writeTranslateIndicator(attribs);
}
if (attribs.isPrepareStatementNameSet())
{
writePrepareStatementName(attribs);
}
if (attribs.isSQLStatementTextSet())
{
writeSQLStatementText(attribs);
}
if (attribs.isPrepareOptionSet())
{
writePrepareOption(attribs);
}
if (attribs.isOpenAttributesSet())
{
writeOpenAttributes(attribs);
}
if (attribs.isDescribeOptionSet())
{
writeDescribeOption(attribs);
}
if (attribs.isCursorNameSet())
{
writeCursorName(attribs);
}
if (attribs.isVariableFieldCompressionSet())
{
writeVariableFieldCompression(attribs);
}
if (attribs.isBlockingFactorSet())
{
writeBlockingFactor(attribs);
}
if (attribs.isScrollableCursorFlagSet())
{
writeScrollableCursorFlag(attribs);
}
if (attribs.isFetchScrollOptionSet())
{
writeFetchScrollOption(attribs);
}
if (attribs.isHoldIndicatorSet())
{
writeHoldIndicator(attribs);
}
if (attribs.isReuseIndicatorSet())
{
writeReuseIndicator(attribs);
}
if (attribs.isSQLStatementTypeSet())
{
writeSQLStatementType(attribs);
}
if (attribs.isSQLParameterMarkerBlockIndicatorSet())
{
writeSQLParameterMarkerBlockIndicator(attribs);
}
if (attribs.isQueryTimeoutLimitSet())
{
writeQueryTimeoutLimit(attribs);
}
if (attribs.isServerSideStaticCursorResultSetSizeSet())
{
writeServerSideStaticCursorResultSetSize(attribs);
}
if (attribs.isRLECompressedFunctionParametersSet())
{
writeRLECompressedFunctionParameters(attribs);
}
if (attribs.isExtendedColumnDescriptorOptionSet())
{
writeExtendedColumnDescriptorOption(attribs);
}
if (attribs.isResultSetHoldabilityOptionSet())
{
writeResultSetHoldabilityOption(attribs);
}
if (attribs.isExtendedSQLStatementTextSet())
{
writeExtendedSQLStatementText(attribs);
}
if (attribs.isFetchBufferSizeSet())
{
writeFetchBufferSize(attribs);
}
if (attribs.isReturnOptimisticLockingColumnsSet())
{
writeReturnOptimisticLockingColumns(attribs);
}
}
}
private void sendPrepareAndDescribeRequest(DatabasePrepareAndDescribeAttributes attribs) throws IOException
{
int length = 40;
int parms = 0;
boolean hasParameterMarkers = true; // To be on the safe side, default to requesting parameter marker info.
if (attribs != null)
{
if (attribs.isPrepareStatementNameSet())
{
length += getPrepareStatementNameLength(attribs);
++parms;
}
if (attribs.isSQLStatementTextSet())
{
length += getSQLStatementTextLength(attribs);
++parms;
if (attribs.getSQLStatementText().indexOf("?") < 0) hasParameterMarkers = false;
}
if (attribs.isSQLStatementTypeSet())
{
length += getSQLStatementTypeLength(attribs);
++parms;
}
if (attribs.isPrepareOptionSet())
{
length += getPrepareOptionLength(attribs);
++parms;
}
if (attribs.isDescribeOptionSet())
{
length += getDescribeOptionLength(attribs);
++parms;
}
if (attribs.isOpenAttributesSet())
{
length += getOpenAttributesLength(attribs);
++parms;
}
if (attribs.isPackageNameSet())
{
length += getPackageNameLength(attribs);
++parms;
}
if (attribs.isPackageLibrarySet())
{
length += getPackageLibraryLength(attribs);
++parms;
}
if (attribs.isTranslateIndicatorSet())
{
length += getTranslateIndicatorLength(attribs);
++parms;
}
if (attribs.isRLECompressedFunctionParametersSet())
{
length += getRLECompressedFunctionParametersLength(attribs);
++parms;
}
if (attribs.isExtendedColumnDescriptorOptionSet())
{
length += getExtendedColumnDescriptorOptionLength(attribs);
++parms;
}
if (attribs.isExtendedSQLStatementTextSet())
{
length += getExtendedSQLStatementTextLength(attribs);
++parms;
if (attribs.getExtendedSQLStatementText().indexOf("?") < 0) hasParameterMarkers = false;
}
}
writeHeader(length, 0x1803);
// writeTemplate(parms, 0xF8020000);
// writeTemplate(parms, 0x8A840000);
//Writing BITMAP --
// ORS Bitmap: Bitmap: 0xFA820000
// Bit 1: Send Results Immediately
// Bit 2: Send Message ID
// Bit 3: Send First Level Text
// Bit 4: Send Second Level Text
// Bit 5: Send Data Format
// Bit 7: Send SQLCA
// Bit 9: Send Parameter Marker Format
// Bit 15: Send Extended Column Descriptors
int template = SEND_REPLY_IMMED |
DATA_FORMAT ; // | MESSAGE_ID | FIRST_LEVEL_TEXT | SECOND_LEVEL_TEXT | DATA_FORMAT | PARAMETER_MARKER_FORMAT | EXTENDED_COLUMN_DESCRIPTORS;
if (attribs !=null && attribs.isSQLStatementTypeSet() && attribs.getSQLStatementType() == TYPE_CALL) {
// Do not request column descriptors for call statement
// writeTemplate(parms, 0xF8800000);
} else {
// writeTemplate(parms, 0xF8820000);
template |= EXTENDED_COLUMN_DESCRIPTORS;
}
if (hasParameterMarkers) template |= PARAMETER_MARKER_FORMAT;
writeTemplate(parms, template);
if (attribs != null)
{
if (attribs.isPrepareStatementNameSet())
{
writePrepareStatementName(attribs);
}
if (attribs.isSQLStatementTextSet())
{
writeSQLStatementText(attribs);
}
if (attribs.isSQLStatementTypeSet())
{
writeSQLStatementType(attribs);
}
if (attribs.isPrepareOptionSet())
{
writePrepareOption(attribs);
}
if (attribs.isDescribeOptionSet())
{
writeDescribeOption(attribs);
}
if (attribs.isOpenAttributesSet())
{
writeOpenAttributes(attribs);
}
if (attribs.isPackageLibrarySet())
{
writePackageLibrary(attribs);
}
if (attribs.isPackageNameSet())
{
writePackageName(attribs);
}
if (attribs.isTranslateIndicatorSet())
{
writeTranslateIndicator(attribs);
}
if (attribs.isRLECompressedFunctionParametersSet())
{
writeRLECompressedFunctionParameters(attribs);
}
if (attribs.isExtendedColumnDescriptorOptionSet())
{
writeExtendedColumnDescriptorOption(attribs);
}
if (attribs.isExtendedSQLStatementTextSet())
{
writeExtendedSQLStatementText(attribs);
}
}
}
private int readReplyHeader(String datastream) throws IOException
{
// Read header.
int length = in_.readInt();
if (length < 40)
{
throw DataStreamException.badLength(datastream, length);
}
int headerID = in_.readShort();
int serverID = in_.readShort();
int csInstance = in_.readInt();
int correlationID = in_.readInt();
int templateLength = in_.readShort();
int reqRepID = in_.readShort();
if (reqRepID != 0x2800)
{
// in_.skipBytes(length-20);
in_.end();
throw DataStreamException.badReply(datastream, reqRepID);
}
// Read template.
int orsBitmap = in_.readInt();
int compressed = in_.readInt(); // First byte counts, last 3 reserved.
int returnORSHandle = in_.readShort();
int returnDataFunctionID = in_.readShort();
int requestDataFunctionID = in_.readShort();
int rcClass = in_.readShort();
int rcClassReturnCode = in_.readInt();
int numRead = 40;
if (rcClass != 0)
{
if (rcClassReturnCode >= 0)
{
// Warning.
if (warningCallback_ != null)
{
warningCallback_.newWarning(rcClass, rcClassReturnCode);
}
}
// if (rcClass == 2 && rcClassReturnCode == 0x02BD)
// {
// // Last record warning.
// }
else
{
String msgID = null;
String msgText = null;
String msgText2 = null;
while (numRead < length)
{
int ll = in_.readInt();
int cp = in_.readShort();
if (cp == 0x3801)
{
// Message ID.
int ccsid = in_.readShort();
byte[] messageID = new byte[ll-8];
in_.readFully(messageID);
if (ll > charBuffer_.length) {
charBuffer_ = new char[ll];
}
msgID = Conv.ebcdicByteArrayToString(messageID, charBuffer_);
}
else if (cp == 0x3802)
{
// First level message text.
int ccsid = in_.readShort();
int len = in_.readShort();
byte[] firstLevelMessageText = new byte[ll-10];
in_.readFully(firstLevelMessageText);
if (ll > charBuffer_.length) {
charBuffer_ = new char[ll];
}
msgText = Conv.ebcdicByteArrayToString(firstLevelMessageText, charBuffer_);
}
else if (cp == 0x3803)
{
// Second level message text.
int ccsid = in_.readShort();
int len = in_.readShort();
byte[] secondLevelMessageText = new byte[ll-10];
in_.readFully(secondLevelMessageText);
if (ll > charBuffer_.length) {
charBuffer_ = new char[ll];
}
msgText2 = Conv.ebcdicByteArrayToString(secondLevelMessageText, charBuffer_);
}
else if (cp == 0x3807 && sqlcaCallback_ != null)
{
// SQLCA - Communication Area.
in_.readFully(byteBuffer_, 0, ll-6);
parseSQLCA();
}
else
{
skipBytes(ll-6);
}
numRead += ll;
}
skipBytes(length-numRead);
in_.end();
if (msgID != null)
{
String text = msgText == null ? "" : msgText;
text = text + (msgText2 == null ? "" : " "+msgText2);
throw new MessageException(new Message[] { new Message(msgID, text) });
}
throw new DatabaseException(datastream, rcClass, rcClassReturnCode);
}
}
else if (warningCallback_ != null)
{
warningCallback_.noWarnings();
}
return length;
}
/* while (numRead < length)
{
int ll = in_.readInt();
int cp = in_.readShort();
System.out.println("Reply CP 0x"+Integer.toHexString(cp));
if (cp == 0x3801)
{
int ccsid = in_.readShort();
byte[] messageID = new byte[ll-8];
in_.readFully(messageID);
}
else if (cp == 0x3802)
{
int ccsid = in_.readShort();
byte[] firstLevelMessageText = new byte[ll-8];
in_.readFully(firstLevelMessageText);
}
else if (cp == 0x3803)
{
int ccsid = in_.readShort();
byte[] secondLevelMessageText = new byte[ll-8];
in_.readFully(secondLevelMessageText);
}
else if (cp == 0x3804)
{
int ccsid = in_.readShort();
System.out.println("CCSID: "+ccsid);
int dateFormatParserOption = in_.readShort();
int dateSeparatorParserOption = in_.readShort();
int timeFormatParserOption = in_.readShort();
int timeSeparatorParserOption = in_.readShort();
int decimalSeparatorParserOption = in_.readShort();
int namingConventionParserOption = in_.readShort();
int ignoreDecimalDataErrorParserOption = in_.readShort();
int commitmentControlLevelParserOption = in_.readShort();
int drdaPackageSize = in_.readShort();
int translationIndicator = in_.readByte();
int serverCCSIDValue = in_.readShort();
int serverNLSSValue = in_.readShort();
final byte[] buf = new byte[32];
final char[] cbuf = new char[32];
in_.readFully(buf, 0, 3);
String serverLanguageID = Conv.ebcdicByteArrayToString(buf, 0, 3, cbuf);
System.out.println(serverLanguageID);
in_.readFully(buf, 0, 10);
String serverLanguageTableName = Conv.ebcdicByteArrayToString(buf, 0, 10, cbuf);
System.out.println(serverLanguageTableName);
in_.readFully(buf, 0, 10);
String serverLanguageTableLibrary = Conv.ebcdicByteArrayToString(buf, 0, 10, cbuf);
System.out.println(serverLanguageTableLibrary);
in_.readFully(buf, 0, 4);
String serverLanguageFeatureCode = Conv.ebcdicByteArrayToString(buf, 0, 4, cbuf);
System.out.println(serverLanguageFeatureCode);
in_.readFully(buf, 0, 10);
String serverFunctionalLevel = Conv.ebcdicByteArrayToString(buf, 0, 10, cbuf);
System.out.println(serverFunctionalLevel);
in_.readFully(buf, 0, 18);
String relationalDBName = Conv.ebcdicByteArrayToString(buf, 0, 18, cbuf);
System.out.println(relationalDBName);
in_.readFully(buf, 0, 10);
String defaultSQLLibraryName = Conv.ebcdicByteArrayToString(buf, 0, 10, cbuf);
System.out.println(defaultSQLLibraryName);
in_.readFully(buf, 0, 26);
String jobName = Conv.ebcdicByteArrayToString(buf, 0, 10, cbuf);
String userName = Conv.ebcdicByteArrayToString(buf, 10, 10, cbuf);
String jobNumber = Conv.ebcdicByteArrayToString(buf, 20, 6, cbuf);
System.out.println(jobName+"/"+userName+"/"+jobNumber);
in_.skipBytes(ll-122);
}
// else if (cp == 0x3805)
// {
// // Data Format.
// }
// else if (cp == 0x3806)
// {
// // Result Data.
// }
else if (cp == 0x3807)
{
byte[] sqlCA = new byte[ll-6]; // SQL Communication Area
in_.readFully(sqlCA);
}
// else if (cp == 0x3808)
// {
// // Parameter Marker Format.
// }
// else if (cp == 0x3809)
// {
// // Translation Table Information.
// }
// else if (cp == 0x380A)
// {
// // Data Source Name (DSN) Attributes
// }
// else if (cp == 0x380B)
// {
// // Package Return Info.
// }
// else if (cp == 0x380C)
// {
// // Extended Data Format.
// }
// else if (cp == 0x380D)
// {
// // Extended Parameter Marker Format.
// }
// else if (cp == 0x380E)
// {
// // Extended Result Data.
// }
else if (cp == 0x380F)
{
// LOB Data.
if (ll > 6)
{
int ccsid = in_.readShort();
int secondLL = in_.readInt();
byte[] lobData = new byte[secondLL];
in_.readFully(lobData);
}
}
// else if (cp == 0x3810)
// {
// // Current LOB Length.
// }
// else if (cp == 0x3811)
// {
// // Extended Column Descriptors.
// }
// else if (cp == 0x3812)
// {
// // Super Extended Data Format.
// }
// else if (cp == 0x3813)
// {
// // Super Extended Parameter Marker Format.
// }
else if (cp == 0x3814)
{
// Cursor Attributes.
int cursorHoldability = in_.readByte();
int cursorScrollability = in_.readByte();
int cursorConcurrency = in_.readByte();
int cursorSensitivity = in_.readByte();
in_.skipBytes(ll-10);
}
// else if (cp == 0x3832)
// {
// // RLE Compressed function parameters.
// }
else
{
in_.skipBytes(ll-6);
}
numRead += ll;
}
in_.skipBytes(length-numRead);
}
*/
private void writeLOBLocatorHandle(AttributeLOBLocatorHandle attrib) throws IOException
{
out_.writeInt(10);
out_.writeShort(0x3818);
out_.writeInt(attrib.getLOBLocatorHandle());
}
private void writeRequestedSize(AttributeRequestedSize attrib) throws IOException
{
out_.writeInt(10);
out_.writeShort(0x3819);
out_.writeInt(attrib.getRequestedSize());
}
private void writeStartOffset(AttributeStartOffset attrib) throws IOException
{
out_.writeInt(10);
out_.writeShort(0x381A);
out_.writeInt(attrib.getStartOffset());
}
private void writeCompressionIndicator(AttributeCompressionIndicator attrib) throws IOException
{
out_.writeInt(7);
out_.writeShort(0x381B);
out_.write(attrib.getCompressionIndicator());
}
private void writeReturnCurrentLengthIndicator(AttributeReturnCurrentLengthIndicator attrib) throws IOException
{
out_.writeInt(7);
out_.writeShort(0x3821);
out_.write(attrib.getReturnCurrentLengthIndicator());
}
private void writeColumnIndex(AttributeColumnIndex attrib) throws IOException
{
out_.writeInt(10);
out_.writeShort(0x3828);
out_.writeInt(attrib.getColumnIndex());
}
private void sendRetrieveLOBDataRequest(HostOutputStream out, DatabaseRetrieveLOBDataAttributes attribs, int rpbID) throws IOException
{
int length = 40;
int parms = 0;
if (attribs.isLOBLocatorHandleSet())
{
length += 10; ++parms;
}
if (attribs.isRequestedSizeSet())
{
length += 10; ++parms;
}
if (attribs.isStartOffsetSet())
{
length += 10; ++parms;
}
if (attribs.isCompressionIndicatorSet())
{
length += 7; ++parms;
}
if (attribs.isTranslateIndicatorSet())
{
length += 7; ++parms;
}
if (attribs.isReturnCurrentLengthIndicatorSet())
{
length += 7; ++parms;
}
if (attribs.isColumnIndexSet())
{
length += 10; ++parms;
}
if (attribs.isRLECompressedFunctionParametersSet())
{
++parms;
byte[] comp = attribs.getRLECompressedFunctionParameters();
length += 10 + comp.length;
}
writeHeader(length, 0x1816);
// writeTemplate(parms, 0xFC000000, 0, rpbID);
int template = SEND_REPLY_IMMED | DATA_FORMAT | RESULT_DATA; // | MESSAGE_ID | FIRST_LEVEL_TEXT | SECOND_LEVEL_TEXT | DATA_FORMAT | RESULT_DATA;
writeTemplate(parms, template, 0, rpbID);
if (attribs.isLOBLocatorHandleSet())
{
writeLOBLocatorHandle(attribs);
}
if (attribs.isRequestedSizeSet())
{
writeRequestedSize(attribs);
}
if (attribs.isStartOffsetSet())
{
writeStartOffset(attribs);
}
if (attribs.isCompressionIndicatorSet())
{
writeCompressionIndicator(attribs);
}
if (attribs.isTranslateIndicatorSet())
{
writeTranslateIndicator(attribs);
}
if (attribs.isReturnCurrentLengthIndicatorSet())
{
writeReturnCurrentLengthIndicator(attribs);
}
if (attribs.isColumnIndexSet())
{
writeColumnIndex(attribs);
}
if (attribs.isRLECompressedFunctionParametersSet())
{
writeRLECompressedFunctionParameters(attribs);
}
}
private void sendSetServerAttributesRequest(HostOutputStream out, DatabaseServerAttributes attribs) throws IOException
{
// Calculate total length.
int length = 40;
int parms = 0;
if (attribs.isDefaultClientCCSIDSet())
{
length += 8; ++parms;
}
if (attribs.isLanguageFeatureCodeSet())
{
length += 12; ++parms;
}
if (attribs.isClientFunctionalLevelSet())
{
length += 18; ++parms;
}
if (attribs.isNLSSIdentifierSet())
{
++parms;
int val = attribs.getNLSSIdentifier();
length += 8;
if (val == 1 || val == 2)
{
length += 5;
}
else if (val == 3)
{
length += 6;
String tableName = attribs.getNLSSIdentifierLanguageTableName();
length += tableName.length();
String tableLibrary = attribs.getNLSSIdentifierLanguageTableLibrary();
length += tableLibrary.length();
}
}
if (attribs.isTranslateIndicatorSet())
{
length += getTranslateIndicatorLength(attribs); ++parms;
}
if (attribs.isDRDAPackageSizeSet())
{
length += 8; ++parms;
}
if (attribs.isDateFormatParserOptionSet())
{
length += 8; ++parms;
}
if (attribs.isDateSeparatorParserOptionSet())
{
length += 8; ++parms;
}
if (attribs.isTimeFormatParserOptionSet())
{
length += 8; ++parms;
}
if (attribs.isTimeSeparatorParserOptionSet())
{
length += 8; ++parms;
}
if (attribs.isDecimalSeparatorParserOptionSet())
{
length += 8; ++parms;
}
if (attribs.isNamingConventionParserOptionSet())
{
length += 8; ++parms;
}
if (attribs.isIgnoreDecimalDataErrorParserOptionSet())
{
length += 8; ++parms;
}
if (attribs.isCommitmentControlLevelParserOptionSet())
{
length += 8; ++parms;
}
if (attribs.isDefaultSQLLibraryNameSet())
{
++parms;
String library = attribs.getDefaultSQLLibraryName();
length += 10 + library.length();
}
if (attribs.isASCIICCSIDForTranslationTableSet())
{
length += 8; ++parms;
}
if (attribs.isAmbiguousSelectOptionSet())
{
length += 8; ++parms;
}
if (attribs.isPackageAddStatementAllowedSet())
{
length += 8; ++parms;
}
if (attribs.isUseExtendedFormatsSet())
{
length += 7; ++parms;
}
if (attribs.isLOBFieldThresholdSet())
{
length += 10; ++parms;
}
if (attribs.isDataCompressionParameterSet())
{
length += 8; ++parms;
}
if (attribs.isTrueAutoCommitIndicatorSet())
{
length += 7; ++parms;
}
if (attribs.isClientSupportInformationSet())
{
length += 10; ++parms;
}
if (attribs.isRDBNameSet())
{
++parms;
String name = attribs.getRDBName();
length += 8 + name.length();
}
if (attribs.isDecimalPrecisionAndScaleAttributesSet())
{
length += 12; ++parms;
}
if (attribs.isHexadecimalConstantParserOptionSet())
{
length += 7; ++parms;
}
if (attribs.isInputLocatorTypeSet())
{
length += 7; ++parms;
}
if (attribs.isLocatorPersistenceSet())
{
length += 8; ++parms;
}
if (attribs.isEWLMCorrelatorSet())
{
++parms;
byte[] corr = attribs.getEWLMCorrelator();
length += 6 + corr.length;
}
if (attribs.isRLECompressionSet())
{
++parms;
byte[] comp = attribs.getRLECompression();
length += 10 + comp.length;
}
if (attribs.isOptimizationGoalIndicatorSet())
{
length += 7; ++parms;
}
if (attribs.isQueryStorageLimitSet())
{
length += 10; ++parms;
}
if (attribs.isDecimalFloatingPointRoundingModeOptionSet())
{
length += 8; ++parms;
}
if (attribs.isDecimalFloatingPointErrorReportingOptionSet())
{
length += 8; ++parms;
}
if (attribs.isClientAccountingInformationSet())
{
++parms;
String info = attribs.getClientAccountingInformation();
length += 10 + info.length();
}
if (attribs.isClientApplicationNameSet())
{
++parms;
String name = attribs.getClientApplicationName();
length += 10 + name.length();
}
if (attribs.isClientUserIdentifierSet())
{
++parms;
String user = attribs.getClientUserIdentifier();
length += 10 + user.length();
}
if (attribs.isClientWorkstationNameSet())
{
++parms;
String name = attribs.getClientWorkstationName();
length += 10 + name.length();
}
if (attribs.isClientProgramIdentifierSet())
{
++parms;
String prog = attribs.getClientProgramIdentifier();
length += 10 + prog.length();
}
if (attribs.isInterfaceTypeSet())
{
++parms;
String type = attribs.getInterfaceType();
length += 10 + type.length();
}
if (attribs.isInterfaceNameSet())
{
++parms;
String name = attribs.getInterfaceName();
length += 10 + name.length();
}
if (attribs.isInterfaceLevelSet())
{
++parms;
String level = attribs.getInterfaceLevel();
length += 10 + level.length();
}
if (attribs.isCloseOnEOFSet())
{
length += 7; ++parms;
}
writeHeader(length, 0x1F80);
// Write template.
out.writeInt(0x81000000); // Operational result (ORS) bitmap - return data + server attributes (no RLE compression).
out.writeInt(0); // Reserved.
out.writeShort(0); // Return ORS handle - after operation completes.
out.writeShort(0); // Fill ORS handle.
out.writeShort(0); // Based on ORS handle.
out.writeShort(0); // Request parameter block (RPB) handle.
out.writeShort(0); // Parameter marker descriptor handle.
out.writeShort(parms); // Parameter count.
// Write parameters.
if (attribs.isDefaultClientCCSIDSet())
{
out.writeInt(8);
out.writeShort(0x3801);
out.writeShort(attribs.getDefaultClientCCSID());
}
if (attribs.isLanguageFeatureCodeSet())
{
out.writeInt(12);
out.writeShort(0x3802);
out.writeShort(37);
writePadEBCDIC(attribs.getLanguageFeatureCode(), 4, out);
}
if (attribs.isClientFunctionalLevelSet())
{
out.writeInt(18);
out.writeShort(0x3803);
out.writeShort(37);
writePadEBCDIC(attribs.getClientFunctionalLevel(), 10, out);
}
if (attribs.isNLSSIdentifierSet())
{
int val = attribs.getNLSSIdentifier();
int ll = 8;
if (val == 1 || val == 2)
{
ll += 5;
}
else if (val == 3)
{
ll += 6;
String tableName = attribs.getNLSSIdentifierLanguageTableName();
ll += tableName.length();
String tableLibrary = attribs.getNLSSIdentifierLanguageTableLibrary();
ll += tableLibrary.length();
}
out.writeInt(ll);
out.writeShort(0x3804);
out.writeShort(val);
if (val == 1 || val == 2)
{
out.writeShort(37);
writePadEBCDIC(attribs.getNLSSIdentifierLanguageID(), 3, out);
}
else if (val == 3)
{
out.writeShort(37);
String tableName = attribs.getNLSSIdentifierLanguageTableName();
out.writeShort(tableName.length());
writePadEBCDIC(tableName, tableName.length(), out);
String tableLibrary = attribs.getNLSSIdentifierLanguageTableLibrary();
out.writeShort(tableLibrary.length());
writePadEBCDIC(tableLibrary, tableLibrary.length(), out);
}
}
if (attribs.isTranslateIndicatorSet())
{
writeTranslateIndicator(attribs);
}
if (attribs.isDRDAPackageSizeSet())
{
out.writeInt(8);
out.writeShort(0x3806);
out.writeShort(attribs.getDRDAPackageSize());
}
if (attribs.isDateFormatParserOptionSet())
{
out.writeInt(8);
out.writeShort(0x3807);
out.writeShort(attribs.getDateFormatParserOption());
}
if (attribs.isDateSeparatorParserOptionSet())
{
out.writeInt(8);
out.writeShort(0x3808);
out.writeShort(attribs.getDateSeparatorParserOption());
}
if (attribs.isTimeFormatParserOptionSet())
{
out.writeInt(8);
out.writeShort(0x3809);
out.writeShort(attribs.getTimeFormatParserOption());
}
if (attribs.isTimeSeparatorParserOptionSet())
{
out.writeInt(8);
out.writeShort(0x380A);
out.writeShort(attribs.getTimeSeparatorParserOption());
}
if (attribs.isDecimalSeparatorParserOptionSet())
{
out.writeInt(8);
out.writeShort(0x380B);
out.writeShort(attribs.getDecimalSeparatorParserOption());
}
if (attribs.isNamingConventionParserOptionSet())
{
out.writeInt(8);
out.writeShort(0x380C);
out.writeShort(attribs.getNamingConventionParserOption());
}
if (attribs.isIgnoreDecimalDataErrorParserOptionSet())
{
out.writeInt(8);
out.writeShort(0x380D);
out.writeShort(attribs.getIgnoreDecimalDataErrorParserOption());
}
if (attribs.isCommitmentControlLevelParserOptionSet())
{
out.writeInt(8);
out.writeShort(0x380E);
out.writeShort(attribs.getCommitmentControlLevelParserOption());
}
if (attribs.isDefaultSQLLibraryNameSet())
{
String library = attribs.getDefaultSQLLibraryName();
out.writeInt(10+library.length());
out.writeShort(0x380F);
out.writeShort(37);
out.writeShort(library.length());
writePadEBCDIC(library, library.length(), out);
}
if (attribs.isASCIICCSIDForTranslationTableSet())
{
out.writeInt(8);
out.writeShort(0x3810);
out.writeShort(attribs.getASCIICCSIDForTranslationTable());
}
if (attribs.isAmbiguousSelectOptionSet())
{
out.writeInt(8);
out.writeShort(0x3811);
out.writeShort(attribs.getAmbiguousSelectOption());
}
if (attribs.isPackageAddStatementAllowedSet())
{
out.writeInt(8);
out.writeShort(0x3812);
out.writeShort(attribs.getPackageAddStatementAllowed());
}
// Skip Data Source Name (DSN) parameters, this is what JTOpen does, too.
if (attribs.isUseExtendedFormatsSet())
{
out.writeInt(7);
out.writeShort(0x3821);
out.writeByte(attribs.getUseExtendedFormats());
}
if (attribs.isLOBFieldThresholdSet())
{
out.writeInt(10);
out.writeShort(0x3822);
out.writeInt(attribs.getLOBFieldThreshold());
}
if (attribs.isDataCompressionParameterSet())
{
out.writeInt(8);
out.writeShort(0x3823);
out.writeShort(attribs.getDataCompressionParameter());
}
if (attribs.isTrueAutoCommitIndicatorSet())
{
out.writeInt(7);
out.writeShort(0x3824);
out.writeByte(attribs.getTrueAutoCommitIndicator());
}
if (attribs.isClientSupportInformationSet())
{
out.writeInt(10);
out.writeShort(0x3825);
out.writeInt(attribs.getClientSupportInformation());
}
if (attribs.isRDBNameSet())
{
String name = attribs.getRDBName();
out.writeInt(8+name.length());
out.writeShort(0x3826);
out.writeShort(37);
writePadEBCDIC(name, name.length(), out);
}
if (attribs.isDecimalPrecisionAndScaleAttributesSet())
{
out.writeInt(12);
out.writeShort(0x3827);
out.writeShort(attribs.getMaximumDecimalPrecision());
out.writeShort(attribs.getMaximumDecimalScale());
out.writeShort(attribs.getMinimumDivideScale());
}
if (attribs.isHexadecimalConstantParserOptionSet())
{
out.writeInt(7);
out.writeShort(0x3828);
out.writeByte(attribs.getHexadecimalConstantParserOption());
}
if (attribs.isInputLocatorTypeSet())
{
out.writeInt(7);
out.writeShort(0x3829);
out.writeByte(attribs.getInputLocatorType());
}
// Don't ask me why someone skipped 0x382A-0x382F... my guess is they don't know how to count.
if (attribs.isLocatorPersistenceSet())
{
out.writeInt(8);
out.writeShort(0x3830);
out.writeShort(attribs.getLocatorPersistence());
}
if (attribs.isEWLMCorrelatorSet())
{
byte[] corr = attribs.getEWLMCorrelator();
out.writeInt(6+corr.length);
out.writeShort(0x3831);
out.write(corr);
}
if (attribs.isRLECompressionSet())
{
byte[] comp = attribs.getRLECompression();
out.writeInt(10+comp.length);
out.writeShort(0x3832);
out.writeInt(comp.length);
out.write(comp);
}
if (attribs.isOptimizationGoalIndicatorSet())
{
out.writeInt(7);
out.writeShort(0x3833);
out.writeByte(attribs.getOptimizationGoalIndicator());
}
if (attribs.isQueryStorageLimitSet())
{
out.writeInt(10);
out.writeShort(0x3834);
out.writeInt(attribs.getQueryStorageLimit());
}
if (attribs.isDecimalFloatingPointRoundingModeOptionSet())
{
out.writeInt(8);
out.writeShort(0x3835);
out.writeShort(attribs.getDecimalFloatingPointRoundingModeOption());
}
if (attribs.isDecimalFloatingPointErrorReportingOptionSet())
{
out.writeInt(8);
out.writeShort(0x3836);
out.writeShort(attribs.getDecimalFloatingPointErrorReportingOption());
}
if (attribs.isClientAccountingInformationSet())
{
String info = attribs.getClientAccountingInformation();
out.writeInt(10+info.length());
out.writeShort(0x3837);
out.writeShort(37);
out.writeShort(info.length());
writePadEBCDIC(info, info.length(), out);
}
if (attribs.isClientApplicationNameSet())
{
String name = attribs.getClientApplicationName();
out.writeInt(10+name.length());
out.writeShort(0x3838);
out.writeShort(37);
out.writeShort(name.length());
writePadEBCDIC(name, name.length(), out);
}
if (attribs.isClientUserIdentifierSet())
{
String user = attribs.getClientUserIdentifier();
out.writeInt(10+user.length());
out.writeShort(0x3839);
out.writeShort(37);
out.writeShort(user.length());
writePadEBCDIC(user, user.length(), out);
}
if (attribs.isClientWorkstationNameSet())
{
String name = attribs.getClientWorkstationName();
out.writeInt(10+name.length());
out.writeShort(0x383A);
out.writeShort(37);
out.writeShort(name.length());
writePadEBCDIC(name, name.length(), out);
}
if (attribs.isClientProgramIdentifierSet())
{
String prog = attribs.getClientProgramIdentifier();
out.writeInt(10+prog.length());
out.writeShort(0x383B);
out.writeShort(37);
out.writeShort(prog.length());
writePadEBCDIC(prog, prog.length(), out);
}
if (attribs.isInterfaceTypeSet())
{
String type = attribs.getInterfaceType();
out.writeInt(10+type.length());
out.writeShort(0x383C);
out.writeShort(37);
out.writeShort(type.length());
writePadEBCDIC(type, type.length(), out);
}
if (attribs.isInterfaceNameSet())
{
String name = attribs.getInterfaceName();
out.writeInt(10+name.length());
out.writeShort(0x383D);
out.writeShort(37);
out.writeShort(name.length());
writePadEBCDIC(name, name.length(), out);
}
if (attribs.isInterfaceLevelSet())
{
String level = attribs.getInterfaceLevel();
out.writeInt(10+level.length());
out.writeShort(0x383E);
out.writeShort(37);
out.writeShort(level.length());
writePadEBCDIC(level, level.length(), out);
}
if (attribs.isCloseOnEOFSet())
{
out.writeInt(7);
out.writeShort(0x383F);
out.writeByte(attribs.getCloseOnEOF());
}
}
private void sendCommitRequest(HostOutputStream out) throws IOException
{
int length = 40;
// Write header (20 bytes)
writeHeader(length, 0x1807);
// Write template (20 bytes)
out.writeInt(0x80000000); // Operational result (ORS) bitmap - return data .
out.writeInt(0); // Reserved.
out.writeShort(0); // Return ORS handle - after operation completes.
out.writeShort(0); // Fill ORS handle.
out.writeShort(0); // Based on ORS handle.
out.writeShort(0); // Request parameter block (RPB) handle.
out.writeShort(0); // Parameter marker descriptor handle.
out.writeShort(0); // Parameter count.
}
private void sendRollbackRequest(HostOutputStream out) throws IOException
{
int length = 40;
// Write header (20 bytes)
writeHeader(length, 0x1808);
// Write template (20 bytes)
out.writeInt(0x80000000); // Operational result (ORS) bitmap - return data .
out.writeInt(0); // Reserved.
out.writeShort(0); // Return ORS handle - after operation completes.
out.writeShort(0); // Fill ORS handle.
out.writeShort(0); // Based on ORS handle.
out.writeShort(0); // Request parameter block (RPB) handle.
out.writeShort(0); // Parameter marker descriptor handle.
out.writeShort(0); // Parameter count.
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy