/[Apache-SVN]/incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetConnectionReply.java
ViewVC logotype

Diff of /incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetConnectionReply.java

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

--- incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetConnectionReply.java	2005/05/02 05:18:08	165584
+++ incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetConnectionReply.java	2005/05/02 06:25:59	165585
@@ -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.
+    // 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);
+            }
 
-      if (peekCP == CodePoint.CODPNT) {
-        foundInPass = true;
-        codpntReceived = checkAndGetReceivedFlag (codpntReceived);
-        codpnt = parseCODPNT();
-        peekCP = peekCodePoint();
-      }
+        }
+        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);
 
-      // skip the RECCNT
+        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);
+            }
 
-      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);
     }
-    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);
+    // 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 % 7) != 0)) {
-          doSyntaxrmSemantics(CodePoint.SYNERRCD_OBJ_LEN_NOT_ALLOWED);
+        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.
 
-        int managerCount = managerListLength / 7;
-        managerCodePoint = new int[managerCount];
-        managerLevel = new int[managerCount];
+        // read each of the manager levels returned from the server.
         for (int i = 0; i < managerCount; i++) {
-          managerCodePoint[i] = parseCODPNTDR();
-          managerLevel[i] = parseMGRLVLN();
+
+            // 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;
+            }
         }
-        peekCP = peekCodePoint();
-      }
+    }
 
+    // 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();
+    }
 
-      if (!foundInPass)
-        doPrmnsprmSemantics (peekCP);
 
+    // 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;
     }
-    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();
-      }
+    // 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();
+    };
 
-      if (peekCP == CodePoint.CODPNT) {
-        foundInPass = true;
-        codpntReceived = checkAndGetReceivedFlag (codpntReceived);
-        codpnt = parseCODPNT();
-        peekCP = peekCodePoint();
-      }
 
-      if (!foundInPass)
-        doPrmnsprmSemantics (peekCP);
 
+    protected int parseXIDCNT() throws DisconnectException {
+        parseLengthAndMatchCodePoint(CodePoint.XIDCNT);
+        return readUnsignedShort();
     }
-    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();
-      }
+    protected Xid parseXID() throws DisconnectException {
+        return null;
+    }
 
-      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();
-      }
+    protected java.util.Hashtable parseIndoubtList() throws DisconnectException {
+        return null;
+    }
 
-      if (!foundInPass)
-        doPrmnsprmSemantics (peekCP);
+
+    // 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;
     }
 
-    popCollectionStack();
-    checkRequiredObjects (svrcodReceived, rdbnamReceived);
+    // 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;
+    }
 
-    // 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();
-      }
+    // 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);
+        return readUnsignedShort();
+    }
+
+    // CCSID for Double-Byte Characters specifies a coded character
+    // set identifier for double-byte characters.
+    protected int parseCCSIDDBC() throws DisconnectException {
+        parseLengthAndMatchCodePoint(CodePoint.CCSIDDBC);
+        return readUnsignedShort();
+    }
+
+    // Severity Code is an indicator of the severity of a condition
+    // detected during the execution of a command.
+    protected int parseSVRCOD(int minSvrcod, int maxSvrcod) throws DisconnectException {
+        parseLengthAndMatchCodePoint(CodePoint.SVRCOD);
+
+        int svrcod = readUnsignedShort();
+        if ((svrcod != CodePoint.SVRCOD_INFO) &&
+                (svrcod != CodePoint.SVRCOD_WARNING) &&
+                (svrcod != CodePoint.SVRCOD_ERROR) &&
+                (svrcod != CodePoint.SVRCOD_SEVERE) &&
+                (svrcod != CodePoint.SVRCOD_ACCDMG) &&
+                (svrcod != CodePoint.SVRCOD_PRMDMG) &&
+                (svrcod != CodePoint.SVRCOD_SESDMG)) {
+            doValnsprmSemantics(CodePoint.SVRCOD, svrcod);
+        }
 
-      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 (svrcod < minSvrcod || svrcod > maxSvrcod) {
+            doValnsprmSemantics(CodePoint.SVRCOD, svrcod);
+        }
 
-      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();
-      }
+        return svrcod;
+    }
 
-      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();
-      }
+    protected int parseFastSVRCOD(int minSvrcod, int maxSvrcod) throws DisconnectException {
+        matchCodePoint(CodePoint.SVRCOD);
 
-      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();
-      }
+        int svrcod = readFastUnsignedShort();
+        if ((svrcod != CodePoint.SVRCOD_INFO) &&
+                (svrcod != CodePoint.SVRCOD_WARNING) &&
+                (svrcod != CodePoint.SVRCOD_ERROR) &&
+                (svrcod != CodePoint.SVRCOD_SEVERE) &&
+                (svrcod != CodePoint.SVRCOD_ACCDMG) &&
+                (svrcod != CodePoint.SVRCOD_PRMDMG) &&
+                (svrcod != CodePoint.SVRCOD_SESDMG)) {
+            doValnsprmSemantics(CodePoint.SVRCOD, svrcod);
+        }
 
-      if (!foundInPass)
-        doPrmnsprmSemantics (peekCP);
+        if (svrcod < minSvrcod || svrcod > maxSvrcod) {
+            doValnsprmSemantics(CodePoint.SVRCOD, svrcod);
+        }
 
+        return svrcod;
     }
-    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();
-      }
+    protected NetSqlca parseSQLCARD(Sqlca[] rowsetSqlca) throws DisconnectException {
+        parseLengthAndMatchCodePoint(CodePoint.SQLCARD);
+        int ddmLength = getDdmLength();
+        ensureBLayerDataInBuffer(ddmLength);
+        NetSqlca netSqlca = parseSQLCARDrow(rowsetSqlca);
+        adjustLengths(getDdmLength());
+        return netSqlca;
+    }
+    //--------------------------parse FDOCA objects------------------------
+
+    // SQLCARD : FDOCA EARLY ROW
+    // SQL Communications Area Row Description
+    //
+    // FORMAT FOR ALL SQLAM LEVELS
+    //   SQLCAGRP; GROUP LID 0x54; ELEMENT TAKEN 0(all); REP FACTOR 1
+
+    NetSqlca parseSQLCARDrow(Sqlca[] rowsetSqlca) throws DisconnectException {
+        return parseSQLCAGRP(rowsetSqlca);
+    }
+
+    // SQLNUMROW : FDOCA EARLY ROW
+    // SQL Number of Elements Row Description
+    //
+    // FORMAT FOR SQLAM LEVELS
+    //   SQLNUMGRP; GROUP LID 0x58; ELEMENT TAKEN 0(all); REP FACTOR 1
+    int parseSQLNUMROW() throws DisconnectException {
+        return parseSQLNUMGRP();
+    }
+
+    int parseFastSQLNUMROW() throws DisconnectException {
+        return parseFastSQLNUMGRP();
+    }
+
+    // SQLNUMGRP : FDOCA EARLY GROUP
+    // SQL Number of Elements Group Description
+    //
+    // FORMAT FOR ALL SQLAM LEVELS
+    //   SQLNUM; PROTOCOL TYPE I2; ENVLID 0x04; Length Override 2
+    private int parseSQLNUMGRP() throws DisconnectException {
+        return readShort();
+    }
+
+    private int parseFastSQLNUMGRP() throws DisconnectException {
+        return readFastShort();
+    }
+
+    // SQLCAGRP : FDOCA EARLY GROUP
+    // SQL Communcations Area Group Description
+    //
+    // FORMAT FOR SQLAM <= 6
+    //   SQLCODE; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
+    //   SQLSTATE; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 5
+    //   SQLERRPROC; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 8
+    //   SQLCAXGRP; PROTOCOL TYPE N-GDA; ENVLID 0x52; Length Override 0
+    //
+    // FORMAT FOR SQLAM >= 7
+    //   SQLCODE; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
+    //   SQLSTATE; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 5
+    //   SQLERRPROC; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 8
+    //   SQLCAXGRP; PROTOCOL TYPE N-GDA; ENVLID 0x52; Length Override 0
+    //   SQLDIAGGRP; PROTOCOL TYPE N-GDA; ENVLID 0x56; Length Override 0
+    private NetSqlca parseSQLCAGRP(Sqlca[] rowsetSqlca) throws DisconnectException {
+        if (readFastUnsignedByte() == CodePoint.NULLDATA) {
+            return null;
+        }
 
-      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();
-      }
+        int sqlcode = readFastInt();
+        byte[] sqlstate = readFastBytes(5);
+        byte[] sqlerrproc = readFastBytes(8);
+        NetSqlca netSqlca = new NetSqlca(netAgent_.netConnection_,
+                sqlcode,
+                sqlstate,
+                sqlerrproc,
+                netAgent_.targetTypdef_.getCcsidSbc());
 
