You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by jb...@apache.org on 2005/05/02 08:26:03 UTC
svn commit: r165585 [38/42] - in
/incubator/derby/code/trunk/java/client/org/apache/derby: client/
client/am/ client/net/ client/resources/ jdbc/
Modified: incubator/derby/code/trunk/java/client/org/apache/derby/client/net/Reply.java
URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/client/org/apache/derby/client/net/Reply.java?rev=165585&r1=165584&r2=165585&view=diff
==============================================================================
--- incubator/derby/code/trunk/java/client/org/apache/derby/client/net/Reply.java (original)
+++ incubator/derby/code/trunk/java/client/org/apache/derby/client/net/Reply.java Sun May 1 23:25:59 2005
@@ -21,1479 +21,1398 @@
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.SignedBinary;
import java.io.ByteArrayOutputStream;
-public class Reply
-{
- protected org.apache.derby.client.am.Agent agent_;
- protected NetAgent netAgent_; //cheat-link to (NetAgent) agent_
-
- private CcsidManager ccsidManager_;
- protected final static int DEFAULT_BUFFER_SIZE = 32767;
- protected byte[] buffer_;
- protected int pos_;
- protected int count_;
-
- private int topDdmCollectionStack_;
- private final static int MAX_MARKS_NESTING = 10;
- private int[] ddmCollectionLenStack_;
- private int ddmScalarLen_; // a value of -1 -> streamed ddm -> length unknown
- private final static int EMPTY_STACK = -1;
-
- protected boolean ensuredLengthForDecryption_ = false; // A layer lengths have already been ensured in decrypt method.
- protected byte[] longBufferForDecryption_ = null;
- protected int longPosForDecryption_ = 0;
- protected byte[] longValueForDecryption_ = null;
- protected int longCountForDecryption_ = 0;
-
- protected int dssLength_;
- protected boolean dssIsContinued_;
- private boolean dssIsChainedWithSameID_;
- private boolean dssIsChainedWithDiffID_;
- protected int dssCorrelationID_;
-
- protected int peekedLength_ = 0;
- protected int peekedCodePoint_ = END_OF_COLLECTION; // saves the peeked codept
- private int peekedNumOfExtendedLenBytes_ = 0;
- private int currentPos_ = 0;
-
- public final static int END_OF_COLLECTION = -1;
- public final static int END_OF_SAME_ID_CHAIN = -2;
- Reply (NetAgent netAgent, int bufferSize)
- {
- buffer_ = new byte[bufferSize];
- agent_ = netAgent_ = netAgent;
- ccsidManager_ = netAgent.targetCcsidManager_;
- ddmCollectionLenStack_ = new int[Reply.MAX_MARKS_NESTING];
- initialize ();
- }
-
- final void initialize ()
- {
- pos_ = 0;
- count_ = 0;
- topDdmCollectionStack_ = Reply.EMPTY_STACK;
- for (int i = 0; i < Reply.MAX_MARKS_NESTING; i++) {
- ddmCollectionLenStack_[i] = 0;
- }
- ddmScalarLen_ = 0;
- dssLength_ = 0;
- dssIsContinued_ = false;
- dssIsChainedWithSameID_ = false;
- dssIsChainedWithDiffID_ = false;
- dssCorrelationID_ = 1;
- }
-
- final int getDdmLength()
- {
- return ddmScalarLen_;
- }
-
- // This is a helper method which shifts the buffered bytes from
- // wherever they are in the current buffer to the beginning of
- // different buffer (note these buffers could be the same).
- // State information is updated as needed after the shift.
- private final void shiftBuffer (byte[] destinationBuffer)
- {
- // calculate the size of the data in the current buffer.
- int sz = count_ - pos_;
-
- // copy this data to the new buffer starting at position 0.
- System.arraycopy (buffer_, pos_, destinationBuffer, 0, sz);
-
- // update the state information for data in the new buffer.
- pos_ = 0;
- count_ = sz;
-
- // replace the old buffer with the new buffer.
- buffer_ = destinationBuffer;
- }
-
- // This method makes sure there is enough room in the buffer
- // for a certain number of bytes. This method will allocate
- // a new buffer if needed and shift the bytes in the current buffer
- // to make ensure space is available for a fill. Right now
- // this method will shift bytes as needed to make sure there is
- // as much room as possible in the buffer before trying to
- // do the read. The idea is to try to have space to get as much data as possible
- // if we need to do a read on the socket's stream.
- protected final void ensureSpaceInBufferForFill (int desiredSpace)
- {
- // calculate the total unused space in the buffer.
- // this includes any space at the end of the buffer and any free
- // space at the beginning resulting from bytes already read.
- int currentAvailableSpace = (buffer_.length - count_) + pos_;
-
- // check to see if there is enough free space.
- if (currentAvailableSpace < desiredSpace) {
-
- // there is not enough free space so we need more storage.
- // we are going to double the buffer unless that happens to still be too small.
- // if more than double the buffer is needed, use the smallest amount over this as possible.
- int doubleBufferSize = (2 * buffer_.length);
-
- int minumNewBufferSize = (desiredSpace - currentAvailableSpace) + buffer_.length;
- int newsz = minumNewBufferSize <= doubleBufferSize ? doubleBufferSize : minumNewBufferSize;
-
- byte[] newBuffer = new byte[newsz];
-
- // shift everything from the old buffer to the new buffer
- shiftBuffer (newBuffer);
- }
- else {
-
- // there is enough free space in the buffer but let's make sure it is all at the end.
- // this is also important because if we are going to do a read, it would be nice
- // to get as much data as possible and making room at the end if the buffer helps to
- // ensure this.
- if (pos_ != 0) {
- shiftBuffer (buffer_);
- }
- }
- }
-
- // This method will attempt to read a minimum number of bytes
- // from the underlying stream. This method will keep trying to
- // read bytes until it has obtained at least the minimum number.
- // Now returns the total bytes read for decryption, use to return void.
- protected int fill (int minimumBytesNeeded) throws org.apache.derby.client.am.DisconnectException
- {
- // make sure that there is enough space in the buffer to hold
- // the minimum number of bytes needed.
- ensureSpaceInBufferForFill (minimumBytesNeeded);
-
- // read until the minimum number of bytes needed is now in the buffer.
- // hopefully the read method will return as many bytes as it can.
- int totalBytesRead = 0;
- int actualBytesRead = 0;
- do {
- try {
- // oops, we shouldn't expose the agent's input stream here, collapse this into a read method on the agent
- actualBytesRead = netAgent_.getInputStream().read (buffer_, count_, buffer_.length - count_);
- }
- catch (java.io.IOException ioe) {
- netAgent_.throwCommunicationsFailure ("Reply.fill()",
- "InputStream.read()",
- ioe.getMessage(),
- "*");
- }
- finally {
- if (agent_.loggingEnabled())
- ((NetLogWriter) netAgent_.logWriter_).traceProtocolFlow (buffer_,
- count_,
- actualBytesRead,
- NetLogWriter.TYPE_TRACE_RECEIVE,
- "Reply",
- "fill",
- 2); // tracepoint
- }
- count_ += actualBytesRead;
- totalBytesRead += actualBytesRead;
-
- }
- while ((totalBytesRead < minimumBytesNeeded) && (actualBytesRead != -1));
-
- if (actualBytesRead == -1) {
- if (totalBytesRead < minimumBytesNeeded) {
- netAgent_.throwCommunicationsFailure ("Reply.fill()",
- "InputStream.read()",
- "insufficient data",
- "*");
- }
- }
- return totalBytesRead;
- }
-
- // Make sure a certain amount of Layer A data is in the buffer.
- // The data will be in the buffer after this method is called.
- // Now returns the total bytes read for decryption, use to return void.
- protected final int ensureALayerDataInBuffer (int desiredDataSize) throws org.apache.derby.client.am.DisconnectException
- {
- int totalBytesRead = 0;
- // calulate the the number of bytes in the buffer.
- int avail = count_ - pos_;
-
- // read more bytes off the network if the data is not in the buffer already.
- if (avail < desiredDataSize) {
- totalBytesRead = fill (desiredDataSize - avail);
- }
- return totalBytesRead;
- }
-
- protected final void ensureBLayerDataInBuffer (int desiredDataSize) throws org.apache.derby.client.am.DisconnectException
- {
- if (dssIsContinued_ && (desiredDataSize > dssLength_)) {
- int continueDssHeaderCount =
- (((desiredDataSize - dssLength_) / 32767) + 1);
- ensureALayerDataInBuffer (desiredDataSize + (continueDssHeaderCount * 2));
- compressBLayerData (continueDssHeaderCount);
- return;
- }
- ensureALayerDataInBuffer (desiredDataSize);
- }
-
- // this will probably never be called.
- // it is included here in the highly unlikely event that a reply object
- // exceeds 32K. for opimization purposes, we should consider
- // removing this. removing this should be ok since we handle most
- // big stuff returned from the server (qrydta's for example) by
- // copying out the data into some other storage. any extended dss header
- // info will be removed in the copying process.
- private final void compressBLayerData (int continueDssHeaderCount) throws org.apache.derby.client.am.DisconnectException
- {
- int tempPos = 0;
-
- // jump to the last continuation header.
- for (int i = 0; i < continueDssHeaderCount; i++) {
- // the first may be less than the size of a full dss
- if (i == 0) {
- // only jump by the number of bytes remaining in the current dss
- tempPos = pos_ + dssLength_;
- }
- else {
- // all other jumps are for a full continued dss
- tempPos += 32767;
- }
- }
-
- // for each of the dss headers to remove,
- // read out the continuation header and increment the dss length by the
- // size of the conitnation bytes, then shift the continuation data as needed.
- int shiftSize = 0;
- int bytesToShift = 0;
- int continueHeaderLength = 0;
- int newDssLength = 0;
- for (int i = 0; i < continueDssHeaderCount; i++) {
-
- continueHeaderLength = ((buffer_[tempPos]&0xFF) << 8) +
- ((buffer_[tempPos + 1]&0xFF) << 0);
-
- if (i == 0) {
- // if this is the last one (farthest down stream and first to strip out)
-
- if ((continueHeaderLength & 0x8000) == 0x8000) {
- // the last dss header is again continued
- continueHeaderLength = 32767;
- dssIsContinued_ = true;
- }
- else {
- // the last dss header was not contiued so update continue state flag
- dssIsContinued_ = false;
- }
- // the very first shift size is 2
- shiftSize = 2;
- }
- else {
- // already removed the last header so make sure the chaining flag is on
- if ((continueHeaderLength & 0x8000) == 0x8000) {
- continueHeaderLength = 32767;
- }
- else {
- // this is a syntax error but not really certain which one.
- // for now pick 0x02 which is Dss header Length does not match the number
- // of bytes of data found.
- doSyntaxrmSemantics (CodePoint.SYNERRCD_DSS_LENGTH_BYTE_NUMBER_MISMATCH);
- }
- // increase the shift size by 2
- shiftSize += 2;
- }
-
- // it is a syntax error if the dss continuation is less than or equal to two
- if (continueHeaderLength <= 2) {
- doSyntaxrmSemantics (CodePoint.SYNERRCD_DSS_CONT_LESS_OR_EQUAL_2);
- }
-
- newDssLength += (continueHeaderLength - 2);
-
- // calculate the number of bytes to shift
- if (i != (continueDssHeaderCount - 1))
- bytesToShift = 32767;
- else
- bytesToShift = dssLength_;
-
- tempPos -= (shiftSize - 1);
- // perform the compress
- for (int j = 0; j < bytesToShift; j++) {
- buffer_[tempPos + shiftSize] = buffer_[tempPos];
- tempPos--;
- }
- tempPos += (shiftSize + 1);
- }
- // reposition the start of the data after the final dss shift.
- pos_ = tempPos;
- dssLength_ = dssLength_ + newDssLength;
- }
-
- protected final void readDssHeader () throws org.apache.derby.client.am.DisconnectException
- {
- int correlationID = 0;
- int nextCorrelationID = 0;
- ensureALayerDataInBuffer (6);
-
- // read out the dss length
- dssLength_ =
- ((buffer_[pos_++]&0xFF) << 8) +
- ((buffer_[pos_++]&0xFF) << 0);
-
- // Remember the old dss length for decryption only.
- int oldDssLength = dssLength_;
-
- // check for the continuation bit and update length as needed.
- if ((dssLength_ & 0x8000) == 0x8000) {
- dssLength_ = 32767;
- dssIsContinued_ = true;
- }
- else {
- dssIsContinued_ = false;
- }
-
- if (dssLength_ < 6)
- doSyntaxrmSemantics (CodePoint.SYNERRCD_DSS_LESS_THAN_6);
-
- // If the GDS id is not valid, or
- // if the reply is not an RPYDSS nor
- // a OBJDSS, then throw an exception.
- if ((buffer_[pos_++]&0xFF) != 0xd0)
- doSyntaxrmSemantics (CodePoint.SYNERRCD_CBYTE_NOT_D0);
-
- int gdsFormatter = buffer_[pos_++]&0xFF;
- if (((gdsFormatter & 0x02) != 0x02)
- &&((gdsFormatter & 0x03) != 0x03)
- &&((gdsFormatter & 0x04) != 0x04)) {
- doSyntaxrmSemantics (CodePoint.SYNERRCD_FBYTE_NOT_SUPPORTED);
- }
-
- // Determine if the current DSS is chained with the
- // next DSS, with the same or different request ID.
- if ((gdsFormatter & 0x40) == 0x40) { // on indicates structure chained to next structure
- if ((gdsFormatter & 0x10) == 0x10) {
- dssIsChainedWithSameID_ = true;
- dssIsChainedWithDiffID_ = false;
- nextCorrelationID = dssCorrelationID_;
- }
- else {
+import org.apache.derby.client.am.SignedBinary;
+import org.apache.derby.client.am.SqlException;
+import org.apache.derby.client.am.SqlState;
+
+public class Reply {
+ protected org.apache.derby.client.am.Agent agent_;
+ protected NetAgent netAgent_; //cheat-link to (NetAgent) agent_
+
+ private CcsidManager ccsidManager_;
+ protected final static int DEFAULT_BUFFER_SIZE = 32767;
+ protected byte[] buffer_;
+ protected int pos_;
+ protected int count_;
+
+ private int topDdmCollectionStack_;
+ private final static int MAX_MARKS_NESTING = 10;
+ private int[] ddmCollectionLenStack_;
+ private int ddmScalarLen_; // a value of -1 -> streamed ddm -> length unknown
+ private final static int EMPTY_STACK = -1;
+
+ protected boolean ensuredLengthForDecryption_ = false; // A layer lengths have already been ensured in decrypt method.
+ protected byte[] longBufferForDecryption_ = null;
+ protected int longPosForDecryption_ = 0;
+ protected byte[] longValueForDecryption_ = null;
+ protected int longCountForDecryption_ = 0;
+
+ protected int dssLength_;
+ protected boolean dssIsContinued_;
+ private boolean dssIsChainedWithSameID_;
+ private boolean dssIsChainedWithDiffID_;
+ protected int dssCorrelationID_;
+
+ protected int peekedLength_ = 0;
+ protected int peekedCodePoint_ = END_OF_COLLECTION; // saves the peeked codept
+ private int peekedNumOfExtendedLenBytes_ = 0;
+ private int currentPos_ = 0;
+
+ public final static int END_OF_COLLECTION = -1;
+ public final static int END_OF_SAME_ID_CHAIN = -2;
+
+ Reply(NetAgent netAgent, int bufferSize) {
+ buffer_ = new byte[bufferSize];
+ agent_ = netAgent_ = netAgent;
+ ccsidManager_ = netAgent.targetCcsidManager_;
+ ddmCollectionLenStack_ = new int[Reply.MAX_MARKS_NESTING];
+ initialize();
+ }
+
+ final void initialize() {
+ pos_ = 0;
+ count_ = 0;
+ topDdmCollectionStack_ = Reply.EMPTY_STACK;
+ for (int i = 0; i < Reply.MAX_MARKS_NESTING; i++) {
+ ddmCollectionLenStack_[i] = 0;
+ }
+ ddmScalarLen_ = 0;
+ dssLength_ = 0;
+ dssIsContinued_ = false;
dssIsChainedWithSameID_ = false;
- dssIsChainedWithDiffID_ = true;
- nextCorrelationID = dssCorrelationID_ + 1;
- }
- }
- else {
- // chaining bit not b'1', make sure DSSFMT bit3 not b'1'
- if ((gdsFormatter & 0x10) == 0x10) { // Next DSS can not have same correlator
- doSyntaxrmSemantics(CodePoint.SYNERRCD_CHAIN_OFF_SAME_NEXT_CORRELATOR);
- }
-
- // chaining bit not b'1', make sure no error continuation
- if ((gdsFormatter & 0x20) == 0x20) { // must be 'do not continue on error'
- doSyntaxrmSemantics(CodePoint.SYNERRCD_CHAIN_OFF_ERROR_CONTINUE);
- }
-
- dssIsChainedWithSameID_ = false;
- dssIsChainedWithDiffID_ = false;
- nextCorrelationID = 1;
- }
-
- correlationID =
- ((buffer_[pos_++]&0xFF) << 8) +
- ((buffer_[pos_++]&0xFF) << 0);
-
- // corrid must be the one expected or a -1 which gets returned in some error cases.
- if ((correlationID != dssCorrelationID_) && (correlationID != 0xFFFF)){
- doSyntaxrmSemantics (CodePoint.SYNERRCD_INVALID_CORRELATOR);
- }
- else {
- dssCorrelationID_ = nextCorrelationID;
- }
- dssLength_ -= 6;
- if ((gdsFormatter & 0x04) == 0x04 )
- decryptData (gdsFormatter, oldDssLength); //we have to decrypt data here because
- //we need the decrypted codepoint. If
- //Data is very long > 32767, we have to
- //get all the data first because decrypt
- //piece by piece doesn't work.
- }
+ dssIsChainedWithDiffID_ = false;
+ dssCorrelationID_ = 1;
+ }
+
+ final int getDdmLength() {
+ return ddmScalarLen_;
+ }
+
+ // This is a helper method which shifts the buffered bytes from
+ // wherever they are in the current buffer to the beginning of
+ // different buffer (note these buffers could be the same).
+ // State information is updated as needed after the shift.
+ private final void shiftBuffer(byte[] destinationBuffer) {
+ // calculate the size of the data in the current buffer.
+ int sz = count_ - pos_;
+
+ // copy this data to the new buffer starting at position 0.
+ System.arraycopy(buffer_, pos_, destinationBuffer, 0, sz);
+
+ // update the state information for data in the new buffer.
+ pos_ = 0;
+ count_ = sz;
+
+ // replace the old buffer with the new buffer.
+ buffer_ = destinationBuffer;
+ }
+
+ // This method makes sure there is enough room in the buffer
+ // for a certain number of bytes. This method will allocate
+ // a new buffer if needed and shift the bytes in the current buffer
+ // to make ensure space is available for a fill. Right now
+ // this method will shift bytes as needed to make sure there is
+ // as much room as possible in the buffer before trying to
+ // do the read. The idea is to try to have space to get as much data as possible
+ // if we need to do a read on the socket's stream.
+ protected final void ensureSpaceInBufferForFill(int desiredSpace) {
+ // calculate the total unused space in the buffer.
+ // this includes any space at the end of the buffer and any free
+ // space at the beginning resulting from bytes already read.
+ int currentAvailableSpace = (buffer_.length - count_) + pos_;
+
+ // check to see if there is enough free space.
+ if (currentAvailableSpace < desiredSpace) {
+
+ // there is not enough free space so we need more storage.
+ // we are going to double the buffer unless that happens to still be too small.
+ // if more than double the buffer is needed, use the smallest amount over this as possible.
+ int doubleBufferSize = (2 * buffer_.length);
+
+ int minumNewBufferSize = (desiredSpace - currentAvailableSpace) + buffer_.length;
+ int newsz = minumNewBufferSize <= doubleBufferSize ? doubleBufferSize : minumNewBufferSize;
+
+ byte[] newBuffer = new byte[newsz];
+
+ // shift everything from the old buffer to the new buffer
+ shiftBuffer(newBuffer);
+ } else {
+
+ // there is enough free space in the buffer but let's make sure it is all at the end.
+ // this is also important because if we are going to do a read, it would be nice
+ // to get as much data as possible and making room at the end if the buffer helps to
+ // ensure this.
+ if (pos_ != 0) {
+ shiftBuffer(buffer_);
+ }
+ }
+ }
+
+ // This method will attempt to read a minimum number of bytes
+ // from the underlying stream. This method will keep trying to
+ // read bytes until it has obtained at least the minimum number.
+ // Now returns the total bytes read for decryption, use to return void.
+ protected int fill(int minimumBytesNeeded) throws org.apache.derby.client.am.DisconnectException {
+ // make sure that there is enough space in the buffer to hold
+ // the minimum number of bytes needed.
+ ensureSpaceInBufferForFill(minimumBytesNeeded);
+
+ // read until the minimum number of bytes needed is now in the buffer.
+ // hopefully the read method will return as many bytes as it can.
+ int totalBytesRead = 0;
+ int actualBytesRead = 0;
+ do {
+ try {
+ // oops, we shouldn't expose the agent's input stream here, collapse this into a read method on the agent
+ actualBytesRead = netAgent_.getInputStream().read(buffer_, count_, buffer_.length - count_);
+ } catch (java.io.IOException ioe) {
+ netAgent_.throwCommunicationsFailure("Reply.fill()",
+ "InputStream.read()",
+ ioe.getMessage(),
+ "*");
+ } finally {
+ if (agent_.loggingEnabled()) {
+ ((NetLogWriter) netAgent_.logWriter_).traceProtocolFlow(buffer_,
+ count_,
+ actualBytesRead,
+ NetLogWriter.TYPE_TRACE_RECEIVE,
+ "Reply",
+ "fill",
+ 2); // tracepoint
+ }
+ }
+ count_ += actualBytesRead;
+ totalBytesRead += actualBytesRead;
+
+ } while ((totalBytesRead < minimumBytesNeeded) && (actualBytesRead != -1));
+
+ if (actualBytesRead == -1) {
+ if (totalBytesRead < minimumBytesNeeded) {
+ netAgent_.throwCommunicationsFailure("Reply.fill()",
+ "InputStream.read()",
+ "insufficient data",
+ "*");
+ }
+ }
+ return totalBytesRead;
+ }
+
+ // Make sure a certain amount of Layer A data is in the buffer.
+ // The data will be in the buffer after this method is called.
+ // Now returns the total bytes read for decryption, use to return void.
+ protected final int ensureALayerDataInBuffer(int desiredDataSize) throws org.apache.derby.client.am.DisconnectException {
+ int totalBytesRead = 0;
+ // calulate the the number of bytes in the buffer.
+ int avail = count_ - pos_;
+
+ // read more bytes off the network if the data is not in the buffer already.
+ if (avail < desiredDataSize) {
+ totalBytesRead = fill(desiredDataSize - avail);
+ }
+ return totalBytesRead;
+ }
+
+ protected final void ensureBLayerDataInBuffer(int desiredDataSize) throws org.apache.derby.client.am.DisconnectException {
+ if (dssIsContinued_ && (desiredDataSize > dssLength_)) {
+ int continueDssHeaderCount =
+ (((desiredDataSize - dssLength_) / 32767) + 1);
+ ensureALayerDataInBuffer(desiredDataSize + (continueDssHeaderCount * 2));
+ compressBLayerData(continueDssHeaderCount);
+ return;
+ }
+ ensureALayerDataInBuffer(desiredDataSize);
+ }
+
+ // this will probably never be called.
+ // it is included here in the highly unlikely event that a reply object
+ // exceeds 32K. for opimization purposes, we should consider
+ // removing this. removing this should be ok since we handle most
+ // big stuff returned from the server (qrydta's for example) by
+ // copying out the data into some other storage. any extended dss header
+ // info will be removed in the copying process.
+ private final void compressBLayerData(int continueDssHeaderCount) throws org.apache.derby.client.am.DisconnectException {
+ int tempPos = 0;
+
+ // jump to the last continuation header.
+ for (int i = 0; i < continueDssHeaderCount; i++) {
+ // the first may be less than the size of a full dss
+ if (i == 0) {
+ // only jump by the number of bytes remaining in the current dss
+ tempPos = pos_ + dssLength_;
+ } else {
+ // all other jumps are for a full continued dss
+ tempPos += 32767;
+ }
+ }
+
+ // for each of the dss headers to remove,
+ // read out the continuation header and increment the dss length by the
+ // size of the conitnation bytes, then shift the continuation data as needed.
+ int shiftSize = 0;
+ int bytesToShift = 0;
+ int continueHeaderLength = 0;
+ int newDssLength = 0;
+ for (int i = 0; i < continueDssHeaderCount; i++) {
+
+ continueHeaderLength = ((buffer_[tempPos] & 0xFF) << 8) +
+ ((buffer_[tempPos + 1] & 0xFF) << 0);
+
+ if (i == 0) {
+ // if this is the last one (farthest down stream and first to strip out)
+
+ if ((continueHeaderLength & 0x8000) == 0x8000) {
+ // the last dss header is again continued
+ continueHeaderLength = 32767;
+ dssIsContinued_ = true;
+ } else {
+ // the last dss header was not contiued so update continue state flag
+ dssIsContinued_ = false;
+ }
+ // the very first shift size is 2
+ shiftSize = 2;
+ } else {
+ // already removed the last header so make sure the chaining flag is on
+ if ((continueHeaderLength & 0x8000) == 0x8000) {
+ continueHeaderLength = 32767;
+ } else {
+ // this is a syntax error but not really certain which one.
+ // for now pick 0x02 which is Dss header Length does not match the number
+ // of bytes of data found.
+ doSyntaxrmSemantics(CodePoint.SYNERRCD_DSS_LENGTH_BYTE_NUMBER_MISMATCH);
+ }
+ // increase the shift size by 2
+ shiftSize += 2;
+ }
+
+ // it is a syntax error if the dss continuation is less than or equal to two
+ if (continueHeaderLength <= 2) {
+ doSyntaxrmSemantics(CodePoint.SYNERRCD_DSS_CONT_LESS_OR_EQUAL_2);
+ }
+
+ newDssLength += (continueHeaderLength - 2);
+
+ // calculate the number of bytes to shift
+ if (i != (continueDssHeaderCount - 1)) {
+ bytesToShift = 32767;
+ } else {
+ bytesToShift = dssLength_;
+ }
+
+ tempPos -= (shiftSize - 1);
+ // perform the compress
+ for (int j = 0; j < bytesToShift; j++) {
+ buffer_[tempPos + shiftSize] = buffer_[tempPos];
+ tempPos--;
+ }
+ tempPos += (shiftSize + 1);
+ }
+ // reposition the start of the data after the final dss shift.
+ pos_ = tempPos;
+ dssLength_ = dssLength_ + newDssLength;
+ }
+
+ protected final void readDssHeader() throws org.apache.derby.client.am.DisconnectException {
+ int correlationID = 0;
+ int nextCorrelationID = 0;
+ ensureALayerDataInBuffer(6);
+
+ // read out the dss length
+ dssLength_ =
+ ((buffer_[pos_++] & 0xFF) << 8) +
+ ((buffer_[pos_++] & 0xFF) << 0);
+
+ // Remember the old dss length for decryption only.
+ int oldDssLength = dssLength_;
+
+ // check for the continuation bit and update length as needed.
+ if ((dssLength_ & 0x8000) == 0x8000) {
+ dssLength_ = 32767;
+ dssIsContinued_ = true;
+ } else {
+ dssIsContinued_ = false;
+ }
+
+ if (dssLength_ < 6) {
+ doSyntaxrmSemantics(CodePoint.SYNERRCD_DSS_LESS_THAN_6);
+ }
+
+ // If the GDS id is not valid, or
+ // if the reply is not an RPYDSS nor
+ // a OBJDSS, then throw an exception.
+ if ((buffer_[pos_++] & 0xFF) != 0xd0) {
+ doSyntaxrmSemantics(CodePoint.SYNERRCD_CBYTE_NOT_D0);
+ }
+
+ int gdsFormatter = buffer_[pos_++] & 0xFF;
+ if (((gdsFormatter & 0x02) != 0x02)
+ && ((gdsFormatter & 0x03) != 0x03)
+ && ((gdsFormatter & 0x04) != 0x04)) {
+ doSyntaxrmSemantics(CodePoint.SYNERRCD_FBYTE_NOT_SUPPORTED);
+ }
+
+ // Determine if the current DSS is chained with the
+ // next DSS, with the same or different request ID.
+ if ((gdsFormatter & 0x40) == 0x40) { // on indicates structure chained to next structure
+ if ((gdsFormatter & 0x10) == 0x10) {
+ dssIsChainedWithSameID_ = true;
+ dssIsChainedWithDiffID_ = false;
+ nextCorrelationID = dssCorrelationID_;
+ } else {
+ dssIsChainedWithSameID_ = false;
+ dssIsChainedWithDiffID_ = true;
+ nextCorrelationID = dssCorrelationID_ + 1;
+ }
+ } else {
+ // chaining bit not b'1', make sure DSSFMT bit3 not b'1'
+ if ((gdsFormatter & 0x10) == 0x10) { // Next DSS can not have same correlator
+ doSyntaxrmSemantics(CodePoint.SYNERRCD_CHAIN_OFF_SAME_NEXT_CORRELATOR);
+ }
+
+ // chaining bit not b'1', make sure no error continuation
+ if ((gdsFormatter & 0x20) == 0x20) { // must be 'do not continue on error'
+ doSyntaxrmSemantics(CodePoint.SYNERRCD_CHAIN_OFF_ERROR_CONTINUE);
+ }
+ dssIsChainedWithSameID_ = false;
+ dssIsChainedWithDiffID_ = false;
+ nextCorrelationID = 1;
+ }
+ correlationID =
+ ((buffer_[pos_++] & 0xFF) << 8) +
+ ((buffer_[pos_++] & 0xFF) << 0);
+
+ // corrid must be the one expected or a -1 which gets returned in some error cases.
+ if ((correlationID != dssCorrelationID_) && (correlationID != 0xFFFF)) {
+ doSyntaxrmSemantics(CodePoint.SYNERRCD_INVALID_CORRELATOR);
+ } else {
+ dssCorrelationID_ = nextCorrelationID;
+ }
+ dssLength_ -= 6;
+ if ((gdsFormatter & 0x04) == 0x04) {
+ decryptData(gdsFormatter, oldDssLength); //we have to decrypt data here because
+ }
+ //we need the decrypted codepoint. If
+ //Data is very long > 32767, we have to
+ //get all the data first because decrypt
+ //piece by piece doesn't work.
+ }
- private final void decryptData(int gdsFormatter, int oldDssLength) throws org.apache.derby.client.am.DisconnectException
- {
+
+ private final void decryptData(int gdsFormatter, int oldDssLength) throws org.apache.derby.client.am.DisconnectException {
boolean readHeader;
- if(dssLength_ == 32761) {
- ByteArrayOutputStream baos;
- int copySize = 0;
+ if (dssLength_ == 32761) {
+ ByteArrayOutputStream baos;
+ int copySize = 0;
+
+ baos = new ByteArrayOutputStream();
+
+ // set the amount to read for the first segment
+ copySize = dssLength_; // note: has already been adjusted for headers
+
+ do {
+ // determine if a continuation header needs to be read after the data
+ if (dssIsContinued_) {
+ readHeader = true;
+ } else {
+ readHeader = false;
+ }
+
+ // read the segment
+ ensureALayerDataInBuffer(copySize);
+ adjustLengths(copySize);
+ baos.write(buffer_, pos_, copySize);
+ pos_ += copySize;
+
+ // read the continuation header, if necessary
+ if (readHeader) {
+ readDSSContinuationHeader();
+ }
+
+ copySize = dssLength_;
+ } while (readHeader == true);
+ byte[] cipherBytes = baos.toByteArray();
+ byte[] clearedByte = null;
+ try {
+ clearedByte = netAgent_.netConnection_.getEncryptionManager().decryptData(cipherBytes,
+ NetConfiguration.SECMEC_EUSRIDPWD,
+ netAgent_.netConnection_.getTargetPublicKey(),
+ netAgent_.netConnection_.getTargetPublicKey());
+ } catch (SqlException e) {
+ //throw new SqlException (agent_.logWriter_, "error in decrypting data");
+ }
+
+ //The decrypted data is for one codepoint only. We need to save the data follows this codepoint
+ longBufferForDecryption_ = new byte[buffer_.length - pos_];
+ longPosForDecryption_ = 0;
+ count_ = count_ - pos_;
+ longCountForDecryption_ = count_;
+ System.arraycopy(buffer_, pos_, longBufferForDecryption_, 0, buffer_.length - pos_);
+
+ //copy the clear data to buffer_
+ if (clearedByte.length >= 32767) {
+ System.arraycopy(clearedByte, 0, buffer_, 0, 32767);
+ } else {
+ System.arraycopy(clearedByte, 0, buffer_, 0, clearedByte.length);
+ }
+
+ pos_ = 0;
+ dssLength_ = buffer_.length;
- baos = new ByteArrayOutputStream ();
+ int lobLength = 0;
+ if (clearedByte.length > 32767) { //for extended length, length is the 4 bytes that follow codepoint
+ lobLength = ((clearedByte[4] & 0xFF) << 24) +
+ ((clearedByte[5] & 0xFF) << 16) +
+ ((clearedByte[6] & 0xFF) << 8) +
+ ((clearedByte[7] & 0xFF) << 0);
+ longValueForDecryption_ = new byte[lobLength];
+ System.arraycopy(clearedByte, 8, longValueForDecryption_, 0, clearedByte.length - 8);
+ } else {
+ lobLength = ((clearedByte[0] & 0xFF) << 8) +
+ ((clearedByte[1] & 0xFF) << 0);
+ longValueForDecryption_ = new byte[lobLength - 4];
+ System.arraycopy(clearedByte, 4, longValueForDecryption_, 0, clearedByte.length - 4);
+ }
+ } else {
+ int bytesRead = ensureALayerDataInBuffer(dssLength_); //we need to get back all the data here, and then decrypt
+ if (bytesRead > 0) //we ensuredALayerDAtaInBuffer here and set the flag to true, so we don't need do this again later
+ {
+ ensuredLengthForDecryption_ = true;
+ }
+ byte[] encryptedByte = new byte[dssLength_];
+ System.arraycopy(buffer_, pos_, encryptedByte, 0, dssLength_);
+ byte[] array1 = new byte[pos_];
+ System.arraycopy(buffer_, 0, array1, 0, pos_); //save the data before encrypted data in array1
+ byte[] array3 = new byte[buffer_.length - dssLength_ - pos_];
+ System.arraycopy(buffer_, pos_ + dssLength_, array3, 0, buffer_.length - dssLength_ - pos_); //save the data follows encrypted data in array3
+ byte[] clearedByte = null;
+ try {
+ clearedByte = netAgent_.netConnection_.getEncryptionManager().decryptData(encryptedByte,
+ NetConfiguration.SECMEC_EUSRIDPWD,
+ netAgent_.netConnection_.getTargetPublicKey(),
+ netAgent_.netConnection_.getTargetPublicKey());
+ } catch (SqlException e) {
+ //throw new SqlException (agent_.logWriter_, "error in decrypting data");
+ }
+ dssLength_ -= (encryptedByte.length - clearedByte.length);
+ byte[] buffer = new byte[array1.length + clearedByte.length + array3.length];
+ System.arraycopy(array1, 0, buffer, 0, array1.length);
+ System.arraycopy(clearedByte, 0, buffer, array1.length, clearedByte.length);
+ System.arraycopy(array3, 0, buffer, array1.length + clearedByte.length, array3.length);
+ buffer_ = buffer;
+ int oldCount = count_;
+ count_ = count_ - (encryptedByte.length - clearedByte.length);
+ if (((clearedByte[2] & 0xff) << 8) + ((clearedByte[3] & 0xff) << 0) == 0x146c) {
+ int firstLobLength = ((clearedByte[0] & 0xFF) << 8) +
+ ((clearedByte[1] & 0xFF) << 0);
+
+ boolean flag = false;
+ if (gdsFormatter == 0x54) {
+ flag = true;
+ }
+ if (flag) {
+ if (oldCount - oldDssLength < 6) {
+ int totalBytesRead = fill(6); //sometimes the 2nd EXTDTA doesn't come back, need to fetch again to get it
+ if (totalBytesRead > 0) {
+ longBufferForDecryption_ = new byte[totalBytesRead];
+ longPosForDecryption_ = 0;
+ System.arraycopy(buffer_, pos_ + firstLobLength, longBufferForDecryption_, 0,
+ totalBytesRead);
+ }
+
+ } else {
+ longBufferForDecryption_ = new byte[count_ - pos_ - firstLobLength];
+ longPosForDecryption_ = 0;
+ System.arraycopy(buffer_, pos_ + firstLobLength, longBufferForDecryption_, 0,
+ longBufferForDecryption_.length);
+
+ }
+ } //end if(flag)
+ int lobLength = ((clearedByte[0] & 0xFF) << 8) +
+ ((clearedByte[1] & 0xFF) << 0) - 4;
+
+ longValueForDecryption_ = new byte[lobLength];
+
+ System.arraycopy(clearedByte, 4, longValueForDecryption_, 0, clearedByte.length - 4); //copy the decrypted lob value (excluded length an dcodepoint) to longValue_
+ } else if (((clearedByte[2] & 0xff) << 8) + ((clearedByte[3] & 0xff) << 0) == 0x241B) {
+ int length = ((clearedByte[0] & 0xFF) << 8) +
+ ((clearedByte[1] & 0xFF) << 0);
+ boolean noData = false;
+ if (clearedByte[4] == -1 && clearedByte[5] == -1) {
+ noData = true; //there is no data, no need to do the copy
+ }
+ if (!noData) {
+ if (length == 32776) {
+ length = ((clearedByte[4] & 0xFF) << 24) +
+ ((clearedByte[5] & 0xFF) << 16) +
+ ((clearedByte[6] & 0xFF) << 8) +
+ ((clearedByte[7] & 0xFF) << 0);
+ longValueForDecryption_ = new byte[length];
+ System.arraycopy(clearedByte, 8, longValueForDecryption_, 0,
+ clearedByte.length - 8);
+ longCountForDecryption_ = count_ - (pos_ + length + 8);
+ longBufferForDecryption_ = new byte[buffer_.length - pos_ - length - 8];
+ System.arraycopy(buffer_, pos_ + length + 8, longBufferForDecryption_, 0,
+ longBufferForDecryption_.length);
+
+ } else {
+ longPosForDecryption_ = 0;
+ longCountForDecryption_ = count_ - (pos_ + length);
+ longBufferForDecryption_ = new byte[buffer_.length - pos_ - length];
+ System.arraycopy(buffer_, pos_ + length, longBufferForDecryption_, 0,
+ longBufferForDecryption_.length);
- // set the amount to read for the first segment
- copySize = dssLength_; // note: has already been adjusted for headers
+ longValueForDecryption_ = new byte[length - 4];
- do {
+ System.arraycopy(clearedByte, 4, longValueForDecryption_, 0,
+ clearedByte.length - 4);
+ }
+ }
+ }
+ }
+ }
+
+
+ final int readUnsignedShort() throws org.apache.derby.client.am.DisconnectException {
+ // should we be checking dss lengths and ddmScalarLengths here
+ // if yes, i am not sure this is the correct place if we should be checking
+ ensureBLayerDataInBuffer(2);
+ adjustLengths(2);
+ return ((buffer_[pos_++] & 0xff) << 8) +
+ ((buffer_[pos_++] & 0xff) << 0);
+ }
+
+ final short readShort() throws org.apache.derby.client.am.DisconnectException {
+ // should we be checking dss lengths and ddmScalarLengths here
+ ensureBLayerDataInBuffer(2);
+ adjustLengths(2);
+ short s = SignedBinary.getShort(buffer_, pos_);
+
+ pos_ += 2;
+
+ return s;
+ }
+
+ final int readInt() throws org.apache.derby.client.am.DisconnectException {
+ // should we be checking dss lengths and ddmScalarLengths here
+ ensureBLayerDataInBuffer(4);
+ adjustLengths(4);
+ int i = SignedBinary.getInt(buffer_, pos_);
+ pos_ += 4;
+
+ return i;
+ }
+
+ final void readIntArray(int[] array) throws org.apache.derby.client.am.DisconnectException {
+ ensureBLayerDataInBuffer(array.length * 4);
+ adjustLengths(array.length * 4);
+
+ for (int i = 0; i < array.length; i++) {
+ array[i] = SignedBinary.getInt(buffer_, pos_);
+ pos_ += 4;
+ }
+ }
+
+
+ final long readLong() throws org.apache.derby.client.am.DisconnectException {
+ // should we be checking dss lengths and ddmScalarLengths here
+ ensureBLayerDataInBuffer(8);
+ adjustLengths(8);
+ long l = SignedBinary.getLong(buffer_, pos_);
+
+ pos_ += 8;
+
+ return l;
+ }
+
+
+ final int[] readUnsignedShortList() throws org.apache.derby.client.am.DisconnectException {
+ int len = ddmScalarLen_;
+ ensureBLayerDataInBuffer(len);
+ adjustLengths(len);
+
+ int count = len / 2;
+ int[] list = new int[count];
+
+ for (int i = 0; i < count; i++) {
+ list[i] = ((buffer_[pos_++] & 0xff) << 8) +
+ ((buffer_[pos_++] & 0xff) << 0);
+ }
+
+ return list;
+ }
+
+ final int readUnsignedByte() throws org.apache.derby.client.am.DisconnectException {
+ ensureBLayerDataInBuffer(1);
+ adjustLengths(1);
+ return (buffer_[pos_++] & 0xff);
+ }
+
+ final byte readByte() throws org.apache.derby.client.am.DisconnectException {
+ ensureBLayerDataInBuffer(1);
+ adjustLengths(1);
+ return (byte) (buffer_[pos_++] & 0xff);
+ }
+
+ final boolean readBoolean() throws org.apache.derby.client.am.DisconnectException {
+ ensureBLayerDataInBuffer(1);
+ adjustLengths(1);
+ return buffer_[pos_++] != 0;
+ }
+
+ final String readString(int length) throws org.apache.derby.client.am.DisconnectException {
+ ensureBLayerDataInBuffer(length);
+ adjustLengths(length);
+
+ String result = ccsidManager_.convertToUCS2(buffer_, pos_, length);
+ pos_ += length;
+ return result;
+ }
+
+ final String readString(int length, String encoding) throws org.apache.derby.client.am.DisconnectException {
+ ensureBLayerDataInBuffer(length);
+ adjustLengths(length);
+ String s = null;
+
+ try {
+ s = new String(buffer_, pos_, length, encoding);
+ } catch (java.io.UnsupportedEncodingException e) {
+ agent_.accumulateChainBreakingReadExceptionAndThrow(new org.apache.derby.client.am.DisconnectException(e,
+ agent_,
+ "encoding not supported!!"));
+ }
+
+ pos_ += length;
+ return s;
+ }
+
+ final String readString() throws org.apache.derby.client.am.DisconnectException {
+ int len = ddmScalarLen_;
+ ensureBLayerDataInBuffer(len);
+ adjustLengths(len);
+ String result = ccsidManager_.convertToUCS2(buffer_, pos_, len);
+ pos_ += len;
+ return result;
+ }
+
+ final byte[] readBytes(int length) throws org.apache.derby.client.am.DisconnectException {
+ ensureBLayerDataInBuffer(length);
+ adjustLengths(length);
+
+ byte[] b = new byte[length];
+ System.arraycopy(buffer_, pos_, b, 0, length);
+ pos_ += length;
+ return b;
+ }
+
+ final byte[] readBytes() throws org.apache.derby.client.am.DisconnectException {
+ int len = ddmScalarLen_;
+ ensureBLayerDataInBuffer(len);
+ adjustLengths(len);
+
+ byte[] b = new byte[len];
+ System.arraycopy(buffer_, pos_, b, 0, len);
+ pos_ += len;
+ return b;
+ }
+
+ final byte[] readLDBytes() throws org.apache.derby.client.am.DisconnectException {
+ ensureBLayerDataInBuffer(2);
+ int len = ((buffer_[pos_++] & 0xff) << 8) + ((buffer_[pos_++] & 0xff) << 0);
+
+ if (len == 0) {
+ adjustLengths(2);
+ return null;
+ }
+
+ ensureBLayerDataInBuffer(len);
+ adjustLengths(len + 2);
+
+ byte[] b = new byte[len];
+ System.arraycopy(buffer_, pos_, b, 0, len);
+ pos_ += len;
+ return b;
+ }
+
+ final void skipBytes(int length) throws org.apache.derby.client.am.DisconnectException {
+ ensureBLayerDataInBuffer(length);
+ adjustLengths(length);
+ pos_ += length;
+ }
+
+ final void skipBytes() throws org.apache.derby.client.am.DisconnectException {
+ int len = ddmScalarLen_;
+ ensureBLayerDataInBuffer(len);
+ adjustLengths(len);
+ pos_ += len;
+ }
+
+ // This will be the new and improved getData that handles all QRYDTA/EXTDTA
+ // Returns the stream so that the caller can cache it
+ final ByteArrayOutputStream getData(ByteArrayOutputStream existingBuffer) throws org.apache.derby.client.am.DisconnectException {
+ boolean readHeader;
+ int copySize;
+ ByteArrayOutputStream baos;
+
+ // note: an empty baos can yield an allocated and empty byte[]
+ if (existingBuffer != null) {
+ baos = existingBuffer;
+ } else {
+ if (ddmScalarLen_ != -1) {
+ // allocate a stream based on a known amount of data
+ baos = new ByteArrayOutputStream(ddmScalarLen_);
+ } else {
+ // allocate a stream to hold an unknown amount of data
+ baos = new ByteArrayOutputStream();
+ //isLengthAndNullabilityUnknown = true;
+ }
+ }
+
+ // set the amount to read for the first segment
+ copySize = dssLength_; // note: has already been adjusted for headers
+
+ do {
// determine if a continuation header needs to be read after the data
- if (dssIsContinued_)
- readHeader = true;
- else
- readHeader = false;
+ if (dssIsContinued_) {
+ readHeader = true;
+ } else {
+ readHeader = false;
+ }
// read the segment
- ensureALayerDataInBuffer (copySize);
- adjustLengths (copySize);
- baos.write (buffer_, pos_, copySize);
+ ensureALayerDataInBuffer(copySize);
+ adjustLengths(copySize);
+ baos.write(buffer_, pos_, copySize);
pos_ += copySize;
// read the continuation header, if necessary
- if (readHeader)
- readDSSContinuationHeader ();
+ if (readHeader) {
+ readDSSContinuationHeader();
+ }
copySize = dssLength_;
- }
- while (readHeader == true);
- byte[] cipherBytes = baos.toByteArray();
- byte[] clearedByte = null;
- try{
- clearedByte = netAgent_.netConnection_.getEncryptionManager().decryptData(
- cipherBytes,
- NetConfiguration.SECMEC_EUSRIDPWD,
- netAgent_.netConnection_.getTargetPublicKey(),
- netAgent_.netConnection_.getTargetPublicKey());
- }
- catch (SqlException e)
- {
- //throw new SqlException (agent_.logWriter_, "error in decrypting data");
- }
-
- //The decrypted data is for one codepoint only. We need to save the data follows this codepoint
- longBufferForDecryption_ = new byte[buffer_.length - pos_];
- longPosForDecryption_ = 0;
- count_ = count_ - pos_;
- longCountForDecryption_ = count_;
- System.arraycopy(buffer_,pos_,longBufferForDecryption_,0,buffer_.length - pos_);
-
- //copy the clear data to buffer_
- if (clearedByte.length >=32767)
- System.arraycopy(clearedByte,0,buffer_,0,32767);
- else
- System.arraycopy(clearedByte,0,buffer_,0,clearedByte.length);
-
- pos_ = 0;
- dssLength_ = buffer_.length;
-
- int lobLength = 0;
- if(clearedByte.length > 32767) { //for extended length, length is the 4 bytes that follow codepoint
- lobLength = ( (clearedByte[4] & 0xFF) << 24) +
- ( (clearedByte[5] & 0xFF) << 16) +
- ( (clearedByte[6] & 0xFF) << 8) +
- ( (clearedByte[7] & 0xFF) << 0);
- longValueForDecryption_ = new byte[lobLength];
- System.arraycopy (clearedByte, 8, longValueForDecryption_, 0, clearedByte.length-8);
- }
- else {
- lobLength = ( (clearedByte[0] & 0xFF) << 8) +
- ( (clearedByte[1] & 0xFF) << 0);
- longValueForDecryption_ = new byte[lobLength-4];
- System.arraycopy (clearedByte, 4, longValueForDecryption_, 0, clearedByte.length-4);
- }
- }
-
- else{
- int bytesRead = ensureALayerDataInBuffer (dssLength_); //we need to get back all the data here, and then decrypt
- if (bytesRead > 0) //we ensuredALayerDAtaInBuffer here and set the flag to true, so we don't need do this again later
- ensuredLengthForDecryption_ = true;
- byte[] encryptedByte = new byte[dssLength_];
- System.arraycopy(buffer_,pos_,encryptedByte,0,dssLength_);
- byte[] array1 = new byte[pos_];
- System.arraycopy(buffer_,0,array1,0,pos_); //save the data before encrypted data in array1
- byte[] array3 = new byte[buffer_.length - dssLength_ - pos_];
- System.arraycopy(buffer_,pos_+dssLength_,array3,0,buffer_.length - dssLength_ - pos_); //save the data follows encrypted data in array3
- byte[] clearedByte = null;
- try{
- clearedByte = netAgent_.netConnection_.getEncryptionManager().decryptData(
- encryptedByte,
- NetConfiguration.SECMEC_EUSRIDPWD,
- netAgent_.netConnection_.getTargetPublicKey(),
- netAgent_.netConnection_.getTargetPublicKey());
+ } while (readHeader == true);
+
+ return baos;
+ }
+
+ // reads a DSS continuation header
+ // prereq: pos_ is positioned on the first byte of the two-byte header
+ // post: dssIsContinued_ is set to true if the continuation bit is on, false otherwise
+ // dssLength_ is set to DssConstants.MAX_DSS_LEN - 2 (don't count the header for the next read)
+ // helper method for getEXTDTAData
+ protected final void readDSSContinuationHeader() throws org.apache.derby.client.am.DisconnectException {
+ ensureALayerDataInBuffer(2);
+
+ dssLength_ =
+ ((buffer_[pos_++] & 0xFF) << 8) +
+ ((buffer_[pos_++] & 0xFF) << 0);
+
+ if ((dssLength_ & 0x8000) == 0x8000) {
+ dssLength_ = DssConstants.MAX_DSS_LEN;
+ dssIsContinued_ = true;
+ } else {
+ dssIsContinued_ = false;
}
- catch (SqlException e)
- {
- //throw new SqlException (agent_.logWriter_, "error in decrypting data");
+ // it is a syntax error if the dss continuation header length
+ // is less than or equal to two
+ if (dssLength_ <= 2) {
+ doSyntaxrmSemantics(CodePoint.SYNERRCD_DSS_CONT_LESS_OR_EQUAL_2);
}
- dssLength_ -= (encryptedByte.length - clearedByte.length);
- byte[] buffer = new byte[array1.length + clearedByte.length + array3.length];
- System.arraycopy(array1,0,buffer,0,array1.length);
- System.arraycopy(clearedByte,0,buffer,array1.length,clearedByte.length);
- System.arraycopy(array3,0,buffer,array1.length+clearedByte.length,array3.length);
- buffer_ = buffer;
- int oldCount = count_;
- count_ = count_ - (encryptedByte.length - clearedByte.length);
- if (((clearedByte[2]& 0xff) << 8) + ((clearedByte[3] & 0xff) << 0) == 0x146c) {
- int firstLobLength = ( (clearedByte[0] & 0xFF) << 8) +
- ( (clearedByte[1] & 0xFF) << 0);
-
- boolean flag = false;
- if (gdsFormatter == 0x54)
- flag = true;
- if(flag){
- if (oldCount - oldDssLength < 6) {
- int totalBytesRead = fill(6); //sometimes the 2nd EXTDTA doesn't come back, need to fetch again to get it
- if (totalBytesRead > 0) {
- longBufferForDecryption_ = new byte[totalBytesRead];
- longPosForDecryption_ = 0;
- System.arraycopy(buffer_, pos_ + firstLobLength, longBufferForDecryption_, 0,
- totalBytesRead);
- }
-
- }
- else {
- longBufferForDecryption_ = new byte[count_ - pos_ - firstLobLength];
- longPosForDecryption_ = 0;
- System.arraycopy(buffer_, pos_ + firstLobLength, longBufferForDecryption_, 0,
- longBufferForDecryption_.length);
- }
- } //end if(flag)
- int lobLength = ( (clearedByte[0] & 0xFF) << 8) +
- ( (clearedByte[1] & 0xFF) << 0) - 4;
-
- longValueForDecryption_ = new byte[lobLength];
-
- System.arraycopy (clearedByte, 4, longValueForDecryption_, 0, clearedByte.length - 4); //copy the decrypted lob value (excluded length an dcodepoint) to longValue_
- }
- else if (((clearedByte[2]& 0xff) << 8) + ((clearedByte[3] & 0xff) << 0) == 0x241B){
- int length = ( (clearedByte[0] & 0xFF) << 8) +
- ( (clearedByte[1] & 0xFF) << 0);
- boolean noData = false;
- if (clearedByte[4] == -1 && clearedByte[5] == -1)
- noData = true; //there is no data, no need to do the copy
- if (!noData) {
- if (length == 32776) {
- length = ( (clearedByte[4] & 0xFF) << 24) +
- ( (clearedByte[5] & 0xFF) << 16) +
- ( (clearedByte[6] & 0xFF) << 8) +
- ( (clearedByte[7] & 0xFF) << 0);
- longValueForDecryption_ = new byte[length];
- System.arraycopy (clearedByte, 8, longValueForDecryption_, 0,
- clearedByte.length - 8);
- longCountForDecryption_ = count_ - (pos_ + length + 8);
- longBufferForDecryption_ = new byte[buffer_.length - pos_ - length - 8];
- System.arraycopy(buffer_, pos_ + length + 8, longBufferForDecryption_, 0,
- longBufferForDecryption_.length);
-
- }
- else {
- longPosForDecryption_ = 0;
- longCountForDecryption_ = count_ - (pos_ + length);
- longBufferForDecryption_ = new byte[buffer_.length - pos_ - length];
- System.arraycopy (buffer_, pos_ + length, longBufferForDecryption_, 0,
- longBufferForDecryption_.length);
-
- longValueForDecryption_ = new byte[length - 4];
-
- System.arraycopy (clearedByte, 4, longValueForDecryption_, 0,
- clearedByte.length - 4);
- }
- }
- }
- }
- }
-
-
- final int readUnsignedShort () throws org.apache.derby.client.am.DisconnectException
- {
- // should we be checking dss lengths and ddmScalarLengths here
- // if yes, i am not sure this is the correct place if we should be checking
- ensureBLayerDataInBuffer (2);
- adjustLengths (2);
- return ((buffer_[pos_++] & 0xff) << 8) +
- ((buffer_[pos_++] & 0xff) << 0);
- }
-
- final short readShort () throws org.apache.derby.client.am.DisconnectException
- {
- // should we be checking dss lengths and ddmScalarLengths here
- ensureBLayerDataInBuffer (2);
- adjustLengths (2);
- short s = SignedBinary.getShort (buffer_, pos_);
-
- pos_ += 2;
-
- return s;
- }
-
- final int readInt () throws org.apache.derby.client.am.DisconnectException
- {
- // should we be checking dss lengths and ddmScalarLengths here
- ensureBLayerDataInBuffer (4);
- adjustLengths (4);
- int i = SignedBinary.getInt (buffer_, pos_);
- pos_ += 4;
-
- return i;
- }
-
- final void readIntArray (int[] array) throws org.apache.derby.client.am.DisconnectException
- {
- ensureBLayerDataInBuffer (array.length * 4);
- adjustLengths (array.length * 4);
-
- for (int i = 0; i < array.length; i++) {
- array[i] = SignedBinary.getInt (buffer_, pos_);
- pos_ += 4;
- }
- }
-
-
- final long readLong () throws org.apache.derby.client.am.DisconnectException
- {
- // should we be checking dss lengths and ddmScalarLengths here
- ensureBLayerDataInBuffer (8);
- adjustLengths (8);
- long l = SignedBinary.getLong (buffer_, pos_);
-
- pos_ += 8;
-
- return l;
- }
-
-
- final int [] readUnsignedShortList() throws org.apache.derby.client.am.DisconnectException
- {
- int len = ddmScalarLen_;
- ensureBLayerDataInBuffer (len);
- adjustLengths (len);
-
- int count = len/2;
- int[] list = new int[count];
-
- for (int i=0; i < count; i++) {
- list[i] = ((buffer_[pos_++] & 0xff) << 8) +
- ((buffer_[pos_++] & 0xff) << 0);
- }
-
- return list;
- }
-
- final int readUnsignedByte () throws org.apache.derby.client.am.DisconnectException
- {
- ensureBLayerDataInBuffer (1);
- adjustLengths (1);
- return (buffer_[pos_++] & 0xff);
- }
-
- final byte readByte () throws org.apache.derby.client.am.DisconnectException
- {
- ensureBLayerDataInBuffer (1);
- adjustLengths (1);
- return (byte) (buffer_[pos_++] & 0xff);
- }
-
- final boolean readBoolean () throws org.apache.derby.client.am.DisconnectException
- {
- ensureBLayerDataInBuffer (1);
- adjustLengths (1);
- return buffer_[pos_++] != 0;
- }
-
- final String readString (int length) throws org.apache.derby.client.am.DisconnectException
- {
- ensureBLayerDataInBuffer (length);
- adjustLengths (length);
-
- String result = ccsidManager_.convertToUCS2 (buffer_, pos_, length);
- pos_ += length;
- return result;
- }
-
- final String readString (int length, String encoding) throws org.apache.derby.client.am.DisconnectException
- {
- ensureBLayerDataInBuffer (length);
- adjustLengths (length);
- String s = null;
-
- try {
- s = new String (buffer_, pos_, length, encoding);
- }
- catch (java.io.UnsupportedEncodingException e) {
- agent_.accumulateChainBreakingReadExceptionAndThrow (
- new org.apache.derby.client.am.DisconnectException (
- e,
- agent_,
- "encoding not supported!!"));
- }
-
- pos_ += length;
- return s;
- }
-
- final String readString () throws org.apache.derby.client.am.DisconnectException
- {
- int len = ddmScalarLen_;
- ensureBLayerDataInBuffer (len);
- adjustLengths (len);
- String result = ccsidManager_.convertToUCS2 (buffer_, pos_, len);
- pos_ += len;
- return result;
- }
-
- final byte[] readBytes (int length) throws org.apache.derby.client.am.DisconnectException
- {
- ensureBLayerDataInBuffer (length);
- adjustLengths (length);
-
- byte[] b = new byte[length];
- System.arraycopy (buffer_, pos_, b, 0, length);
- pos_ += length;
- return b;
- }
-
- final byte[] readBytes () throws org.apache.derby.client.am.DisconnectException
- {
- int len = ddmScalarLen_;
- ensureBLayerDataInBuffer (len);
- adjustLengths (len);
-
- byte[] b = new byte[len];
- System.arraycopy (buffer_, pos_, b, 0, len);
- pos_ += len;
- return b;
- }
-
- final byte[] readLDBytes () throws org.apache.derby.client.am.DisconnectException
- {
- ensureBLayerDataInBuffer (2);
- int len = ((buffer_[pos_++] & 0xff) << 8) + ((buffer_[pos_++] & 0xff) << 0);
-
- if (len == 0) {
- adjustLengths (2);
- return null;
- }
-
- ensureBLayerDataInBuffer (len);
- adjustLengths (len + 2);
-
- byte [] b = new byte[len];
- System.arraycopy (buffer_, pos_, b, 0, len);
- pos_ += len;
- return b;
- }
-
- final void skipBytes (int length) throws org.apache.derby.client.am.DisconnectException
- {
- ensureBLayerDataInBuffer (length);
- adjustLengths (length);
- pos_ += length;
- }
-
- final void skipBytes () throws org.apache.derby.client.am.DisconnectException
- {
- int len = ddmScalarLen_;
- ensureBLayerDataInBuffer (len);
- adjustLengths (len);
- pos_ += len;
- }
-
- // This will be the new and improved getData that handles all QRYDTA/EXTDTA
- // Returns the stream so that the caller can cache it
- final ByteArrayOutputStream getData (ByteArrayOutputStream existingBuffer) throws org.apache.derby.client.am.DisconnectException
- {
- boolean readHeader;
- int copySize;
- ByteArrayOutputStream baos;
-
- // note: an empty baos can yield an allocated and empty byte[]
- if (existingBuffer != null)
- baos = existingBuffer;
- else {
- if (ddmScalarLen_ != -1) {
- // allocate a stream based on a known amount of data
- baos = new ByteArrayOutputStream (ddmScalarLen_);
- }
- else {
- // allocate a stream to hold an unknown amount of data
- baos = new ByteArrayOutputStream ();
- //isLengthAndNullabilityUnknown = true;
- }
- }
-
- // set the amount to read for the first segment
- copySize = dssLength_; // note: has already been adjusted for headers
-
- do {
- // determine if a continuation header needs to be read after the data
- if (dssIsContinued_)
- readHeader = true;
- else
- readHeader = false;
-
- // read the segment
- ensureALayerDataInBuffer (copySize);
- adjustLengths (copySize);
- baos.write (buffer_, pos_, copySize);
- pos_ += copySize;
-
- // read the continuation header, if necessary
- if (readHeader)
- readDSSContinuationHeader ();
-
- copySize = dssLength_;
- }
- while (readHeader == true);
-
- return baos;
- }
-
- // reads a DSS continuation header
- // prereq: pos_ is positioned on the first byte of the two-byte header
- // post: dssIsContinued_ is set to true if the continuation bit is on, false otherwise
- // dssLength_ is set to DssConstants.MAX_DSS_LEN - 2 (don't count the header for the next read)
- // helper method for getEXTDTAData
- protected final void readDSSContinuationHeader () throws org.apache.derby.client.am.DisconnectException
- {
- ensureALayerDataInBuffer(2);
-
- dssLength_ =
- ((buffer_[pos_++]&0xFF) << 8) +
- ((buffer_[pos_++]&0xFF) << 0);
-
- if ((dssLength_ & 0x8000) == 0x8000) {
- dssLength_ = DssConstants.MAX_DSS_LEN;
- dssIsContinued_ = true;
- }
- else {
- dssIsContinued_ = false;
- }
- // it is a syntax error if the dss continuation header length
- // is less than or equal to two
- if (dssLength_ <= 2) {
- doSyntaxrmSemantics (CodePoint.SYNERRCD_DSS_CONT_LESS_OR_EQUAL_2);
- }
-
- dssLength_ -= 2; // avoid consuming the DSS cont header
- }
-
-
- // As part of parsing the reply, the client can detect that the
- // data sent from the target agent does not structurally
- // conform to the requirements of the DDM architecture. These are
- // the same checks performed by the target server on the messages
- // it receives from the protocolj code. Server side detected errors
- // result in a SYNTAXRM being returned from the AS. According to the
- // DDM manual, parsing of the DSS is terminated when the error is
- // detected. The Syntax Error Code, SYNERRCD, 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.
- // Syntax Error Code Description of Error
- // ----------------- --------------------
- // 0x01 Dss header Length is less than 6.
- // 0x02 Dss header Length does not match the
- // number of bytes of data found.
- // 0x03 Dss header C-byte not D0.
- // 0x04 Dss header f-bytes either not
- // recognized or not supported.
- // 0x05 DSS continuation specified but not found.
- // For example, DSS continuation is specified
- // on the last DSS, and the SNA LU 6.2 communication
- // facility returned the SEND indicator.
- // 0x06 DSS chaining specified but no DSS found.
- // For example, DSS chaining is specified
- // on the last DSS, and the SNA LU 6.2 communication
- // facility returned the SEND indicator.
- // 0x07 Object length less than four. For example,
- // a command parameter's length is specified
- // as two, or a command's length is specified as three.
- // 0x08 Object length does not match the number of bytes of data
- // found. For example, a RQSDSS with a length of 150
- // contains a command whose length is 125 or a SRVDGN parameter
- // specifies a length of 200 but there are only 50
- // bytes left in the DSS.
- // 0x09 Object length greater than maximum allowed.
- // For example, a RECCNT parameter specifies a
- // length of ten, but the parameter is defined
- // to have a maximum length of eight.
- // 0x0A Object length less than the minimum required.
- // For example, a SVRCOD parameter specifies a
- // length of five, but the parameter is defined
- // to have a fixed length of six.
- // 0x0B Object length not allowed. For example,
- // a FILEXDPT parameter is specified with a length of
- // 11, but this would indicate that only half of the hours
- // field is present instead of the complete hours field.
- // 0x0C Incorrect large object extended length field (see
- // description of DSS). For example, an extended
- // length field is present, but it is only three bytes
- // long when it is defined to be a multiple of two bytes.
- // 0x0D Object code point index not supported.
- // For example, a code point of 8032 is encountered
- // but x'8' is a reserved code point index.
- // 0x0E Required object not found. For example, a CLEAR
- // command does not have a filnam parameter present,
- // or a MODREC command is not followed by a RECORD
- // command data object.
- // 0x0F Too many command data objects sent. For example,
- // a MODREC command is followed by two RECORD command
- // command data objects, or a DECREC command is followed
- // by RECORD object.
- // 0x10 Mutually exclusive objects present.
- // For example, a CRTDIRF command specifies both
- // a DCLNAM and FILNAM parameters.
- // 0x11 Too few command data objects sent.
- // For example, an INSRECEF command that
- // specified RECCNT95) is followed by only
- // 4 RECORD command data objects.
- // 0x12 Duplicate object present.
- // For example, a LSTFAT command has tow FILNAM
- // parameters specified.
- // 0x13 Invalid request correlator specified.
- // Use PRCCNVRM with PRCCNVDC of 04 or 05 instead
- // of this error code. This error code is being retained
- // for compatibility with Level 1 of the architecture.
- // 0x14 Required value not found.
- // 0x15 Reserved value not allowed. For example,
- // a INSRECEF command specified a RECCNT(0) parameter.
- // 0x16 DSS continuation less than or equal to two.
- // For example, the length bytes of the DSS continuation
- // have the value of one.
- // 0x17 Objects not in required order. For example, a RECAL
- // object contains a RECORD object followed by a RECNBR
- // object with is not in the defined order.
- // 0x18 DSS chaining byt not b'1', but DSSFMT bit3 set to b'1'.
- // 0x19 Previous DSS indicated current DSS has the same
- // request correlator, but the request correlators are
- // not the same.
- // 0x1A DSS cahining bit not b'1', but error continuation requested.
- // 0x1B Mutually exclusive parameter values not specified.
- // For example, an OPEN command specified PRPSHD(TRUE)
- // and FILSHR(READER).
- // 0x1D Code point not valid command. For example, the first
- // code point in RQSDSS either is not in the dictionary
- // or is not a code point for a command.
- //
- // When the client detects these errors, it will be handled as if a SYNTAXRM is returned
- // from the server. In this SYNTAXRM case, 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.
- final void doSyntaxrmSemantics (int syntaxErrorCode) throws org.apache.derby.client.am.DisconnectException
- {
- agent_.accumulateChainBreakingReadExceptionAndThrow (
- new org.apache.derby.client.am.DisconnectException (
- agent_,
- "Execution failed due to a distribution protocol error " +
- "that caused deallocation of the conversation. " +
- "A PROTOCOL Data Stream Syntax Error was detected. Reason: " +
- "0x" + Integer.toHexString (syntaxErrorCode),
- SqlState._58009));
- }
+ dssLength_ -= 2; // avoid consuming the DSS cont header
+ }
+
+
+ // As part of parsing the reply, the client can detect that the
+ // data sent from the target agent does not structurally
+ // conform to the requirements of the DDM architecture. These are
+ // the same checks performed by the target server on the messages
+ // it receives from the protocolj code. Server side detected errors
+ // result in a SYNTAXRM being returned from the AS. According to the
+ // DDM manual, parsing of the DSS is terminated when the error is
+ // detected. The Syntax Error Code, SYNERRCD, 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.
+ // Syntax Error Code Description of Error
+ // ----------------- --------------------
+ // 0x01 Dss header Length is less than 6.
+ // 0x02 Dss header Length does not match the
+ // number of bytes of data found.
+ // 0x03 Dss header C-byte not D0.
+ // 0x04 Dss header f-bytes either not
+ // recognized or not supported.
+ // 0x05 DSS continuation specified but not found.
+ // For example, DSS continuation is specified
+ // on the last DSS, and the SNA LU 6.2 communication
+ // facility returned the SEND indicator.
+ // 0x06 DSS chaining specified but no DSS found.
+ // For example, DSS chaining is specified
+ // on the last DSS, and the SNA LU 6.2 communication
+ // facility returned the SEND indicator.
+ // 0x07 Object length less than four. For example,
+ // a command parameter's length is specified
+ // as two, or a command's length is specified as three.
+ // 0x08 Object length does not match the number of bytes of data
+ // found. For example, a RQSDSS with a length of 150
+ // contains a command whose length is 125 or a SRVDGN parameter
+ // specifies a length of 200 but there are only 50
+ // bytes left in the DSS.
+ // 0x09 Object length greater than maximum allowed.
+ // For example, a RECCNT parameter specifies a
+ // length of ten, but the parameter is defined
+ // to have a maximum length of eight.
+ // 0x0A Object length less than the minimum required.
+ // For example, a SVRCOD parameter specifies a
+ // length of five, but the parameter is defined
+ // to have a fixed length of six.
+ // 0x0B Object length not allowed. For example,
+ // a FILEXDPT parameter is specified with a length of
+ // 11, but this would indicate that only half of the hours
+ // field is present instead of the complete hours field.
+ // 0x0C Incorrect large object extended length field (see
+ // description of DSS). For example, an extended
+ // length field is present, but it is only three bytes
+ // long when it is defined to be a multiple of two bytes.
+ // 0x0D Object code point index not supported.
+ // For example, a code point of 8032 is encountered
+ // but x'8' is a reserved code point index.
+ // 0x0E Required object not found. For example, a CLEAR
+ // command does not have a filnam parameter present,
+ // or a MODREC command is not followed by a RECORD
+ // command data object.
+ // 0x0F Too many command data objects sent. For example,
+ // a MODREC command is followed by two RECORD command
+ // command data objects, or a DECREC command is followed
+ // by RECORD object.
+ // 0x10 Mutually exclusive objects present.
+ // For example, a CRTDIRF command specifies both
+ // a DCLNAM and FILNAM parameters.
+ // 0x11 Too few command data objects sent.
+ // For example, an INSRECEF command that
+ // specified RECCNT95) is followed by only
+ // 4 RECORD command data objects.
+ // 0x12 Duplicate object present.
+ // For example, a LSTFAT command has tow FILNAM
+ // parameters specified.
+ // 0x13 Invalid request correlator specified.
+ // Use PRCCNVRM with PRCCNVDC of 04 or 05 instead
+ // of this error code. This error code is being retained
+ // for compatibility with Level 1 of the architecture.
+ // 0x14 Required value not found.
+ // 0x15 Reserved value not allowed. For example,
+ // a INSRECEF command specified a RECCNT(0) parameter.
+ // 0x16 DSS continuation less than or equal to two.
+ // For example, the length bytes of the DSS continuation
+ // have the value of one.
+ // 0x17 Objects not in required order. For example, a RECAL
+ // object contains a RECORD object followed by a RECNBR
+ // object with is not in the defined order.
+ // 0x18 DSS chaining byt not b'1', but DSSFMT bit3 set to b'1'.
+ // 0x19 Previous DSS indicated current DSS has the same
+ // request correlator, but the request correlators are
+ // not the same.
+ // 0x1A DSS cahining bit not b'1', but error continuation requested.
+ // 0x1B Mutually exclusive parameter values not specified.
+ // For example, an OPEN command specified PRPSHD(TRUE)
+ // and FILSHR(READER).
+ // 0x1D Code point not valid command. For example, the first
+ // code point in RQSDSS either is not in the dictionary
+ // or is not a code point for a command.
+ //
+ // When the client detects these errors, it will be handled as if a SYNTAXRM is returned
+ // from the server. In this SYNTAXRM case, 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.
+ final void doSyntaxrmSemantics(int syntaxErrorCode) throws org.apache.derby.client.am.DisconnectException {
+ agent_.accumulateChainBreakingReadExceptionAndThrow(new org.apache.derby.client.am.DisconnectException(agent_,
+ "Execution failed due to a distribution protocol error " +
+ "that caused deallocation of the conversation. " +
+ "A PROTOCOL Data Stream Syntax Error was detected. Reason: " +
+ "0x" + Integer.toHexString(syntaxErrorCode),
+ SqlState._58009));
+ }
// the names of these methods start with a letter z.
// the z will be removed when they are finalized...
- protected final void pushLengthOnCollectionStack()
- {
- ddmCollectionLenStack_[++topDdmCollectionStack_] = ddmScalarLen_;
- ddmScalarLen_ = 0;
- }
-
- protected final void adjustLengths(int length)
- {
- ddmScalarLen_ -= length;
- adjustCollectionAndDssLengths (length);
- /*
- for (int i = 0; i <= topDdmCollectionStack_; i++) {
- ddmCollectionLenStack_[i] -= length;
- }
- dssLength_ -= length;
- */
- }
-
- protected int adjustDdmLength (int ddmLength, int length)
- {
- ddmLength -= length;
- if (ddmLength == 0)
- adjustLengths (getDdmLength());
- return ddmLength;
- }
-
- // Pop the collection Length stack.
- // pre: The collection length stack must not be empty and the top value
- // on the stack must be 0.
- // post: The top 0 value on the stack will be popped.
- protected final void popCollectionStack()
- {
- topDdmCollectionStack_--;
- }
-
- protected final int peekCodePoint() throws org.apache.derby.client.am.DisconnectException
- {
- if (topDdmCollectionStack_ != EMPTY_STACK) {
- if (ddmCollectionLenStack_[topDdmCollectionStack_] == 0)
- return END_OF_COLLECTION;
- else if (ddmCollectionLenStack_[topDdmCollectionStack_] < 4) {
- // error
- }
- }
-
- // if there is no more data in the current dss, and the dss is not
- // continued, indicate the end of the same Id chain or read the next dss header.
- if ((dssLength_ == 0) && (!dssIsContinued_)) {
- if (!dssIsChainedWithSameID_) {
- return END_OF_SAME_ID_CHAIN;
- }
- readDssHeader();
- }
-
- if (longBufferForDecryption_ == null) //we don't need to do this if it's data stream encryption
- ensureBLayerDataInBuffer (4);
- peekedLength_ = ((buffer_[pos_] & 0xff) << 8) + ((buffer_[pos_+1] & 0xff) << 0);
- peekedCodePoint_ = ((buffer_[pos_+2] & 0xff) << 8) + ((buffer_[pos_+3] & 0xff) << 0);
-
- // check for extended length
- if ((peekedLength_ & 0x8000) == 0x8000)
- peekExtendedLength();
- else
- peekedNumOfExtendedLenBytes_ = 0;
- return peekedCodePoint_;
- }
-
- // Read out the 2-byte length without moving the pos_ pointer.
- protected final int peekLength() throws org.apache.derby.client.am.DisconnectException
- {
- ensureBLayerDataInBuffer (2);
- return (((buffer_[pos_] & 0xff) << 8) +
- ((buffer_[pos_ + 1] & 0xff) << 0));
- }
-
- // Read "length" number of bytes from the buffer into the byte array b starting from offset
- // "offset". The current offset in the buffer does not change.
- protected final int peekFastBytes (byte[] b, int offset, int length) throws org.apache.derby.client.am.DisconnectException
- {
- for (int i = 0; i < length; i++) {
- b[offset+i] = buffer_[pos_+i];
- }
- return offset+length;
- }
-
- protected final void parseLengthAndMatchCodePoint (int expectedCodePoint) throws org.apache.derby.client.am.DisconnectException
- {
- int actualCodePoint = 0;
- if (peekedCodePoint_ == END_OF_COLLECTION)
- actualCodePoint = readLengthAndCodePoint();
- else {
- actualCodePoint = peekedCodePoint_;
- pos_ += (4 + peekedNumOfExtendedLenBytes_);
- ddmScalarLen_ = peekedLength_;
- if (peekedNumOfExtendedLenBytes_ == 0 && ddmScalarLen_ != -1) {
- adjustLengths (4);
- }
- else {
- adjustCollectionAndDssLengths (4+peekedNumOfExtendedLenBytes_);
- }
- peekedLength_ = 0;
- peekedCodePoint_ = END_OF_COLLECTION;
- peekedNumOfExtendedLenBytes_ = 0;
- }
-
- if (actualCodePoint != expectedCodePoint) {
- zThrowSyntaxError ("actual code point, " + actualCodePoint +
- " does not match expected code point, " + expectedCodePoint);
- }
- }
- protected final int readLengthAndCodePoint () throws org.apache.derby.client.am.DisconnectException
- {
- if (topDdmCollectionStack_ != EMPTY_STACK) {
- if (ddmCollectionLenStack_[topDdmCollectionStack_] == 0)
- return END_OF_COLLECTION;
- else if (ddmCollectionLenStack_[topDdmCollectionStack_] < 4) {
- zThrowSyntaxError ("ddm collection contains less than 4 bytes of data");
- }
- }
-
[... 822 lines stripped ...]