You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by ba...@apache.org on 2005/04/28 21:05:45 UTC
svn commit: r165178 [17/26] - in /incubator/derby/code/trunk: ./
java/client/ java/client/org/ java/client/org/apache/
java/client/org/apache/derby/ java/client/org/apache/derby/client/
java/client/org/apache/derby/client/am/
java/client/org/apache/derby/client/net/
java/client/org/apache/derby/client/resources/
java/client/org/apache/derby/jdbc/ tools/ant/properties/
Added: incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetConnectionReply.java
URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetConnectionReply.java?rev=165178&view=auto
==============================================================================
--- incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetConnectionReply.java (added)
+++ incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetConnectionReply.java Thu Apr 28 12:05:42 2005
@@ -0,0 +1,3372 @@
+/*
+
+ Derby - Class org.apache.derby.client.net.NetConnectionReply
+
+ Copyright (c) 2001, 2005 The Apache Software Foundation or its licensors, where applicable.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+package org.apache.derby.client.net;
+
+import org.apache.derby.client.am.SqlState;
+import org.apache.derby.client.am.SqlException;
+import org.apache.derby.client.am.DisconnectException;
+import org.apache.derby.client.am.Connection;
+import org.apache.derby.client.am.ConnectionCallbackInterface;
+import org.apache.derby.client.am.Sqlca; import javax.transaction.xa.*;
+
+public class NetConnectionReply extends Reply
+ implements ConnectionReplyInterface
+{
+ NetConnectionReply (NetAgent netAgent, int bufferSize)
+ {
+ super (netAgent, bufferSize);
+ }
+
+ // NET only entry point
+ void readExchangeServerAttributes (Connection connection) throws SqlException
+ {
+ startSameIdChainParse();
+ parseEXCSATreply((NetConnection) connection);
+ endOfSameIdChainData();
+ agent_.checkForChainBreakingException_();
+ }
+ void verifyDeferredReset () throws SqlException
+ {
+ readDssHeader();
+ verifyConnectReply(CodePoint.EXCSATRD);
+ readDssHeader();
+ verifyConnectReply(CodePoint.ACCSECRD);
+ readDssHeader();
+ verifyConnectReply(CodePoint.SECCHKRM);
+ readDssHeader();
+ verifyConnectReply(CodePoint.ACCRDBRM);
+ agent_.checkForChainBreakingException_();
+ }
+
+ void verifyConnectReply (int codept) throws SqlException
+ {
+ if (peekCodePoint() != codept) {
+ parseConnectError ();
+ return;
+ }
+ readLengthAndCodePoint();
+ skipBytes();
+
+ if (codept == CodePoint.ACCRDBRM) {
+ int peekCP = peekCodePoint();
+ if (peekCP == Reply.END_OF_SAME_ID_CHAIN)
+ return;
+
+ parseTypdefsOrMgrlvlovrs ();
+ NetSqlca netSqlca = parseSQLCARD (null);
+ netAgent_.netConnection_.completeSqlca (netSqlca);
+ }
+ }
+
+ void parseConnectError () throws DisconnectException
+ {
+ int peekCP = peekCodePoint();
+ switch (peekCP) {
+ case CodePoint.CMDCHKRM:
+ parseCMDCHKRM();
+ break;
+ case CodePoint.MGRLVLRM:
+ parseMGRLVLRM();
+ break;
+ default:
+ parseCommonError (peekCP);
+ }
+ }
+ void readDummyExchangeServerAttributes (Connection connection) throws SqlException
+ {
+ startSameIdChainParse();
+ parseDummyEXCSATreply((NetConnection) connection);
+ endOfSameIdChainData();
+ agent_.checkForChainBreakingException_();
+ }
+
+ // NET only entry point
+ void readAccessSecurity (Connection connection,
+ int securityMechanism) throws SqlException
+ {
+ startSameIdChainParse();
+ parseACCSECreply((NetConnection) connection, securityMechanism);
+ endOfSameIdChainData();
+ agent_.checkForChainBreakingException_();
+ }
+
+ // NET only entry point
+ void readSecurityCheck (Connection connection) throws SqlException
+ {
+ startSameIdChainParse();
+ parseSECCHKreply((NetConnection) connection);
+ endOfSameIdChainData();
+ agent_.checkForChainBreakingException_();
+ }
+
+ // NET only entry point
+ void readAccessDatabase (Connection connection) throws SqlException
+ {
+ startSameIdChainParse();
+ parseACCRDBreply((NetConnection) connection);
+ endOfSameIdChainData();
+ agent_.checkForChainBreakingException_();
+ }
+
+
+ public void readCommitSubstitute (ConnectionCallbackInterface connection) throws DisconnectException
+ {
+ startSameIdChainParse();
+ parseDummyEXCSATreply ((NetConnection)connection);
+ endOfSameIdChainData();
+ }
+
+ public void readLocalCommit (ConnectionCallbackInterface connection) throws DisconnectException
+ {
+ startSameIdChainParse();
+ parseRDBCMMreply (connection);
+ endOfSameIdChainData();
+ }
+
+ public void readLocalRollback (ConnectionCallbackInterface connection) throws DisconnectException
+ {
+ startSameIdChainParse();
+ parseRDBRLLBCKreply (connection);
+ endOfSameIdChainData();
+ }
+
+
+ public void readLocalXAStart (ConnectionCallbackInterface connection) throws DisconnectException
+ {
+ }
+
+ public void readLocalXACommit (ConnectionCallbackInterface connection) throws DisconnectException
+ {
+ }
+
+ public void readLocalXARollback (ConnectionCallbackInterface connection) throws DisconnectException
+ {
+ }
+
+
+ protected void readXaStartUnitOfWork(NetConnection conn) throws DisconnectException
+ {
+ }
+
+ protected int readXaEndUnitOfWork(NetConnection conn) throws DisconnectException
+ {
+ return 0;
+ }
+
+ protected int readXaPrepare(NetConnection conn) throws DisconnectException
+ {
+ return 0;
+ }
+
+ protected void readXaCommit(NetConnection conn) throws DisconnectException
+ {
+ }
+
+ protected int readXaRollback(NetConnection conn) throws DisconnectException
+ {
+ return 0;
+ }
+
+ protected void readXaRecover(NetConnection conn) throws DisconnectException
+ {
+ }
+
+ protected void readXaForget(NetConnection conn) throws DisconnectException
+ {
+ }
+
+
+ //------------------parse reply for specific command--------------------------
+ // These methods are "private protected", which is not a recognized java privilege,
+ // but means that these methods are private to this class and to subclasses,
+ // and should not be used as package-wide friendly methods.
+
+ // Parse the reply for the RDB Commit Unit of Work Command.
+ // This method handles the parsing of all command replies and reply data
+ // for the rdbcmm command.
+ private void parseRDBCMMreply (ConnectionCallbackInterface connection) throws DisconnectException
+ {
+ int peekCP = parseTypdefsOrMgrlvlovrs ();
+
+ if (peekCP != CodePoint.ENDUOWRM && peekCP != CodePoint.SQLCARD) {
+ parseCommitError (connection);
+ return;
+ }
+
+ if (peekCP == CodePoint.ENDUOWRM)
+ {
+ parseENDUOWRM (connection);
+ peekCP = parseTypdefsOrMgrlvlovrs ();
+ }
+
+ NetSqlca netSqlca = parseSQLCARD (null);
+ connection.completeSqlca (netSqlca);
+ }
+
+ // Parse the reply for the RDB Rollback Unit of Work Command.
+ // This method handles the parsing of all command replies and reply data
+ // for the rdbrllbck command.
+ private void parseRDBRLLBCKreply (ConnectionCallbackInterface connection) throws DisconnectException
+ {
+ int peekCP = parseTypdefsOrMgrlvlovrs ();
+ if (peekCP != CodePoint.ENDUOWRM) {
+ parseRollbackError ();
+ return;
+ }
+
+ parseENDUOWRM (connection);
+ peekCP = parseTypdefsOrMgrlvlovrs ();
+
+ NetSqlca netSqlca = parseSQLCARD (null);
+ connection.completeSqlca (netSqlca);
+ }
+
+ // Parse the reply for the Exchange Server Attributes Command.
+ // This method handles the parsing of all command replies and reply data
+ // for the excsat command.
+ private void parseEXCSATreply (NetConnection netConnection) throws DisconnectException
+ {
+ if (peekCodePoint() != CodePoint.EXCSATRD) {
+ parseExchangeServerAttributesError ();
+ return;
+ }
+ parseEXCSATRD (netConnection);
+ }
+
+ // Parse the reply for the Exchange Server Attributes Command (Dummy)
+ // This method handles the parsing of all command replies and reply data
+ // for the excsat command.
+ private void parseDummyEXCSATreply (NetConnection netConnection) throws DisconnectException
+ {
+ if (peekCodePoint() != CodePoint.EXCSATRD) {
+ parseExchangeServerAttributesError ();
+ return;
+ }
+ parseDummyEXCSATRD (netConnection);
+ }
+
+ // Parse the reply for the Access Security Command.
+ // This method handles the parsing of all command replies and reply data
+ // for the accsec command.
+ private void parseACCSECreply (NetConnection netConnection, int securityMechanism) throws DisconnectException
+ {
+ int peekCP = peekCodePoint();
+ if (peekCP != CodePoint.ACCSECRD) {
+ parseAccessSecurityError (netConnection);
+ return;
+ }
+ parseACCSECRD (netConnection, securityMechanism);
+
+ peekCP = peekCodePoint();
+ if (peekCP == Reply.END_OF_SAME_ID_CHAIN)
+ return;
+
+ }
+
+ // Parse the reply for the Security Check Command.
+ // This method handles the parsing of all command replies and reply data
+ // for the secchk command.
+ private void parseSECCHKreply (NetConnection netConnection) throws DisconnectException
+ {
+ if (peekCodePoint() != CodePoint.SECCHKRM) {
+ parseSecurityCheckError (netConnection);
+ return;
+ }
+
+ parseSECCHKRM (netConnection);
+ if (peekCodePoint() == CodePoint.SECTKN) {
+ // rpydta used only if the security mechanism returns
+ // a security token that must be sent back to the source system.
+ // this is only used for DCSSEC. In the case of DCESEC,
+ // the sectkn must be returned as reply data if DCE is using
+ // mutual authentication.
+ // Need to double check what to map this to. This is probably
+ // incorrect but consider it a conversation protocol error
+ // 0x03 - OBJDSS sent when not allowed.
+ //parseSECTKN (true);
+ boolean done = false;
+ byte[] bytes = parseSECTKN (false);
+ }
+ }
+
+ // Parse the reply for the Access RDB Command.
+ // This method handles the parsing of all command replies and reply data
+ // for the accrdb command.
+ private void parseACCRDBreply (NetConnection netConnection) throws DisconnectException
+ {
+ int peekCP = peekCodePoint();
+ if (peekCP != CodePoint.ACCRDBRM) {
+ parseAccessRdbError (netConnection);
+ return;
+ }
+
+ parseACCRDBRM (netConnection);
+ peekCP = peekCodePoint();
+ if (peekCP == Reply.END_OF_SAME_ID_CHAIN)
+ return;
+
+ parseTypdefsOrMgrlvlovrs ();
+ NetSqlca netSqlca = parseSQLCARD (null);
+ netConnection.completeSqlca (netSqlca);
+ }
+
+
+
+ protected int parseTypdefsOrMgrlvlovrs () throws DisconnectException
+ {
+ boolean targetTypedefCloned = false;
+ while (true) {
+ int peekCP = peekCodePoint();
+ if (peekCP == CodePoint.TYPDEFNAM) {
+ if (!targetTypedefCloned) {
+ netAgent_.targetTypdef_ = (Typdef) netAgent_.targetTypdef_.clone();
+ targetTypedefCloned = true;
+ }
+ parseTYPDEFNAM();
+ }
+ else if (peekCP == CodePoint.TYPDEFOVR) {
+ if (!targetTypedefCloned) {
+ netAgent_.targetTypdef_ = (Typdef) netAgent_.targetTypdef_.clone();
+ targetTypedefCloned = true;
+ }
+ parseTYPDEFOVR();
+ }
+ else
+ return peekCP;
+ }
+ }
+
+
+ //-----------------------------parse DDM Reply Messages-----------------------
+
+ protected void parseCommitError (ConnectionCallbackInterface connection) throws DisconnectException
+ {
+ int peekCP = peekCodePoint();
+ switch (peekCP) {
+ case CodePoint.ABNUOWRM:
+ NetSqlca sqlca = parseAbnormalEndUow (connection);
+ connection.completeSqlca (sqlca);
+ break;
+ case CodePoint.CMDCHKRM:
+ parseCMDCHKRM();
+ break;
+ case CodePoint.RDBNACRM:
+ parseRDBNACRM();
+ break;
+ default:
+ parseCommonError (peekCP);
+ break;
+ }
+ }
+
+ void parseRollbackError () throws DisconnectException
+ {
+ int peekCP = peekCodePoint();
+ switch (peekCP) {
+ case CodePoint.CMDCHKRM:
+ parseCMDCHKRM();
+ break;
+ case CodePoint.RDBNACRM:
+ parseRDBNACRM();
+ break;
+ default:
+ parseCommonError (peekCP);
+ break;
+ }
+ }
+
+ void parseExchangeServerAttributesError () throws DisconnectException
+ {
+ int peekCP = peekCodePoint();
+ switch (peekCP) {
+ case CodePoint.CMDCHKRM:
+ parseCMDCHKRM();
+ break;
+ case CodePoint.MGRLVLRM:
+ parseMGRLVLRM();
+ break;
+ default:
+ parseCommonError (peekCP);
+ }
+ }
+
+ void parseAccessSecurityError (NetConnection netConnection) throws DisconnectException
+ {
+ int peekCP = peekCodePoint();
+ switch (peekCP) {
+ case CodePoint.CMDCHKRM:
+ parseCMDCHKRM();
+ break;
+ case CodePoint.RDBNFNRM:
+ parseRDBNFNRM (netConnection);
+ break;
+ case CodePoint.RDBAFLRM:
+ parseRdbAccessFailed (netConnection);
+ break;
+ default:
+ parseCommonError (peekCP);
+ }
+ }
+
+ void parseSecurityCheckError (NetConnection netConnection) throws DisconnectException
+ {
+ int peekCP = peekCodePoint();
+ switch (peekCP) {
+ case CodePoint.CMDCHKRM:
+ parseCMDCHKRM();
+ break;
+ case CodePoint.OBJNSPRM:
+ parseOBJNSPRM();
+ break;
+ case CodePoint.RDBNFNRM:
+ parseRDBNFNRM (netConnection);
+ break;
+ case CodePoint.RDBAFLRM:
+ parseRdbAccessFailed (netConnection);
+ break;
+ default:
+ parseCommonError (peekCP);
+ }
+ }
+
+ void parseAccessRdbError (NetConnection netConnection) throws DisconnectException
+ {
+ int peekCP = peekCodePoint();
+ switch (peekCP) {
+ case CodePoint.CMDCHKRM:
+ parseCMDCHKRM();
+ break;
+ case CodePoint.RDBACCRM:
+ parseRDBACCRM();
+ break;
+ case CodePoint.RDBAFLRM:
+ parseRdbAccessFailed (netConnection);
+ break;
+ case CodePoint.RDBATHRM:
+ parseRDBATHRM (netConnection);
+ break;
+ case CodePoint.RDBNFNRM:
+ parseRDBNFNRM (netConnection);
+ break;
+ default:
+ parseCommonError (peekCP);
+ }
+ }
+
+
+ // Called by all the NET*Reply classes.
+ void parseCommonError (int peekCP) throws DisconnectException
+ {
+ switch (peekCP) {
+ case CodePoint.CMDNSPRM:
+ parseCMDNSPRM();
+ break;
+ case CodePoint.PRCCNVRM:
+ parsePRCCNVRM();
+ break;
+ case CodePoint.SYNTAXRM:
+ parseSYNTAXRM();
+ break;
+ case CodePoint.VALNSPRM:
+ parseVALNSPRM();
+ break;
+ default:
+ doObjnsprmSemantics (peekCP);
+ }
+ }
+
+ NetSqlca parseAbnormalEndUow (ConnectionCallbackInterface connection) throws DisconnectException
+ {
+ parseABNUOWRM (connection);
+ if (peekCodePoint() != CodePoint.SQLCARD)
+ parseTypdefsOrMgrlvlovrs();
+
+ NetSqlca netSqlca = parseSQLCARD (null);
+ return netSqlca;
+ }
+
+ void parseRdbAccessFailed (NetConnection netConnection) throws DisconnectException
+ {
+ parseRDBAFLRM();
+
+ // an SQLCARD is returned if an RDBALFRM is returned.
+ // this SQLCARD always follows the RDBALFRM.
+ // TYPDEFNAM and TYPDEFOVR are MTLINC
+
+ if (peekCodePoint() == CodePoint.TYPDEFNAM) {
+ parseTYPDEFNAM ();
+ parseTYPDEFOVR ();
+ }
+ else {
+ parseTYPDEFOVR ();
+ parseTYPDEFNAM ();
+ }
+
+ NetSqlca netSqlca = parseSQLCARD (null);
+ netConnection.completeSqlca (netSqlca);
+ }
+
+
+ // The Security Check (SECCHKRM) Reply Message indicates the acceptability
+ // of the security information.
+ // this method returns the security check code. it is up to the caller to check
+ // the value of this return code and take the appropriate action.
+ //
+ // Returned from Server:
+ // SVRCOD - required (0 - INFO, 8 - ERROR, 16 -SEVERE)
+ // SECCHKCD - required
+ // SECTKN - optional, ignorable
+ // SVCERRNO - optional
+ private void parseSECCHKRM (NetConnection netConnection) throws DisconnectException
+ {
+ boolean svrcodReceived = false;
+ int svrcod = CodePoint.SVRCOD_INFO;
+ boolean secchkcdReceived = false;
+ int secchkcd = CodePoint.SECCHKCD_00;
+ boolean sectknReceived = false;
+ byte[] sectkn = null;
+
+ parseLengthAndMatchCodePoint (CodePoint.SECCHKRM);
+ pushLengthOnCollectionStack();
+ int peekCP = peekCodePoint();
+
+ while (peekCP != Reply.END_OF_COLLECTION) {
+
+ boolean foundInPass = false;
+
+ if (peekCP == CodePoint.SVRCOD) {
+ // severity code. it's value is dictated by the SECCHKCD.
+ // right now it will not be checked that it is the correct value
+ // for the SECCHKCD. maybe this will be done in the future.
+ foundInPass = true;
+ svrcodReceived = checkAndGetReceivedFlag (svrcodReceived);
+ svrcod = parseSVRCOD (CodePoint.SVRCOD_INFO, CodePoint.SVRCOD_SEVERE);
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.SECCHKCD) {
+ // security check code. this specifies the state of the security information.
+ // there is a relationship between this value and the SVRCOD value.
+ // right now this driver will not check these values against each other.
+ foundInPass = true;
+ secchkcdReceived = checkAndGetReceivedFlag (secchkcdReceived);
+ secchkcd = parseSECCHKCD();
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.SECTKN) {
+ // security token.
+ // used when mutual authentication of the source and target servers
+ // is requested. The architecture lists this as an instance variable
+ // and also says that the SECTKN flows as reply data to the secchk cmd and
+ // it must flow after the secchkrm message. Right now this driver doesn't
+ // support ay mutual authentication so it will be ignored (it is listed
+ // as an ignorable instance variable in the ddm manual).
+ foundInPass = true;
+ sectknReceived = checkAndGetReceivedFlag (sectknReceived);
+ sectkn = parseSECTKN (true);
+ peekCP = peekCodePoint();
+ }
+
+ if (!foundInPass)
+ doPrmnsprmSemantics (peekCP);
+
+ }
+ popCollectionStack();
+ // check for the required instance variables.
+ checkRequiredObjects (svrcodReceived, secchkcdReceived);
+
+ netConnection.securityCheckComplete (svrcod, secchkcd);
+ }
+
+
+ // Access to RDB Completed (ACRDBRM) Reply Message specifies that an
+ // instance of the SQL application manager has been created and is bound
+ // to the specified relation database (RDB).
+ //
+ // Returned from Server:
+ // SVRCOD - required (0 - INFO, 4 - WARNING)
+ // PRDID - required
+ // TYPDEFNAM - required (MINLVL 4) (QTDSQLJVM)
+ // TYPDEFOVR - required
+ // RDBINTTKN - optional
+ // CRRTKN - optional
+ // USRID - optional
+ // SRVLST - optional (MINLVL 5)
+ private void parseACCRDBRM (NetConnection netConnection) throws DisconnectException
+ {
+ boolean svrcodReceived = false;
+ int svrcod = CodePoint.SVRCOD_INFO;
+ boolean prdidReceived = false;
+ String prdid = null;
+ boolean typdefnamReceived = false;
+ boolean typdefovrReceived = false;
+ boolean rdbinttknReceived = false;
+ boolean crrtknReceived = false;
+ byte[] crrtkn = null;
+ boolean usridReceived = false;
+ String usrid = null;
+
+ parseLengthAndMatchCodePoint (CodePoint.ACCRDBRM);
+ pushLengthOnCollectionStack();
+ int peekCP = peekCodePoint();
+
+ while (peekCP != Reply.END_OF_COLLECTION) {
+
+ boolean foundInPass = false;
+
+ if (peekCP == CodePoint.SVRCOD) {
+ // severity code. If the target SQLAM cannot support the typdefovr
+ // parameter values specified for the double-byte and mixed-byte CCSIDs
+ // on the corresponding ACCRDB command, then the severity code WARNING
+ // is specified on the ACCRDBRM.
+ foundInPass = true;
+ svrcodReceived = checkAndGetReceivedFlag (svrcodReceived);
+ svrcod = parseSVRCOD (CodePoint.SVRCOD_INFO, CodePoint.SVRCOD_WARNING);
+ peekCP = peekCodePoint();
+ }
+
+ // this is the product release level of the target RDB server.
+ if (peekCP == CodePoint.PRDID) {
+ foundInPass = true;
+ prdidReceived = checkAndGetReceivedFlag (prdidReceived);
+ prdid = parsePRDID (false); // false means do not skip the bytes
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.TYPDEFNAM) {
+ // this is the name of the data type to the data representation mapping
+ // definitions tha the target SQLAM uses when sending reply data objects.
+ foundInPass = true;
+ typdefnamReceived = checkAndGetReceivedFlag (typdefnamReceived);
+ parseTYPDEFNAM();
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.TYPDEFOVR) {
+ // this is the single-byte, double-byte, and mixed-byte CCSIDs of the
+ // scalar data arrays (SDA) in the identified data type to data representation
+ // mapping definitions.
+ foundInPass = true;
+ typdefovrReceived = checkAndGetReceivedFlag (typdefovrReceived);
+ parseTYPDEFOVR();
+ peekCP = peekCodePoint();
+ }
+
+
+
+ if (peekCP == CodePoint.USRID) {
+ // specifies the target defined user ID. It is returned if the value of
+ // TRGDFTRT is TRUE in ACCRDB. Right now this driver always sets this
+ // value to false so this should never get returned here.
+ // if it is returned, it could be considered an error but for now
+ // this driver will just skip the bytes.
+ foundInPass = true;
+ usridReceived = checkAndGetReceivedFlag (usridReceived);
+ usrid = parseUSRID (true);
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.CRRTKN) {
+ // carries information to correlate with the work being done on bahalf
+ // of an application at the source and at the target server.
+ // defualt value is ''.
+ // this parameter is only retunred if an only if the CRRTKN parameter
+ // is not received on ACCRDB. We will rely on server to send us this
+ // in ACCRDBRM
+ foundInPass = true;
+ crrtknReceived = checkAndGetReceivedFlag (crrtknReceived);
+ crrtkn = parseCRRTKN (false);
+ peekCP = peekCodePoint();
+ }
+
+
+ if (!foundInPass)
+ doPrmnsprmSemantics (peekCP);
+ }
+ popCollectionStack();
+ // check for the required instance variables.
+ checkRequiredObjects (svrcodReceived,
+ prdidReceived,
+ typdefnamReceived,
+ typdefovrReceived);
+
+ netConnection.rdbAccessed(svrcod,
+ prdid,
+ crrtknReceived,
+ crrtkn);
+ }
+
+
+
+ // The End Unit of Work Condition (ENDUOWRM) Reply Mesage specifies
+ // that the unit of work has ended as a result of the last command.
+ //
+ // Returned from Server:
+ // SVRCOD - required (4 WARNING)
+ // UOWDSP - required
+ // RDBNAM - optional
+ void parseENDUOWRM (ConnectionCallbackInterface connection) throws DisconnectException
+ {
+ boolean svrcodReceived = false;
+ int svrcod = CodePoint.SVRCOD_INFO;
+ boolean uowdspReceived = false;
+ int uowdsp = 0;
+ boolean rdbnamReceived = false;
+ String rdbnam = null;
+
+ parseLengthAndMatchCodePoint (CodePoint.ENDUOWRM);
+ pushLengthOnCollectionStack();
+ int peekCP = peekCodePoint();
+
+ while (peekCP != Reply.END_OF_COLLECTION) {
+
+ boolean foundInPass = false;
+
+ if (peekCP == CodePoint.SVRCOD) {
+ foundInPass = true;
+ svrcodReceived = checkAndGetReceivedFlag (svrcodReceived);
+ svrcod = parseSVRCOD (CodePoint.SVRCOD_WARNING, CodePoint.SVRCOD_WARNING);
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.UOWDSP) {
+ foundInPass = true;
+ uowdspReceived = checkAndGetReceivedFlag (uowdspReceived);
+ uowdsp = parseUOWDSP();
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.RDBNAM) {
+ foundInPass = true;
+ rdbnamReceived = checkAndGetReceivedFlag (rdbnamReceived);
+ rdbnam = parseRDBNAM (true);
+ peekCP = peekCodePoint();
+ }
+
+
+ if (!foundInPass)
+ doPrmnsprmSemantics (peekCP);
+ }
+ popCollectionStack();
+ checkRequiredObjects (svrcodReceived, uowdspReceived);
+
+ netAgent_.setSvrcod (svrcod);
+ if (uowdsp == CodePoint.UOWDSP_COMMIT)
+ connection.completeLocalCommit();
+ else
+ connection.completeLocalRollback();
+ }
+
+ // Command Check Reply Message indicates that the requested
+ // command encountered an unarchitected and implementation-specific
+ // condition for which there is no architected message. If the severity
+ // code value is ERROR or greater, the command has failed. The
+ // message can be accompanied by other messages that help to identify
+ // the specific condition.
+ // The CMDCHKRM should not be used as a general catch-all in place of
+ // product-defined messages when using product extensions to DDM.
+ // PROTOCOL architects the SQLSTATE value depending on SVRCOD
+ // SVRCOD 0 -> SQLSTATE is not returned
+ // SVRCOD 8 -> SQLSTATE of 58008 or 58009
+ // SVRCOD 16,32,64,128 -> SQLSTATE of 58009
+ //
+ // Messages
+ // SQLSTATE : 58009
+ // Execution failed due to a distribution protocol error that caused deallocation of the conversation.
+ // SQLCODE : -30020
+ // Execution failed because of a Distributed Protocol
+ // Error that will affect the successful execution of subsequent
+ // commands and SQL statements: Reason Code <reason-code>.
+ // Some possible reason codes include:
+ // 121C Indicates that the user is not authorized to perform the requested command.
+ // 1232 The command could not be completed because of a permanent error.
+ // In most cases, the server will be in the process of an abend.
+ // 220A The target server has received an invalid data description.
+ // If a user SQLDA is specified, ensure that the fields are
+ // initialized correctly. Also, ensure that the length does not
+ // exceed the maximum allowed length for the data type being used.
+ //
+ // The command or statement cannot be processed. The current
+ // transaction is rolled back and the application is disconnected
+ // from the remote database.
+ //
+ //
+ // Returned from Server:
+ // SVRCOD - required (0 - INFO, 4 - WARNING, 8 - ERROR, 16 - SEVERE,
+ // 32 - ACCDMG, 64 - PRMDMG, 128 - SESDMG))
+ // RDBNAM - optional (MINLVL 3)
+ // RECCNT - optional (MINVAL 0, MINLVL 3)
+ //
+ // Called by all the Reply classesCMDCHKRM
+ protected void parseCMDCHKRM () throws DisconnectException
+ {
+ boolean svrcodReceived = false;
+ int svrcod = CodePoint.SVRCOD_INFO;
+ boolean rdbnamReceived = false;
+ String rdbnam = null;
+ parseLengthAndMatchCodePoint (CodePoint.CMDCHKRM);
+ pushLengthOnCollectionStack();
+ int peekCP = peekCodePoint();
+
+ while (peekCP != Reply.END_OF_COLLECTION) {
+
+ boolean foundInPass = false;
+
+ if (peekCP == CodePoint.SVRCOD) {
+ foundInPass = true;
+ svrcodReceived = checkAndGetReceivedFlag (svrcodReceived);
+ svrcod = parseSVRCOD (CodePoint.SVRCOD_INFO, CodePoint.SVRCOD_SESDMG);
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.RDBNAM) {
+ foundInPass = true;
+ rdbnamReceived = checkAndGetReceivedFlag (rdbnamReceived);
+ rdbnam = parseRDBNAM (true);
+ peekCP = peekCodePoint();
+ }
+ // skip over the RECCNT since it can't be found in the DDM book.
+
+ if (peekCP == 0x115C) {
+ foundInPass = true;
+ parseLengthAndMatchCodePoint (0x115C);
+ skipBytes();
+ peekCP = peekCodePoint();
+ }
+
+ if (!foundInPass)
+ doPrmnsprmSemantics (peekCP);
+
+ }
+ popCollectionStack();
+ checkRequiredObjects (svrcodReceived);
+
+ netAgent_.setSvrcod (svrcod);
+ agent_.accumulateChainBreakingReadExceptionAndThrow (new DisconnectException (
+ agent_,
+ "Execution failed due to a distribution protocol error that caused " +
+ "deallocation of the conversation. " +
+ "The requested command encountered an unarchitected and implementation " +
+ "specific condition for which there was no architected message.",
+ SqlState._58009));
+ }
+
+
+ // RDB Not Accessed Reply Message indicates that the access relational
+ // database command (ACCRDB) was not issued prior to a command
+ // requesting the RDB Services.
+ // PROTOCOL Architects an SQLSTATE of 58008 or 58009.
+ //
+ // Messages
+ // SQLSTATE : 58009
+ // Execution failed due to a distribution protocol error that caused deallocation of the conversation.
+ // SQLCODE : -30020
+ // Execution failed because of a Distributed Protocol
+ // Error that will affect the successful execution of subsequent
+ // commands and SQL statements: Reason Code <reason-code>.
+ // Some possible reason codes include:
+ // 121C Indicates that the user is not authorized to perform the requested command.
+ // 1232 The command could not be completed because of a permanent error.
+ // In most cases, the server will be in the process of an abend.
+ // 220A The target server has received an invalid data description.
+ // If a user SQLDA is specified, ensure that the fields are
+ // initialized correctly. Also, ensure that the length does not
+ // exceed the maximum allowed length for the data type being used.
+ //
+ // The command or statement cannot be processed. The current
+ // transaction is rolled back and the application is disconnected
+ // from the remote database.
+ //
+ //
+ // Returned from Server:
+ // SVRCOD - required (8 - ERROR)
+ // RDBNAM - required
+ //
+ // Called by all the NET*Reply classes.
+ void parseRDBNACRM () throws DisconnectException
+ {
+ boolean svrcodReceived = false;
+ int svrcod = CodePoint.SVRCOD_INFO;
+ boolean rdbnamReceived = false;
+ String rdbnam = null;
+
+ parseLengthAndMatchCodePoint (CodePoint.RDBNACRM);
+ pushLengthOnCollectionStack();
+ int peekCP = peekCodePoint();
+
+ while (peekCP != Reply.END_OF_COLLECTION) {
+
+ boolean foundInPass = false;
+
+ if (peekCP == CodePoint.SVRCOD) {
+ foundInPass = true;
+ svrcodReceived = checkAndGetReceivedFlag (svrcodReceived);
+ svrcod = parseSVRCOD (CodePoint.SVRCOD_ERROR, CodePoint.SVRCOD_ERROR);
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.RDBNAM) {
+ foundInPass = true;
+ rdbnamReceived = checkAndGetReceivedFlag (rdbnamReceived);
+ rdbnam = parseRDBNAM (true);
+ peekCP = peekCodePoint();
+ }
+
+ if (!foundInPass)
+ doPrmnsprmSemantics (peekCP);
+
+ }
+ popCollectionStack();
+ checkRequiredObjects (svrcodReceived, rdbnamReceived);
+
+ netAgent_.setSvrcod (svrcod);
+ agent_.accumulateChainBreakingReadExceptionAndThrow (new DisconnectException (
+ agent_,
+ "Execution failed due to a distribution protocol error that caused " +
+ "deallocation of the conversation. " +
+ "The access relational database command was not issued prior to " +
+ "a command requesting RDB services. ",
+ SqlState._58009));
+ }
+
+ // RDB Not Found Reply Message indicates that the target
+ // server cannot find the specified relational database.
+ // PROTOCOL architects an SQLSTATE of 08004.
+ //
+ // Messages
+ // SQLSTATE : 8004
+ // The application server rejected establishment of the connection.
+ // SQLCODE : -30061
+ // The database alias or database name <name> was not found at the remote node.
+ // The statement cannot be processed.
+ //
+ //
+ // Returned from Server:
+ // SVRCOD - required (8 - ERROR)
+ // RDBNAM - required
+ //
+ private void parseRDBNFNRM (NetConnection netConnection) throws DisconnectException
+ {
+ boolean svrcodReceived = false;
+ int svrcod = CodePoint.SVRCOD_INFO;
+ boolean rdbnamReceived = false;
+ String rdbnam = null;
+
+ parseLengthAndMatchCodePoint (CodePoint.RDBNFNRM);
+ pushLengthOnCollectionStack();
+ int peekCP = peekCodePoint();
+
+ while (peekCP != Reply.END_OF_COLLECTION) {
+
+ boolean foundInPass = false;
+
+ if (peekCP == CodePoint.SVRCOD) {
+ foundInPass = true;
+ svrcodReceived = checkAndGetReceivedFlag (svrcodReceived);
+ svrcod = parseSVRCOD (CodePoint.SVRCOD_ERROR, CodePoint.SVRCOD_ERROR);
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.RDBNAM) {
+ foundInPass = true;
+ rdbnamReceived = checkAndGetReceivedFlag (rdbnamReceived);
+ rdbnam = parseRDBNAM (true);
+ peekCP = peekCodePoint();
+ }
+
+
+ if (!foundInPass)
+ doPrmnsprmSemantics (peekCP);
+
+ }
+ popCollectionStack();
+ checkRequiredObjects (svrcodReceived, rdbnamReceived);
+
+ netAgent_.setSvrcod (svrcod);
+ agent_.accumulateChainBreakingReadExceptionAndThrow (new DisconnectException (
+ agent_,
+ "The application server rejected establishment of the connection. " +
+ "An attempt was made to access a database, " +
+ netConnection.databaseName_ + ", which was not found.",
+ SqlState._08004));
+ }
+
+
+ // Not Authorized to RDB Reply Message specifies that
+ // the requester is not authorized to access the specified
+ // relational database.
+ // PROTOCOL architects an SQLSTATE of 08004
+ //
+ // Messages
+ // SQLSTATE : 8004
+ // Authorization ID <authorization-ID> attempted to perform the specified
+ // <operation> without having been granted the proper authorization to do so.
+ // SQLCODE : -30060
+ // <authorization-ID> does not have the privilege to perform operation <operation>.
+ //
+ //
+ // Returned from Server:
+ // SVRCOD - required (8 - ERROR)
+ // RDBNAM - required
+ //
+ private void parseRDBATHRM (NetConnection netConnection) throws DisconnectException
+ {
+ boolean svrcodReceived = false;
+ int svrcod = CodePoint.SVRCOD_INFO;
+ boolean rdbnamReceived = false;
+ String rdbnam = null;
+
+ parseLengthAndMatchCodePoint (CodePoint.RDBATHRM);
+ pushLengthOnCollectionStack();
+ int peekCP = peekCodePoint();
+
+ while (peekCP != Reply.END_OF_COLLECTION) {
+
+ boolean foundInPass = false;
+
+ if (peekCP == CodePoint.SVRCOD) {
+ foundInPass = true;
+ svrcodReceived = checkAndGetReceivedFlag (svrcodReceived);
+ svrcod = parseSVRCOD (CodePoint.SVRCOD_ERROR, CodePoint.SVRCOD_ERROR);
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.RDBNAM) {
+ foundInPass = true;
+ rdbnamReceived = checkAndGetReceivedFlag (rdbnamReceived);
+ rdbnam = parseRDBNAM (true);
+ peekCP = peekCodePoint();
+ }
+
+ if (!foundInPass)
+ doPrmnsprmSemantics (peekCP);
+
+ }
+ popCollectionStack();
+ checkRequiredObjects (svrcodReceived, rdbnamReceived);
+
+ netAgent_.setSvrcod (svrcod);
+ netAgent_.accumulateReadException (new SqlException (agent_.logWriter_,
+ "The application server rejected establishment of the connection. " +
+ "The user is not authorized to access the database.",
+ SqlState._08004));
+ }
+
+ // Data Stream Syntax Error Reply Message indicates that the data
+ // sent to the target agent does not structurally conform to the requirements
+ // of the DDM architecture. The target agent terminated paring of the DSS
+ // when the condition SYNERRCD specified was detected.
+ // PROTOCOL architects an SQLSTATE of 58008 or 58009.
+ //
+ // Messages
+ // SQLSTATE : 58009
+ // Execution failed due to a distribution protocol error that caused deallocation of the conversation.
+ // SQLCODE : -30020
+ // Execution failed because of a Distributed Protocol
+ // Error that will affect the successful execution of subsequent
+ // commands and SQL statements: Reason Code <reason-code>.
+ // Some possible reason codes include:
+ // 121C Indicates that the user is not authorized to perform the requested command.
+ // 1232 The command could not be completed because of a permanent error.
+ // In most cases, the server will be in the process of an abend.
+ // 220A The target server has received an invalid data description.
+ // If a user SQLDA is specified, ensure that the fields are
+ // initialized correctly. Also, ensure that the length does not
+ // exceed the maximum allowed length for the data type being used.
+ //
+ // The command or statement cannot be processed. The current
+ // transaction is rolled back and the application is disconnected
+ // from the remote database.
+ //
+ //
+ // Returned from Server:
+ // SVRCOD - required (8 - ERROR)
+ // SYNERRCD - required
+ // RECCNT - optional (MINVAL 0, MINLVL 3) (will not be returned - should be ignored)
+ // CODPNT - optional (MINLVL 3)
+ // RDBNAM - optional (MINLVL 3)
+ //
+ protected void parseSYNTAXRM () throws DisconnectException
+ {
+ boolean svrcodReceived = false;
+ int svrcod = CodePoint.SVRCOD_INFO;
+ boolean synerrcdReceived = false;
+ int synerrcd = 0;
+ boolean rdbnamReceived = false;
+ String rdbnam = null;
+ boolean codpntReceived = false;
+ int codpnt = 0;
+
+ parseLengthAndMatchCodePoint (CodePoint.SYNTAXRM);
+ pushLengthOnCollectionStack();
+ int peekCP = peekCodePoint();
+
+ while (peekCP != Reply.END_OF_COLLECTION) {
+
+ boolean foundInPass = false;
+
+ if (peekCP == CodePoint.SVRCOD) {
+ foundInPass = true;
+ svrcodReceived = checkAndGetReceivedFlag (svrcodReceived);
+ svrcod = parseSVRCOD (CodePoint.SVRCOD_ERROR, CodePoint.SVRCOD_ERROR);
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.SYNERRCD) {
+ foundInPass = true;
+ synerrcdReceived = checkAndGetReceivedFlag (synerrcdReceived);
+ synerrcd = parseSYNERRCD();
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.RDBNAM) {
+ foundInPass = true;
+ rdbnamReceived = checkAndGetReceivedFlag (rdbnamReceived);
+ rdbnam = parseRDBNAM (true);
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.CODPNT) {
+ foundInPass = true;
+ codpntReceived = checkAndGetReceivedFlag (codpntReceived);
+ codpnt = parseCODPNT();
+ peekCP = peekCodePoint();
+ }
+
+ // RECCNT will be skipped.
+
+ if (!foundInPass)
+ doPrmnsprmSemantics (peekCP);
+ }
+ popCollectionStack();
+ checkRequiredObjects (svrcodReceived, synerrcdReceived);
+
+ netAgent_.setSvrcod (svrcod);
+ doSyntaxrmSemantics (codpnt);
+ }
+
+ // RDB Currently Accessed Reply Message inidcates that the
+ // ACCRDB command cannot be issued because the requester
+ // has access to a relational database.
+ // PROTOCOL architects an SQLSTATE of 58008 or 58009.
+ //
+ // Messages
+ // SQLSTATE : 58009
+ // Execution failed due to a distribution protocol error that caused deallocation of the conversation.
+ // SQLCODE : -30020
+ // Execution failed because of a Distributed Protocol
+ // Error that will affect the successful execution of subsequent
+ // commands and SQL statements: Reason Code <reason-code>.
+ // Some possible reason codes include:
+ // 121C Indicates that the user is not authorized to perform the requested command.
+ // 1232 The command could not be completed because of a permanent error.
+ // In most cases, the server will be in the process of an abend.
+ // 220A The target server has received an invalid data description.
+ // If a user SQLDA is specified, ensure that the fields are
+ // initialized correctly. Also, ensure that the length does not
+ // exceed the maximum allowed length for the data type being used.
+ //
+ // The command or statement cannot be processed. The current
+ // transaction is rolled back and the application is disconnected
+ // from the remote database.
+ //
+ //
+ // Returned from Server:
+ // SVRCOD - required (8 - ERROR)
+ // RDBNAM - required
+ //
+ private void parseRDBACCRM () throws DisconnectException
+ {
+ boolean svrcodReceived = false;
+ int svrcod = CodePoint.SVRCOD_INFO;
+ boolean rdbnamReceived = false;
+ String rdbnam = null;
+
+ parseLengthAndMatchCodePoint (CodePoint.RDBACCRM);
+ pushLengthOnCollectionStack();
+ int peekCP = peekCodePoint();
+
+ while (peekCP != Reply.END_OF_COLLECTION) {
+
+ boolean foundInPass = false;
+
+ if (peekCP == CodePoint.SVRCOD) {
+ foundInPass = true;
+ svrcodReceived = checkAndGetReceivedFlag (svrcodReceived);
+ svrcod = parseSVRCOD (CodePoint.SVRCOD_ERROR, CodePoint.SVRCOD_ERROR);
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.RDBNAM) {
+ foundInPass = true;
+ rdbnamReceived = checkAndGetReceivedFlag (rdbnamReceived);
+ rdbnam = parseRDBNAM (true);
+ peekCP = peekCodePoint();
+ }
+
+ if (!foundInPass)
+ doPrmnsprmSemantics (peekCP);
+
+ }
+ popCollectionStack();
+ checkRequiredObjects (svrcodReceived, rdbnamReceived);
+
+ netAgent_.setSvrcod (svrcod);
+ agent_.accumulateChainBreakingReadExceptionAndThrow (new DisconnectException (
+ agent_,
+ "Execution failed due to a distribution protocol error that caused " +
+ "deallocation of the conversation. " +
+ "The access relational database command cannot be issued because an " +
+ "RDB is already currently accessed.",
+ SqlState._58009));
+ }
+
+ // RDB Access Failed Reply Message specifies that the relational
+ // database failed the attempted connection.
+ // An SQLCARD object must also be returned, following the
+ // RDBAFLRM, to explain why the RDB failed the connection.
+ // In addition, the target SQLAM instance is destroyed.
+ // The SQLSTATE is returned in the SQLCARD.
+ //
+ // Messages
+ // SQLSTATE : 58009
+ // Execution failed due to a distribution protocol error that caused deallocation of the conversation.
+ // SQLCODE : -30020
+ // Execution failed because of a Distributed Protocol
+ // Error that will affect the successful execution of subsequent
+ // commands and SQL statements: Reason Code <reason-code>.
+ // Some possible reason codes include:
+ // 121C Indicates that the user is not authorized to perform the requested command.
+ // 1232 The command could not be completed because of a permanent error.
+ // In most cases, the server will be in the process of an abend.
+ // 220A The target server has received an invalid data description.
+ // If a user SQLDA is specified, ensure that the fields are
+ // initialized correctly. Also, ensure that the length does not
+ // exceed the maximum allowed length for the data type being used.
+ //
+ // The command or statement cannot be processed. The current
+ // transaction is rolled back and the application is disconnected
+ // from the remote database.
+ //
+ //
+ // Returned from Server:
+ // SVRCOD - required (8 - ERROR)
+ // RDBNAM - required
+ //
+ private void parseRDBAFLRM () throws DisconnectException
+ {
+ boolean svrcodReceived = false;
+ int svrcod = CodePoint.SVRCOD_INFO;
+ boolean rdbnamReceived = false;
+ String rdbnam = null;
+
+ parseLengthAndMatchCodePoint (CodePoint.RDBAFLRM);
+ pushLengthOnCollectionStack();
+ int peekCP = peekCodePoint();
+
+ while (peekCP != Reply.END_OF_COLLECTION) {
+
+ boolean foundInPass = false;
+
+ if (peekCP == CodePoint.SVRCOD) {
+ foundInPass = true;
+ svrcodReceived = checkAndGetReceivedFlag (svrcodReceived);
+ svrcod = parseSVRCOD (CodePoint.SVRCOD_ERROR, CodePoint.SVRCOD_ERROR);
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.RDBNAM) {
+ foundInPass = true;
+ rdbnamReceived = checkAndGetReceivedFlag (rdbnamReceived);
+ rdbnam = parseRDBNAM (true);
+ peekCP = peekCodePoint();
+ }
+
+ if (!foundInPass)
+ doPrmnsprmSemantics (peekCP);
+
+ }
+ popCollectionStack();
+ checkRequiredObjects (svrcodReceived, rdbnamReceived);
+
+ netAgent_.setSvrcod (svrcod);
+ }
+
+
+ // Parameter Value Not Supported Reply Message indicates
+ // that the parameter value specified is either not recognized
+ // or not supported for the specified parameter.
+ // The VALNSPRM can only be specified in accordance with
+ // the rules specified for DDM subsetting.
+ // The code point of the command parameter in error is
+ // returned as a parameter in this message.
+ // PROTOCOL Architects an SQLSTATE of 58017.
+ //
+ // if codepoint is 0x119C,0x119D, or 0x119E then SQLSTATE 58017, SQLCODE -332
+ // else SQLSTATE 58017, SQLCODE -30073
+ //
+ // Messages
+ // SQLSTATE : 58017
+ // The DDM parameter value is not supported.
+ // SQLCODE : -332
+ // There is no available conversion for the source code page
+ // <code page> to the target code page <code page>.
+ // Reason code <reason-code>.
+ // The reason codes are as follows:
+ // 1 source and target code page combination is not supported
+ // by the database manager.
+ // 2 source and target code page combination is either not
+ // supported by the database manager or by the operating
+ // system character conversion utility on the client node.
+ // 3 source and target code page combination is either not
+ // supported by the database manager or by the operating
+ // system character conversion utility on the server node.
+ //
+ // SQLSTATE : 58017
+ // The DDM parameter value is not supported.
+ // SQLCODE : -30073
+ // <parameter-identifier> Parameter value <value> is not supported.
+ // Some possible parameter identifiers include:
+ // 002F The target server does not support the data type
+ // requested by the application requester.
+ // The target server does not support the CCSID
+ // requested by the application requester. Ensure the CCSID
+ // used by the requester is supported by the server.
+ // 119C - Verify the single-byte CCSID.
+ // 119D - Verify the double-byte CCSID.
+ // 119E - Verify the mixed-byte CCSID.
+ //
+ // The current environment command or SQL statement
+ // cannot be processed successfully, nor can any subsequent
+ // commands or SQL statements. The current transaction is
+ // rolled back and the application is disconnected
+ // from the remote database. The command cannot be processed.
+ //
+ // Returned from Server:
+ // SVRCOD - required (8 - ERROR)
+ // CODPNT - required
+ // RECCNT - optional (MINLVL 3, MINVAL 0) (will not be returned - should be ignored)
+ // RDBNAM - optional (MINLVL 3)
+ //
+ protected void parseVALNSPRM () throws DisconnectException
+ {
+ boolean svrcodReceived = false;
+ int svrcod = CodePoint.SVRCOD_INFO;
+ boolean rdbnamReceived = false;
+ String rdbnam = null;
+ boolean codpntReceived = false;
+ int codpnt = 0;
+
+ parseLengthAndMatchCodePoint (CodePoint.VALNSPRM);
+ pushLengthOnCollectionStack();
+ int peekCP = peekCodePoint();
+
+ while (peekCP != Reply.END_OF_COLLECTION) {
+
+ boolean foundInPass = false;
+
+ if (peekCP == CodePoint.SVRCOD) {
+ foundInPass = true;
+ svrcodReceived = checkAndGetReceivedFlag (svrcodReceived);
+ svrcod = parseSVRCOD (CodePoint.SVRCOD_ERROR, CodePoint.SVRCOD_ERROR);
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.RDBNAM) {
+ foundInPass = true;
+ rdbnamReceived = checkAndGetReceivedFlag (rdbnamReceived);
+ rdbnam = parseRDBNAM (true);
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.CODPNT) {
+ foundInPass = true;
+ codpntReceived = checkAndGetReceivedFlag (codpntReceived);
+ codpnt = parseCODPNT();
+ peekCP = peekCodePoint();
+ }
+
+ // RECCNT will be skipped
+
+ if (!foundInPass)
+ doPrmnsprmSemantics (peekCP);
+
+ }
+ popCollectionStack();
+ checkRequiredObjects (svrcodReceived, codpntReceived);
+
+ netAgent_.setSvrcod (svrcod);
+ doValnsprmSemantics (codpnt, "\"\"");
+ }
+
+
+ // Conversational Protocol Error Reply Message
+ // indicates that a conversational protocol error occurred.
+ // PROTOCOL architects the SQLSTATE value depending on SVRCOD
+ // SVRCOD 8 -> SQLSTATE of 58008 or 58009
+ // SVRCOD 16,128 -> SQLSTATE of 58009
+ //
+ // Messages
+ // SQLSTATE : 58009
+ // Execution failed due to a distribution protocol error that caused deallocation of the conversation.
+ // SQLCODE : -30020
+ // Execution failed because of a Distributed Protocol
+ // Error that will affect the successful execution of subsequent
+ // commands and SQL statements: Reason Code <reason-code>.
+ // Some possible reason codes include:
+ // 121C Indicates that the user is not authorized to perform the requested command.
+ // 1232 The command could not be completed because of a permanent error.
+ // In most cases, the server will be in the process of an abend.
+ // 220A The target server has received an invalid data description.
+ // If a user SQLDA is specified, ensure that the fields are
+ // initialized correctly. Also, ensure that the length does not
+ // exceed the maximum allowed length for the data type being used.
+ //
+ // The command or statement cannot be processed. The current
+ // transaction is rolled back and the application is disconnected
+ // from the remote database.
+ //
+ //
+ // Returned from Server:
+ // SVRCOD - required (8 - ERROR, 16 - SEVERE, 128 - SESDMG)
+ // PRCCNVCD - required
+ // RECCNT - optional (MINVAL 0, MINLVL 3)
+ // RDBNAM - optional (NINLVL 3)
+ //
+ protected void parsePRCCNVRM () throws DisconnectException
+ {
+ boolean svrcodReceived = false;
+ int svrcod = CodePoint.SVRCOD_INFO;
+ boolean rdbnamReceived = false;
+ String rdbnam = null;
+ boolean prccnvcdReceived = false;
+ int prccnvcd = 0;
+
+ parseLengthAndMatchCodePoint (CodePoint.PRCCNVRM);
+ pushLengthOnCollectionStack();
+ int peekCP = peekCodePoint();
+
+ while (peekCP != Reply.END_OF_COLLECTION) {
+
+ boolean foundInPass = false;
+
+ if (peekCP == CodePoint.SVRCOD) {
+ foundInPass = true;
+ svrcodReceived = checkAndGetReceivedFlag (svrcodReceived);
+ svrcod = parseSVRCOD (CodePoint.SVRCOD_ERROR, CodePoint.SVRCOD_SESDMG);
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.RDBNAM) {
+ foundInPass = true;
+ rdbnamReceived = checkAndGetReceivedFlag (rdbnamReceived);
+ rdbnam = parseRDBNAM (true);
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.PRCCNVCD) {
+ foundInPass = true;
+ prccnvcdReceived = checkAndGetReceivedFlag (prccnvcdReceived);
+ prccnvcd = parsePRCCNVCD();
+ peekCP = peekCodePoint();
+ }
+
+ if (!foundInPass)
+ doPrmnsprmSemantics (peekCP);
+
+ }
+ popCollectionStack();
+ checkRequiredObjects (svrcodReceived, prccnvcdReceived);
+
+ netAgent_.setSvrcod (svrcod);
+ doPrccnvrmSemantics (CodePoint.PRCCNVRM);
+ }
+
+ // Object Not Supported Reply Message indicates that the target
+ // server does not recognize or support the object
+ // specified as data in an OBJDSS for the command associated
+ // with the object.
+ // The OBJNSPRM is also returned if an object is found in a
+ // valid collection in an OBJDSS (such as RECAL collection)
+ // that that is not valid for that collection.
+ // PROTOCOL Architects an SQLSTATE of 58015.
+ //
+ // Messages
+ // SQLSTATE : 58015
+ // The DDM object is not supported.
+ // SQLCODE : -30071
+ // <object-identifier> Object is not supported.
+ // The current transaction is rolled back and the application
+ // is disconnected from the remote database. The command
+ // cannot be processed.
+ //
+ //
+ // Returned from Server:
+ // SVRCOD - required (8 - ERROR, 16 - SEVERE)
+ // CODPNT - required
+ // RECCNT - optional (MINVAL 0) (will not be returned - should be ignored)
+ // RDBNAM - optional (MINLVL 3)
+ //
+ // Also called by NetPackageReply and NetStatementReply
+ void parseOBJNSPRM () throws DisconnectException
+ {
+ boolean svrcodReceived = false;
+ int svrcod = CodePoint.SVRCOD_INFO;
+ boolean rdbnamReceived = false;
+ String rdbnam = null;
+ boolean codpntReceived = false;
+ int codpnt = 0;
+
+ parseLengthAndMatchCodePoint (CodePoint.OBJNSPRM);
+ pushLengthOnCollectionStack();
+ int peekCP = peekCodePoint();
+
+ while (peekCP != Reply.END_OF_COLLECTION) {
+
+ boolean foundInPass = false;
+
+ if (peekCP == CodePoint.SVRCOD) {
+ foundInPass = true;
+ svrcodReceived = checkAndGetReceivedFlag (svrcodReceived);
+ svrcod = parseSVRCOD (CodePoint.SVRCOD_ERROR, CodePoint.SVRCOD_SEVERE);
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.RDBNAM) {
+ foundInPass = true;
+ rdbnamReceived = checkAndGetReceivedFlag (rdbnamReceived);
+ rdbnam = parseRDBNAM (true);
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.CODPNT) {
+ foundInPass = true;
+ codpntReceived = checkAndGetReceivedFlag (codpntReceived);
+ codpnt = parseCODPNT();
+ peekCP = peekCodePoint();
+ }
+
+ // skip the RECCNT
+
+ if (!foundInPass)
+ doPrmnsprmSemantics (peekCP);
+
+ }
+ popCollectionStack();
+ checkRequiredObjects (svrcodReceived, codpntReceived);
+
+ netAgent_.setSvrcod (svrcod);
+ doObjnsprmSemantics (codpnt);
+ }
+
+
+ // Manager-Level Conflict (MGRLVLRM) Reply Message indicates that
+ // the manager levels specified in the MGRLVLLS conflict amoung
+ // themselves or with previously specified manager levels.
+ // - The manager-level dependencies of one specified manager violates another
+ // specified maanger level.
+ // - The manager- level specified attempts to respecify a manager level that
+ // previously EXCSAT command specified.
+ // PROTOCOL architects an SQLSTATE of 58010.
+ //
+ // Messages
+ // SQLSTATE : 58010
+ // Execution failed due to a distributed protocol error that will affect
+ // the successful execution of subsequent DDM commands or SQL statements.
+ // SQLCODE : -30021
+ // Execution failed due to a distribution protocol error
+ // that will affect the successful execution of subsequent
+ // commands and SQL statements: Manager <manager> at Level <level>
+ // not supported.
+ //
+ // A system error occurred that prevented successful connection
+ // of the application to the remote database.
+ //
+ //
+ // Returned from Server:
+ // SVRCOD - required (8 - ERROR)
+ // MGRLVLLS - required
+ //
+ private void parseMGRLVLRM () throws DisconnectException
+ {
+ boolean svrcodReceived = false;
+ int svrcod = CodePoint.SVRCOD_INFO;
+ boolean mgrlvllsReceived = false;
+ int[] managerCodePoint = null;
+ int[] managerLevel = null;
+
+ parseLengthAndMatchCodePoint (CodePoint.MGRLVLRM);
+ pushLengthOnCollectionStack();
+ int peekCP = peekCodePoint();
+
+ while (peekCP != Reply.END_OF_COLLECTION) {
+
+ boolean foundInPass = false;
+
+ if (peekCP == CodePoint.SVRCOD) {
+ foundInPass = true;
+ svrcodReceived = checkAndGetReceivedFlag (svrcodReceived);
+ svrcod = parseSVRCOD (CodePoint.SVRCOD_ERROR, CodePoint.SVRCOD_ERROR);
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.MGRLVLLS) {
+ foundInPass = true;
+ mgrlvllsReceived = checkAndGetReceivedFlag (mgrlvllsReceived);
+
+ parseLengthAndMatchCodePoint (CodePoint.MGRLVLLS);
+ int managerListLength = getDdmLength();
+ if ((managerListLength == 0) || ((managerListLength % 7) != 0)) {
+ doSyntaxrmSemantics(CodePoint.SYNERRCD_OBJ_LEN_NOT_ALLOWED);
+ }
+
+ int managerCount = managerListLength / 7;
+ managerCodePoint = new int[managerCount];
+ managerLevel = new int[managerCount];
+ for (int i = 0; i < managerCount; i++) {
+ managerCodePoint[i] = parseCODPNTDR();
+ managerLevel[i] = parseMGRLVLN();
+ }
+ peekCP = peekCodePoint();
+ }
+
+
+ if (!foundInPass)
+ doPrmnsprmSemantics (peekCP);
+
+ }
+ popCollectionStack();
+ checkRequiredObjects (svrcodReceived, mgrlvllsReceived);
+
+ netAgent_.setSvrcod (svrcod);
+ doMgrlvlrmSemantics(managerCodePoint, managerLevel);
+ }
+
+
+ // Command Not Supported Reply Message indicates that the specified
+ // command is not recognized or not supported for the
+ // specified target. The reply message can be returned
+ // only in accordance with the architected rules for DDM subsetting.
+ // PROTOCOL architects an SQLSTATE of 58014.
+ //
+ // Messages
+ // SQLSTATE : 58014
+ // The DDM command is not supported.
+ // SQLCODE : -30070
+ // <command-identifier> Command is not supported.
+ // The current transaction is rolled back and the application is
+ // disconnected from the remote database. The statement cannot be processed.
+ //
+ //
+ // Returned from Server:
+ // SVRCOD - required (4 - WARNING, 8 - ERROR) (MINLVL 2)
+ // CODPNT - required
+ // RDBNAM - optional (MINLVL 3)
+ //
+ protected void parseCMDNSPRM () throws DisconnectException
+ {
+ boolean svrcodReceived = false;
+ int svrcod = CodePoint.SVRCOD_INFO;
+ boolean rdbnamReceived = false;
+ String rdbnam = null;
+ boolean srvdgnReceived = false;
+ byte[] srvdgn = null;
+ boolean codpntReceived = false;
+ int codpnt = 0;
+
+ parseLengthAndMatchCodePoint (CodePoint.CMDNSPRM);
+ pushLengthOnCollectionStack();
+ int peekCP = peekCodePoint();
+
+ while (peekCP != Reply.END_OF_COLLECTION) {
+
+ boolean foundInPass = false;
+
+ if (peekCP == CodePoint.SVRCOD) {
+ foundInPass = true;
+ svrcodReceived = checkAndGetReceivedFlag (svrcodReceived);
+ svrcod = parseSVRCOD (CodePoint.SVRCOD_WARNING, CodePoint.SVRCOD_ERROR);
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.RDBNAM) {
+ foundInPass = true;
+ rdbnamReceived = checkAndGetReceivedFlag (rdbnamReceived);
+ rdbnam = parseRDBNAM (true);
+ peekCP = peekCodePoint();
+ }
+
+
+ if (peekCP == CodePoint.CODPNT) {
+ foundInPass = true;
+ codpntReceived = checkAndGetReceivedFlag (codpntReceived);
+ codpnt = parseCODPNT();
+ peekCP = peekCodePoint();
+ }
+
+ if (!foundInPass)
+ doPrmnsprmSemantics (peekCP);
+
+ }
+ popCollectionStack();
+ checkRequiredObjects (svrcodReceived, codpntReceived);
+
+ netAgent_.setSvrcod (svrcod);
+ agent_.accumulateChainBreakingReadExceptionAndThrow (new DisconnectException (
+ agent_,
+ "The DDM command is not supported. " +
+ "Unsupported DDM command code point: " +
+ "0x" + Integer.toHexString (codpnt),
+ SqlState._58014));
+ }
+
+ // Abnormal End Unit of Work Condition Reply Message indicates
+ // that the current unit of work ended abnormally because
+ // of some action at the target server. This can be caused by a
+ // deadlock resolution, operator intervention, or some similar
+ // situation that caused the relational database to rollback
+ // the current unit of work. This reply message is returned only
+ // if an SQLAM issues the command. Whenever an ABNUOWRM is returned
+ // in response to a command, an SQLCARD object must also be returned
+ // following the ABNUOWRM. The SQLSTATE is returned in the SQLCARD.
+ //
+ // Returned from Server:
+ // SVRCOD - required (8 - ERROR)
+ // RDBNAM - required
+ //
+ // Called by all the NET*Reply classes.
+ void parseABNUOWRM (ConnectionCallbackInterface connection) throws DisconnectException
+ {
+ boolean svrcodReceived = false;
+ int svrcod = CodePoint.SVRCOD_INFO;
+ boolean rdbnamReceived = false;
+ String rdbnam = null;
+
+ parseLengthAndMatchCodePoint (CodePoint.ABNUOWRM);
+ pushLengthOnCollectionStack();
+ int peekCP = peekCodePoint();
+
+ while (peekCP != Reply.END_OF_COLLECTION) {
+
+ boolean foundInPass = false;
+
+ if (peekCP == CodePoint.SVRCOD) {
+ foundInPass = true;
+ svrcodReceived = checkAndGetReceivedFlag (svrcodReceived);
+ svrcod = parseSVRCOD (CodePoint.SVRCOD_ERROR, CodePoint.SVRCOD_ERROR);
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.RDBNAM) {
+ // skip the rbbnam since it doesn't tell us anything new.
+ // there is no way to return it to the application anyway.
+ // not having to convert this to a string is a time saver also.
+ foundInPass = true;
+ rdbnamReceived = checkAndGetReceivedFlag (rdbnamReceived);
+ rdbnam = parseRDBNAM (true);
+ peekCP = peekCodePoint();
+ }
+
+ if (!foundInPass)
+ doPrmnsprmSemantics (peekCP);
+ }
+
+ popCollectionStack();
+ checkRequiredObjects (svrcodReceived, rdbnamReceived);
+
+ // the abnuowrm has been received, do whatever state changes are necessary
+ netAgent_.setSvrcod (svrcod);
+ connection.completeAbnormalUnitOfWork();
+
+ }
+
+ //--------------------- parse DDM Reply Data--------------------------------------
+
+ // The Server Attributes Reply Data (EXCSATRD) returns the following
+ // information in response to an EXCSAT command:
+ // - the target server's class name
+ // - the target server's support level for each class of manager
+ // the source requests
+ // - the target server's product release level
+ // - the target server's external name
+ // - the target server's name
+ //
+ // Returned from Server:
+ // EXTNAM - optional
+ // MGRLVLLS - optional
+ // SRVCLSNM - optional
+ // SRVNAM - optional
+ // SRVRLSLV - optional
+ private void parseEXCSATRD (NetConnection netConnection) throws DisconnectException
+ {
+ boolean extnamReceived = false;
+ String extnam = null;
+ boolean mgrlvllsReceived = false;
+ boolean srvclsnmReceived = false;
+ String srvclsnm = null;
+ boolean srvnamReceived = false;
+ String srvnam = null;
+ boolean srvrlslvReceived = false;
+ String srvrlslv = null;
+
+ parseLengthAndMatchCodePoint (CodePoint.EXCSATRD);
+ pushLengthOnCollectionStack();
+ int peekCP = peekCodePoint();
+
+ while (peekCP != Reply.END_OF_COLLECTION) {
+
+ boolean foundInPass = false;
+
+ if (peekCP == CodePoint.EXTNAM) {
+ // External Name is the name of the job, task, or process
+ // on a system for which a DDM server is active. For a target
+ // DDM server, the external name is the name of the job the system creates
+ // or activates to run the DDM server.
+ // No semantic meaning is assigned to external names in DDM.
+ // External names are transmitted to aid in problem determination.
+ // This driver will save the external name of the target (the
+ // driver may use it for logging purposes later).
+ foundInPass = true;
+ extnamReceived = checkAndGetReceivedFlag (extnamReceived);
+ extnam = parseEXTNAM();
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.MGRLVLLS) {
+ // Manager-Level List
+ // specifies a list of code points and support levels for the
+ // classes of managers a server supports
+ foundInPass = true;
+ mgrlvllsReceived = checkAndGetReceivedFlag (mgrlvllsReceived);
+ parseMGRLVLLS (netConnection); // need to review this one, check input and output
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.SRVCLSNM) {
+ // Server Class Name
+ // specifies the name of a class of ddm servers.
+ foundInPass = true;
+ srvclsnmReceived = checkAndGetReceivedFlag (srvclsnmReceived);
+ srvclsnm = parseSRVCLSNM();
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.SRVNAM) {
+ // Server Name
+ // no semantic meaning is assigned to server names in DDM,
+ // it is recommended (by the DDM manual) that the server's
+ // physical or logical location identifier be used as a server name.
+ // server names are transmitted for problem determination purposes.
+ // this driver will save this name and in the future may use it
+ // for logging errors.
+ foundInPass = true;
+ srvnamReceived = checkAndGetReceivedFlag (srvnamReceived);
+ srvnam = parseSRVNAM();
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.SRVRLSLV) {
+ // Server Product Release Level
+ // specifies the procuct release level of a ddm server.
+ // the contents are unarchitected.
+ // this driver will save this information and in the future may
+ // use it for logging purposes.
+ foundInPass = true;
+ srvrlslvReceived = checkAndGetReceivedFlag (srvrlslvReceived);
+ srvrlslv = parseSRVRLSLV();
+ peekCP = peekCodePoint();
+ }
+
+ if (!foundInPass)
+ doPrmnsprmSemantics (peekCP);
+
+ }
+ popCollectionStack();
+ // according the the DDM book, all these instance variables are optional
+ netConnection.setServerAttributeData (extnam, srvclsnm, srvnam, srvrlslv);
+ }
+
+ // Must make a version that does not change state in the associated connection
+ private void parseDummyEXCSATRD (NetConnection netConnection) throws DisconnectException
+ {
+ boolean extnamReceived = false;
+ String extnam = null;
+ boolean mgrlvllsReceived = false;
+ boolean srvclsnmReceived = false;
+ String srvclsnm = null;
+ boolean srvnamReceived = false;
+ String srvnam = null;
+ boolean srvrlslvReceived = false;
+ String srvrlslv = null;
+
+ parseLengthAndMatchCodePoint (CodePoint.EXCSATRD);
+ pushLengthOnCollectionStack();
+ int peekCP = peekCodePoint();
+
+ while (peekCP != Reply.END_OF_COLLECTION) {
+
+ boolean foundInPass = false;
+
+ if (peekCP == CodePoint.EXTNAM) {
+ // External Name is the name of the job, task, or process
+ // on a system for which a DDM server is active. For a target
+ // DDM server, the external name is the name of the job the system creates
+ // or activates to run the DDM server.
+ // No semantic meaning is assigned to external names in DDM.
+ // External names are transmitted to aid in problem determination.
+ // This driver will save the external name of the target (the
+ // driver may use it for logging purposes later).
+ foundInPass = true;
+ extnamReceived = checkAndGetReceivedFlag (extnamReceived);
+ extnam = parseEXTNAM();
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.MGRLVLLS) {
+ // Manager-Level List
+ // specifies a list of code points and support levels for the
+ // classes of managers a server supports
+ foundInPass = true;
+ mgrlvllsReceived = checkAndGetReceivedFlag (mgrlvllsReceived);
+ parseMGRLVLLS (netConnection); // need to review this one, check input and output
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.SRVCLSNM) {
+ // Server Class Name
+ // specifies the name of a class of ddm servers.
+ foundInPass = true;
+ srvclsnmReceived = checkAndGetReceivedFlag (srvclsnmReceived);
+ srvclsnm = parseSRVCLSNM();
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.SRVNAM) {
+ // Server Name
+ // no semantic meaning is assigned to server names in DDM,
+ // it is recommended (by the DDM manual) that the server's
+ // physical or logical location identifier be used as a server name.
+ // server names are transmitted for problem determination purposes.
+ // this driver will save this name and in the future may use it
+ // for logging errors.
+ foundInPass = true;
+ srvnamReceived = checkAndGetReceivedFlag (srvnamReceived);
+ srvnam = parseSRVNAM();
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.SRVRLSLV) {
+ // Server Product Release Level
+ // specifies the procuct release level of a ddm server.
+ // the contents are unarchitected.
+ // this driver will save this information and in the future may
+ // use it for logging purposes.
+ foundInPass = true;
+ srvrlslvReceived = checkAndGetReceivedFlag (srvrlslvReceived);
+ srvrlslv = parseSRVRLSLV();
+ peekCP = peekCodePoint();
+ }
+
+ if (!foundInPass)
+ doPrmnsprmSemantics (peekCP);
+
+ }
+ popCollectionStack();
+ // according the the DDM book, all these instance variables are optional
+ // don't change state of netConnection because this is a DUMMY flow
+ //netConnection.setServerAttributeData (extnam, srvclsnm, srvnam, srvrlslv);
+ }
+
+ // The Access Security Reply Data (ACSECRD) Collection Object contains
+ // the security information from a target server's security manager.
+ // this method returns the security check code received from the server
+ // (if the server does not return a security check code, this method
+ // will return 0). it is up to the caller to check
+ // the value of this return code and take the appropriate action.
+ //
+ // Returned from Server:
+ // SECMEC - required
+ // SECTKN - optional (MINLVL 6)
+ // SECCHKCD - optional
+ private void parseACCSECRD (NetConnection netConnection, int securityMechanism) throws DisconnectException
+ {
+ boolean secmecReceived = false;
+ int[] secmecList = null;
+ boolean sectknReceived = false;
+ byte[] sectkn = null;
+ boolean secchkcdReceived = false;
+ int secchkcd = 0;
+
+ parseLengthAndMatchCodePoint (CodePoint.ACCSECRD);
+ pushLengthOnCollectionStack();
+ int peekCP = peekCodePoint();
+
+ while (peekCP != Reply.END_OF_COLLECTION) {
+
+ boolean foundInPass = false;
+
+ if (peekCP == CodePoint.SECMEC) {
+ // security mechanism.
+ // this value must either reflect the value sent in the ACCSEC command
+ // if the target server supports it; or the values the target server
+ // does support when it does not support or accept the value
+ // requested by the source server.
+ // the secmecs returned are treated as a list and stored in
+ // targetSecmec_List.
+ // if the target server supports the source's secmec, it
+ // will be saved in the variable targetSecmec_ (NOTE: so
+ // after calling this method, if targetSecmec_'s value is zero,
+ // then the target did NOT support the source secmec. any alternate
+ // secmecs would be contained in targetSecmec_List).
+ foundInPass = true;
+ secmecReceived = checkAndGetReceivedFlag (secmecReceived);
+ secmecList = parseSECMEC();
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.SECTKN) {
+ // security token
+ foundInPass = true;
+ sectknReceived = checkAndGetReceivedFlag (sectknReceived);
+ sectkn = parseSECTKN (false);
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.SECCHKCD) {
+ // security check code.
+ // included if and only if an error is detected when processing
+ // the ACCSEC command. this has an implied severity code
+ // of ERROR.
+ foundInPass = true;
+ secchkcdReceived = checkAndGetReceivedFlag (secchkcdReceived);
+ secchkcd = parseSECCHKCD();
+ peekCP = peekCodePoint();
+ }
+
+ if (!foundInPass)
+ doPrmnsprmSemantics (peekCP);
+ }
+ popCollectionStack();
+ checkRequiredObjects (secmecReceived);
+
+ netConnection.setAccessSecurityData(secchkcd,
+ securityMechanism,
+ secmecList,
+ sectknReceived,
+ sectkn);
+ }
+
+ // Called by all the NET*Reply classes.
+ void parseTYPDEFNAM () throws DisconnectException
+ {
+ parseLengthAndMatchCodePoint (CodePoint.TYPDEFNAM);
+ netAgent_.targetTypdef_.setTypdefnam (readString());
+ }
+
+ // Called by all the NET*Reply classes.
+ void parseTYPDEFOVR () throws DisconnectException
+ {
+ parseLengthAndMatchCodePoint (CodePoint.TYPDEFOVR);
+ pushLengthOnCollectionStack();
+ int peekCP = peekCodePoint();
+
+ while (peekCP != Reply.END_OF_COLLECTION) {
+
+ boolean foundInPass = false;
+
+ if (peekCP == CodePoint.CCSIDSBC) {
+ foundInPass = true;
+ netAgent_.targetTypdef_.setCcsidSbc (parseCCSIDSBC());
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.CCSIDDBC) {
+ foundInPass = true;
+ netAgent_.targetTypdef_.setCcsidDbc (parseCCSIDDBC());
+ peekCP = peekCodePoint();
+ }
+
+ if (peekCP == CodePoint.CCSIDMBC) {
+ foundInPass = true;
+ netAgent_.targetTypdef_.setCcsidMbc (parseCCSIDMBC());
+ peekCP = peekCodePoint();
+ }
+
+ if (!foundInPass)
+ doPrmnsprmSemantics (peekCP);
+
+ }
+ popCollectionStack();
+ }
+
+
+ // The SYNCCRD Reply Mesage
+ //
+ // Returned from Server:
+ // XARETVAL - required
+ int parseSYNCCRD (ConnectionCallbackInterface connection) throws DisconnectException
+ {
+ return 0;
+ }
+
+ // Process XA return value
+ protected int parseXARETVAL() throws DisconnectException
+ {
+ return 0;
+ }
+
+ // Process XA return value
+ protected byte parseSYNCTYPE() throws DisconnectException
+ {
+ return 0;
+ }
+
+ // This method handles the parsing of all command replies and reply data
+ // for the SYNCCTL command.
+ protected int parseSYNCCTLreply (ConnectionCallbackInterface connection) throws DisconnectException
+ {
+ return 0;
+ }
+
+ // Called by the XA commit and rollback parse reply methods.
+ void parseSYNCCTLError (int peekCP) throws DisconnectException
+ {
+ switch (peekCP) {
+ case CodePoint.CMDCHKRM:
+ parseCMDCHKRM();
+ break;
+ case CodePoint.PRCCNVRM:
+ parsePRCCNVRM();
+ break;
+ case CodePoint.SYNTAXRM:
+ parseSYNTAXRM();
+ break;
+ case CodePoint.VALNSPRM:
+ parseVALNSPRM();
+ break;
+ default:
+ doObjnsprmSemantics (peekCP);
+ }
+ }
+
+
+
+
+ // Manager-Level List.
+ // Specifies a list of code points and support levels for the
+ // classes of managers a server supports.
+ // The target server must not provide information for any target
+ // managers unless the source explicitly requests it.
+ // For each manager class, if the target server's support level
+ // is greater than or equal to the source server's level, then the source
+ // server's level is returned for that class if the target server can operate
+ // at the source's level; otherwise a level 0 is returned. If the target
+ // server's support level is less than the source server's level, the
+ // target server's level is returned for that class. If the target server
+ // does not recognize the code point of a manager class or does not support
+ // that class, it returns a level of 0. The target server then waits
+ // for the next command or for the source server to terminate communications.
+ // When the source server receives EXCSATRD, it must compare each of the entries
+ // in the mgrlvlls parameter it received to the corresponding entries in the mgrlvlls
+ // parameter it sent. If any level mismatches, the source server must decide
+ // whether it can use or adjust to the lower level of target support for that manager
+ // class. There are no architectural criteria for making this decision.
+ // The source server can terminate communications or continue at the target
+ // servers level of support. It can also attempt to use whatever
+ // commands its user requests while receiving eror reply messages for real
+ // functional mismatches.
+ // The manager levels the source server specifies or the target server
+ // returns must be compatible with the manager-level dependencies of the specified
+ // manangers. Incompatible manager levels cannot be specified.
+ // After this method successfully returns, the targetXXXX values (where XXXX
+ // represents a manager name. example targetAgent) contain the negotiated
+ // manager levels for this particular connection.
+ private void parseMGRLVLLS (NetConnection netConnection) throws DisconnectException
+ {
+ parseLengthAndMatchCodePoint (CodePoint.MGRLVLLS);
+
+ // each manager class and level is 4 bytes long.
+ // get the length of the mgrlvls bytes, make sure it contains
+ // the correct number of bytes for a mgrlvlls object, and calculate
+ // the number of manager's returned from the server.
+ int managerListLength = getDdmLength();
+ if ((managerListLength == 0) || ((managerListLength % 4) != 0))
+ doSyntaxrmSemantics(CodePoint.SYNERRCD_OBJ_LEN_NOT_ALLOWED);
+ int managerCount = managerListLength / 4;
+
+ // the managerCount should be equal to the same number of
+ // managers sent on the excsat.
+
+ // read each of the manager levels returned from the server.
+ for (int i = 0; i < managerCount; i++) {
+
+ // first two byte are the manager's codepoint, next two bytes are the level.
+ int managerCodePoint = parseCODPNTDR();
+ int managerLevel = parseMGRLVLN();
+
+ // check each manager to make sure levels are within proper limits
+ // for this driver. Also make sure unexpected managers are not returned.
+ switch (managerCodePoint) {
+
+ case CodePoint.AGENT:
+ if ((managerLevel < NetConfiguration.MIN_AGENT_MGRLVL) ||
+ (managerLevel > netConnection.targetAgent_)) {
+ doMgrlvlrmSemantics (managerCodePoint, managerLevel);
+ }
+ netConnection.targetAgent_ = managerLevel;
+ break;
+
+ case CodePoint.CMNTCPIP:
+ if ((managerLevel < NetConfiguration.MIN_CMNTCPIP_MGRLVL) ||
+ (managerLevel > netConnection.targetCmntcpip_)) {
+ doMgrlvlrmSemantics (managerCodePoint, managerLevel);
+ }
+ netConnection.targetCmntcpip_ = managerLevel;
+ break;
+
+ case CodePoint.RDB:
+ if ((managerLevel < NetConfiguration.MIN_RDB_MGRLVL) ||
+ (managerLevel > netConnection.targetRdb_)) {
+ doMgrlvlrmSemantics (managerCodePoint, managerLevel);
+ }
+ netConnection.targetRdb_ = managerLevel;
+ break;
+
+ case CodePoint.SECMGR:
+ if ((managerLevel < NetConfiguration.MIN_SECMGR_MGRLVL) ||
+ (managerLevel > netConnection.targetSecmgr_)) {
+ doMgrlvlrmSemantics (managerCodePoint, managerLevel);
+ }
+ netConnection.targetSecmgr_ = managerLevel;
+ break;
+
+ case CodePoint.SQLAM:
+ if ((managerLevel < NetConfiguration.MIN_SQLAM_MGRLVL) ||
+ (managerLevel > netAgent_.targetSqlam_)) {
+ doMgrlvlrmSemantics (managerCodePoint, managerLevel);
+ }
+ netAgent_.orignalTargetSqlam_ = managerLevel;
+ break;
+
+ case CodePoint.CMNAPPC:
+ if ((managerLevel < NetConfiguration.MIN_CMNAPPC_MGRLVL) ||
+ (managerLevel > netConnection.targetCmnappc_)) {
+ doMgrlvlrmSemantics (managerCodePoint, managerLevel);
+ }
+ netConnection.targetCmnappc_ = managerLevel;
+ break;
+
+ case CodePoint.XAMGR:
+ if ((managerLevel != 0) &&
+ (managerLevel < NetConfiguration.MIN_XAMGR_MGRLVL) ||
+ (managerLevel > netConnection.targetXamgr_)) {
+ doMgrlvlrmSemantics (managerCodePoint, managerLevel);
+ }
+ netConnection.targetXamgr_ = managerLevel;
+ break;
+
+ case CodePoint.SYNCPTMGR:
+ if ((managerLevel != 0) &&
+ (managerLevel < NetConfiguration.MIN_SYNCPTMGR_MGRLVL) ||
+ (managerLevel > netConnection.targetSyncptmgr_)) {
+ doMgrlvlrmSemantics (managerCodePoint, managerLevel);
+ }
+ netConnection.targetSyncptmgr_ = managerLevel;
+ break;
+
+ case CodePoint.RSYNCMGR:
+ if ((managerLevel != 0) &&
+ (managerLevel < NetConfiguration.MIN_RSYNCMGR_MGRLVL) ||
+ (managerLevel > netConnection.targetRsyncmgr_)) {
+ doMgrlvlrmSemantics (managerCodePoint, managerLevel);
+ }
+ netConnection.targetRsyncmgr_ = managerLevel;
+ break;
+ // The target server must not provide information for any target managers
+ // unless the source explicitly requests. The following managers are never requested.
+ default:
+ doMgrlvlrmSemantics (managerCodePoint,managerLevel);
+ break;
+ }
+ }
+ }
+
+ // The External Name is the name of the job, task, or process on a
+ // system for which a DDM server is active. On a source DDM server,
+ // the external name is the name of the job that is requesting
+ // access to remote resources. For a target DDM server,
+ // the external name is the name of the job the system
+ // creates or activates to run the DDM server.
+ // No semantic meaning is assigned to external names in DDM.
+ // External names are transmitted to aid in problem determination.
+ protected String parseEXTNAM () throws DisconnectException
+ {
+ parseLengthAndMatchCodePoint (CodePoint.EXTNAM);
+ return readString();
+ }
+
+ // Server Class name specifies the name of a class of DDM servers.
+ // Server class names are assigned for each product involved in PROTOCOL.
+ protected String parseSRVCLSNM () throws DisconnectException
+ {
+ parseLengthAndMatchCodePoint (CodePoint.SRVCLSNM);
+ return readString();
+ }
+
+ // Server Name is the name of the DDM server.
+ // No semantic meaning is assigned to server names in DDM,
+ // but it is recommended that the server names are transmitted
+ // for problem determination.
+ protected String parseSRVNAM () throws DisconnectException
+ {
+ parseLengthAndMatchCodePoint (CodePoint.SRVNAM);
+ return readString();
+ }
+
+ // Server Product Release Level String specifies the product
+ // release level of a DDM server. The contents of the
+ // parameter are unarchitected. Up to 255 bytes can be sent.
+ // SRVRLSLV should not be used in place of product-defined
+ // extensions to carry information not related to the products
+ // release level.
+ protected String parseSRVRLSLV () throws DisconnectException
+ {
+ parseLengthAndMatchCodePoint (CodePoint.SRVRLSLV);
+ return readString();
+ }
+
+ // Manager-Level Number Attribute Binary Integer Number specifies
+ // the level of a defined DDM manager.
+ protected int parseMGRLVLN () throws DisconnectException
+ {
+ return readUnsignedShort();
+ }
+
+ // Security Mechanims.
+ protected int[] parseSECMEC() throws DisconnectException
+ {
+ parseLengthAndMatchCodePoint (CodePoint.SECMEC);
+ return readUnsignedShortList();
+ }
+
+ // The Security Token Byte String is information provided and used
+ // by the various security mechanisms.
+ protected byte[] parseSECTKN (boolean skip) throws DisconnectException
+ {
+ parseLengthAndMatchCodePoint (CodePoint.SECTKN);
+ if (skip) {
+ skipBytes();
+ return null;
+ }
+ return readBytes();
+ }
+
+
+ // The Security Check Code String codifies the security information
+ // and condition for the SECCHKRM.
+ protected int parseSECCHKCD() throws DisconnectException
+ {
+ parseLengthAndMatchCodePoint (CodePoint.SECCHKCD);
+ int secchkcd = readUnsignedByte();
+ if ((secchkcd < CodePoint.SECCHKCD_00) || (secchkcd > CodePoint.SECCHKCD_15))
+ doValnsprmSemantics (CodePoint.SECCHKCD, secchkcd);
+ return secchkcd;
+ }
+
+ // Product specific Identifier specifies the product release level
+ // of a DDM server.
+ protected String parsePRDID (boolean skip) throws DisconnectException
+ {
+ parseLengthAndMatchCodePoint (CodePoint.PRDID);
+ if (skip) {
+ skipBytes();
+ return null;
+ }
+ else return readString();
+ }
+
+ // The User Id specifies an end-user name.
+ protected String parseUSRID (boolean skip) throws DisconnectException
+ {
+ parseLengthAndMatchCodePoint (CodePoint.USRID);
+ if (skip) {
+ skipBytes();
+ return null;
+ }
+ return readString();
+ };
+
+ // Code Point Data Representation specifies the data representation
+ // of a dictionary codepoint. Code points are hexadecimal aliases for DDM
+ // named terms.
+ protected int parseCODPNTDR () throws DisconnectException
+ {
+ return readUnsignedShort();
+ }
+
+ // Correlation Token specifies a token that is conveyed between source
+ // and target servers for correlating the processing between servers.
+ protected byte[] parseCRRTKN (boolean skip) throws DisconnectException
+ {
+ parseLengthAndMatchCodePoint (CodePoint.CRRTKN);
+ if (skip) {
+ skipBytes();
+ return null;
+ }
+ return readBytes();
+ }
+
+ // Unit of Work Disposition Scalar Object specifies the disposition of the
+ // last unit of work.
+ protected int parseUOWDSP() throws DisconnectException
+ {
+ parseLengthAndMatchCodePoint (CodePoint.UOWDSP);
+ int uowdsp = readUnsignedByte();
+ if ((uowdsp != CodePoint.UOWDSP_COMMIT) && (uowdsp != CodePoint.UOWDSP_ROLLBACK))
+ doValnsprmSemantics (CodePoint.UOWDSP, uowdsp);
+ return uowdsp;
+ }
+
+
+ // Relational Database Name specifies the name of a relational
+ // database of the server. A server can have more than one RDB.
+ protected String parseRDBNAM (boolean skip) throws DisconnectException
+ {
+ parseLengthAndMatchCodePoint (CodePoint.RDBNAM);
+ if (skip) {
+ skipBytes();
+ return null;
+ }
+ return readString();
+ };
+
+
+
+ protected int parseXIDCNT () throws DisconnectException
+ {
+ parseLengthAndMatchCodePoint (CodePoint.XIDCNT);
+ return readUnsignedShort();
+ }
+
+ protected Xid parseXID () throws DisconnectException
+ {
+ return null;
+ }
+
+ protected java.util.Hashtable parseIndoubtList() throws DisconnectException
+ {
+ return null;
+ }
+
+
+
+ // Syntax Error Code String specifies the condition that caused termination
+ // of data stream parsing.
+ protected int parseSYNERRCD() throws DisconnectException
+ {
+ parseLengthAndMatchCodePoint (CodePoint.SYNERRCD);
+ int synerrcd = readUnsignedByte();
+ if ((synerrcd < 0x01) || (synerrcd > 0x1D))
+ doValnsprmSemantics (CodePoint.SYNERRCD, synerrcd);
+ return synerrcd;
+ }
+
+ // The Code Point Data specifies a scalar value that is an architected code point.
+ protected int parseCODPNT () throws DisconnectException
+ {
+ parseLengthAndMatchCodePoint (CodePoint.CODPNT);
+ return parseCODPNTDR();
+ }
+
+ // Conversational Protocol Error Code specifies the condition
+ // for which the PRCCNVRm was returned.
+ protected int parsePRCCNVCD() throws DisconnectException
+ {
+ parseLengthAndMatchCodePoint (CodePoint.PRCCNVCD);
+ int prccnvcd = readUnsignedByte();
+ if ((prccnvcd != 0x01) && (prccnvcd != 0x02) && (prccnvcd != 0x03) &&
+ (prccnvcd != 0x04) && (prccnvcd != 0x05) && (prccnvcd != 0x06) &&
+ (prccnvcd != 0x10) && (prccnvcd != 0x11) && (prccnvcd != 0x12) &&
+ (prccnvcd != 0x13) && (prccnvcd != 0x15))
+ doValnsprmSemantics (CodePoint.PRCCNVCD, prccnvcd);
+ return prccnvcd;
+ }
+
+ // CCSID for Single-Byte Characters specifies a coded character
+ // set identifier for single-byte characters.
+ protected int parseCCSIDSBC() throws DisconnectException
+ {
+ parseLengthAndMatchCodePoint (CodePoint.CCSIDSBC);
+ return readUnsignedShort();
+ }
+
+ // CCSID for Mixed-Byte Characters specifies a coded character
+ // set identifier for mixed-byte characters.
+ protected int parseCCSIDMBC() throws DisconnectException
+ {
+ parseLengthAndMatchCodePoint (CodePoint.CCSIDMBC);
[... 847 lines stripped ...]