-      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();
-      }
+        parseSQLCAXGRP(netSqlca);
+
+        if (netAgent_.targetSqlam_ >= NetConfiguration.MGRLVL_7) {
+            netSqlca.setRowsetRowCount(parseSQLDIAGGRP(rowsetSqlca));
+        }
+
+        return netSqlca;
+    }
+
+    // SQLCAXGRP : EARLY FDOCA GROUP
+    // SQL Communications Area Exceptions Group Description
+    //
+    // FORMAT FOR SQLAM <= 6
+    //   SQLRDBNME; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 18
+    //   SQLERRD1; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
+    //   SQLERRD2; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
+    //   SQLERRD3; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
+    //   SQLERRD4; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
+    //   SQLERRD5; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
+    //   SQLERRD6; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
+    //   SQLWARN0; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
+    //   SQLWARN1; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
+    //   SQLWARN2; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
+    //   SQLWARN3; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
+    //   SQLWARN4; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
+    //   SQLWARN5; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
+    //   SQLWARN6; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
+    //   SQLWARN7; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
+    //   SQLWARN8; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
+    //   SQLWARN9; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
+    //   SQLWARNA; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
+    //   SQLERRMSG_m; PROTOCOL TYPE VCM; ENVLID 0x3E; Length Override 70
+    //   SQLERRMSG_s; PROTOCOL TYPE VCS; ENVLID 0x32; Length Override 70
+    //
+    // FORMAT FOR SQLAM >= 7
+    //   SQLERRD1; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
+    //   SQLERRD2; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
+    //   SQLERRD3; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
+    //   SQLERRD4; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
+    //   SQLERRD5; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
+    //   SQLERRD6; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
+    //   SQLWARN0; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
+    //   SQLWARN1; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
+    //   SQLWARN2; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
+    //   SQLWARN3; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
+    //   SQLWARN4; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
+    //   SQLWARN5; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
+    //   SQLWARN6; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
+    //   SQLWARN7; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
+    //   SQLWARN8; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
+    //   SQLWARN9; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
+    //   SQLWARNA; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
+    //   SQLRDBNAME; PROTOCOL TYPE VCS; ENVLID 0x32; Length Override 255
+    //   SQLERRMSG_m; PROTOCOL TYPE VCM; ENVLID 0x3E; Length Override 70
+    //   SQLERRMSG_s; PROTOCOL TYPE VCS; ENVLID 0x32; Length Override 70
+    private void parseSQLCAXGRP(NetSqlca netSqlca) throws DisconnectException {
+        if (readFastUnsignedByte() == CodePoint.NULLDATA) {
+            netSqlca.setContainsSqlcax(false);
+            return;
+        }
+
+        if (netAgent_.targetSqlam_ < NetConfiguration.MGRLVL_7) {
+            // skip over the rdbnam for now
+            //   SQLRDBNME; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 18
+            skipFastBytes(18);
+        }
+        //   SQLERRD1 to SQLERRD6; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
+        int[] sqlerrd = new int[6];
+        readFastIntArray(sqlerrd);
+
+        //   SQLWARN0 to SQLWARNA; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
+        byte[] sqlwarn = readFastBytes(11);
+
+        if (netAgent_.targetSqlam_ >= NetConfiguration.MGRLVL_7) {
+            // skip over the rdbnam for now
+            // SQLRDBNAME; PROTOCOL TYPE VCS; ENVLID 0x32; Length Override 255
+            parseFastVCS();
+        }
 
-      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);
+        int sqlerrmcCcsid = 0;
+        byte[] sqlerrmc = readFastLDBytes();
+        if (sqlerrmc != null) {
+            sqlerrmcCcsid = netAgent_.targetTypdef_.getCcsidMbc();
+            skipFastBytes(2);
+        } else {
+            sqlerrmc = readFastLDBytes();
+            sqlerrmcCcsid = netAgent_.targetTypdef_.getCcsidSbc();
+        }
 
+        netSqlca.setSqlerrd(sqlerrd);
+        netSqlca.setSqlwarnBytes(sqlwarn);
+        netSqlca.setSqlerrmcBytes(sqlerrmc, sqlerrmcCcsid); // sqlerrmc may be null
     }
-    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();
-      }
+    // SQLDIAGGRP : FDOCA EARLY GROUP
+    // SQL Diagnostics Group Description - Identity 0xD1
+    // Nullable Group
+    // SQLDIAGSTT; PROTOCOL TYPE N-GDA; ENVLID 0xD3; Length Override 0
+    // SQLDIAGCN;  DRFA TYPE N-RLO; ENVLID 0xF6; Length Override 0
+    // SQLDIAGCI;  PROTOCOL TYPE N-RLO; ENVLID 0xF5; Length Override 0
+    private long parseSQLDIAGGRP(Sqlca[] rowsetSqlca) throws DisconnectException {
+        if (readFastUnsignedByte() == CodePoint.NULLDATA) {
+            return 0;
+        }
 
-      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();
-      }
+        long row_count = parseSQLDIAGSTT(rowsetSqlca);
+        parseSQLDIAGCI(rowsetSqlca);
+        parseSQLDIAGCN();
+
+        return row_count;
+    }
+
+    // this is duplicated in parseColumnMetaData, but different
+    // DAGroup under NETColumnMetaData requires a lot more stuffs including
+    // precsion, scale and other stuffs
+    protected String parseFastVCS() throws DisconnectException {
+        // doublecheck what readString() does if the length is 0
+        return readFastString(readFastUnsignedShort(),
+                netAgent_.targetTypdef_.getCcsidSbcEncoding());
+    }
+    //----------------------non-parsing computational helper methods--------------
+
+    protected boolean checkAndGetReceivedFlag(boolean receivedFlag) throws DisconnectException {
+        if (receivedFlag) {
+            // this method will throw a disconnect exception if
+            // the received flag is already true;
+            doSyntaxrmSemantics(CodePoint.SYNERRCD_DUP_OBJ_PRESENT);
+        }
+        return true;
+    }
 
-      if (!foundInPass)
-        doPrmnsprmSemantics (peekCP);
+    protected void checkRequiredObjects(boolean receivedFlag) throws DisconnectException {
+        if (!receivedFlag) {
+            doSyntaxrmSemantics(CodePoint.SYNERRCD_REQ_OBJ_NOT_FOUND);
+        }
     }
-    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();
-      }
+    protected void checkRequiredObjects(boolean receivedFlag,
+                                        boolean receivedFlag2) throws DisconnectException {
+        if (!receivedFlag || !receivedFlag2) {
+            doSyntaxrmSemantics(CodePoint.SYNERRCD_REQ_OBJ_NOT_FOUND);
+        }
+    }
 
-      if (peekCP == CodePoint.CCSIDDBC) {
-        foundInPass = true;
-        netAgent_.targetTypdef_.setCcsidDbc (parseCCSIDDBC());
-        peekCP = peekCodePoint();
-      }
+    protected void checkRequiredObjects(boolean receivedFlag,
+                                        boolean receivedFlag2,
+                                        boolean receivedFlag3) throws DisconnectException {
+        if (!receivedFlag || !receivedFlag2 || !receivedFlag3) {
+            doSyntaxrmSemantics(CodePoint.SYNERRCD_REQ_OBJ_NOT_FOUND);
+        }
+    }
 
-      if (peekCP == CodePoint.CCSIDMBC) {
-        foundInPass = true;
-        netAgent_.targetTypdef_.setCcsidMbc (parseCCSIDMBC());
-        peekCP = peekCodePoint();
-      }
+    protected void checkRequiredObjects(boolean receivedFlag,
+                                        boolean receivedFlag2,
+                                        boolean receivedFlag3,
+                                        boolean receivedFlag4) throws DisconnectException {
+        if (!receivedFlag || !receivedFlag2 || !receivedFlag3 || !receivedFlag4) {
+            doSyntaxrmSemantics(CodePoint.SYNERRCD_REQ_OBJ_NOT_FOUND);
+        }
+    }
+
+    protected void checkRequiredObjects(boolean receivedFlag,
+                                        boolean receivedFlag2,
+                                        boolean receivedFlag3,
+                                        boolean receivedFlag4,
+                                        boolean receivedFlag5,
+                                        boolean receivedFlag6) throws DisconnectException {
+        if (!receivedFlag || !receivedFlag2 || !receivedFlag3 || !receivedFlag4 ||
+                !receivedFlag5 || !receivedFlag6) {
+            doSyntaxrmSemantics(CodePoint.SYNERRCD_REQ_OBJ_NOT_FOUND);
+        }
 
-      if (!foundInPass)
-        doPrmnsprmSemantics (peekCP);
+    }
 
+    protected void checkRequiredObjects(boolean receivedFlag,
+                                        boolean receivedFlag2,
+                                        boolean receivedFlag3,
+                                        boolean receivedFlag4,
+                                        boolean receivedFlag5,
+                                        boolean receivedFlag6,
+                                        boolean receivedFlag7) throws DisconnectException {
+        if (!receivedFlag || !receivedFlag2 || !receivedFlag3 || !receivedFlag4 ||
+                !receivedFlag5 || !receivedFlag6 || !receivedFlag7) {
+            doSyntaxrmSemantics(CodePoint.SYNERRCD_REQ_OBJ_NOT_FOUND);
+        }
     }
-    popCollectionStack();
-  }
 
