Modified: incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetStatementReply.java URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetStatementReply.java?rev=165585&r1=165584&r2=165585&view=diff ============================================================================== --- incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetStatementReply.java (original) +++ incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetStatementReply.java Sun May 1 23:25:59 2005 @@ -20,2370 +20,2335 @@ package org.apache.derby.client.net; -import org.apache.derby.client.am.Agent; -import org.apache.derby.client.am.SqlState; -import org.apache.derby.client.am.Statement; import org.apache.derby.client.am.ColumnMetaData; import org.apache.derby.client.am.DisconnectException; -import org.apache.derby.client.am.Utils; -import org.apache.derby.client.am.Types; -import org.apache.derby.client.am.Section; -import org.apache.derby.client.am.StatementCallbackInterface; import org.apache.derby.client.am.PreparedStatementCallbackInterface; import org.apache.derby.client.am.ResultSetCallbackInterface; +import org.apache.derby.client.am.Section; +import org.apache.derby.client.am.SqlState; +import org.apache.derby.client.am.Statement; +import org.apache.derby.client.am.StatementCallbackInterface; +import org.apache.derby.client.am.Types; +import org.apache.derby.client.am.Utils; -public class NetStatementReply extends NetPackageReply implements StatementReplyInterface -{ - NetStatementReply (NetAgent netAgent, int bufferSize) - { - super (netAgent, bufferSize); - } - - //----------------------------- entry points --------------------------------- - - public void readPrepareDescribeOutput (StatementCallbackInterface statement) throws DisconnectException - { - startSameIdChainParse(); - parsePRPSQLSTTreply (statement); - endOfSameIdChainData(); - } - - public void readExecuteImmediate (StatementCallbackInterface statement) throws DisconnectException - { - startSameIdChainParse(); - parseEXCSQLIMMreply (statement); - endOfSameIdChainData(); - } - - public void readOpenQuery (StatementCallbackInterface statement) throws DisconnectException - { - startSameIdChainParse(); - parseOPNQRYreply (statement); - endOfSameIdChainData(); - } - - public void readExecute (PreparedStatementCallbackInterface preparedStatement) throws DisconnectException - { - startSameIdChainParse(); - parseEXCSQLSTTreply (preparedStatement); - endOfSameIdChainData(); - } - - public void readPrepare (StatementCallbackInterface statement) throws DisconnectException - { - startSameIdChainParse(); - parsePRPSQLSTTreply (statement); - endOfSameIdChainData(); - } - - public void readDescribeInput (PreparedStatementCallbackInterface preparedStatement) throws DisconnectException - { - if (longBufferForDecryption_ != null) { - buffer_ = longBufferForDecryption_; - pos_ = longPosForDecryption_; - count_ = longCountForDecryption_; - if (longBufferForDecryption_ != null && count_ > longBufferForDecryption_.length) - count_ = longBufferForDecryption_.length; - dssLength_ = 0; - longBufferForDecryption_ = null; - } - - startSameIdChainParse(); - parseDSCSQLSTTreply (preparedStatement, 1); // anything other than 0 for input - endOfSameIdChainData(); - } - - public void readDescribeOutput (PreparedStatementCallbackInterface preparedStatement) throws DisconnectException - { - startSameIdChainParse(); - parseDSCSQLSTTreply (preparedStatement, 0); // 0 for output - endOfSameIdChainData(); - } - - public void readExecuteCall (StatementCallbackInterface statement) throws DisconnectException - { - startSameIdChainParse(); - parseEXCSQLSTTreply (statement); - endOfSameIdChainData(); - } - - - //----------------------helper methods---------------------------------------- - - //------------------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. - - private void parsePRPSQLSTTreply (StatementCallbackInterface statement) throws DisconnectException - { - int peekCP = parseTypdefsOrMgrlvlovrs (); - - if (peekCP == CodePoint.SQLDARD) { - // the sqlcagrp is most likely null for insert/update/deletes. if it is null, then we can - // peek ahead for the column number which most likely will be 0. if it is 0, then we will - // not new up a ColumnMetaData, and we can skip the rest of the bytes in sqldard. - // if sqlcargrp is not null, (most likely for select's) then we will not peek ahead for the - // column number since it will never be 0 in a select case. - ColumnMetaData columnMetaData = null; - NetSqlca netSqlca = null; - boolean nullSqlca = peekForNullSqlcagrp (); - if (nullSqlca && peekNumOfColumns() == 0) - netSqlca = parseSQLDARD (columnMetaData, true); // true means to skip the rest of SQLDARD bytes - else { - columnMetaData = new ColumnMetaData (netAgent_.logWriter_); - netSqlca = parseSQLDARD (columnMetaData, false); // false means do not skip SQLDARD bytes. - } - - statement.completePrepareDescribeOutput (columnMetaData, - netSqlca); - } - else if (peekCP == CodePoint.SQLCARD) { - NetSqlca netSqlca = parseSQLCARD (null); - statement.completePrepare (netSqlca); - } - else { - parsePrepareError (statement); - } - - } - - // Parse the reply for the Describe SQL Statement Command. - // This method handles the parsing of all command replies and reply data - // for the dscsqlstt command. - private void parseDSCSQLSTTreply (PreparedStatementCallbackInterface ps, - int metaDataType) // 0 is output, else input - throws DisconnectException - { - int peekCP = parseTypdefsOrMgrlvlovrs (); - - if (peekCP == CodePoint.SQLDARD) { - ColumnMetaData columnMetaData = null; - - if (columnMetaData == null) - columnMetaData = new ColumnMetaData(netAgent_.logWriter_); - - NetSqlca netSqlca = parseSQLDARD (columnMetaData, false); // false means do not skip SQLDARD bytes - if(columnMetaData.columns_ == 0) - columnMetaData = null; - - if (metaDataType == 0) // DESCRIBE OUTPUT - ps.completeDescribeOutput (columnMetaData, netSqlca); - else - ps.completeDescribeInput (columnMetaData, netSqlca); - } - else if (peekCP == CodePoint.SQLCARD) { - NetSqlca netSqlca = parseSQLCARD (null); - if (metaDataType == 0) // DESCRIBE OUTPUT - ps.completeDescribeOutput (null, netSqlca); - else - ps.completeDescribeInput (null, netSqlca); - } - else { - parseDescribeError (ps); - } - - } - - // Parse the reply for the Execute Immediate SQL Statement Command. - // This method handles the parsing of all command replies and reply data - // for the excsqlimm command. - private void parseEXCSQLIMMreply (StatementCallbackInterface statement) throws DisconnectException - { - int peekCP = parseTypdefsOrMgrlvlovrs (); - - if (peekCP == CodePoint.RDBUPDRM) { - parseRDBUPDRM(); - peekCP = parseTypdefsOrMgrlvlovrs (); - } - - switch (peekCP) { - case CodePoint.ENDUOWRM: - parseENDUOWRM (statement.getConnectionCallbackInterface()); - parseTypdefsOrMgrlvlovrs (); - case CodePoint.SQLCARD: - NetSqlca netSqlca = parseSQLCARD (null); - - - statement.completeExecuteImmediate (netSqlca); - break; - default: - parseExecuteImmediateError (statement); - break; - } - - } - - // Parse the reply for the Open Query Command. - // This method handles the parsing of all command replies and reply data for the opnqry command. - // will be replaced by parseOPNQRYreply (see parseOPNQRYreplyProto) - private void parseOPNQRYreply (StatementCallbackInterface statementI) throws DisconnectException - { - int peekCP = peekCodePoint(); - - if (peekCP == CodePoint.OPNQRYRM) { - parseOpenQuery (statementI); - peekCP = peekCodePoint(); - if (peekCP == CodePoint.RDBUPDRM) { - parseRDBUPDRM(); - peekCP = peekCodePoint(); - } +public class NetStatementReply extends NetPackageReply implements StatementReplyInterface { + NetStatementReply(NetAgent netAgent, int bufferSize) { + super(netAgent, bufferSize); } - else if (peekCP == CodePoint.RDBUPDRM) { - parseRDBUPDRM(); - parseOpenQuery (statementI); - peekCP = peekCodePoint(); - } - else if (peekCP == CodePoint.OPNQFLRM) { - parseOpenQueryFailure (statementI); - peekCP = peekCodePoint(); - } - else { - parseOpenQueryError (statementI); - peekCP = peekCodePoint(); - } - - } - - // Called by NETSetClientPiggybackCommand.read() - private void parseEXCSQLSETreply (StatementCallbackInterface statement) throws DisconnectException - { - int peekCP = parseTypdefsOrMgrlvlovrs (); - - if (peekCP == CodePoint.RDBUPDRM) { - parseRDBUPDRM(); - parseTypdefsOrMgrlvlovrs (); - } - else if (peekCP == CodePoint.ENDUOWRM) { - parseENDUOWRM (statement.getConnectionCallbackInterface()); - parseTypdefsOrMgrlvlovrs (); - } - - if (peekCP == CodePoint.SQLCARD) { - NetSqlca netSqlca = parseSQLCARD (null); - statement.completeExecuteSetStatement (netSqlca); - } - else - parseExecuteSetStatementError (statement); - - } - - // Parse the reply for the Execute SQL Statement Command. - // This method handles the parsing of all command replies and reply data - // for the excsqlstt command. - // Also called by CallableStatement.readExecuteCall() - private void parseEXCSQLSTTreply (StatementCallbackInterface statementI) throws DisconnectException - { - // first handle the transaction component, which consists of one or more - // reply messages indicating the transaction state. - // These are ENDUOWRM, CMMRQSRM, or RDBUPDRM. If RDBUPDRM is returned, - // it may be followed by ENDUOWRM or CMMRQSRM - int peekCP = peekCodePoint(); - if (peekCP == CodePoint.RDBUPDRM) { - parseRDBUPDRM(); - peekCP = peekCodePoint(); - } - - if (peekCP == CodePoint.ENDUOWRM) { - parseENDUOWRM (statementI.getConnectionCallbackInterface()); - peekCP = peekCodePoint(); - } - - // Check for a RSLSETRM, this is first rm of the result set summary component - // which would be returned if a stored procedure was called which returned result sets. - if (peekCP == CodePoint.RSLSETRM) { - parseResultSetProcedure (statementI); - peekCP = peekCodePoint(); - if (peekCP == CodePoint.RDBUPDRM) - parseRDBUPDRM(); - return; - } - - // check for a possible TYPDEFNAM or TYPDEFOVR which may be present - // before the SQLCARD or SQLDTARD. - peekCP = parseTypdefsOrMgrlvlovrs (); - - // an SQLCARD may be retunred if there was no output data, result sets or parameters, - // or in the case of an error. - if (peekCP == CodePoint.SQLCARD) { - NetSqlca netSqlca = parseSQLCARD (null); - - statementI.completeExecute (netSqlca); - } - else if (peekCP == CodePoint.SQLDTARD) { - // in the case of singleton select or if a stored procedure was called which had - // parameters but no result sets, an SQLSTARD may be returned - // keep the PreparedStatementCallbackInterface, since only preparedstatement and callablestatement - // has parameters or singleton select which translates to sqldtard. - NetSqldta netSqldta = null; - boolean useCachedSingletonRowData = false; - if (((Statement)statementI).cachedSingletonRowData_ == null) - netSqldta = new NetSqldta (netAgent_); - else { - netSqldta = (NetSqldta)((Statement)statementI).cachedSingletonRowData_; - netSqldta.resetDataBuffer(); - netSqldta.extdtaData_.clear(); - useCachedSingletonRowData = true; - } - NetSqlca netSqlca = - parseSQLDTARD (netSqldta); - - // there may be externalized LOB data which also gets returned. - peekCP = peekCodePoint(); - while (peekCP == CodePoint.EXTDTA) { - copyEXTDTA (netSqldta); - peekCP = peekCodePoint(); - } - statementI.completeExecuteCall (netSqlca, netSqldta); + + //----------------------------- entry points --------------------------------- + + public void readPrepareDescribeOutput(StatementCallbackInterface statement) throws DisconnectException { + startSameIdChainParse(); + parsePRPSQLSTTreply(statement); + endOfSameIdChainData(); + } + + public void readExecuteImmediate(StatementCallbackInterface statement) throws DisconnectException { + startSameIdChainParse(); + parseEXCSQLIMMreply(statement); + endOfSameIdChainData(); + } + + public void readOpenQuery(StatementCallbackInterface statement) throws DisconnectException { + startSameIdChainParse(); + parseOPNQRYreply(statement); + endOfSameIdChainData(); + } + + public void readExecute(PreparedStatementCallbackInterface preparedStatement) throws DisconnectException { + startSameIdChainParse(); + parseEXCSQLSTTreply(preparedStatement); + endOfSameIdChainData(); + } + + public void readPrepare(StatementCallbackInterface statement) throws DisconnectException { + startSameIdChainParse(); + parsePRPSQLSTTreply(statement); + endOfSameIdChainData(); + } + + public void readDescribeInput(PreparedStatementCallbackInterface preparedStatement) throws DisconnectException { + if (longBufferForDecryption_ != null) { + buffer_ = longBufferForDecryption_; + pos_ = longPosForDecryption_; + count_ = longCountForDecryption_; + if (longBufferForDecryption_ != null && count_ > longBufferForDecryption_.length) { + count_ = longBufferForDecryption_.length; + } + dssLength_ = 0; + longBufferForDecryption_ = null; + } + + startSameIdChainParse(); + parseDSCSQLSTTreply(preparedStatement, 1); // anything other than 0 for input + endOfSameIdChainData(); + } + + public void readDescribeOutput(PreparedStatementCallbackInterface preparedStatement) throws DisconnectException { + startSameIdChainParse(); + parseDSCSQLSTTreply(preparedStatement, 0); // 0 for output + endOfSameIdChainData(); + } + + public void readExecuteCall(StatementCallbackInterface statement) throws DisconnectException { + startSameIdChainParse(); + parseEXCSQLSTTreply(statement); + endOfSameIdChainData(); + } + + + //----------------------helper methods---------------------------------------- + + //------------------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. + + private void parsePRPSQLSTTreply(StatementCallbackInterface statement) throws DisconnectException { + int peekCP = parseTypdefsOrMgrlvlovrs(); + + if (peekCP == CodePoint.SQLDARD) { + // the sqlcagrp is most likely null for insert/update/deletes. if it is null, then we can + // peek ahead for the column number which most likely will be 0. if it is 0, then we will + // not new up a ColumnMetaData, and we can skip the rest of the bytes in sqldard. + // if sqlcargrp is not null, (most likely for select's) then we will not peek ahead for the + // column number since it will never be 0 in a select case. + ColumnMetaData columnMetaData = null; + NetSqlca netSqlca = null; + boolean nullSqlca = peekForNullSqlcagrp(); + if (nullSqlca && peekNumOfColumns() == 0) { + netSqlca = parseSQLDARD(columnMetaData, true); // true means to skip the rest of SQLDARD bytes + } else { + columnMetaData = new ColumnMetaData(netAgent_.logWriter_); + netSqlca = parseSQLDARD(columnMetaData, false); // false means do not skip SQLDARD bytes. + } + + statement.completePrepareDescribeOutput(columnMetaData, + netSqlca); + } else if (peekCP == CodePoint.SQLCARD) { + NetSqlca netSqlca = parseSQLCARD(null); + statement.completePrepare(netSqlca); + } else { + parsePrepareError(statement); + } + + } + + // Parse the reply for the Describe SQL Statement Command. + // This method handles the parsing of all command replies and reply data + // for the dscsqlstt command. + private void parseDSCSQLSTTreply(PreparedStatementCallbackInterface ps, + int metaDataType) // 0 is output, else input + throws DisconnectException { + int peekCP = parseTypdefsOrMgrlvlovrs(); + + if (peekCP == CodePoint.SQLDARD) { + ColumnMetaData columnMetaData = null; + + if (columnMetaData == null) { + columnMetaData = new ColumnMetaData(netAgent_.logWriter_); + } + + NetSqlca netSqlca = parseSQLDARD(columnMetaData, false); // false means do not skip SQLDARD bytes + if (columnMetaData.columns_ == 0) { + columnMetaData = null; + } + + if (metaDataType == 0) // DESCRIBE OUTPUT + { + ps.completeDescribeOutput(columnMetaData, netSqlca); + } else { + ps.completeDescribeInput(columnMetaData, netSqlca); + } + } else if (peekCP == CodePoint.SQLCARD) { + NetSqlca netSqlca = parseSQLCARD(null); + if (metaDataType == 0) // DESCRIBE OUTPUT + { + ps.completeDescribeOutput(null, netSqlca); + } else { + ps.completeDescribeInput(null, netSqlca); + } + } else { + parseDescribeError(ps); + } + + } + + // Parse the reply for the Execute Immediate SQL Statement Command. + // This method handles the parsing of all command replies and reply data + // for the excsqlimm command. + private void parseEXCSQLIMMreply(StatementCallbackInterface statement) throws DisconnectException { + int peekCP = parseTypdefsOrMgrlvlovrs(); + + if (peekCP == CodePoint.RDBUPDRM) { + parseRDBUPDRM(); + peekCP = parseTypdefsOrMgrlvlovrs(); + } + + switch (peekCP) { + case CodePoint.ENDUOWRM: + parseENDUOWRM(statement.getConnectionCallbackInterface()); + parseTypdefsOrMgrlvlovrs(); + case CodePoint.SQLCARD: + NetSqlca netSqlca = parseSQLCARD(null); + + + statement.completeExecuteImmediate(netSqlca); + break; + default: + parseExecuteImmediateError(statement); + break; + } + + } + + // Parse the reply for the Open Query Command. + // This method handles the parsing of all command replies and reply data for the opnqry command. + // will be replaced by parseOPNQRYreply (see parseOPNQRYreplyProto) + private void parseOPNQRYreply(StatementCallbackInterface statementI) throws DisconnectException { + int peekCP = peekCodePoint(); + + if (peekCP == CodePoint.OPNQRYRM) { + parseOpenQuery(statementI); + peekCP = peekCodePoint(); + if (peekCP == CodePoint.RDBUPDRM) { + parseRDBUPDRM(); + peekCP = peekCodePoint(); + } + } else if (peekCP == CodePoint.RDBUPDRM) { + parseRDBUPDRM(); + parseOpenQuery(statementI); + peekCP = peekCodePoint(); + } else if (peekCP == CodePoint.OPNQFLRM) { + parseOpenQueryFailure(statementI); + peekCP = peekCodePoint(); + } else { + parseOpenQueryError(statementI); + peekCP = peekCodePoint(); + } + + } + + // Called by NETSetClientPiggybackCommand.read() + private void parseEXCSQLSETreply(StatementCallbackInterface statement) throws DisconnectException { + int peekCP = parseTypdefsOrMgrlvlovrs(); + + if (peekCP == CodePoint.RDBUPDRM) { + parseRDBUPDRM(); + parseTypdefsOrMgrlvlovrs(); + } else if (peekCP == CodePoint.ENDUOWRM) { + parseENDUOWRM(statement.getConnectionCallbackInterface()); + parseTypdefsOrMgrlvlovrs(); + } + + if (peekCP == CodePoint.SQLCARD) { + NetSqlca netSqlca = parseSQLCARD(null); + statement.completeExecuteSetStatement(netSqlca); + } else { + parseExecuteSetStatementError(statement); + } + } - else { - // if here, then assume an error reply message was returned. - parseExecuteError (statementI); - } - - } - - protected void parseResultSetProcedure (StatementCallbackInterface statementI) throws DisconnectException - { - // when a stored procedure is called which returns result sets, - // the next thing to be returned after the optional transaction component - // is the summary component. - // - // Parse the Result Set Summary Component which consists of a - // Result Set Reply Message, SQLCARD or SQLDTARD, and an SQL Result Set - // Reply data object. Also check for possible TYPDEF overrides before the - // OBJDSSs. - // This method returns an ArrayList of generated sections which contain the - // package and section information for the result sets which were opened on the - // server. - - // the result set summary component consists of a result set reply message. - java.util.ArrayList sectionAL = parseRSLSETRM(); - - // following the RSLSETRM is an SQLCARD or an SQLDTARD. check for a - // TYPDEFNAM or TYPDEFOVR before looking for these objects. - int peekCP = parseTypdefsOrMgrlvlovrs (); - - // The SQLCARD and the SQLDTARD are mutually exclusive. - // The SQLDTARD is returned if the stored procedure had parameters. - // (Note: the SQLDTARD contains an sqlca also. this is the sqlca for the - // stored procedure call. - NetSqldta netSqldta = null; - NetSqlca netSqlca = null; - if (peekCP == CodePoint.SQLCARD) { - netSqlca = parseSQLCARD (null); - } - else { - // keep the PreparedStatementCallbackInterface, since only preparedstatement and callablestatement - // has parameters or singleton select which translates to sqldtard. - netSqldta = new NetSqldta (netAgent_); - netSqlca = parseSQLDTARD (netSqldta); - } - - // check for a possible TYPDEFNAM or TYPDEFOVR - // before the SQL Result Set Reply Data object - peekCP = parseTypdefsOrMgrlvlovrs (); - - int numberOfResultSets = parseSQLRSLRD (sectionAL); - - // The result set summary component parsed above indicated how many result sets were opened - // by the stored pocedure call. It contained section information for - // each of these result sets. Loop through the section array and - // parse the result set component for each of the retunred result sets. - NetResultSet[] resultSets = new NetResultSet[numberOfResultSets]; - for (int i = 0; i < numberOfResultSets; i++) { - // parse the result set component of the stored procedure reply. - NetResultSet netResultSet = parseResultSetCursor ( - statementI, (Section) sectionAL.get (i)); - resultSets[i] = netResultSet; - } - - // LOBs may have been returned for one of the stored procedure parameters so - // check for any externalized data. - peekCP = peekCodePoint(); - while (peekCP == CodePoint.EXTDTA) { - copyEXTDTA (netSqldta); - peekCP = peekCodePoint(); - } - statementI.completeExecuteCall (netSqlca, netSqldta, resultSets); - } - - // Parse the Result Set component of the reply for a stored procedure - // call which returns result sets. - // The Result Set component consists of an Open Query Reply Message - // followed by an optional SQLCARD, followed by an optional - // SQL Column Information Reply data object, followed by a Query Descriptor. - // There may also be Query Data or an End of Query Reply Message. - protected NetResultSet parseResultSetCursor (StatementCallbackInterface statementI, - Section section) throws DisconnectException - { - // The first item returne is an OPNQRYRM. - NetResultSet netResultSet = parseOPNQRYRM (statementI); - - // The next to be returned is an OBJDSS so check for any TYPDEF overrides. - int peekCP = parseTypdefsOrMgrlvlovrs (); - - // An SQLCARD may be returned if there were any warnings on the OPEN. - NetSqlca netSqlca = null; - if (peekCP == CodePoint.SQLCARD) { - netSqlca = parseSQLCARD (null); - peekCP = parseTypdefsOrMgrlvlovrs (); - } - - // the SQLCINRD contains SQLDA like information for the result set. - ColumnMetaData resultSetMetaData = null; - if (peekCP == CodePoint.SQLCINRD) { - resultSetMetaData = parseSQLCINRD(); - peekCP = parseTypdefsOrMgrlvlovrs (); - } - - // A Query Descriptor must be present. - // We cannot cache the cursor if result set is returned from a stored procedure, so - // there is no cached cursor to use here. - parseQRYDSC (netResultSet.netCursor_); - peekCP = peekCodePoint(); - statementI.completeExecuteCallOpenQuery (netSqlca, netResultSet, resultSetMetaData, section); - - // Depending on the blocking rules, QRYDTA may have been returned on the open. - while (peekCP == CodePoint.QRYDTA) { - parseQRYDTA (netResultSet); - peekCP = peekCodePoint(); - } - - // Under some circumstances, the server may have closed the cursor. - // This will be indicated by an ENDQRYRM. - if (peekCP == CodePoint.ENDQRYRM) - parseEndQuery ((ResultSetCallbackInterface) netResultSet); - - return netResultSet; - } - - protected void parseOpenQuery (StatementCallbackInterface statementI) throws DisconnectException - { - NetResultSet netResultSet = parseOPNQRYRM (statementI); - - NetSqlca sqlca = null; - int peekCP = peekCodePoint(); - if (peekCP != CodePoint.QRYDSC) { - - peekCP = parseTypdefsOrMgrlvlovrs (); - - if (peekCP == CodePoint.SQLDARD) { - ColumnMetaData columnMetaData = new ColumnMetaData (netAgent_.logWriter_); - NetSqlca netSqlca = parseSQLDARD (columnMetaData, false); // false means do not skip SQLDARD bytes - - //For java stored procedure, we got the resultSetMetaData from server, - //Do we need to save the resultSetMetaData and propagate netSqlca? - //The following statement are doing the both, but it do more than - //we want. It also mark the completion of Prepare statement. + + // Parse the reply for the Execute SQL Statement Command. + // This method handles the parsing of all command replies and reply data + // for the excsqlstt command. + // Also called by CallableStatement.readExecuteCall() + private void parseEXCSQLSTTreply(StatementCallbackInterface statementI) throws DisconnectException { + // first handle the transaction component, which consists of one or more + // reply messages indicating the transaction state. + // These are ENDUOWRM, CMMRQSRM, or RDBUPDRM. If RDBUPDRM is returned, + // it may be followed by ENDUOWRM or CMMRQSRM + int peekCP = peekCodePoint(); + if (peekCP == CodePoint.RDBUPDRM) { + parseRDBUPDRM(); + peekCP = peekCodePoint(); + } + + if (peekCP == CodePoint.ENDUOWRM) { + parseENDUOWRM(statementI.getConnectionCallbackInterface()); + peekCP = peekCodePoint(); + } + + // Check for a RSLSETRM, this is first rm of the result set summary component + // which would be returned if a stored procedure was called which returned result sets. + if (peekCP == CodePoint.RSLSETRM) { + parseResultSetProcedure(statementI); + peekCP = peekCodePoint(); + if (peekCP == CodePoint.RDBUPDRM) { + parseRDBUPDRM(); + } + return; + } + + // check for a possible TYPDEFNAM or TYPDEFOVR which may be present + // before the SQLCARD or SQLDTARD. + peekCP = parseTypdefsOrMgrlvlovrs(); + + // an SQLCARD may be retunred if there was no output data, result sets or parameters, + // or in the case of an error. + if (peekCP == CodePoint.SQLCARD) { + NetSqlca netSqlca = parseSQLCARD(null); + + statementI.completeExecute(netSqlca); + } else if (peekCP == CodePoint.SQLDTARD) { + // in the case of singleton select or if a stored procedure was called which had + // parameters but no result sets, an SQLSTARD may be returned + // keep the PreparedStatementCallbackInterface, since only preparedstatement and callablestatement + // has parameters or singleton select which translates to sqldtard. + NetSqldta netSqldta = null; + boolean useCachedSingletonRowData = false; + if (((Statement) statementI).cachedSingletonRowData_ == null) { + netSqldta = new NetSqldta(netAgent_); + } else { + netSqldta = (NetSqldta) ((Statement) statementI).cachedSingletonRowData_; + netSqldta.resetDataBuffer(); + netSqldta.extdtaData_.clear(); + useCachedSingletonRowData = true; + } + NetSqlca netSqlca = + parseSQLDTARD(netSqldta); + + // there may be externalized LOB data which also gets returned. + peekCP = peekCodePoint(); + while (peekCP == CodePoint.EXTDTA) { + copyEXTDTA(netSqldta); + peekCP = peekCodePoint(); + } + statementI.completeExecuteCall(netSqlca, netSqldta); + } else { + // if here, then assume an error reply message was returned. + parseExecuteError(statementI); + } + + } + + protected void parseResultSetProcedure(StatementCallbackInterface statementI) throws DisconnectException { + // when a stored procedure is called which returns result sets, + // the next thing to be returned after the optional transaction component + // is the summary component. // - // this will override the same call made from parsePrepareDescribe - // this will not work, this is not the DA for the stored proc params - statementI.completePrepareDescribeOutput (columnMetaData, netSqlca); - peekCP = parseTypdefsOrMgrlvlovrs (); - } - // check if the DARD is mutually exclusive with CARD, if so, then the following if should be an elese - - if (peekCP == CodePoint.SQLCARD) { - sqlca = parseSQLCARD (null); - peekCP = parseTypdefsOrMgrlvlovrs (); - } - } - parseQRYDSC (netResultSet.netCursor_); - - peekCP = peekCodePoint(); - while (peekCP == CodePoint.QRYDTA) { - parseQRYDTA (netResultSet); - peekCP = peekCodePoint(); - } - - if (peekCP == CodePoint.SQLCARD) { - NetSqlca netSqlca = parseSQLCARD (null); - statementI.completeSqlca (netSqlca); - peekCP = peekCodePoint(); - } - - if (peekCP == CodePoint.ENDQRYRM) - parseEndQuery (netResultSet); - - statementI.completeOpenQuery (sqlca, netResultSet); - } - - protected void parseEndQuery (ResultSetCallbackInterface resultSetI) throws DisconnectException - { - parseENDQRYRM (resultSetI); - parseTypdefsOrMgrlvlovrs (); - NetSqlca netSqlca = parseSQLCARD (null); - resultSetI.earlyCloseComplete (netSqlca); - } - - void parseOpenQueryFailure (StatementCallbackInterface statementI) throws DisconnectException - { - parseOPNQFLRM (statementI); - parseTypdefsOrMgrlvlovrs (); - NetSqlca netSqlca = parseSQLCARD (null); - statementI.completeOpenQuery (netSqlca, null); - } - - void parsePrepareError (StatementCallbackInterface statement) throws DisconnectException - { - int peekCP = peekCodePoint(); - switch (peekCP) { - case CodePoint.ABNUOWRM: { - NetSqlca sqlca = parseAbnormalEndUow (statement.getConnectionCallbackInterface()); - statement.completeSqlca (sqlca); - break; - } - case CodePoint.CMDCHKRM: - parseCMDCHKRM(); - break; - case CodePoint.DTAMCHRM: - parseDTAMCHRM(); - break; - case CodePoint.OBJNSPRM: - parseOBJNSPRM(); - break; - case CodePoint.RDBNACRM: - parseRDBNACRM(); - break; - case CodePoint.SQLERRRM: { - NetSqlca sqlca = parseSqlErrorCondition(); - statement.completeSqlca (sqlca); - break; - } - default: - parseCommonError (peekCP); - } - } - - void parseExecuteImmediateError (StatementCallbackInterface statement) throws DisconnectException - { - int peekCP = peekCodePoint(); - switch (peekCP) { - case CodePoint.ABNUOWRM: { - NetSqlca sqlca = parseAbnormalEndUow (statement.getConnectionCallbackInterface()); - statement.completeSqlca (sqlca); - break; - } - case CodePoint.CMDCHKRM: - parseCMDCHKRM(); - break; - case CodePoint.DTAMCHRM: - parseDTAMCHRM(); - break; - case CodePoint.OBJNSPRM: - parseOBJNSPRM(); - break; - case CodePoint.RDBNACRM: - parseRDBNACRM(); - break; - case CodePoint.SQLERRRM:{ - NetSqlca sqlca = parseSqlErrorCondition(); - statement.completeSqlca (sqlca); - break; - } - default: - parseCommonError (peekCP); - break; - } - } - - - void parseDescribeError (StatementCallbackInterface statement) throws DisconnectException - { - int peekCP = peekCodePoint(); - switch (peekCP) { - case CodePoint.ABNUOWRM: { - NetSqlca sqlca = parseAbnormalEndUow (statement.getConnectionCallbackInterface()); - statement.completeSqlca (sqlca); - break; - } - case CodePoint.CMDCHKRM: - parseCMDCHKRM(); - break; - case CodePoint.RDBNACRM: - parseRDBNACRM(); - break; - case CodePoint.SQLERRRM: { - NetSqlca sqlca = parseSqlErrorCondition(); - statement.completeSqlca (sqlca); - break; - } - default: - parseCommonError (peekCP); - } - } - - - void parseOpenQueryError (StatementCallbackInterface statementI) throws DisconnectException - { - int peekCP = peekCodePoint(); - switch (peekCP) { - case CodePoint.ABNUOWRM: { - NetSqlca sqlca = parseAbnormalEndUow (statementI.getConnectionCallbackInterface()); - statementI.completeSqlca (sqlca); - break; - } - case CodePoint.CMDCHKRM: - parseCMDCHKRM(); - break; - case CodePoint.DTAMCHRM: - parseDTAMCHRM(); - break; - case CodePoint.OBJNSPRM: - parseOBJNSPRM(); - break; - case CodePoint.QRYPOPRM: - parseQRYPOPRM (); - break; - case CodePoint.RDBNACRM: - parseRDBNACRM(); - break; - default: - parseCommonError (peekCP); - } - } - - void parseExecuteError (StatementCallbackInterface statementI) throws DisconnectException - { - int peekCP = peekCodePoint(); - switch (peekCP) { - case CodePoint.ABNUOWRM: { - NetSqlca sqlca = parseAbnormalEndUow (statementI.getConnectionCallbackInterface()); - statementI.completeSqlca (sqlca); - break; - } - case CodePoint.CMDCHKRM: - parseCMDCHKRM(); - break; - case CodePoint.DTAMCHRM: - parseDTAMCHRM(); - break; - case CodePoint.OBJNSPRM: - parseOBJNSPRM(); - break; - case CodePoint.RDBNACRM: - parseRDBNACRM(); - break; - case CodePoint.SQLERRRM: { - NetSqlca sqlca = parseSqlErrorCondition(); - statementI.completeSqlca (sqlca); - break; - } - default: - parseCommonError (peekCP); - break; - } - } - - void parseExecuteSetStatementError (StatementCallbackInterface statement) throws DisconnectException - { - int peekCP = peekCodePoint(); - switch (peekCP) { - case CodePoint.ABNUOWRM: { - NetSqlca sqlca = parseAbnormalEndUow (statement.getConnectionCallbackInterface()); - statement.completeSqlca (sqlca); - break; - } - case CodePoint.CMDCHKRM: - parseCMDCHKRM(); - break; - case CodePoint.DTAMCHRM: - parseDTAMCHRM(); - break; - case CodePoint.OBJNSPRM: - parseOBJNSPRM(); - break; - case CodePoint.RDBNACRM: - parseRDBNACRM(); - break; - case CodePoint.SQLERRRM: { - NetSqlca sqlca = parseSqlErrorCondition(); - statement.completeSqlca (sqlca); - break; - } - default: - parseCommonError (peekCP); - break; - } - } - - - //-----------------------------parse DDM Reply Messages----------------------- - - // Open Query Complete Reply Message indicates to the requester that - // an OPNQRY or EXCSQLSTT command completed normally and that the query - // process has been initiated. It also indicates the type of query protocol - // and cursor used for the query. - // When an EXCSQLSTT contains an SQL statement that invokes a stored procedure, - // and the procedure completes, an OPNQRYRM is returned for each answer set. - protected NetResultSet parseOPNQRYRM (StatementCallbackInterface statementI) throws DisconnectException - { - // these need to be initialized to the correct default values. - int svrcod = CodePoint.SVRCOD_INFO; - boolean svrcodReceived = false; - int qryprctyp = 0; - boolean qryprctypReceived = false; - int sqlcsrhld = 0xF0; // 0xF0 is false (default), 0xF1 is true. - boolean sqlcsrhldReceived = false; - int qryattscr = 0xF0; // 0xF0 is false (default), 0xF1 is true. - boolean qryattscrReceived = false; - int qryattsns = CodePoint.QRYUNK; - boolean qryattsnsReceived = false; - int qryattupd = CodePoint.QRYUNK; - boolean qryattupdReceived = false; - long qryinsid = 0; - boolean qryinsidReceived = false; - - - int qryattset = 0xF0; // 0xF0 is false (default), 0xF1 is true. - boolean qryattsetReceived = false; - - parseLengthAndMatchCodePoint (CodePoint.OPNQRYRM); - //pushLengthOnCollectionStack(); - int ddmLength = getDdmLength(); - ensureBLayerDataInBuffer (ddmLength); - int peekCP = peekCodePoint(); - int length = 0; - - //while (peekCP != Reply.END_OF_COLLECTION) { - while (ddmLength > 0) { - - boolean foundInPass = false; - - if (peekCP == CodePoint.SVRCOD) { - foundInPass = true; - svrcodReceived = checkAndGetReceivedFlag (svrcodReceived); - length = peekedLength_; - svrcod = parseFastSVRCOD (CodePoint.SVRCOD_INFO, CodePoint.SVRCOD_SESDMG); - ddmLength = adjustDdmLength (ddmLength, length); - peekCP = peekCodePoint(); - } + // Parse the Result Set Summary Component which consists of a + // Result Set Reply Message, SQLCARD or SQLDTARD, and an SQL Result Set + // Reply data object. Also check for possible TYPDEF overrides before the + // OBJDSSs. + // This method returns an ArrayList of generated sections which contain the + // package and section information for the result sets which were opened on the + // server. + + // the result set summary component consists of a result set reply message. + java.util.ArrayList sectionAL = parseRSLSETRM(); + + // following the RSLSETRM is an SQLCARD or an SQLDTARD. check for a + // TYPDEFNAM or TYPDEFOVR before looking for these objects. + int peekCP = parseTypdefsOrMgrlvlovrs(); + + // The SQLCARD and the SQLDTARD are mutually exclusive. + // The SQLDTARD is returned if the stored procedure had parameters. + // (Note: the SQLDTARD contains an sqlca also. this is the sqlca for the + // stored procedure call. + NetSqldta netSqldta = null; + NetSqlca netSqlca = null; + if (peekCP == CodePoint.SQLCARD) { + netSqlca = parseSQLCARD(null); + } else { + // keep the PreparedStatementCallbackInterface, since only preparedstatement and callablestatement + // has parameters or singleton select which translates to sqldtard. + netSqldta = new NetSqldta(netAgent_); + netSqlca = parseSQLDTARD(netSqldta); + } - if (peekCP == CodePoint.QRYPRCTYP) { - foundInPass = true; - qryprctypReceived = checkAndGetReceivedFlag (qryprctypReceived); - length = peekedLength_; - qryprctyp = parseFastQRYPRCTYP(); - ddmLength = adjustDdmLength (ddmLength, length); - peekCP = peekCodePoint(); - } + // check for a possible TYPDEFNAM or TYPDEFOVR + // before the SQL Result Set Reply Data object + peekCP = parseTypdefsOrMgrlvlovrs(); + + int numberOfResultSets = parseSQLRSLRD(sectionAL); + + // The result set summary component parsed above indicated how many result sets were opened + // by the stored pocedure call. It contained section information for + // each of these result sets. Loop through the section array and + // parse the result set component for each of the retunred result sets. + NetResultSet[] resultSets = new NetResultSet[numberOfResultSets]; + for (int i = 0; i < numberOfResultSets; i++) { + // parse the result set component of the stored procedure reply. + NetResultSet netResultSet = parseResultSetCursor(statementI, (Section) sectionAL.get(i)); + resultSets[i] = netResultSet; + } - if (peekCP == CodePoint.SQLCSRHLD) { - // Indicates whether the requester specified the HOLD option. - // When specified, the cursor is not closed upon execution of a commit operation. - foundInPass = true; - sqlcsrhldReceived = checkAndGetReceivedFlag (sqlcsrhldReceived); - length = peekedLength_; - sqlcsrhld = parseFastSQLCSRHLD(); - ddmLength = adjustDdmLength (ddmLength, length); + // LOBs may have been returned for one of the stored procedure parameters so + // check for any externalized data. peekCP = peekCodePoint(); - } + while (peekCP == CodePoint.EXTDTA) { + copyEXTDTA(netSqldta); + peekCP = peekCodePoint(); + } + statementI.completeExecuteCall(netSqlca, netSqldta, resultSets); + } - if (peekCP == CodePoint.QRYATTSCR) { - foundInPass = true; - qryattscrReceived = checkAndGetReceivedFlag (qryattscrReceived); - length = peekedLength_; - qryattscr = parseFastQRYATTSCR(); - ddmLength = adjustDdmLength (ddmLength, length); - peekCP = peekCodePoint(); - } + // Parse the Result Set component of the reply for a stored procedure + // call which returns result sets. + // The Result Set component consists of an Open Query Reply Message + // followed by an optional SQLCARD, followed by an optional + // SQL Column Information Reply data object, followed by a Query Descriptor. + // There may also be Query Data or an End of Query Reply Message. + protected NetResultSet parseResultSetCursor(StatementCallbackInterface statementI, + Section section) throws DisconnectException { + // The first item returne is an OPNQRYRM. + NetResultSet netResultSet = parseOPNQRYRM(statementI); + + // The next to be returned is an OBJDSS so check for any TYPDEF overrides. + int peekCP = parseTypdefsOrMgrlvlovrs(); + + // An SQLCARD may be returned if there were any warnings on the OPEN. + NetSqlca netSqlca = null; + if (peekCP == CodePoint.SQLCARD) { + netSqlca = parseSQLCARD(null); + peekCP = parseTypdefsOrMgrlvlovrs(); + } - if (peekCP == CodePoint.QRYATTSNS) { - foundInPass = true; - qryattsnsReceived = checkAndGetReceivedFlag (qryattsnsReceived); - length = peekedLength_; - qryattsns = parseFastQRYATTSNS(); - ddmLength = adjustDdmLength (ddmLength, length); - peekCP = peekCodePoint(); - } + // the SQLCINRD contains SQLDA like information for the result set. + ColumnMetaData resultSetMetaData = null; + if (peekCP == CodePoint.SQLCINRD) { + resultSetMetaData = parseSQLCINRD(); + peekCP = parseTypdefsOrMgrlvlovrs(); + } - if (peekCP == CodePoint.QRYATTUPD) { - foundInPass = true; - qryattupdReceived = checkAndGetReceivedFlag (qryattupdReceived); - length = peekedLength_; - qryattupd = parseFastQRYATTUPD(); - ddmLength = adjustDdmLength (ddmLength, length); - peekCP = peekCodePoint(); - } + // A Query Descriptor must be present. + // We cannot cache the cursor if result set is returned from a stored procedure, so + // there is no cached cursor to use here. + parseQRYDSC(netResultSet.netCursor_); + peekCP = peekCodePoint(); + statementI.completeExecuteCallOpenQuery(netSqlca, netResultSet, resultSetMetaData, section); + + // Depending on the blocking rules, QRYDTA may have been returned on the open. + while (peekCP == CodePoint.QRYDTA) { + parseQRYDTA(netResultSet); + peekCP = peekCodePoint(); + } - if (peekCP == CodePoint.QRYINSID) { - foundInPass = true; - qryinsidReceived = checkAndGetReceivedFlag (qryinsidReceived); - length = peekedLength_; - qryinsid = parseFastQRYINSID (); - ddmLength = adjustDdmLength (ddmLength, length); - peekCP = peekCodePoint(); - } + // Under some circumstances, the server may have closed the cursor. + // This will be indicated by an ENDQRYRM. + if (peekCP == CodePoint.ENDQRYRM) { + parseEndQuery((ResultSetCallbackInterface) netResultSet); + } + + return netResultSet; + } + + protected void parseOpenQuery(StatementCallbackInterface statementI) throws DisconnectException { + NetResultSet netResultSet = parseOPNQRYRM(statementI); + + NetSqlca sqlca = null; + int peekCP = peekCodePoint(); + if (peekCP != CodePoint.QRYDSC) { + + peekCP = parseTypdefsOrMgrlvlovrs(); + + if (peekCP == CodePoint.SQLDARD) { + ColumnMetaData columnMetaData = new ColumnMetaData(netAgent_.logWriter_); + NetSqlca netSqlca = parseSQLDARD(columnMetaData, false); // false means do not skip SQLDARD bytes + + //For java stored procedure, we got the resultSetMetaData from server, + //Do we need to save the resultSetMetaData and propagate netSqlca? + //The following statement are doing the both, but it do more than + //we want. It also mark the completion of Prepare statement. + // + // this will override the same call made from parsePrepareDescribe + // this will not work, this is not the DA for the stored proc params + statementI.completePrepareDescribeOutput(columnMetaData, netSqlca); + peekCP = parseTypdefsOrMgrlvlovrs(); + } + // check if the DARD is mutually exclusive with CARD, if so, then the following if should be an elese + + if (peekCP == CodePoint.SQLCARD) { + sqlca = parseSQLCARD(null); + peekCP = parseTypdefsOrMgrlvlovrs(); + } + } + parseQRYDSC(netResultSet.netCursor_); - if (peekCP == CodePoint.QRYATTSET) { - foundInPass = true; - qryattsetReceived = checkAndGetReceivedFlag (qryattsetReceived); - length = peekedLength_; - qryattset = parseFastQRYATTSET(); - ddmLength = adjustDdmLength (ddmLength, length); peekCP = peekCodePoint(); - } + while (peekCP == CodePoint.QRYDTA) { + parseQRYDTA(netResultSet); + peekCP = peekCodePoint(); + } + if (peekCP == CodePoint.SQLCARD) { + NetSqlca netSqlca = parseSQLCARD(null); + statementI.completeSqlca(netSqlca); + peekCP = peekCodePoint(); + } - if (!foundInPass) - doPrmnsprmSemantics (peekCP); + if (peekCP == CodePoint.ENDQRYRM) { + parseEndQuery(netResultSet); + } + statementI.completeOpenQuery(sqlca, netResultSet); } - checkRequiredObjects (svrcodReceived, qryprctypReceived, qryinsidReceived); - netAgent_.setSvrcod (svrcod); - - // hack for now until event methods are used below - Statement statement = (Statement) statementI; - - // if there is a cached Cursor object, then use the cached cursor object. - NetResultSet rs = null; - if (statement.cachedCursor_ != null) { - statement.cachedCursor_.resetDataBuffer(); - ((NetCursor)statement.cachedCursor_).extdtaData_.clear(); - rs = new NetResultSet (netAgent_, - (NetStatement) statement.materialStatement_, - statement.cachedCursor_, - //qryprctyp, //protocolType, CodePoint.FIXROWPRC | CodePoint.LMTBLKPRC - sqlcsrhld, //holdOption, 0xF0 for false (default) | 0xF1 for true. - qryattscr, //scrollOption, 0xF0 for false (default) | 0xF1 for true. - qryattsns, //sensitivity, CodePoint.QRYUNK | CodePoint.QRYINS - qryattset, - qryinsid, //instanceIdentifier, 0 (if not returned, check default) or number - calculateResultSetType (qryattscr,qryattsns,statement.resultSetType_), - calculateResultSetConcurrency (qryattupd,statement.resultSetConcurrency_), - calculateResultSetHoldability (sqlcsrhld) - ); - } - else - rs = new NetResultSet (netAgent_, - (NetStatement) statement.materialStatement_, - new NetCursor (netAgent_, qryprctyp), - //qryprctyp, //protocolType, CodePoint.FIXROWPRC | CodePoint.LMTBLKPRC - sqlcsrhld, //holdOption, 0xF0 for false (default) | 0xF1 for true. - qryattscr, //scrollOption, 0xF0 for false (default) | 0xF1 for true. - qryattsns, //sensitivity, CodePoint.QRYUNK | CodePoint.QRYINS - qryattset, - qryinsid, //instanceIdentifier, 0 (if not returned, check default) or number - calculateResultSetType (qryattscr,qryattsns,statement.resultSetType_), - calculateResultSetConcurrency (qryattupd,statement.resultSetConcurrency_), - calculateResultSetHoldability (sqlcsrhld) - ); - - return rs; - } - - - // Also called by NetResultSetReply subclass. - // The End of Query Reply Message indicates that the query process has - // terminated in such a manner that the query or result set is now closed. - // It cannot be resumed with the CNTQRY command or closed with the CLSQRY command. - // The ENDQRYRM is always followed by an SQLCARD. - protected void parseENDQRYRM (ResultSetCallbackInterface resultSetI) throws DisconnectException - { - boolean svrcodReceived = false; - int svrcod = CodePoint.SVRCOD_INFO; - boolean rdbnamReceived = false; - String rdbnam = null; - - parseLengthAndMatchCodePoint (CodePoint.ENDQRYRM); - 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(); - } + protected void parseEndQuery(ResultSetCallbackInterface resultSetI) throws DisconnectException { + parseENDQRYRM(resultSetI); + parseTypdefsOrMgrlvlovrs(); + NetSqlca netSqlca = parseSQLCARD(null); + resultSetI.earlyCloseComplete(netSqlca); + } + + void parseOpenQueryFailure(StatementCallbackInterface statementI) throws DisconnectException { + parseOPNQFLRM(statementI); + parseTypdefsOrMgrlvlovrs(); + NetSqlca netSqlca = parseSQLCARD(null); + statementI.completeOpenQuery(netSqlca, null); + } + + void parsePrepareError(StatementCallbackInterface statement) throws DisconnectException { + int peekCP = peekCodePoint(); + switch (peekCP) { + case CodePoint.ABNUOWRM: + { + NetSqlca sqlca = parseAbnormalEndUow(statement.getConnectionCallbackInterface()); + statement.completeSqlca(sqlca); + break; + } + case CodePoint.CMDCHKRM: + parseCMDCHKRM(); + break; + case CodePoint.DTAMCHRM: + parseDTAMCHRM(); + break; + case CodePoint.OBJNSPRM: + parseOBJNSPRM(); + break; + case CodePoint.RDBNACRM: + parseRDBNACRM(); + break; + case CodePoint.SQLERRRM: + { + NetSqlca sqlca = parseSqlErrorCondition(); + statement.completeSqlca(sqlca); + break; + } + default: + parseCommonError(peekCP); + } + } - if (peekCP == CodePoint.RDBNAM) { - foundInPass = true; - rdbnamReceived = checkAndGetReceivedFlag (rdbnamReceived); - rdbnam = parseRDBNAM (true); - peekCP = peekCodePoint(); - } - if (!foundInPass) - doPrmnsprmSemantics (peekCP); - - } - popCollectionStack(); - checkRequiredObjects (svrcodReceived); - - netAgent_.setSvrcod (svrcod); - - } - - - // Query Previously Opened Reply Message is issued when an - // OPNQRY command is issued for a query that is already open. - // A previous OPNQRY command might have opened the query - // which may not be closed. - // 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 - // PKGNAMCSN - required - // SRVDGN - optional - // - private void parseQRYPOPRM () throws DisconnectException - { - boolean svrcodReceived = false; - int svrcod = CodePoint.SVRCOD_INFO; - boolean rdbnamReceived = false; - String rdbnam = null; - boolean pkgnamcsnReceived = false; - Object pkgnamcsn = null; - - parseLengthAndMatchCodePoint (CodePoint.QRYPOPRM); - 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(); - } + void parseExecuteImmediateError(StatementCallbackInterface statement) throws DisconnectException { + int peekCP = peekCodePoint(); + switch (peekCP) { + case CodePoint.ABNUOWRM: + { + NetSqlca sqlca = parseAbnormalEndUow(statement.getConnectionCallbackInterface()); + statement.completeSqlca(sqlca); + break; + } + case CodePoint.CMDCHKRM: + parseCMDCHKRM(); + break; + case CodePoint.DTAMCHRM: + parseDTAMCHRM(); + break; + case CodePoint.OBJNSPRM: + parseOBJNSPRM(); + break; + case CodePoint.RDBNACRM: + parseRDBNACRM(); + break; + case CodePoint.SQLERRRM: + { + NetSqlca sqlca = parseSqlErrorCondition(); + statement.completeSqlca(sqlca); + break; + } + default: + parseCommonError(peekCP); + break; + } + } - if (peekCP == CodePoint.RDBNAM) { - foundInPass = true; - rdbnamReceived = checkAndGetReceivedFlag (rdbnamReceived); - rdbnam = parseRDBNAM (true); - peekCP = peekCodePoint(); - } - if (peekCP == CodePoint.PKGNAMCSN) { - foundInPass = true; - pkgnamcsnReceived = checkAndGetReceivedFlag (pkgnamcsnReceived); - pkgnamcsn = parsePKGNAMCSN (true); - peekCP = peekCodePoint(); - } - if (!foundInPass) - doPrmnsprmSemantics (peekCP); + void parseDescribeError(StatementCallbackInterface statement) throws DisconnectException { + int peekCP = peekCodePoint(); + switch (peekCP) { + case CodePoint.ABNUOWRM: + { + NetSqlca sqlca = parseAbnormalEndUow(statement.getConnectionCallbackInterface()); + statement.completeSqlca(sqlca); + break; + } + case CodePoint.CMDCHKRM: + parseCMDCHKRM(); + break; + case CodePoint.RDBNACRM: + parseRDBNACRM(); + break; + case CodePoint.SQLERRRM: + { + NetSqlca sqlca = parseSqlErrorCondition(); + statement.completeSqlca(sqlca); + break; + } + default: + parseCommonError(peekCP); + } + } + + void parseOpenQueryError(StatementCallbackInterface statementI) throws DisconnectException { + int peekCP = peekCodePoint(); + switch (peekCP) { + case CodePoint.ABNUOWRM: + { + NetSqlca sqlca = parseAbnormalEndUow(statementI.getConnectionCallbackInterface()); + statementI.completeSqlca(sqlca); + break; + } + case CodePoint.CMDCHKRM: + parseCMDCHKRM(); + break; + case CodePoint.DTAMCHRM: + parseDTAMCHRM(); + break; + case CodePoint.OBJNSPRM: + parseOBJNSPRM(); + break; + case CodePoint.QRYPOPRM: + parseQRYPOPRM(); + break; + case CodePoint.RDBNACRM: + parseRDBNACRM(); + break; + default: + parseCommonError(peekCP); + } } - popCollectionStack(); - checkRequiredObjects (svrcodReceived, - rdbnamReceived, - pkgnamcsnReceived); - - netAgent_.setSvrcod (svrcod); - agent_.accumulateChainBreakingReadExceptionAndThrow (new DisconnectException ( - agent_, - "Execution failed due to a distribution protocol error that caused " + - "deallocation of the conversation. " + - "An Open Query Command was issued for a query which was already open.", - SqlState._58009)); - } - - // Open Query Failure (OPNQFLRM) Reply Message indicates that the - // OPNQRY command failed to open the query. The reason that the - // target relational database was unable to open the query is reported in an - // SQLCARD reply data object. - // Whenever an OPNQFLRM is returned, an SQLCARD object must also be returned - // following the OPNQFLRM. - // - // Returned from Server: - // SVRCOD - required (8 - ERROR) - // RDBNAM - required - // SRVDGN - optional - private void parseOPNQFLRM (StatementCallbackInterface statement) throws DisconnectException - { - boolean svrcodReceived = false; - int svrcod = CodePoint.SVRCOD_INFO; - boolean rdbnamReceived = false; - String rdbnam = null; - - parseLengthAndMatchCodePoint (CodePoint.OPNQFLRM); - 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 rdbnam 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); - - netAgent_.setSvrcod (svrcod); - - // get SQLSTATE from SQLCARD... - } - - // RDB Result Set Reply Message (RSLSETRM) indicates that an - // EXCSQLSTT command invoked a stored procedure, that the execution - // of the stored procedure generated one or more result sets, and - // additional information aobut these result sets follows the SQLCARD and - // SQLDTARD in the reply data of the response - // - // Returned from Server: - // SVRCOD - required (0 INFO) - // PKGSNLST - required - // SRVDGN - optional - protected java.util.ArrayList parseRSLSETRM () throws DisconnectException - { - boolean svrcodReceived = false; - int svrcod = CodePoint.SVRCOD_INFO; - boolean pkgsnlstReceived = false; - java.util.ArrayList pkgsnlst = null; - - parseLengthAndMatchCodePoint (CodePoint.RSLSETRM); - 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_INFO); - peekCP = peekCodePoint(); - } + void parseExecuteError(StatementCallbackInterface statementI) throws DisconnectException { + int peekCP = peekCodePoint(); + switch (peekCP) { + case CodePoint.ABNUOWRM: + { + NetSqlca sqlca = parseAbnormalEndUow(statementI.getConnectionCallbackInterface()); + statementI.completeSqlca(sqlca); + break; + } + case CodePoint.CMDCHKRM: + parseCMDCHKRM(); + break; + case CodePoint.DTAMCHRM: + parseDTAMCHRM(); + break; + case CodePoint.OBJNSPRM: + parseOBJNSPRM(); + break; + case CodePoint.RDBNACRM: + parseRDBNACRM(); + break; + case CodePoint.SQLERRRM: + { + NetSqlca sqlca = parseSqlErrorCondition(); + statementI.completeSqlca(sqlca); + break; + } + default: + parseCommonError(peekCP); + break; + } + } - if (peekCP == CodePoint.PKGSNLST) { - // contain repeatable PKGNAMCSN - foundInPass = true; - pkgsnlstReceived = checkAndGetReceivedFlag (pkgsnlstReceived); - pkgsnlst = parsePKGSNLST(); - peekCP = peekCodePoint(); - } + void parseExecuteSetStatementError(StatementCallbackInterface statement) throws DisconnectException { + int peekCP = peekCodePoint(); + switch (peekCP) { + case CodePoint.ABNUOWRM: + { + NetSqlca sqlca = parseAbnormalEndUow(statement.getConnectionCallbackInterface()); + statement.completeSqlca(sqlca); + break; + } + case CodePoint.CMDCHKRM: + parseCMDCHKRM(); + break; + case CodePoint.DTAMCHRM: + parseDTAMCHRM(); + break; + case CodePoint.OBJNSPRM: + parseOBJNSPRM(); + break; + case CodePoint.RDBNACRM: + parseRDBNACRM(); + break; + case CodePoint.SQLERRRM: + { + NetSqlca sqlca = parseSqlErrorCondition(); + statement.completeSqlca(sqlca); + break; + } + default: + parseCommonError(peekCP); + break; + } + } + + + //-----------------------------parse DDM Reply Messages----------------------- + + // Open Query Complete Reply Message indicates to the requester that + // an OPNQRY or EXCSQLSTT command completed normally and that the query + // process has been initiated. It also indicates the type of query protocol + // and cursor used for the query. + // When an EXCSQLSTT contains an SQL statement that invokes a stored procedure, + // and the procedure completes, an OPNQRYRM is returned for each answer set. + protected NetResultSet parseOPNQRYRM(StatementCallbackInterface statementI) throws DisconnectException { + // these need to be initialized to the correct default values. + int svrcod = CodePoint.SVRCOD_INFO; + boolean svrcodReceived = false; + int qryprctyp = 0; + boolean qryprctypReceived = false; + int sqlcsrhld = 0xF0; // 0xF0 is false (default), 0xF1 is true. + boolean sqlcsrhldReceived = false; + int qryattscr = 0xF0; // 0xF0 is false (default), 0xF1 is true. + boolean qryattscrReceived = false; + int qryattsns = CodePoint.QRYUNK; + boolean qryattsnsReceived = false; + int qryattupd = CodePoint.QRYUNK; + boolean qryattupdReceived = false; + long qryinsid = 0; + boolean qryinsidReceived = false; + + + int qryattset = 0xF0; // 0xF0 is false (default), 0xF1 is true. + boolean qryattsetReceived = false; + + parseLengthAndMatchCodePoint(CodePoint.OPNQRYRM); + //pushLengthOnCollectionStack(); + int ddmLength = getDdmLength(); + ensureBLayerDataInBuffer(ddmLength); + int peekCP = peekCodePoint(); + int length = 0; + + //while (peekCP != Reply.END_OF_COLLECTION) { + while (ddmLength > 0) { + + boolean foundInPass = false; + + if (peekCP == CodePoint.SVRCOD) { + foundInPass = true; + svrcodReceived = checkAndGetReceivedFlag(svrcodReceived); + length = peekedLength_; + svrcod = parseFastSVRCOD(CodePoint.SVRCOD_INFO, CodePoint.SVRCOD_SESDMG); + ddmLength = adjustDdmLength(ddmLength, length); + peekCP = peekCodePoint(); + } + + if (peekCP == CodePoint.QRYPRCTYP) { + foundInPass = true; + qryprctypReceived = checkAndGetReceivedFlag(qryprctypReceived); + length = peekedLength_; + qryprctyp = parseFastQRYPRCTYP(); + ddmLength = adjustDdmLength(ddmLength, length); + peekCP = peekCodePoint(); + } + + if (peekCP == CodePoint.SQLCSRHLD) { + // Indicates whether the requester specified the HOLD option. + // When specified, the cursor is not closed upon execution of a commit operation. + foundInPass = true; + sqlcsrhldReceived = checkAndGetReceivedFlag(sqlcsrhldReceived); + length = peekedLength_; + sqlcsrhld = parseFastSQLCSRHLD(); + ddmLength = adjustDdmLength(ddmLength, length); + peekCP = peekCodePoint(); + } + + if (peekCP == CodePoint.QRYATTSCR) { + foundInPass = true; + qryattscrReceived = checkAndGetReceivedFlag(qryattscrReceived); + length = peekedLength_; + qryattscr = parseFastQRYATTSCR(); + ddmLength = adjustDdmLength(ddmLength, length); + peekCP = peekCodePoint(); + } + + if (peekCP == CodePoint.QRYATTSNS) { + foundInPass = true; + qryattsnsReceived = checkAndGetReceivedFlag(qryattsnsReceived); + length = peekedLength_; + qryattsns = parseFastQRYATTSNS(); + ddmLength = adjustDdmLength(ddmLength, length); + peekCP = peekCodePoint(); + } + + if (peekCP == CodePoint.QRYATTUPD) { + foundInPass = true; + qryattupdReceived = checkAndGetReceivedFlag(qryattupdReceived); + length = peekedLength_; + qryattupd = parseFastQRYATTUPD(); + ddmLength = adjustDdmLength(ddmLength, length); + peekCP = peekCodePoint(); + } + + if (peekCP == CodePoint.QRYINSID) { + foundInPass = true; + qryinsidReceived = checkAndGetReceivedFlag(qryinsidReceived); + length = peekedLength_; + qryinsid = parseFastQRYINSID(); + ddmLength = adjustDdmLength(ddmLength, length); + peekCP = peekCodePoint(); + } + + if (peekCP == CodePoint.QRYATTSET) { + foundInPass = true; + qryattsetReceived = checkAndGetReceivedFlag(qryattsetReceived); + length = peekedLength_; + qryattset = parseFastQRYATTSET(); + ddmLength = adjustDdmLength(ddmLength, length); + peekCP = peekCodePoint(); + } + + + if (!foundInPass) { + doPrmnsprmSemantics(peekCP); + } + + } + checkRequiredObjects(svrcodReceived, qryprctypReceived, qryinsidReceived); + + netAgent_.setSvrcod(svrcod); + + // hack for now until event methods are used below + Statement statement = (Statement) statementI; + + // if there is a cached Cursor object, then use the cached cursor object. + NetResultSet rs = null; + if (statement.cachedCursor_ != null) { + statement.cachedCursor_.resetDataBuffer(); + ((NetCursor) statement.cachedCursor_).extdtaData_.clear(); + rs = new NetResultSet(netAgent_, + (NetStatement) statement.materialStatement_, + statement.cachedCursor_, + //qryprctyp, //protocolType, CodePoint.FIXROWPRC | CodePoint.LMTBLKPRC + sqlcsrhld, //holdOption, 0xF0 for false (default) | 0xF1 for true. + qryattscr, //scrollOption, 0xF0 for false (default) | 0xF1 for true. + qryattsns, //sensitivity, CodePoint.QRYUNK | CodePoint.QRYINS + qryattset, + qryinsid, //instanceIdentifier, 0 (if not returned, check default) or number + calculateResultSetType(qryattscr, qryattsns, statement.resultSetType_), + calculateResultSetConcurrency(qryattupd, statement.resultSetConcurrency_), + calculateResultSetHoldability(sqlcsrhld)); + } else { + rs = new NetResultSet(netAgent_, + (NetStatement) statement.materialStatement_, + new NetCursor(netAgent_, qryprctyp), + //qryprctyp, //protocolType, CodePoint.FIXROWPRC | CodePoint.LMTBLKPRC + sqlcsrhld, //holdOption, 0xF0 for false (default) | 0xF1 for true. + qryattscr, //scrollOption, 0xF0 for false (default) | 0xF1 for true. + qryattsns, //sensitivity, CodePoint.QRYUNK | CodePoint.QRYINS + qryattset, + qryinsid, //instanceIdentifier, 0 (if not returned, check default) or number + calculateResultSetType(qryattscr, qryattsns, statement.resultSetType_), + calculateResultSetConcurrency(qryattupd, statement.resultSetConcurrency_), + calculateResultSetHoldability(sqlcsrhld)); + } + + return rs; + } + + + // Also called by NetResultSetReply subclass. + // The End of Query Reply Message indicates that the query process has + // terminated in such a manner that the query or result set is now closed. + // It cannot be resumed with the CNTQRY command or closed with the CLSQRY command. + // The ENDQRYRM is always followed by an SQLCARD. + protected void parseENDQRYRM(ResultSetCallbackInterface resultSetI) throws DisconnectException { + boolean svrcodReceived = false; + int svrcod = CodePoint.SVRCOD_INFO; + boolean rdbnamReceived = false; + String rdbnam = null; + + parseLengthAndMatchCodePoint(CodePoint.ENDQRYRM); + 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 (!foundInPass) { + doPrmnsprmSemantics(peekCP); + } + + } + popCollectionStack(); + checkRequiredObjects(svrcodReceived); - if (!foundInPass) - doPrmnsprmSemantics (peekCP); + netAgent_.setSvrcod(svrcod); } - popCollectionStack(); - checkRequiredObjects (svrcodReceived, pkgsnlstReceived); - netAgent_.setSvrcod (svrcod); - return pkgsnlst; - } + // Query Previously Opened Reply Message is issued when an + // OPNQRY command is issued for a query that is already open. + // A previous OPNQRY command might have opened the query + // which may not be closed. + // 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 + // PKGNAMCSN - required + // SRVDGN - optional + // + private void parseQRYPOPRM() throws DisconnectException { + boolean svrcodReceived = false; + int svrcod = CodePoint.SVRCOD_INFO; + boolean rdbnamReceived = false; + String rdbnam = null; + boolean pkgnamcsnReceived = false; + Object pkgnamcsn = null; + + parseLengthAndMatchCodePoint(CodePoint.QRYPOPRM); + 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.PKGNAMCSN) { + foundInPass = true; + pkgnamcsnReceived = checkAndGetReceivedFlag(pkgnamcsnReceived); + pkgnamcsn = parsePKGNAMCSN(true); + peekCP = peekCodePoint(); + } + + if (!foundInPass) { + doPrmnsprmSemantics(peekCP); + } - //--------------------- parse DDM Reply Data-------------------------------------- + } + popCollectionStack(); + checkRequiredObjects(svrcodReceived, + rdbnamReceived, + pkgnamcsnReceived); + + netAgent_.setSvrcod(svrcod); + agent_.accumulateChainBreakingReadExceptionAndThrow(new DisconnectException(agent_, + "Execution failed due to a distribution protocol error that caused " + + "deallocation of the conversation. " + + "An Open Query Command was issued for a query which was already open.", + SqlState._58009)); + } + + // Open Query Failure (OPNQFLRM) Reply Message indicates that the + // OPNQRY command failed to open the query. The reason that the + // target relational database was unable to open the query is reported in an + // SQLCARD reply data object. + // Whenever an OPNQFLRM is returned, an SQLCARD object must also be returned + // following the OPNQFLRM. + // + // Returned from Server: + // SVRCOD - required (8 - ERROR) + // RDBNAM - required + // SRVDGN - optional + private void parseOPNQFLRM(StatementCallbackInterface statement) throws DisconnectException { + boolean svrcodReceived = false; + int svrcod = CodePoint.SVRCOD_INFO; + boolean rdbnamReceived = false; + String rdbnam = null; + + parseLengthAndMatchCodePoint(CodePoint.OPNQFLRM); + 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 rdbnam 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); - // SQL Data Reply Data consists of output data from the relational database (RDB) - // processing of an SQL statement. It also includes a description of the data. - // - // Returned from Server: - // FDODSC - required - // FDODTA - required - protected NetSqlca parseSQLDTARD (NetSqldta netSqldta) throws DisconnectException - { - boolean fdodscReceived = false; - boolean fdodtaReceived = false; + netAgent_.setSvrcod(svrcod); - parseLengthAndMatchCodePoint (CodePoint.SQLDTARD); - pushLengthOnCollectionStack(); + // get SQLSTATE from SQLCARD... + } - NetSqlca netSqlca = null; - int peekCP = peekCodePoint(); - while (peekCP != Reply.END_OF_COLLECTION) { + // RDB Result Set Reply Message (RSLSETRM) indicates that an + // EXCSQLSTT command invoked a stored procedure, that the execution + // of the stored procedure generated one or more result sets, and + // additional information aobut these result sets follows the SQLCARD and + // SQLDTARD in the reply data of the response + // + // Returned from Server: + // SVRCOD - required (0 INFO) + // PKGSNLST - required + // SRVDGN - optional + protected java.util.ArrayList parseRSLSETRM() throws DisconnectException { + boolean svrcodReceived = false; + int svrcod = CodePoint.SVRCOD_INFO; + boolean pkgsnlstReceived = false; + java.util.ArrayList pkgsnlst = null; + + parseLengthAndMatchCodePoint(CodePoint.RSLSETRM); + 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_INFO); + peekCP = peekCodePoint(); + } + + if (peekCP == CodePoint.PKGSNLST) { + // contain repeatable PKGNAMCSN + foundInPass = true; + pkgsnlstReceived = checkAndGetReceivedFlag(pkgsnlstReceived); + pkgsnlst = parsePKGSNLST(); + peekCP = peekCodePoint(); + } + + if (!foundInPass) { + doPrmnsprmSemantics(peekCP); + } - boolean foundInPass = false; + } + popCollectionStack(); + checkRequiredObjects(svrcodReceived, pkgsnlstReceived); - if (peekCP == CodePoint.FDODSC) { - foundInPass = true; - fdodscReceived = checkAndGetReceivedFlag (fdodscReceived); - parseFDODSC (netSqldta); - peekCP = peekCodePoint(); - } + netAgent_.setSvrcod(svrcod); - if (peekCP == CodePoint.FDODTA) { - foundInPass = true; - fdodtaReceived = checkAndGetReceivedFlag (fdodtaReceived); - netSqlca = parseFDODTA (netSqldta); - peekCP = peekCodePoint(); - } + return pkgsnlst; + } + + //--------------------- parse DDM Reply Data-------------------------------------- + + + // SQL Data Reply Data consists of output data from the relational database (RDB) + // processing of an SQL statement. It also includes a description of the data. + // + // Returned from Server: + // FDODSC - required + // FDODTA - required + protected NetSqlca parseSQLDTARD(NetSqldta netSqldta) throws DisconnectException { + boolean fdodscReceived = false; + boolean fdodtaReceived = false; + + parseLengthAndMatchCodePoint(CodePoint.SQLDTARD); + pushLengthOnCollectionStack(); + + NetSqlca netSqlca = null; + int peekCP = peekCodePoint(); + while (peekCP != Reply.END_OF_COLLECTION) { + + boolean foundInPass = false; + + if (peekCP == CodePoint.FDODSC) { + foundInPass = true; + fdodscReceived = checkAndGetReceivedFlag(fdodscReceived); + parseFDODSC(netSqldta); + peekCP = peekCodePoint(); + } + + if (peekCP == CodePoint.FDODTA) { + foundInPass = true; + fdodtaReceived = checkAndGetReceivedFlag(fdodtaReceived); + netSqlca = parseFDODTA(netSqldta); + peekCP = peekCodePoint(); + } + + if (!foundInPass) { + doPrmnsprmSemantics(peekCP); + } + + } + popCollectionStack(); + checkRequiredObjects(fdodscReceived, fdodtaReceived); + netSqldta.calculateColumnOffsetsForRow(); + return netSqlca; + } + + protected void parseQRYDSC(NetCursor cursor) throws DisconnectException { + parseLengthAndMatchCodePoint(CodePoint.QRYDSC); + parseSQLDTARDarray(cursor, false); // false means don't just skip the bytes + } + + private void parseFDODSC(NetCursor cursor) throws DisconnectException { + parseLengthAndMatchCodePoint(CodePoint.FDODSC); + parseSQLDTARDarray(cursor, false); // false means don't just skip the bytes + } + + private void parseSQLDTARDarray(NetCursor cursor, boolean skipBytes) throws DisconnectException { + if (skipBytes) { + skipBytes(); + } + int previousTripletType = FdocaConstants.SQLDTARD_TRIPLET_TYPE_START; + int previousTripletId = FdocaConstants.SQLDTARD_TRIPLET_ID_START; + int mddProtocolType = 0; + int columnCount = 0; + netAgent_.targetTypdef_.clearMddOverrides(); + + int ddmLength = getDdmLength(); + ensureBLayerDataInBuffer(ddmLength); + + while (ddmLength > 0) { + + int tripletLength = readFastUnsignedByte(); + int tripletType = readFastUnsignedByte(); + int tripletId = readFastUnsignedByte(); + + switch (tripletType) { + + case FdocaConstants.MDD_TRIPLET_TYPE: + if ((tripletLength != FdocaConstants.MDD_TRIPLET_SIZE) || + (tripletId != FdocaConstants.NULL_LID)) { + descriptorErrorDetected(); + } + checkPreviousSQLDTARDtriplet(previousTripletType, + FdocaConstants.SQLDTARD_TRIPLET_TYPE_MDD, + previousTripletId, + FdocaConstants.SQLDTARD_TRIPLET_ID_0); + previousTripletType = FdocaConstants.SQLDTARD_TRIPLET_TYPE_MDD; + previousTripletId = FdocaConstants.SQLDTARD_TRIPLET_ID_0; + + // read in remaining MDD bytes + int mddClass = readFastUnsignedByte(); + int mddType = readFastUnsignedByte(); + int mddRefType = readFastUnsignedByte(); + mddProtocolType = readFastUnsignedByte(); + break; + + case FdocaConstants.NGDA_TRIPLET_TYPE: // rename to NGDA_TRIPLET_CODEPOINT + if (tripletId != FdocaConstants.SQLDTAGRP_LID) { + descriptorErrorDetected(); + } + checkPreviousSQLDTARDtriplet(previousTripletType, + FdocaConstants.SQLDTARD_TRIPLET_TYPE_GDA, + previousTripletId, + FdocaConstants.SQLDTARD_TRIPLET_ID_D0); + previousTripletType = FdocaConstants.SQLDTARD_TRIPLET_TYPE_GDA; + previousTripletId = FdocaConstants.SQLDTARD_TRIPLET_ID_0; + + // add a quick check to see if the table is altered (columns are added or deleted) + // before reusing the cached cursor. note: this check does not catch the case + // where the number of columns stay the same, but the column type or length changes, + // i.e. from integer to char. + int columns = peekTotalColumnCount(tripletLength); + // peek ahead to get the total number of columns. + cursor.initializeColumnInfoArrays(netAgent_.targetTypdef_, columns, netAgent_.targetSqlam_);
[... 2333 lines stripped ...]