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 jb...@apache.org on 2005/05/02 08:26:03 UTC
svn commit: r165585 [27/42] - in
/incubator/derby/code/trunk/java/client/org/apache/derby: client/
client/am/ client/net/ client/resources/ jdbc/
Modified: 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=165585&r1=165584&r2=165585&view=diff
==============================================================================
--- incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetConnectionReply.java (original)
+++ incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetConnectionReply.java Sun May 1 23:25:59 2005
@@ -20,3352 +20,3262 @@
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 javax.transaction.xa.Xid;
+
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.*;
+import org.apache.derby.client.am.DisconnectException;
+import org.apache.derby.client.am.SqlException;
+import org.apache.derby.client.am.SqlState;
+import org.apache.derby.client.am.Sqlca;
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();
- }
+ 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 (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 (codept == CodePoint.ACCRDBRM) {
+ int peekCP = peekCodePoint();
+ if (peekCP == Reply.END_OF_SAME_ID_CHAIN) {
+ return;
+ }
+
+ parseTypdefsOrMgrlvlovrs();
+ NetSqlca netSqlca = parseSQLCARD(null);
+ netAgent_.netConnection_.completeSqlca(netSqlca);
+ }
+ }
- 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();
- }
+ void parseConnectError() throws DisconnectException {
+ int peekCP = peekCodePoint();
+ switch (peekCP) {
+ case CodePoint.CMDCHKRM:
+ parseCMDCHKRM();
+ break;
+ case CodePoint.MGRLVLRM:
+ parseMGRLVLRM();
+ break;
+ default:
+ parseCommonError(peekCP);
+ }
+ }
- if (!foundInPass)
- doPrmnsprmSemantics (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_();
}
- 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();
- }
+ // NET only entry point
+ void readSecurityCheck(Connection connection) throws SqlException {
+ startSameIdChainParse();
+ parseSECCHKreply((NetConnection) connection);
+ endOfSameIdChainData();
+ agent_.checkForChainBreakingException_();
+ }
- 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();
- }
+ // NET only entry point
+ void readAccessDatabase(Connection connection) throws SqlException {
+ startSameIdChainParse();
+ parseACCRDBreply((NetConnection) connection);
+ endOfSameIdChainData();
+ agent_.checkForChainBreakingException_();
+ }
- 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();
- }
+ public void readCommitSubstitute(ConnectionCallbackInterface connection) throws DisconnectException {
+ startSameIdChainParse();
+ parseDummyEXCSATreply((NetConnection) connection);
+ endOfSameIdChainData();
+ }
+ public void readLocalCommit(ConnectionCallbackInterface connection) throws DisconnectException {
+ startSameIdChainParse();
+ parseRDBCMMreply(connection);
+ endOfSameIdChainData();
+ }
- 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();
- }
+ public void readLocalRollback(ConnectionCallbackInterface connection) throws DisconnectException {
+ startSameIdChainParse();
+ parseRDBRLLBCKreply(connection);
+ endOfSameIdChainData();
+ }
- 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();
- }
+ public void readLocalXAStart(ConnectionCallbackInterface connection) throws DisconnectException {
+ }
- if (!foundInPass)
- doPrmnsprmSemantics (peekCP);
+ public void readLocalXACommit(ConnectionCallbackInterface connection) throws DisconnectException {
}
- popCollectionStack();
- // check for the required instance variables.
- checkRequiredObjects (svrcodReceived,
- prdidReceived,
- typdefnamReceived,
- typdefovrReceived);
-
- netConnection.rdbAccessed(svrcod,
- prdid,
- crrtknReceived,
- crrtkn);
- }
+ public void readLocalXARollback(ConnectionCallbackInterface connection) throws DisconnectException {
+ }
- // 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();
- }
+ protected void readXaStartUnitOfWork(NetConnection conn) throws DisconnectException {
+ }
- if (peekCP == CodePoint.UOWDSP) {
- foundInPass = true;
- uowdspReceived = checkAndGetReceivedFlag (uowdspReceived);
- uowdsp = parseUOWDSP();
- peekCP = peekCodePoint();
- }
+ protected int readXaEndUnitOfWork(NetConnection conn) throws DisconnectException {
+ return 0;
+ }
- if (peekCP == CodePoint.RDBNAM) {
- foundInPass = true;
- rdbnamReceived = checkAndGetReceivedFlag (rdbnamReceived);
- rdbnam = parseRDBNAM (true);
- peekCP = peekCodePoint();
- }
+ protected int readXaPrepare(NetConnection conn) throws DisconnectException {
+ return 0;
+ }
+ protected void readXaCommit(NetConnection conn) throws DisconnectException {
+ }
- if (!foundInPass)
- doPrmnsprmSemantics (peekCP);
+ protected int readXaRollback(NetConnection conn) throws DisconnectException {
+ return 0;
}
- 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();
- }
+ protected void readXaRecover(NetConnection conn) throws DisconnectException {
+ }
- 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.
+ protected void readXaForget(NetConnection conn) throws DisconnectException {
+ }
- if (peekCP == 0x115C) {
- foundInPass = true;
- parseLengthAndMatchCodePoint (0x115C);
- skipBytes();
- peekCP = peekCodePoint();
- }
- if (!foundInPass)
- doPrmnsprmSemantics (peekCP);
+ //------------------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);
}
- 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();
- }
+ // 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;
+ }
- if (peekCP == CodePoint.RDBNAM) {
- foundInPass = true;
- rdbnamReceived = checkAndGetReceivedFlag (rdbnamReceived);
- rdbnam = parseRDBNAM (true);
- peekCP = peekCodePoint();
- }
+ parseENDUOWRM(connection);
+ peekCP = parseTypdefsOrMgrlvlovrs();
- if (!foundInPass)
- doPrmnsprmSemantics (peekCP);
+ 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);
}
- 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();
- }
+ // 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);
- if (peekCP == CodePoint.RDBNAM) {
- foundInPass = true;
- rdbnamReceived = checkAndGetReceivedFlag (rdbnamReceived);
- rdbnam = parseRDBNAM (true);
peekCP = peekCodePoint();
- }
+ if (peekCP == Reply.END_OF_SAME_ID_CHAIN) {
+ return;
+ }
+ }
- if (!foundInPass)
- doPrmnsprmSemantics (peekCP);
+ // 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);
+ }
}
- 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);
+ // 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);
+ }
- if (!foundInPass)
- doPrmnsprmSemantics (peekCP);
+ 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;
+ }
+ }
}
- 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();
- }
+ //-----------------------------parse DDM Reply Messages-----------------------
- if (peekCP == CodePoint.RDBNAM) {
- foundInPass = true;
- rdbnamReceived = checkAndGetReceivedFlag (rdbnamReceived);
- rdbnam = parseRDBNAM (true);
- peekCP = peekCodePoint();
- }
+ 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;
+ }
+ }
- if (peekCP == CodePoint.CODPNT) {
- foundInPass = true;
- codpntReceived = checkAndGetReceivedFlag (codpntReceived);
- codpnt = parseCODPNT();
- peekCP = peekCodePoint();
- }
+ void parseRollbackError() throws DisconnectException {
+ int peekCP = peekCodePoint();
+ switch (peekCP) {
+ case CodePoint.CMDCHKRM:
+ parseCMDCHKRM();
+ break;
+ case CodePoint.RDBNACRM:
+ parseRDBNACRM();
+ break;
+ default:
+ parseCommonError(peekCP);
+ break;
+ }
+ }
- // RECCNT will be skipped.
+ void parseExchangeServerAttributesError() throws DisconnectException {
+ int peekCP = peekCodePoint();
+ switch (peekCP) {
+ case CodePoint.CMDCHKRM:
+ parseCMDCHKRM();
+ break;
+ case CodePoint.MGRLVLRM:
+ parseMGRLVLRM();
+ break;
+ default:
+ parseCommonError(peekCP);
+ }
+ }
- if (!foundInPass)
- doPrmnsprmSemantics (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);
+ }
}
- 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();
- }
+ 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);
+ }
+ }
- if (!foundInPass)
- doPrmnsprmSemantics (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);
+ }
}
- 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();
- }
+ NetSqlca parseAbnormalEndUow(ConnectionCallbackInterface connection) throws DisconnectException {
+ parseABNUOWRM(connection);
+ if (peekCodePoint() != CodePoint.SQLCARD) {
+ parseTypdefsOrMgrlvlovrs();
+ }
- if (peekCP == CodePoint.RDBNAM) {
- foundInPass = true;
- rdbnamReceived = checkAndGetReceivedFlag (rdbnamReceived);
- rdbnam = parseRDBNAM (true);
- peekCP = peekCodePoint();
- }
+ NetSqlca netSqlca = parseSQLCARD(null);
+ return netSqlca;
+ }
- if (!foundInPass)
- doPrmnsprmSemantics (peekCP);
+ 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);
}
- 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();
- }
+ // 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);
+ }
- if (peekCP == CodePoint.CODPNT) {
- foundInPass = true;
- codpntReceived = checkAndGetReceivedFlag (codpntReceived);
- codpnt = parseCODPNT();
- peekCP = peekCodePoint();
- }
+ }
+ 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);
+ }
- // RECCNT will be skipped
- if (!foundInPass)
- doPrmnsprmSemantics (peekCP);
+ // 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();
+ }
}
- 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();
- }
+ // 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);
+ }
- if (peekCP == CodePoint.PRCCNVCD) {
- foundInPass = true;
- prccnvcdReceived = checkAndGetReceivedFlag (prccnvcdReceived);
- prccnvcd = parsePRCCNVCD();
- peekCP = peekCodePoint();
- }
+ }
+ popCollectionStack();
+ checkRequiredObjects(svrcodReceived);
- if (!foundInPass)
- doPrmnsprmSemantics (peekCP);
+ 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));
}
- 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();
- }
+ // Not Authorized to RDB Reply Message specifies that
+ // the requester is not authorized to access the specified
+ // relational database.
[... 4061 lines stripped ...]