+    // 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.
+
+    protected void doObjnsprmSemantics(int codePoint) throws DisconnectException {
+        agent_.accumulateChainBreakingReadExceptionAndThrow(new DisconnectException(agent_,
+                "The DDM object is not supported.  " +
+                "Unsupported DDM object code point: 0x" + Integer.toHexString(codePoint),
+                SqlState._58015));
+    }
+
+    // Also called by NetStatementReply.
+    protected void doPrmnsprmSemantics(int codePoint) throws DisconnectException {
+        agent_.accumulateChainBreakingReadExceptionAndThrow(new DisconnectException(agent_,
+                "The DDM parameter is not supported.  " +
+                "Unsupported DDM parameter code point: 0x" + Integer.toHexString(codePoint),
+                SqlState._58016));
+    }
+
+    // Also called by NetStatementReply
+    void doValnsprmSemantics(int codePoint, int value) throws DisconnectException {
+        doValnsprmSemantics(codePoint, Integer.toString(value));
+    }
+
+    void doValnsprmSemantics(int codePoint, String value) throws DisconnectException {
+
+        // special case the FDODTA codepoint not to disconnect.
+        if (codePoint == CodePoint.FDODTA) {
+            agent_.accumulateReadException(new SqlException(agent_.logWriter_,
+                    "The DDM parameter value is not supported.  " +
+                    "DDM parameter code point having unsupported value : 0x" + Integer.toHexString(codePoint) +
+                    ".  An input host variable may not be within the range the server supports.",
+                    SqlState._58017));
+            return;
+        }
 
-    // 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);
-    return readUnsignedShort();
-  }
-
-  // CCSID for Double-Byte Characters specifies a coded character
-  // set identifier for double-byte characters.
-  protected int parseCCSIDDBC() throws DisconnectException
-  {
-    parseLengthAndMatchCodePoint (CodePoint.CCSIDDBC);
-    return readUnsignedShort();
-  }
-
-  // Severity Code is an indicator of the severity of a condition
-  // detected during the execution of a command.
-  protected int parseSVRCOD (int minSvrcod, int maxSvrcod) throws DisconnectException
-  {
-    parseLengthAndMatchCodePoint (CodePoint.SVRCOD);
-
-    int svrcod = readUnsignedShort();
-    if ((svrcod != CodePoint.SVRCOD_INFO) &&
-        (svrcod != CodePoint.SVRCOD_WARNING) &&
-        (svrcod != CodePoint.SVRCOD_ERROR) &&
-        (svrcod != CodePoint.SVRCOD_SEVERE) &&
-        (svrcod != CodePoint.SVRCOD_ACCDMG) &&
-        (svrcod != CodePoint.SVRCOD_PRMDMG) &&
-        (svrcod != CodePoint.SVRCOD_SESDMG))
-      doValnsprmSemantics (CodePoint.SVRCOD, svrcod);
-
-    if (svrcod < minSvrcod || svrcod > maxSvrcod)
-      doValnsprmSemantics (CodePoint.SVRCOD, svrcod);
-
-    return svrcod;
-  }
-
-  protected int parseFastSVRCOD (int minSvrcod, int maxSvrcod) throws DisconnectException
-  {
-    matchCodePoint (CodePoint.SVRCOD);
-
-    int svrcod = readFastUnsignedShort();
-    if ((svrcod != CodePoint.SVRCOD_INFO) &&
-        (svrcod != CodePoint.SVRCOD_WARNING) &&
-        (svrcod != CodePoint.SVRCOD_ERROR) &&
-        (svrcod != CodePoint.SVRCOD_SEVERE) &&
-        (svrcod != CodePoint.SVRCOD_ACCDMG) &&
-        (svrcod != CodePoint.SVRCOD_PRMDMG) &&
-        (svrcod != CodePoint.SVRCOD_SESDMG))
-      doValnsprmSemantics (CodePoint.SVRCOD, svrcod);
-
-    if (svrcod < minSvrcod || svrcod > maxSvrcod)
-      doValnsprmSemantics (CodePoint.SVRCOD, svrcod);
-
-    return svrcod;
-  }
-
-  protected NetSqlca parseSQLCARD (Sqlca[] rowsetSqlca) throws DisconnectException
-  {
-    parseLengthAndMatchCodePoint (CodePoint.SQLCARD);
-    int ddmLength = getDdmLength();
-    ensureBLayerDataInBuffer (ddmLength);
-    NetSqlca netSqlca = parseSQLCARDrow (rowsetSqlca);
-    adjustLengths (getDdmLength());
-    return netSqlca;
-  }
-  //--------------------------parse FDOCA objects------------------------
-
-  // SQLCARD : FDOCA EARLY ROW
-  // SQL Communications Area Row Description
-  //
-  // FORMAT FOR ALL SQLAM LEVELS
-  //   SQLCAGRP; GROUP LID 0x54; ELEMENT TAKEN 0(all); REP FACTOR 1
-
-  NetSqlca parseSQLCARDrow (Sqlca[] rowsetSqlca) throws DisconnectException
-  {
-    return parseSQLCAGRP (rowsetSqlca);
-  }
-
-  // SQLNUMROW : FDOCA EARLY ROW
-  // SQL Number of Elements Row Description
-  //
-  // FORMAT FOR SQLAM LEVELS
-  //   SQLNUMGRP; GROUP LID 0x58; ELEMENT TAKEN 0(all); REP FACTOR 1
-  int parseSQLNUMROW () throws DisconnectException
-  {
-    return parseSQLNUMGRP();
-  }
-
-  int parseFastSQLNUMROW () throws DisconnectException
-  {
-    return parseFastSQLNUMGRP();
-  }
-
-  // SQLNUMGRP : FDOCA EARLY GROUP
-  // SQL Number of Elements Group Description
-  //
-  // FORMAT FOR ALL SQLAM LEVELS
-  //   SQLNUM; PROTOCOL TYPE I2; ENVLID 0x04; Length Override 2
-  private int parseSQLNUMGRP () throws DisconnectException
-  {
-    return readShort ();
-  }
-
-  private int parseFastSQLNUMGRP () throws DisconnectException
-  {
-    return readFastShort ();
-  }
-
-  // SQLCAGRP : FDOCA EARLY GROUP
-  // SQL Communcations Area Group Description
-  //
-  // FORMAT FOR SQLAM <= 6
-  //   SQLCODE; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
-  //   SQLSTATE; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 5
-  //   SQLERRPROC; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 8
-  //   SQLCAXGRP; PROTOCOL TYPE N-GDA; ENVLID 0x52; Length Override 0
-  //
-  // FORMAT FOR SQLAM >= 7
-  //   SQLCODE; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
-  //   SQLSTATE; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 5
-  //   SQLERRPROC; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 8
-  //   SQLCAXGRP; PROTOCOL TYPE N-GDA; ENVLID 0x52; Length Override 0
-  //   SQLDIAGGRP; PROTOCOL TYPE N-GDA; ENVLID 0x56; Length Override 0
-  private NetSqlca parseSQLCAGRP (Sqlca[] rowsetSqlca) throws DisconnectException
-  {
-    if (readFastUnsignedByte() == CodePoint.NULLDATA)
-      return null;
-
-    int sqlcode = readFastInt ();
-    byte[] sqlstate = readFastBytes (5);
-    byte[] sqlerrproc = readFastBytes (8);
-    NetSqlca netSqlca = new NetSqlca (netAgent_.netConnection_,
-                                   sqlcode,
-                                   sqlstate,
-                                   sqlerrproc,
-                                   netAgent_.targetTypdef_.getCcsidSbc());
-
-    parseSQLCAXGRP (netSqlca);
-
-    if (netAgent_.targetSqlam_ >= NetConfiguration.MGRLVL_7)
-      netSqlca.setRowsetRowCount (parseSQLDIAGGRP (rowsetSqlca));
-
-    return netSqlca;
-  }
-
-  // SQLCAXGRP : EARLY FDOCA GROUP
-  // SQL Communications Area Exceptions Group Description
-  //
-  // FORMAT FOR SQLAM <= 6
-  //   SQLRDBNME; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 18
-  //   SQLERRD1; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
-  //   SQLERRD2; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
-  //   SQLERRD3; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
-  //   SQLERRD4; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
-  //   SQLERRD5; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
-  //   SQLERRD6; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
-  //   SQLWARN0; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
-  //   SQLWARN1; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
-  //   SQLWARN2; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
-  //   SQLWARN3; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
-  //   SQLWARN4; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
-  //   SQLWARN5; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
-  //   SQLWARN6; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
-  //   SQLWARN7; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
-  //   SQLWARN8; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
-  //   SQLWARN9; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
-  //   SQLWARNA; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
-  //   SQLERRMSG_m; PROTOCOL TYPE VCM; ENVLID 0x3E; Length Override 70
-  //   SQLERRMSG_s; PROTOCOL TYPE VCS; ENVLID 0x32; Length Override 70
-  //
-  // FORMAT FOR SQLAM >= 7
-  //   SQLERRD1; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
-  //   SQLERRD2; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
-  //   SQLERRD3; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
-  //   SQLERRD4; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
-  //   SQLERRD5; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
-  //   SQLERRD6; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
-  //   SQLWARN0; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
-  //   SQLWARN1; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
-  //   SQLWARN2; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
-  //   SQLWARN3; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
-  //   SQLWARN4; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
-  //   SQLWARN5; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
-  //   SQLWARN6; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
-  //   SQLWARN7; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
-  //   SQLWARN8; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
-  //   SQLWARN9; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
-  //   SQLWARNA; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
-  //   SQLRDBNAME; PROTOCOL TYPE VCS; ENVLID 0x32; Length Override 255
-  //   SQLERRMSG_m; PROTOCOL TYPE VCM; ENVLID 0x3E; Length Override 70
-  //   SQLERRMSG_s; PROTOCOL TYPE VCS; ENVLID 0x32; Length Override 70
-  private void parseSQLCAXGRP (NetSqlca netSqlca) throws DisconnectException
-  {
-    if (readFastUnsignedByte() == CodePoint.NULLDATA) {
-      netSqlca.setContainsSqlcax (false);
-      return;
-    }
-
-    if (netAgent_.targetSqlam_ < NetConfiguration.MGRLVL_7) {
-      // skip over the rdbnam for now
-      //   SQLRDBNME; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 18
-      skipFastBytes(18);
-    }
-    //   SQLERRD1 to SQLERRD6; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
-    int[] sqlerrd = new int[6];
-    readFastIntArray(sqlerrd);
-
-    //   SQLWARN0 to SQLWARNA; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
-    byte[] sqlwarn = readFastBytes(11);
-
-    if (netAgent_.targetSqlam_ >= NetConfiguration.MGRLVL_7) {
-      // skip over the rdbnam for now
-      // SQLRDBNAME; PROTOCOL TYPE VCS; ENVLID 0x32; Length Override 255
-      parseFastVCS ();
-    }
-
-
-    int sqlerrmcCcsid = 0;
-    byte[] sqlerrmc = readFastLDBytes();
-    if (sqlerrmc != null) {
-      sqlerrmcCcsid = netAgent_.targetTypdef_.getCcsidMbc();
-      skipFastBytes (2);
-    }
-    else {
-      sqlerrmc = readFastLDBytes();
-      sqlerrmcCcsid = netAgent_.targetTypdef_.getCcsidSbc();
-    }
-
-    netSqlca.setSqlerrd (sqlerrd);
-    netSqlca.setSqlwarnBytes (sqlwarn);
-    netSqlca.setSqlerrmcBytes (sqlerrmc, sqlerrmcCcsid); // sqlerrmc may be null
-  }
-
-  // SQLDIAGGRP : FDOCA EARLY GROUP
-  // SQL Diagnostics Group Description - Identity 0xD1
-  // Nullable Group
-  // SQLDIAGSTT; PROTOCOL TYPE N-GDA; ENVLID 0xD3; Length Override 0
-  // SQLDIAGCN;  DRFA TYPE N-RLO; ENVLID 0xF6; Length Override 0
-  // SQLDIAGCI;  PROTOCOL TYPE N-RLO; ENVLID 0xF5; Length Override 0
-  private long parseSQLDIAGGRP (Sqlca[] rowsetSqlca) throws DisconnectException
-  {
-    if (readFastUnsignedByte() == CodePoint.NULLDATA)
-      return 0;
-
-    long row_count = parseSQLDIAGSTT (rowsetSqlca);
-    parseSQLDIAGCI (rowsetSqlca);
-    parseSQLDIAGCN ();
-
-    return row_count;
-  }
-
-  // this is duplicated in parseColumnMetaData, but different
-  // DAGroup under NETColumnMetaData requires a lot more stuffs including
-  // precsion, scale and other stuffs
-  protected String parseFastVCS () throws DisconnectException
-  {
-    // doublecheck what readString() does if the length is 0 
-    return readFastString (readFastUnsignedShort(),
-                           netAgent_.targetTypdef_.getCcsidSbcEncoding());
-  }
-  //----------------------non-parsing computational helper methods--------------
-
-  protected boolean checkAndGetReceivedFlag (boolean receivedFlag) throws DisconnectException
-  {
-    if (receivedFlag) {
-      // this method will throw a disconnect exception if
-      // the received flag is already true;
-      doSyntaxrmSemantics (CodePoint.SYNERRCD_DUP_OBJ_PRESENT);
-    }
-    return true;
-  }
-
-  protected void checkRequiredObjects (boolean receivedFlag) throws DisconnectException
-  {
-    if (!receivedFlag)
-      doSyntaxrmSemantics (CodePoint.SYNERRCD_REQ_OBJ_NOT_FOUND);
-  }
-
-  protected void checkRequiredObjects (boolean receivedFlag,
-                                       boolean receivedFlag2) throws DisconnectException
-  {
-    if (!receivedFlag || !receivedFlag2)
-      doSyntaxrmSemantics (CodePoint.SYNERRCD_REQ_OBJ_NOT_FOUND);
-  }
-
-  protected void checkRequiredObjects (boolean receivedFlag,
-                                       boolean receivedFlag2,
-                                       boolean receivedFlag3) throws DisconnectException
-  {
-    if (!receivedFlag || !receivedFlag2 || !receivedFlag3)
-      doSyntaxrmSemantics (CodePoint.SYNERRCD_REQ_OBJ_NOT_FOUND);
-  }
-
-  protected void checkRequiredObjects (boolean receivedFlag,
-                                       boolean receivedFlag2,
-                                       boolean receivedFlag3,
-                                       boolean receivedFlag4) throws DisconnectException
-  {
-    if (!receivedFlag || !receivedFlag2 || !receivedFlag3 || !receivedFlag4)
-      doSyntaxrmSemantics (CodePoint.SYNERRCD_REQ_OBJ_NOT_FOUND);
-  }
-
-  protected void checkRequiredObjects (boolean receivedFlag,
-                                       boolean receivedFlag2,
-                                       boolean receivedFlag3,
-                                       boolean receivedFlag4,
-                                       boolean receivedFlag5,
-                                       boolean receivedFlag6) throws DisconnectException
-  {
-    if (!receivedFlag || !receivedFlag2 || !receivedFlag3 || !receivedFlag4 ||
-        !receivedFlag5 || !receivedFlag6)
-      doSyntaxrmSemantics (CodePoint.SYNERRCD_REQ_OBJ_NOT_FOUND);
-
-  }
-  protected void checkRequiredObjects (boolean receivedFlag,
-                                       boolean receivedFlag2,
-                                       boolean receivedFlag3,
-                                       boolean receivedFlag4,
-                                       boolean receivedFlag5,
-                                       boolean receivedFlag6,
-                                       boolean receivedFlag7) throws DisconnectException
-  {
-    if (!receivedFlag || !receivedFlag2 || !receivedFlag3 || !receivedFlag4 ||
-        !receivedFlag5 || !receivedFlag6 || !receivedFlag7)
-      doSyntaxrmSemantics (CodePoint.SYNERRCD_REQ_OBJ_NOT_FOUND);
-  }
-
-  // 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.
-
-  protected void doObjnsprmSemantics (int codePoint) throws DisconnectException
-  {
-    agent_.accumulateChainBreakingReadExceptionAndThrow (new DisconnectException (
-      agent_,
-      "The DDM object is not supported.  " +
-      "Unsupported DDM object code point: 0x" + Integer.toHexString(codePoint),
-      SqlState._58015));
-  }
-
-  // Also called by NetStatementReply.
-  protected void doPrmnsprmSemantics (int codePoint) throws DisconnectException
-  {
-    agent_.accumulateChainBreakingReadExceptionAndThrow (new DisconnectException (
-      agent_,
-      "The DDM parameter is not supported.  " +
-      "Unsupported DDM parameter code point: 0x" + Integer.toHexString(codePoint),
-      SqlState._58016));
-  }
-
-  // Also called by NetStatementReply
-  void doValnsprmSemantics (int codePoint, int value) throws DisconnectException
-  {
-    doValnsprmSemantics(codePoint, Integer.toString(value));
-  }
-
-  void doValnsprmSemantics (int codePoint, String value) throws DisconnectException
-  {
-
-    // special case the FDODTA codepoint not to disconnect.
-    if (codePoint == CodePoint.FDODTA) {
-      agent_.accumulateReadException(new SqlException (
-        agent_.logWriter_,
-        "The DDM parameter value is not supported.  " +
-        "DDM parameter code point having unsupported value : 0x" + Integer.toHexString(codePoint) +
-        ".  An input host variable may not be within the range the server supports." ,
-        SqlState._58017));
-      return;
-    }
-
-    if (codePoint == CodePoint.CCSIDSBC ||
-        codePoint == CodePoint.CCSIDDBC ||
-        codePoint == CodePoint.CCSIDMBC) {
-      // the server didn't like one of the ccsids.
-      // the message should reflect the error in question.  right now these values
-      // will be hard coded but this won't be correct if our driver starts sending
-      // other values to the server.  In order to pick up the correct values,
-      // a little reorganization may need to take place so that this code (or
-      // whatever code sets the message) has access to the correct values.
-      int cpValue = 0;
-      switch (codePoint){
-      case CodePoint.CCSIDSBC:
-        cpValue = netAgent_.typdef_.getCcsidSbc();
-        break;
-      case CodePoint.CCSIDDBC:
-        cpValue = netAgent_.typdef_.getCcsidDbc();
-        break;
-      case CodePoint.CCSIDMBC:
-        cpValue = netAgent_.typdef_.getCcsidSbc();
-        break;
-      default:
-        // should never be in this default case...
-        cpValue = 0;
-        break;
-      }
-    agent_.accumulateChainBreakingReadExceptionAndThrow (new DisconnectException (
-      agent_,
-      "There is no available conversion for the source code page, " + cpValue +
-      ", to the target code page, " + value + "."));
-      //"57017", -332));
-      return;
-    }
-      // the problem isn't with one of the ccsid values so...
-
-      // Returning more information would
-      // require rearranging this code a little.
-      agent_.accumulateChainBreakingReadExceptionAndThrow (new DisconnectException (
-        agent_,
-        "The DDM parameter value is not supported.  " +
-        "DDM parameter code point having unsupported value : 0x" + Integer.toHexString(codePoint),
-        SqlState._58017));
-
-  }
-
-  void doDtamchrmSemantics () throws DisconnectException
-  {
-    agent_.accumulateChainBreakingReadExceptionAndThrow (new DisconnectException (
-      agent_,
-     "Execution failed due to a distribution protocol error that caused " +
-     "deallocation of the conversation.  " +
-     "A Data Descriptor Mismatch Error was detected.",
-     SqlState._58009));
-  }
-
-  // Messages
-  //  SQLSTATE : 58010
-  //      Execution failed due to a distribution protocol error that
-  //      will affect the successful execution of subsequent DDM commands
-  //      or SQL statements.
-  //  SQLCODE : -30021
-  //       Execution failed because of a Distributed Protocol
-  //       Error that will affect the successful execution of subsequent
-  //       commands and SQL statements: Manager <manager> at Level
-  //       <level> not supported.
-  //
-  //       A system erro occurred that prevented successful connection
-  //       of the application to the remote database.  This message (SQLCODE)
-  //       is producted for SQL CONNECT statement.
-  private void doMgrlvlrmSemantics (String manager, String level) throws DisconnectException
-  {
-    agent_.accumulateChainBreakingReadExceptionAndThrow (new DisconnectException (
-      agent_,
-      "Execution failed due to a distribution protocol error that will " +
-      "affect the successful execution of subsequent DDM commands or SQL statements.  " +
-      "A connection could not be established to the database because " +
-      "manager " + manager + " at level " + level + " is not supported.",
-      SqlState._58010));
-
-  }
-
-  private void doMgrlvlrmSemantics (int manager, int level) throws DisconnectException
-  {
-    doMgrlvlrmSemantics ("0x" + Integer.toHexString (manager),
-                         "0x" + Integer.toHexString (level));
-  }
-
-  private void doMgrlvlrmSemantics (int[] nameList, int[] levelList) throws DisconnectException
-  {
-    StringBuffer managerNames = new StringBuffer (100);
-    StringBuffer managerLevels = new StringBuffer (100);
-
-    int count = nameList.length;
-    for (int i = 0; i < count; i++) {
-      managerNames.append ("0x");
-      managerNames.append (nameList[i]);
-      managerLevels.append ("0x");
-      managerLevels.append (levelList[i]);
-      if (i != (count - 1)) {
-        managerNames.append (",");
-        managerLevels.append (",");
-      }
-    }
-    doMgrlvlrmSemantics (managerNames.toString(), managerLevels.toString());
-  }
-
-  // The client can detect that a conversational protocol error has occurred.
-  // This can also be detected at the server in which case a PRCCNVRM is returned.
-  // The Conversation Protocol Error Code, PRCCNVRM, describes the various errors.
-  //
-  // Note: Not all of these may be valid at the client.  See descriptions for
-  // which ones make sense for client side errors/checks.
-  // Conversation Error Code                  Description of Error
-  // -----------------------                  --------------------
-  // 0x01                                     RPYDSS received by target communications manager.
-  // 0x02                                     Multiple DSSs sent without chaining or multiple
-  //                                          DSS chains sent.
-  // 0x03                                     OBJDSS sent when not allowed.
-  // 0x04                                     Request correlation identifier of an RQSDSS
-  //                                          is less than or equal to the previous
-  //                                          RQSDSS's request correlatio identifier in the chain.
-  // 0x05                                     Request correlation identifier of an OBJDSS
-  //                                          does not equal the request correlation identifier
-  //                                          of the preceding RQSDSS.
-  // 0x06                                     EXCSAT was not the first command after the connection
-  //                                          was established.
-  // 0x10                                     ACCSEC or SECCHK command sent in wrong state.
-  // 0x11                                     SYNCCTL or SYNCRSY command is used incorrectly.
-  // 0x12                                     RDBNAM mismatch between ACCSEC, SECCHK, and ACCRDB.
-  // 0x13                                     A command follows one that returned EXTDTAs as reply object.
-  //
-  // When the client detects these errors, it will be handled as if a PRCCNVRM is returned
-  // from the server.  In this PRCCNVRM case, PROTOCOL architects an SQLSTATE of 58008 or 58009
-  // depening of the SVRCOD.  In this case, a 58009 will always be returned.
-  // 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.
-  protected void doPrccnvrmSemantics (int conversationProtocolErrorCode) throws DisconnectException
-  {
-    // we may need to map the conversation protocol error code, prccnvcd, to some kind
-    // of reason code.  For now just return the prccnvcd as the reason code
-    agent_.accumulateChainBreakingReadExceptionAndThrow (new DisconnectException (
-      agent_,
-      "Execution failed due to a distribution protocol error that caused " +
-      "deallocation of the conversation.  " +
-      "A PROTOCOL Conversational Protocol Error was detected.  " +
-      "Reason: 0x" + Integer.toHexString(conversationProtocolErrorCode),
-      SqlState._58009));
-  }
-
-  // SQL Diagnostics Condition Token Array - Identity 0xF7
-  // SQLNUMROW; ROW LID 0x68; ELEMENT TAKEN 0(all); REP FACTOR 1
-  // SQLTOKROW; ROW LID 0xE7; ELEMENT TAKEN 0(all); REP FACTOR 0(all)
-  void parseSQLDCTOKS () throws DisconnectException
-  {
-    if (readFastUnsignedByte() == CodePoint.NULLDATA)
-      return;
-    int num = parseFastSQLNUMROW();
-    for (int i = 0; i < num; i++)
-      parseSQLTOKROW();
-  }
-
-  // SQL Diagnostics Condition Information Array - Identity 0xF5
-  // SQLNUMROW; ROW LID 0x68; ELEMENT TAKEN 0(all); REP FACTOR 1
-  // SQLDCIROW; ROW LID 0xE5; ELEMENT TAKEN 0(all); REP FACTOR 0(all)
-  private void parseSQLDIAGCI (Sqlca[] rowsetSqlca) throws DisconnectException
-  {
-    if (readFastUnsignedByte() == CodePoint.NULLDATA)
-      return;
-    int num = parseFastSQLNUMROW();
-    if (num == 0) resetRowsetSqlca (rowsetSqlca, 0);
-
-    // lastRow is the row number for the last row that had a non-null SQLCA.
-    int lastRow = 1;
-    for (int i = 0; i < num; i++)
-      lastRow = parseSQLDCROW (rowsetSqlca, lastRow);
-    resetRowsetSqlca (rowsetSqlca, lastRow+1);
-  }
-
-  // SQL Diagnostics Connection Array - Identity 0xF6
-  // SQLNUMROW; ROW LID 0x68; ELEMENT TAKEN 0(all); REP FACTOR 1
-  // SQLCNROW;  ROW LID 0xE6; ELEMENT TAKEN 0(all); REP FACTOR 0(all)
-  private void parseSQLDIAGCN() throws DisconnectException
-  {
-    if (readUnsignedByte() == CodePoint.NULLDATA)
-      return;
-    int num = parseFastSQLNUMROW();
-    for (int i = 0; i < num; i++)
-      parseSQLCNROW();
-  }
-
-  // SQL Diagnostics Connection Row - Identity 0xE6
-  // SQLCNGRP; GROUP LID 0xD6; ELEMENT TAKEN 0(all); REP FACTOR 1
-  private void parseSQLCNROW () throws DisconnectException
-  {
-    parseSQLCNGRP();
-  }
-
-  // SQL Diagnostics Condition Row - Identity 0xE5
-  // SQLDCGRP; GROUP LID 0xD5; ELEMENT TAKEN 0(all); REP FACTOR 1
-  private int parseSQLDCROW (Sqlca[] rowsetSqlca, int lastRow) throws DisconnectException
-  {
-    return parseSQLDCGRP (rowsetSqlca, lastRow);
-  }
-
-  // SQL Diagnostics Token Row - Identity 0xE7
-  // SQLTOKGRP; GROUP LID 0xD7; ELEMENT TAKEN 0(all); REP FACTOR 1
-  private void parseSQLTOKROW() throws DisconnectException
-  {
-    parseSQLTOKGRP();
-  }
-
-  // check on SQLTOKGRP format
-  private void parseSQLTOKGRP() throws DisconnectException
-  {
-    skipFastNVCMorNVCS();
-  }
-
-  // SQL Diagnostics Statement Group Description - Identity 0xD3
-  // Nullable Group
-  // SQLDSFCOD; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
-  // SQLDSCOST; PROTOCOL TYPE I4; ENVLID 0X02; Length Override 4
-  // SQLDSLROW; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
-  // SQLDSNPM; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
-  // SQLDSNRS; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
-  // SQLDSRNS; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
-  // SQLDSDCOD; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
-  // SQLDSROWC; PROTOCOL TYPE FD; ENVLID 0x0E; Length Override 31
-  // SQLDSNROW; PROTOCOL TYPE FD; ENVLID 0x0E; Length Override 31
-  // SQLDSROWCS; PROTOCOL TYPE FD; ENVLID 0x0E; Length Override 31
-  // SQLDSACON; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
-  // SQLDSACRH; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
-  // SQLDSACRS; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
-  // SQLDSACSL; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
-  // SQLDSACSE; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
-  // SQLDSACTY; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
-  // SQLDSCERR; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
-  // SQLDSMORE; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
-  private long parseSQLDIAGSTT (Sqlca[] rowsetSqlca) throws DisconnectException
-  {
-    if (readFastUnsignedByte() == CodePoint.NULLDATA)
-      return 0;
-    int sqldsFcod = readFastInt (); // FUNCTION_CODE
-    int sqldsCost = readFastInt (); // COST_ESTIMATE
-    int sqldsLrow = readFastInt (); // LAST_ROW
-
-    skipFastBytes (16);
-
-    long sqldsRowc = readFastLong (); // ROW_COUNT
-
-    skipFastBytes(24);
-
-    return sqldsRowc;
-  }
-
-  // SQL Diagnostics Connection Group Description - Identity 0xD6
-  // Nullable
-  //
-  // SQLCNSTATE; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
-  // SQLCNSTATUS; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
-  // SQLCNATYPE; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
-  // SQLCNETYPE; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
-  // SQLCNPRDID; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 8
-  // SQLCNRDB; PROTOCOL TYPE VCS; ENVLID 0x32; Length Override 255
-  // SQLCNCLASS; PROTOCOL TYPE VCS; ENVLID 0x32; Length Override 255
-  // SQLCNAUTHID; PROTOCOL TYPE VCS; ENVLID 0x32; Length Override 255
-  private void parseSQLCNGRP() throws DisconnectException
-  {
-    skipBytes (18);
-    String sqlcnRDB = parseFastVCS();    // RDBNAM
-    String sqlcnClass = parseFastVCS();  // CLASS_NAME
-    String sqlcnAuthid = parseFastVCS(); // AUTHID
-  }
-
-  // SQL Diagnostics Condition Group Description
-  //
-  // SQLDCCODE; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
-  // SQLDCSTATE; PROTOCOL TYPE FCS; ENVLID Ox30; Lengeh Override 5
-  // SQLDCREASON; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
-  // SQLDCLINEN; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
-  // SQLDCROWN; PROTOCOL TYPE FD; ENVLID 0x0E; Lengeh Override 31
-  // SQLDCER01; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
-  // SQLDCER02; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
-  // SQLDCER03; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
-  // SQLDCER04; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
-  // SQLDCPART; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
-  // SQLDCPPOP; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
-  // SQLDCMSGID; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 10
-  // SQLDCMDE; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 8
-  // SQLDCPMOD; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 5
-  // SQLDCRDB; PROTOCOL TYPE VCS; ENVLID 0x32; Length Override 255
-  // SQLDCTOKS; PROTOCOL TYPE N-RLO; ENVLID 0xF7; Length Override 0
-  // SQLDCMSG_m; PROTOCOL TYPE NVMC; ENVLID 0x3F; Length Override 32672
-  // SQLDCMSG_S; PROTOCOL TYPE NVCS; ENVLID 0x33; Length Override 32672
-  // SQLDCCOLN_m; PROTOCOL TYPE NVCM ; ENVLID 0x3F; Length Override 255
-  // SQLDCCOLN_s; PROTOCOL TYPE NVCS; ENVLID 0x33; Length Override 255
-  // SQLDCCURN_m; PROTOCOL TYPE NVCM; ENVLID 0x3F; Length Override 255
-  // SQLDCCURN_s; PROTOCOL TYPE NVCS; ENVLID 0x33; Length Override 255
-  // SQLDCPNAM_m; PROTOCOL TYPE NVCM; ENVLID 0x3F; Length Override 255
-  // SQLDCPNAM_s; PROTOCOL TYPE NVCS; ENVLID 0x33; Length Override 255
-  // SQLDCXGRP; PROTOCOL TYPE N-GDA; ENVLID 0xD3; Length Override 1
-  private int parseSQLDCGRP (Sqlca[] rowsetSqlca, int lastRow) throws DisconnectException
-  {
-    int sqldcCode = readFastInt (); // SQLCODE
-    String sqldcState = readFastString (5, netAgent_.targetTypdef_.getCcsidSbcEncoding()); // SQLSTATE
-    int sqldcReason = readFastInt ();  // REASON_CODE
-    int sqldcLinen = readFastInt (); // LINE_NUMBER
-    int sqldcRown = (int)readFastLong (); // ROW_NUMBER
-
-    // save +20237 in the 0th entry of the rowsetSqlca's.
-    // this info is going to be used when a subsequent fetch prior is issued, and if already
-    // received a +20237 then we've gone beyond the first row and there is no need to
-    // flow another fetch to the server.
-    if (sqldcCode == 20237)
-      rowsetSqlca[0] = new NetSqlca (netAgent_.netConnection_,
-                                    sqldcCode,
-                                    sqldcState.getBytes(),
-                                    null,
-                                    netAgent_.targetTypdef_.getCcsidSbc());
-    else {
-      if (rowsetSqlca[sqldcRown] != null)
-        rowsetSqlca[sqldcRown].resetRowsetSqlca (netAgent_.netConnection_,
-                                                   sqldcCode,
-                                                   sqldcState.getBytes(),
-                                                   null,
-                                                   netAgent_.targetTypdef_.getCcsidSbc());
-      else
-        rowsetSqlca[sqldcRown] = new NetSqlca (netAgent_.netConnection_,
-                                                sqldcCode,
-                                                sqldcState.getBytes(),
-                                                null,
-                                                netAgent_.targetTypdef_.getCcsidSbc());
-    }
-
-    // reset all entries between lastRow and sqldcRown to null
-    for (int i = lastRow+1; i < sqldcRown; i++) {
-      rowsetSqlca[i] = null;
-    }
-
-    skipFastBytes (47);
-    String sqldcRdb = parseFastVCS(); // RDBNAM
-    // skip the tokens for now, since we already have the complete message.
-    parseSQLDCTOKS (); // MESSAGE_TOKENS
-    String sqldcMsg = parseFastNVCMorNVCS(); // MESSAGE_TEXT
-
-    // skip the following for now.
-    skipFastNVCMorNVCS();  // COLUMN_NAME
-    skipFastNVCMorNVCS();  // PARAMETER_NAME
-    skipFastNVCMorNVCS();  // EXTENDED_NAMES
-
-    parseSQLDCXGRP(); // SQLDCXGRP
-    return sqldcRown;
-  }
-
-  // SQL Diagnostics Extended Names Group Description - Identity 0xD5
-  // Nullable
-  //
-  // SQLDCXRDB_m ; PROTOCOL TYPE NVCM; ENVLID 0x3F; Length Override 255
-  // SQLDCXSCH_m ; PROTOCOL TYPE NVCM; ENVLID 0x3F; Length Override 255
-  // SQLDCXNAM_m ; PROTOCOL TYPE NVCM; ENVLID 0x3F; Length Override 255
-  // SQLDCXTBLN_m ; PROTOCOL TYPE NVCM; ENVLID 0x3F; Length Override 255
-  // SQLDCXRDB_s ; PROTOCOL TYPE NVCS; ENVLID 0x33; Length Override 255
-  // SQLDCXSCH_s ; PROTOCOL TYPE NVCS; ENVLID 0x33; Length Override 255
-  // SQLDCXNAM_s ; PROTOCOL TYPE NVCS; ENVLID 0x33; Length Override 255
-  // SQLDCXTBLN_s ; PROTOCOL TYPE NVCS; ENVLID 0x33; Length Override 255
-  //
-  // SQLDCXCRDB_m ; PROTOCOL TYPE NVCM; ENVLID 0x3F; Length Override 255
-  // SQLDCXCSCH_m ; PROTOCOL TYPE NVCM; ENVLID 0x3F; Length Override 255
-  // SQLDCXCNAM_m ; PROTOCOL TYPE NVCM; ENVLID 0x3F; Length Override 255
-  // SQLDCXCRDB_s ; PROTOCOL TYPE NVCS; ENVLID 0x33; Length Override 255
-  // SQLDCXCSCH_s ; PROTOCOL TYPE NVCS; ENVLID 0x33; Length Override 255
-  // SQLDCXCNAM_s ; PROTOCOL TYPE NVCS; ENVLID 0x33; Length Override 255
-  //
-  // SQLDCXRRDB_m ; PROTOCOL TYPE NVCM; ENVLID 0x3F; Length Override 255
-  // SQLDCXRSCH_m ; PROTOCOL TYPE NVCM; ENVLID 0x3F; Length Override 255
-  // SQLDCXRNAM_m ; PROTOCOL TYPE NVCM; ENVLID 0x3F; Length Override 255
-  // SQLDCXRRDB_s ; PROTOCOL TYPE NVCS; ENVLID 0x33; Length Override 255
-  // SQLDCXRSCH_s ; PROTOCOL TYPE NVCS; ENVLID 0x33; Length Override 255
-  // SQLDCXRNAM_s ; PROTOCOL TYPE NVCS; ENVLID 0x33; Length Override 255
-  //
-  // SQLDCXTRDB_m ; PROTOCOL TYPE NVCM; ENVLID 0x3F; Length Override 255
-  // SQLDCXTSCH_m ; PROTOCOL TYPE NVCM; ENVLID 0x3F; Length Override 255
-  // SQLDCXTNAM_m ; PROTOCOL TYPE NVCM; ENVLID 0x3F; Length Override 255
-  // SQLDCXTRDB_s ; PROTOCOL TYPE NVCS; ENVLID 0x33; Length Override 255
-  // SQLDCXTSCH_s ; PROTOCOL TYPE NVCS; ENVLID 0x33; Length Override 255
-  // SQLDCXTNAM_s ; PROTOCOL TYPE NVCS; ENVLID 0x33; Length Override 255
-  private void parseSQLDCXGRP() throws DisconnectException
-  {
-    if (readFastUnsignedByte() == CodePoint.NULLDATA)
-      return;
-    skipFastNVCMorNVCS();  // OBJECT_RDBNAM
-    skipFastNVCMorNVCS();  // OBJECT_SCHEMA
-    skipFastNVCMorNVCS();  // SPECIFIC_NAME
-    skipFastNVCMorNVCS();  // TABLE_NAME
-    String sqldcxCrdb = parseFastVCS();        // CONSTRAINT_RDBNAM
-    skipFastNVCMorNVCS();  // CONSTRAINT_SCHEMA
-    skipFastNVCMorNVCS();  // CONSTRAINT_NAME
-    parseFastVCS();        // ROUTINE_RDBNAM
-    skipFastNVCMorNVCS();  // ROUTINE_SCHEMA
-    skipFastNVCMorNVCS();  // ROUTINE_NAME
-    parseFastVCS();        // TRIGGER_RDBNAM
-    skipFastNVCMorNVCS();  // TRIGGER_SCHEMA
-    skipFastNVCMorNVCS();  // TRIGGER_NAME
-  }
-
-  private String parseFastNVCMorNVCS () throws DisconnectException
-  {
-    String stringToBeSet = null;
-    int vcm_length = 0;
-    int vcs_length = 0;
-    if (readFastUnsignedByte() != CodePoint.NULLDATA) {
-      vcm_length = readFastUnsignedShort();
-      if (vcm_length > 0)
-        stringToBeSet = readFastString (vcm_length, netAgent_.targetTypdef_.getCcsidMbcEncoding());
-      if (readFastUnsignedByte() != CodePoint.NULLDATA)
-        agent_.accumulateChainBreakingReadExceptionAndThrow (new DisconnectException (
-            agent_,
-            "only one of NVCM, NVCS can be non-none"));
-    }
-    else {
-      if (readFastUnsignedByte() != CodePoint.NULLDATA) {
-        vcs_length = readFastUnsignedShort();
-        if (vcs_length > 0)
-          stringToBeSet = readFastString (vcs_length, netAgent_.targetTypdef_.getCcsidSbcEncoding());
-      }
-    }
-    return stringToBeSet;
-  }
-
-  private void skipFastNVCMorNVCS () throws DisconnectException
-  {
-    int vcm_length = 0;
-    int vcs_length = 0;
-    if (readFastUnsignedByte() != CodePoint.NULLDATA) {
-      vcm_length = readFastUnsignedShort();
-      if (vcm_length > 0)
-        //stringToBeSet = readString (vcm_length, netAgent_.targetTypdef_.getCcsidMbcEncoding());
-        skipFastBytes (vcm_length);
-      if (readFastUnsignedByte() != CodePoint.NULLDATA)
-        agent_.accumulateChainBreakingReadExceptionAndThrow (new DisconnectException (
-            agent_,
-            "only one of NVCM, NVCS can be non-none"));
-    }
-    else {
-      if (readFastUnsignedByte() != CodePoint.NULLDATA) {
-        vcs_length = readFastUnsignedShort();
-        if (vcs_length > 0)
-          //stringToBeSet = readString (vcs_length, netAgent_.targetTypdef_.getCcsidSbcEncoding());
-          skipFastBytes (vcs_length);
-      }
-    }
-  }
-
-  void resetRowsetSqlca (Sqlca[] rowsetSqlca, int row)
-  {
-    // rowsetSqlca can be null.
-    int count = ((rowsetSqlca == null) ? 0 : rowsetSqlca.length);
-    for (int i=row; i< count; i++)
-      rowsetSqlca[i] = null;
-  }
+        if (codePoint == CodePoint.CCSIDSBC ||
+                codePoint == CodePoint.CCSIDDBC ||
+                codePoint == CodePoint.CCSIDMBC) {
+            // the server didn't like one of the ccsids.
+            // the message should reflect the error in question.  right now these values
+            // will be hard coded but this won't be correct if our driver starts sending
+            // other values to the server.  In order to pick up the correct values,
+            // a little reorganization may need to take place so that this code (or
+            // whatever code sets the message) has access to the correct values.
+            int cpValue = 0;
+            switch (codePoint) {
+            case CodePoint.CCSIDSBC:
+                cpValue = netAgent_.typdef_.getCcsidSbc();
+                break;
+            case CodePoint.CCSIDDBC:
+                cpValue = netAgent_.typdef_.getCcsidDbc();
+                break;
+            case CodePoint.CCSIDMBC:
+                cpValue = netAgent_.typdef_.getCcsidSbc();
+                break;
+            default:
+                // should never be in this default case...
+                cpValue = 0;
+                break;
+            }
+            agent_.accumulateChainBreakingReadExceptionAndThrow(new DisconnectException(agent_,
+                    "There is no available conversion for the source code page, " + cpValue +
+                    ", to the target code page, " + value + "."));
+            //"57017", -332));
+            return;
+        }
+        // the problem isn't with one of the ccsid values so...
+
+        // Returning more information would
+        // require rearranging this code a little.
+        agent_.accumulateChainBreakingReadExceptionAndThrow(new DisconnectException(agent_,
+                "The DDM parameter value is not supported.  " +
+                "DDM parameter code point having unsupported value : 0x" + Integer.toHexString(codePoint),
+                SqlState._58017));
+
+    }
+
+    void doDtamchrmSemantics() throws DisconnectException {
+        agent_.accumulateChainBreakingReadExceptionAndThrow(new DisconnectException(agent_,
+                "Execution failed due to a distribution protocol error that caused " +
+                "deallocation of the conversation.  " +
+                "A Data Descriptor Mismatch Error was detected.",
+                SqlState._58009));
+    }
+
+    // Messages
+    //  SQLSTATE : 58010
+    //      Execution failed due to a distribution protocol error that
+    //      will affect the successful execution of subsequent DDM commands
+    //      or SQL statements.
+    //  SQLCODE : -30021
+    //       Execution failed because of a Distributed Protocol
+    //       Error that will affect the successful execution of subsequent
+    //       commands and SQL statements: Manager <manager> at Level
+    //       <level> not supported.
+    //
+    //       A system erro occurred that prevented successful connection
+    //       of the application to the remote database.  This message (SQLCODE)
+    //       is producted for SQL CONNECT statement.
+    private void doMgrlvlrmSemantics(String manager, String level) throws DisconnectException {
+        agent_.accumulateChainBreakingReadExceptionAndThrow(new DisconnectException(agent_,
+                "Execution failed due to a distribution protocol error that will " +
+                "affect the successful execution of subsequent DDM commands or SQL statements.  " +
+                "A connection could not be established to the database because " +
+                "manager " + manager + " at level " + level + " is not supported.",
+                SqlState._58010));
+
+    }
+
+    private void doMgrlvlrmSemantics(int manager, int level) throws DisconnectException {
+        doMgrlvlrmSemantics("0x" + Integer.toHexString(manager),
+                "0x" + Integer.toHexString(level));
+    }
+
+    private void doMgrlvlrmSemantics(int[] nameList, int[] levelList) throws DisconnectException {
+        StringBuffer managerNames = new StringBuffer(100);
+        StringBuffer managerLevels = new StringBuffer(100);
+
+        int count = nameList.length;
+        for (int i = 0; i < count; i++) {
+            managerNames.append("0x");
+            managerNames.append(nameList[i]);
+            managerLevels.append("0x");
+            managerLevels.append(levelList[i]);
+            if (i != (count - 1)) {
+                managerNames.append(",");
+                managerLevels.append(",");
+            }
+        }
+        doMgrlvlrmSemantics(managerNames.toString(), managerLevels.toString());
+    }
+
+    // The client can detect that a conversational protocol error has occurred.
+    // This can also be detected at the server in which case a PRCCNVRM is returned.
+    // The Conversation Protocol Error Code, PRCCNVRM, describes the various errors.
+    //
+    // Note: Not all of these may be valid at the client.  See descriptions for
+    // which ones make sense for client side errors/checks.
+    // Conversation Error Code                  Description of Error
+    // -----------------------                  --------------------
+    // 0x01                                     RPYDSS received by target communications manager.
+    // 0x02                                     Multiple DSSs sent without chaining or multiple
+    //                                          DSS chains sent.
+    // 0x03                                     OBJDSS sent when not allowed.
+    // 0x04                                     Request correlation identifier of an RQSDSS
+    //                                          is less than or equal to the previous
+    //                                          RQSDSS's request correlatio identifier in the chain.
+    // 0x05                                     Request correlation identifier of an OBJDSS
+    //                                          does not equal the request correlation identifier
+    //                                          of the preceding RQSDSS.
+    // 0x06                                     EXCSAT was not the first command after the connection
+    //                                          was established.
+    // 0x10                                     ACCSEC or SECCHK command sent in wrong state.
+    // 0x11                                     SYNCCTL or SYNCRSY command is used incorrectly.
+    // 0x12                                     RDBNAM mismatch between ACCSEC, SECCHK, and ACCRDB.
+    // 0x13                                     A command follows one that returned EXTDTAs as reply object.
+    //
+    // When the client detects these errors, it will be handled as if a PRCCNVRM is returned
+    // from the server.  In this PRCCNVRM case, PROTOCOL architects an SQLSTATE of 58008 or 58009
+    // depening of the SVRCOD.  In this case, a 58009 will always be returned.
+    // 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.
+    protected void doPrccnvrmSemantics(int conversationProtocolErrorCode) throws DisconnectException {
+        // we may need to map the conversation protocol error code, prccnvcd, to some kind
+        // of reason code.  For now just return the prccnvcd as the reason code
+        agent_.accumulateChainBreakingReadExceptionAndThrow(new DisconnectException(agent_,
+                "Execution failed due to a distribution protocol error that caused " +
+                "deallocation of the conversation.  " +
+                "A PROTOCOL Conversational Protocol Error was detected.  " +
+                "Reason: 0x" + Integer.toHexString(conversationProtocolErrorCode),
+                SqlState._58009));
+    }
+
+    // SQL Diagnostics Condition Token Array - Identity 0xF7
+    // SQLNUMROW; ROW LID 0x68; ELEMENT TAKEN 0(all); REP FACTOR 1
+    // SQLTOKROW; ROW LID 0xE7; ELEMENT TAKEN 0(all); REP FACTOR 0(all)
+    void parseSQLDCTOKS() throws DisconnectException {
+        if (readFastUnsignedByte() == CodePoint.NULLDATA) {
+            return;
+        }
+        int num = parseFastSQLNUMROW();
+        for (int i = 0; i < num; i++) {
+            parseSQLTOKROW();
+        }
+    }
+
+    // SQL Diagnostics Condition Information Array - Identity 0xF5
+    // SQLNUMROW; ROW LID 0x68; ELEMENT TAKEN 0(all); REP FACTOR 1
+    // SQLDCIROW; ROW LID 0xE5; ELEMENT TAKEN 0(all); REP FACTOR 0(all)
+    private void parseSQLDIAGCI(Sqlca[] rowsetSqlca) throws DisconnectException {
+        if (readFastUnsignedByte() == CodePoint.NULLDATA) {
+            return;
+        }
+        int num = parseFastSQLNUMROW();
+        if (num == 0) {
+            resetRowsetSqlca(rowsetSqlca, 0);
+        }
+
+        // lastRow is the row number for the last row that had a non-null SQLCA.
+        int lastRow = 1;
+        for (int i = 0; i < num; i++) {
+            lastRow = parseSQLDCROW(rowsetSqlca, lastRow);
+        }
+        resetRowsetSqlca(rowsetSqlca, lastRow + 1);
+    }
+
+    // SQL Diagnostics Connection Array - Identity 0xF6
+    // SQLNUMROW; ROW LID 0x68; ELEMENT TAKEN 0(all); REP FACTOR 1
+    // SQLCNROW;  ROW LID 0xE6; ELEMENT TAKEN 0(all); REP FACTOR 0(all)
+    private void parseSQLDIAGCN() throws DisconnectException {
+        if (readUnsignedByte() == CodePoint.NULLDATA) {
+            return;
+        }
+        int num = parseFastSQLNUMROW();
+        for (int i = 0; i < num; i++) {
+            parseSQLCNROW();
+        }
+    }
+
+    // SQL Diagnostics Connection Row - Identity 0xE6
+    // SQLCNGRP; GROUP LID 0xD6; ELEMENT TAKEN 0(all); REP FACTOR 1
+    private void parseSQLCNROW() throws DisconnectException {
+        parseSQLCNGRP();
+    }
+
+    // SQL Diagnostics Condition Row - Identity 0xE5
+    // SQLDCGRP; GROUP LID 0xD5; ELEMENT TAKEN 0(all); REP FACTOR 1
+    private int parseSQLDCROW(Sqlca[] rowsetSqlca, int lastRow) throws DisconnectException {
+        return parseSQLDCGRP(rowsetSqlca, lastRow);
+    }
+
+    // SQL Diagnostics Token Row - Identity 0xE7
+    // SQLTOKGRP; GROUP LID 0xD7; ELEMENT TAKEN 0(all); REP FACTOR 1
+    private void parseSQLTOKROW() throws DisconnectException {
+        parseSQLTOKGRP();
+    }
+
+    // check on SQLTOKGRP format
+    private void parseSQLTOKGRP() throws DisconnectException {
+        skipFastNVCMorNVCS();
+    }
+
+    // SQL Diagnostics Statement Group Description - Identity 0xD3
+    // Nullable Group
+    // SQLDSFCOD; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
+    // SQLDSCOST; PROTOCOL TYPE I4; ENVLID 0X02; Length Override 4
+    // SQLDSLROW; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
+    // SQLDSNPM; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
+    // SQLDSNRS; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
+    // SQLDSRNS; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
+    // SQLDSDCOD; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
+    // SQLDSROWC; PROTOCOL TYPE FD; ENVLID 0x0E; Length Override 31
+    // SQLDSNROW; PROTOCOL TYPE FD; ENVLID 0x0E; Length Override 31
+    // SQLDSROWCS; PROTOCOL TYPE FD; ENVLID 0x0E; Length Override 31
+    // SQLDSACON; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
+    // SQLDSACRH; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
+    // SQLDSACRS; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
+    // SQLDSACSL; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
+    // SQLDSACSE; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
+    // SQLDSACTY; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
+    // SQLDSCERR; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
+    // SQLDSMORE; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
+    private long parseSQLDIAGSTT(Sqlca[] rowsetSqlca) throws DisconnectException {
+        if (readFastUnsignedByte() == CodePoint.NULLDATA) {
+            return 0;
+        }
+        int sqldsFcod = readFastInt(); // FUNCTION_CODE
+        int sqldsCost = readFastInt(); // COST_ESTIMATE
+        int sqldsLrow = readFastInt(); // LAST_ROW
+
+        skipFastBytes(16);
+
+        long sqldsRowc = readFastLong(); // ROW_COUNT
+
+        skipFastBytes(24);
+
+        return sqldsRowc;
+    }
+
+    // SQL Diagnostics Connection Group Description - Identity 0xD6
+    // Nullable
+    //
+    // SQLCNSTATE; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
+    // SQLCNSTATUS; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
+    // SQLCNATYPE; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
+    // SQLCNETYPE; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 1
+    // SQLCNPRDID; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 8
+    // SQLCNRDB; PROTOCOL TYPE VCS; ENVLID 0x32; Length Override 255
+    // SQLCNCLASS; PROTOCOL TYPE VCS; ENVLID 0x32; Length Override 255
+    // SQLCNAUTHID; PROTOCOL TYPE VCS; ENVLID 0x32; Length Override 255
+    private void parseSQLCNGRP() throws DisconnectException {
+        skipBytes(18);
+        String sqlcnRDB = parseFastVCS();    // RDBNAM
+        String sqlcnClass = parseFastVCS();  // CLASS_NAME
+        String sqlcnAuthid = parseFastVCS(); // AUTHID
+    }
+
+    // SQL Diagnostics Condition Group Description
+    //
+    // SQLDCCODE; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
+    // SQLDCSTATE; PROTOCOL TYPE FCS; ENVLID Ox30; Lengeh Override 5
+    // SQLDCREASON; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
+    // SQLDCLINEN; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
+    // SQLDCROWN; PROTOCOL TYPE FD; ENVLID 0x0E; Lengeh Override 31
+    // SQLDCER01; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
+    // SQLDCER02; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
+    // SQLDCER03; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
+    // SQLDCER04; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
+    // SQLDCPART; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
+    // SQLDCPPOP; PROTOCOL TYPE I4; ENVLID 0x02; Length Override 4
+    // SQLDCMSGID; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 10
+    // SQLDCMDE; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 8
+    // SQLDCPMOD; PROTOCOL TYPE FCS; ENVLID 0x30; Length Override 5
+    // SQLDCRDB; PROTOCOL TYPE VCS; ENVLID 0x32; Length Override 255
+    // SQLDCTOKS; PROTOCOL TYPE N-RLO; ENVLID 0xF7; Length Override 0
+    // SQLDCMSG_m; PROTOCOL TYPE NVMC; ENVLID 0x3F; Length Override 32672
+    // SQLDCMSG_S; PROTOCOL TYPE NVCS; ENVLID 0x33; Length Override 32672
+    // SQLDCCOLN_m; PROTOCOL TYPE NVCM ; ENVLID 0x3F; Length Override 255
+    // SQLDCCOLN_s; PROTOCOL TYPE NVCS; ENVLID 0x33; Length Override 255
+    // SQLDCCURN_m; PROTOCOL TYPE NVCM; ENVLID 0x3F; Length Override 255
+    // SQLDCCURN_s; PROTOCOL TYPE NVCS; ENVLID 0x33; Length Override 255
+    // SQLDCPNAM_m; PROTOCOL TYPE NVCM; ENVLID 0x3F; Length Override 255
+    // SQLDCPNAM_s; PROTOCOL TYPE NVCS; ENVLID 0x33; Length Override 255
+    // SQLDCXGRP; PROTOCOL TYPE N-GDA; ENVLID 0xD3; Length Override 1
+    private int parseSQLDCGRP(Sqlca[] rowsetSqlca, int lastRow) throws DisconnectException {
+        int sqldcCode = readFastInt(); // SQLCODE
+        String sqldcState = readFastString(5, netAgent_.targetTypdef_.getCcsidSbcEncoding()); // SQLSTATE
+        int sqldcReason = readFastInt();  // REASON_CODE
+        int sqldcLinen = readFastInt(); // LINE_NUMBER
+        int sqldcRown = (int) readFastLong(); // ROW_NUMBER
+
+        // save +20237 in the 0th entry of the rowsetSqlca's.
+        // this info is going to be used when a subsequent fetch prior is issued, and if already
+        // received a +20237 then we've gone beyond the first row and there is no need to
+        // flow another fetch to the server.
+        if (sqldcCode == 20237) {
+            rowsetSqlca[0] = new NetSqlca(netAgent_.netConnection_,
+                    sqldcCode,
+                    sqldcState.getBytes(),
+                    null,
+                    netAgent_.targetTypdef_.getCcsidSbc());
+        } else {
+            if (rowsetSqlca[sqldcRown] != null) {
+                rowsetSqlca[sqldcRown].resetRowsetSqlca(netAgent_.netConnection_,
+                        sqldcCode,
+                        sqldcState.getBytes(),
+                        null,
+                        netAgent_.targetTypdef_.getCcsidSbc());
+            } else {
+                rowsetSqlca[sqldcRown] = new NetSqlca(netAgent_.netConnection_,
+                        sqldcCode,
+                        sqldcState.getBytes(),
+                        null,
+                        netAgent_.targetTypdef_.getCcsidSbc());
+            }
+        }
+
+        // reset all entries between lastRow and sqldcRown to null
+        for (int i = lastRow + 1; i < sqldcRown; i++) {
+            rowsetSqlca[i] = null;
+        }
+
+        skipFastBytes(47);
+        String sqldcRdb = parseFastVCS(); // RDBNAM
+        // skip the tokens for now, since we already have the complete message.
+        parseSQLDCTOKS(); // MESSAGE_TOKENS
+        String sqldcMsg = parseFastNVCMorNVCS(); // MESSAGE_TEXT
+
+        // skip the following for now.
+        skipFastNVCMorNVCS();  // COLUMN_NAME
+        skipFastNVCMorNVCS();  // PARAMETER_NAME
+        skipFastNVCMorNVCS();  // EXTENDED_NAMES
+
+        parseSQLDCXGRP(); // SQLDCXGRP
+        return sqldcRown;
+    }
+
+    // SQL Diagnostics Extended Names Group Description - Identity 0xD5
+    // Nullable
+    //
+    // SQLDCXRDB_m ; PROTOCOL TYPE NVCM; ENVLID 0x3F; Length Override 255
+    // SQLDCXSCH_m ; PROTOCOL TYPE NVCM; ENVLID 0x3F; Length Override 255
+    // SQLDCXNAM_m ; PROTOCOL TYPE NVCM; ENVLID 0x3F; Length Override 255
+    // SQLDCXTBLN_m ; PROTOCOL TYPE NVCM; ENVLID 0x3F; Length Override 255
+    // SQLDCXRDB_s ; PROTOCOL TYPE NVCS; ENVLID 0x33; Length Override 255
+    // SQLDCXSCH_s ; PROTOCOL TYPE NVCS; ENVLID 0x33; Length Override 255
+    // SQLDCXNAM_s ; PROTOCOL TYPE NVCS; ENVLID 0x33; Length Override 255
+    // SQLDCXTBLN_s ; PROTOCOL TYPE NVCS; ENVLID 0x33; Length Override 255
+    //
+    // SQLDCXCRDB_m ; PROTOCOL TYPE NVCM; ENVLID 0x3F; Length Override 255
+    // SQLDCXCSCH_m ; PROTOCOL TYPE NVCM; ENVLID 0x3F; Length Override 255
+    // SQLDCXCNAM_m ; PROTOCOL TYPE NVCM; ENVLID 0x3F; Length Override 255
+    // SQLDCXCRDB_s ; PROTOCOL TYPE NVCS; ENVLID 0x33; Length Override 255
+    // SQLDCXCSCH_s ; PROTOCOL TYPE NVCS; ENVLID 0x33; Length Override 255
+    // SQLDCXCNAM_s ; PROTOCOL TYPE NVCS; ENVLID 0x33; Length Override 255
+    //
+    // SQLDCXRRDB_m ; PROTOCOL TYPE NVCM; ENVLID 0x3F; Length Override 255
+    // SQLDCXRSCH_m ; PROTOCOL TYPE NVCM; ENVLID 0x3F; Length Override 255
+    // SQLDCXRNAM_m ; PROTOCOL TYPE NVCM; ENVLID 0x3F; Length Override 255
+    // SQLDCXRRDB_s ; PROTOCOL TYPE NVCS; ENVLID 0x33; Length Override 255
+    // SQLDCXRSCH_s ; PROTOCOL TYPE NVCS; ENVLID 0x33; Length Override 255
+    // SQLDCXRNAM_s ; PROTOCOL TYPE NVCS; ENVLID 0x33; Length Override 255
+    //
+    // SQLDCXTRDB_m ; PROTOCOL TYPE NVCM; ENVLID 0x3F; Length Override 255
+    // SQLDCXTSCH_m ; PROTOCOL TYPE NVCM; ENVLID 0x3F; Length Override 255
+    // SQLDCXTNAM_m ; PROTOCOL TYPE NVCM; ENVLID 0x3F; Length Override 255
+    // SQLDCXTRDB_s ; PROTOCOL TYPE NVCS; ENVLID 0x33; Length Override 255
+    // SQLDCXTSCH_s ; PROTOCOL TYPE NVCS; ENVLID 0x33; Length Override 255
+    // SQLDCXTNAM_s ; PROTOCOL TYPE NVCS; ENVLID 0x33; Length Override 255
+    private void parseSQLDCXGRP() throws DisconnectException {
+        if (readFastUnsignedByte() == CodePoint.NULLDATA) {
+            return;
+        }
+        skipFastNVCMorNVCS();  // OBJECT_RDBNAM
+        skipFastNVCMorNVCS();  // OBJECT_SCHEMA
+        skipFastNVCMorNVCS();  // SPECIFIC_NAME
+        skipFastNVCMorNVCS();  // TABLE_NAME
+        String sqldcxCrdb = parseFastVCS();        // CONSTRAINT_RDBNAM
+        skipFastNVCMorNVCS();  // CONSTRAINT_SCHEMA
+        skipFastNVCMorNVCS();  // CONSTRAINT_NAME
+        parseFastVCS();        // ROUTINE_RDBNAM
+        skipFastNVCMorNVCS();  // ROUTINE_SCHEMA
+        skipFastNVCMorNVCS();  // ROUTINE_NAME
+        parseFastVCS();        // TRIGGER_RDBNAM
+        skipFastNVCMorNVCS();  // TRIGGER_SCHEMA
+        skipFastNVCMorNVCS();  // TRIGGER_NAME
+    }
+
+    private String parseFastNVCMorNVCS() throws DisconnectException {
+        String stringToBeSet = null;
+        int vcm_length = 0;
+        int vcs_length = 0;
+        if (readFastUnsignedByte() != CodePoint.NULLDATA) {
+            vcm_length = readFastUnsignedShort();
+            if (vcm_length > 0) {
+                stringToBeSet = readFastString(vcm_length, netAgent_.targetTypdef_.getCcsidMbcEncoding());
+            }
+            if (readFastUnsignedByte() != CodePoint.NULLDATA) {
+                agent_.accumulateChainBreakingReadExceptionAndThrow(new DisconnectException(agent_,
+                        "only one of NVCM, NVCS can be non-none"));
+            }
+        } else {
+            if (readFastUnsignedByte() != CodePoint.NULLDATA) {
+                vcs_length = readFastUnsignedShort();
+                if (vcs_length > 0) {
+                    stringToBeSet = readFastString(vcs_length, netAgent_.targetTypdef_.getCcsidSbcEncoding());
+                }
+            }
+        }
+        return stringToBeSet;
+    }
+
+    private void skipFastNVCMorNVCS() throws DisconnectException {
+        int vcm_length = 0;
+        int vcs_length = 0;
+        if (readFastUnsignedByte() != CodePoint.NULLDATA) {
+            vcm_length = readFastUnsignedShort();
+            if (vcm_length > 0)
+            //stringToBeSet = readString (vcm_length, netAgent_.targetTypdef_.getCcsidMbcEncoding());
+            {
+                skipFastBytes(vcm_length);
+            }
+            if (readFastUnsignedByte() != CodePoint.NULLDATA) {
+                agent_.accumulateChainBreakingReadExceptionAndThrow(new DisconnectException(agent_,
+                        "only one of NVCM, NVCS can be non-none"));
+            }
+        } else {
+            if (readFastUnsignedByte() != CodePoint.NULLDATA) {
+                vcs_length = readFastUnsignedShort();
+                if (vcs_length > 0)
+                //stringToBeSet = readString (vcs_length, netAgent_.targetTypdef_.getCcsidSbcEncoding());
+                {
+                    skipFastBytes(vcs_length);
+                }
+            }
+        }
+    }
+
+    void resetRowsetSqlca(Sqlca[] rowsetSqlca, int row) {
+        // rowsetSqlca can be null.
+        int count = ((rowsetSqlca == null) ? 0 : rowsetSqlca.length);
+        for (int i = row; i < count; i++) {
+            rowsetSqlca[i] = null;
+        }
+    }
 }
 
 

 

infrastructure at apache.org
ViewVC Help
Powered by ViewVC 1.1.26