Modified: incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetIndoubtTransaction.java URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetIndoubtTransaction.java?rev=165585&r1=165584&r2=165585&view=diff ============================================================================== --- incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetIndoubtTransaction.java (original) +++ incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetIndoubtTransaction.java Sun May 1 23:25:59 2005 @@ -19,16 +19,15 @@ */ package org.apache.derby.client.net; -import javax.transaction.xa.*; +import javax.transaction.xa.Xid; /** - * <p>Title: dnc Project</p> - * <p>Description: </p> + * <p>Title: dnc Project</p> <p>Description: </p> + * * @version 1.0 */ -public class NetIndoubtTransaction -{ +public class NetIndoubtTransaction { Xid xid_; byte[] uowid_; @@ -38,47 +37,40 @@ int port_; protected NetIndoubtTransaction(Xid xid, - byte[] uowid, - byte[] cSyncLog, - byte[] pSyncLog, - String ipaddr, - int port) - { - xid_ = xid; - uowid_ = uowid; - cSyncLog_ = cSyncLog; - pSyncLog_ = pSyncLog; - ipaddr_ = ipaddr; - port_ = port; + byte[] uowid, + byte[] cSyncLog, + byte[] pSyncLog, + String ipaddr, + int port) { + xid_ = xid; + uowid_ = uowid; + cSyncLog_ = cSyncLog; + pSyncLog_ = pSyncLog; + ipaddr_ = ipaddr; + port_ = port; } - protected Xid getXid() - { - return xid_; + protected Xid getXid() { + return xid_; } - protected byte[] getUOWID() - { - return uowid_; + protected byte[] getUOWID() { + return uowid_; } - protected byte[] getCSyncLog() - { - return cSyncLog_; + protected byte[] getCSyncLog() { + return cSyncLog_; } - protected byte[] getPSyncLog() - { - return pSyncLog_; + protected byte[] getPSyncLog() { + return pSyncLog_; } - protected String getIpAddr() - { - return ipaddr_; + protected String getIpAddr() { + return ipaddr_; } - protected int getPort() - { - return port_; + protected int getPort() { + return port_; } }
Modified: incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetLogWriter.java URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetLogWriter.java?rev=165585&r1=165584&r2=165585&view=diff ============================================================================== --- incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetLogWriter.java (original) +++ incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetLogWriter.java Sun May 1 23:25:59 2005 @@ -23,394 +23,385 @@ // network traffic tracer. // This class traces communication buffers for both sends and receives. // The value of the hex bytes are traced along with the ascii and ebcdic translations. -public class NetLogWriter extends org.apache.derby.client.am.LogWriter -{ - // The recevie constant is used to indicate that the bytes were read to a Stream. - // It indicates to this class that a receive header should be used. - public static final int TYPE_TRACE_RECEIVE = 2; - - // The send constant is used to indicate that the bytes were written to - // a Stream. It indicates to this class that a send header should be used. - public static final int TYPE_TRACE_SEND = 1; - - //------------------------------ internal constants -------------------------- - - // This class was implemented using character arrays to translate bytes - // into ascii and ebcdic. The goal was to be able to quickly index into the - // arrays to find the characters. Char arrays instead of strings were used as - // much as possible in an attempt to help speed up performance. - - // An array of characters used to translate bytes to ascii. - // The position in the array corresponds to the hex value of the character. - private static final char asciiChar__ [] = { - // 0 1 2 3 4 5 6 7 8 9 A B C D E F - '.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.', //0 - '.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.', //1 - ' ','!','"','#','$','%','&','\'','(',')','*','+',',','-','.','/', //2 - '0','1','2','3','4','5','6','7','8','9',':',';','<','=','>','?', //3 - '@','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O', //4 - 'P','Q','R','S','T','U','V','W','X','Y','Z','[','\\',']','^','_', //5 - '`','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o', //6 - 'p','q','r','s','t','u','v','w','x','y','z','{','|','}','~','.', //7 - '.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.', //8 - '.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.', //9 - '.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.', //A - '.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.', //B - '.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.', //C - '.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.', //D - '.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.', //E - '.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.' //F - }; - - // This column position header is used to mark offsets into the trace. - private static final String colPosHeader__ = - " 0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF 0123456789ABCDEF"; - - // An array of characters used to translate bytes to ebcdic. - // The position in the array corresponds to the hex value of the - // character. - private static final char ebcdicChar__[] = { - // 0 1 2 3 4 5 6 7 8 9 A B C D E F - '.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.', //0 - '.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.', //1 - '.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.', //2 - '.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.', //3 - ' ','.','.','.','.','.','.','.','.','.','.','.','<','(','+','|', //4 - '&','.','.','.','.','.','.','.','.','.','!','$','*',')',';','.', //5 - '-','/','.','.','.','.','.','.','.','.','|',',','%','_','>','?', //6 - '.','.','.','.','.','.','.','.','.','`',':','#','@','\'','=','"', //7 - '.','a','b','c','d','e','f','g','h','i','.','.','.','.','.','.', //8 - '.','j','k','l','m','n','o','p','q','r','.','.','.','.','.','.', //9 - '.','~','s','t','u','v','w','x','y','z','.','.','.','.','.','.', //A - '.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.', //B - '{','A','B','C','D','E','F','G','H','I','.','.','.','.','.','.', //C - '}','J','K','L','M','N','O','P','Q','R','.','.','.','.','.','.', //D - '\\','.','S','T','U','V','W','X','Y','Z','.','.','.','.','.','.', //E - '0','1','2','3','4','5','6','7','8','9','.','.','.','.','.','.' //F - }; - - // An array of characters representing hex numbers. - private static final char hexDigit__ [] = { - '0','1','2','3','4','5','6','7', - '8','9','A','B','C','D','E','F' - }; - - // The receive header comes befor bytes which would be read from a stream. - private static final String receiveHeader__ = - " RECEIVE BUFFER: (ASCII) (EBCDIC)"; - - // The send header comes before bytes which would be written to a stream. - private static final String sendHeader__ = - " SEND BUFFER: (ASCII) (EBCDIC)"; - - private static final char spaceChar__ = ' '; - - private static final char zeroChar__ = '0'; - - // This mapping table associates a codepoint to a String describing the codepoint. - // This is needed because the trace prints the first codepoint in send and receive buffers. - // This is created lazily because there is no need to create the mapping if tracing isn't used. - // So this array will only be created when the com buffer trace is started. - private static CodePointNameTable codePointNameTable__ = null; - - //-----------------------------internal state--------------------------------- - - //-----------------------------constructors/finalizer------------------------- - - // One NetLogWriter object is created per data source, iff tracing is enabled. - public NetLogWriter (java.io.PrintWriter printWriter, int traceLevel) - { - super (printWriter, traceLevel); - - // Initialize the codepoint name table if not previously initialized. - // This is done lazily so that it is not created if the trace isn't used (save some init time). - if (codePointNameTable__ == null) { - codePointNameTable__ = new CodePointNameTable(); - } - } - - //------------------------------entry points---------------------------------- - - // Specialization of LogWriter.traceConnectsExit() - public void traceConnectsExit (org.apache.derby.client.am.Connection connection) - { - if (traceSuspended()) return; - NetConnection c = (NetConnection) connection; - synchronized (printWriter_) { - super.traceConnectsExit (c); - dncnetprint (" PROTOCOL manager levels: { "); - printWriter_.print ("SQLAM=" + c.getSQLAM() + ", "); - printWriter_.print ("AGENT=" + c.getAGENT() + ", "); - printWriter_.print ("CMNTCPIP=" + c.getCMNTCPIP() + ", "); - printWriter_.print ("RDB=" + c.getRDB() + ", "); - printWriter_.print ("SECMGR=" + c.getSECMGR() + ", "); - printWriter_.print ("XAMGR=" + c.getXAMGR() + ", "); - printWriter_.print ("SYNCPTMGR=" + c.getSYNCPTMGR() + ", "); - printWriter_.print ("RSYNCMGR=" + c.getRSYNCMGR()); - printWriter_.println (" }"); - printWriter_.flush(); - } - } - - public void traceConnectsResetExit (org.apache.derby.client.am.Connection connection) - { - if (traceSuspended()) return; - NetConnection c = (NetConnection) connection; - synchronized (printWriter_) { - super.traceConnectsResetExit (c); - dncnetprint (" PROTOCOL manager levels: { "); - printWriter_.print ("SQLAM=" + c.getSQLAM() + ", "); - printWriter_.print ("AGENT=" + c.getAGENT() + ", "); - printWriter_.print ("CMNTCPIP=" + c.getCMNTCPIP() + ", "); - printWriter_.print ("RDB=" + c.getRDB() + ", "); - printWriter_.print ("SECMGR=" + c.getSECMGR() + ", "); - printWriter_.print ("XAMGR=" + c.getXAMGR() + ", "); - printWriter_.print ("SYNCPTMGR=" + c.getSYNCPTMGR() + ", "); - printWriter_.print ("RSYNCMGR=" + c.getRSYNCMGR()); - printWriter_.println (" }"); - printWriter_.flush(); - } - } - - // Pass the connection handle and print it in the header - // What exactly is supposed to be passed, assume one complete DSS packet - // Write the communication buffer data to the trace. - // The data is passed in via a byte array. The start and length of the data is given. - // The type is needed to indicate if the data is part of the send or receive buffer. - // The class name, method name, and trcPt number are also written to the trace. - // Not much checking is performed on the parameters. This is done to help performance. - synchronized public void traceProtocolFlow (byte[] buff, - int offset, - int len, - int type, - String className, - String methodName, - int tracepoint) - { - if (traceSuspended()) return; - if (!loggingEnabled (org.apache.derby.jdbc.ClientDataSource.TRACE_PROTOCOL_FLOWS)) return; - synchronized (printWriter_) { - super.tracepoint ("[net]", tracepoint, className, methodName); - - int fullLen = len; - boolean printColPos = true; - while( fullLen >= 2 ) - { // format each DssHdr seperately - // get the length of this DssHdr - len = ((buff[offset] & 0xff) << 8) + ((buff[offset+1] & 0xff) << 0); - - // check for valid dss header or not all of dss block - if ((len < 10) || (len > fullLen)) - len = fullLen; - - // subtract that length from the full length - fullLen -= len; - // The data will only be written if there is a non-zero positive length. - if (len != 0) { - String codePointName = null; - // If the length <= 10, lookup the first codepoint so it's name can be printed - if (len >= 10) { - // Get the int value of the two byte unsigned codepoint. - int codePoint = getCodePoint (buff, offset+8); - codePointName = codePointNameTable__.lookup (codePoint); - - // if this is not a valid codepoint then format the entire buffer - // as one block. - if (codePointName == null) - { - len += fullLen; - fullLen = 0; - } - } - - if( !printColPos ) - { // not 1st Dss header of this buffer, write seperator - dncnetprintln( "" ); - } - - if (codePointName == null) { - // codePointName was still null so either < 10 bytes were given or - // the codepoint wasn't found in the table. Just print the plain send header. - dncnetprintln (getHeader (type)); - } - else { - // codePointName isn't null so the name of the codepoint will be printed. - printHeaderWithCodePointName (codePointName, type); - } - - // Print the col position header in the trace. - if( printColPos ) - { // first Dss header of buffer, need column position header - dncnetprintln (colPosHeader__); - printColPos = false; - } - - // A char array will be used to translate the bytes to their character - // representations along with ascii and ebcdic representations. - char trcDump[] = new char[77]; - - // bCounter, aCounter, eCounter are offsets used to help position the characters - short bCounter = 7; - short aCounter = 43; - short eCounter = 61; - - // The lines will be counted starting at zero. - // This is hard coded since we are at the beginning. - trcDump[0] = zeroChar__; - trcDump[1] = zeroChar__; - trcDump[2] = zeroChar__; - trcDump[3] = zeroChar__; - - // The 0's are already in the trace so bump the line counter up a row. - int lineCounter = 0x10; - - // Make sure the character array has all blanks in it. - // Some of these blanks will be replaced later with values. - // The 0's were not wrote over. - for (int j = 4; j < 77; j++) { - trcDump[j] = spaceChar__; - } - - // i will maintain the position in the byte array to be traced. - int i = 0; - - do { - // Get the unsigned value of the byte. - // int num = b[off++] & 0xff; - int num = (buff[offset] < 0)? buff[offset] + 256 : buff[offset]; - offset++; - i++; - // Place the characters representing the bytes in the array. - trcDump[bCounter++] = hexDigit__[((num >>> 4) & 0xf)]; - trcDump[bCounter++] = hexDigit__[(num & 0xf)]; - - // Place the ascii and ebcdc representations in the array. - trcDump[aCounter++] = asciiChar__[num]; - trcDump[eCounter++] = ebcdicChar__[num]; - - if (((i%8) == 0)) { - if (((i%16) == 0)) { - // Print the array each time 16 bytes are processed. - dncnetprintln (trcDump); - if (i != len) { - // Not yet at the end of the byte array. - if ((len - i) < 16) { - // This is the last line so blank it all out. - // This keeps the last line looking pretty in case - // < 16 bytes remain. - for (int j = 0; j < trcDump.length; j++) { - trcDump[j] = spaceChar__; - } - } - // Reset the counters. - bCounter = 0; - aCounter = 43; - eCounter = 61; - // Reset the lineCounter if it starts to get too large. - if (lineCounter == 0x100000) { - lineCounter = 0; - } - // Place the characters representing the line counter in the array. - trcDump[bCounter++] = hexDigit__[((lineCounter >>> 12) & 0xf)]; - trcDump[bCounter++] = hexDigit__[((lineCounter >>> 8) & 0xf)]; - trcDump[bCounter++] = hexDigit__[((lineCounter >>> 4) & 0xf)]; - trcDump[bCounter++] = hexDigit__[(lineCounter & 0xf)]; - bCounter += 3; - // Bump up the line counter. - lineCounter += 0x10; - } - } - else { - // 8 bytes were processed so move the counter to adjust for - // spaces between the columns of bytes. - bCounter += 2; - } - } - // do this until we all the data has been traced. - } - while (i < len); - - // print the last line and add some blank lines to make it easier to read. - if (len % 16 != 0) { - dncnetprintln (trcDump); - } - } - } - dncnetprintln (""); - } - } - - // Gets the int value of the two byte unsigned codepoint. - private static int getCodePoint (byte[] buff, int offset) - { - return ((buff[offset++] & 0xff) << 8) + - ((buff[offset] & 0xff) << 0); - } - - private static String getHeader (int type) - { - switch (type) { - case TYPE_TRACE_SEND: - return sendHeader__; - case TYPE_TRACE_RECEIVE: - return receiveHeader__; - default: - return null; - } - } - - private static int getStartPosition (int type) - { - switch (type) { - case TYPE_TRACE_SEND: - return 20; // This is right after 'SEND BUFFER: '. - case TYPE_TRACE_RECEIVE: - return 23; // This is right after 'RECEIVE BUFFER: '. - default: - return 0; - } - } - - private void printHeaderWithCodePointName (String codePointName, int type) - { - // Create a char array so some of the characters - // can be replaced with the name of the codepoint. - char headerArray[] = getHeader(type).toCharArray(); - - // At most, 16 character name will be used. This is so - // the headers on top of the ascii and ebcdic rows aren't shifted. - int replaceLen = (codePointName.length() < 17) ? codePointName.length() : 16; - - int offset = getStartPosition (type); - for (int i = 0; i < replaceLen; i++) { - headerArray[offset++] = codePointName.charAt (i); - } - dncnetprintln (headerArray); - } - - private void dncnetprint (String s) - { - synchronized (printWriter_) { - printWriter_.print ("[derby] " + s); - printWriter_.flush(); - } - } - - private void dncnetprintln (String s) - { - synchronized (printWriter_) { - printWriter_.println ("[derby] " + s); - printWriter_.flush(); - } - } - - private void dncnetprintln (char[] s) - { - synchronized (printWriter_) { - printWriter_.print ("[derby] "); - printWriter_.println (s); - printWriter_.flush(); +public class NetLogWriter extends org.apache.derby.client.am.LogWriter { + + // The recevie constant is used to indicate that the bytes were read to a Stream. + // It indicates to this class that a receive header should be used. + public static final int TYPE_TRACE_RECEIVE = 2; + + // The send constant is used to indicate that the bytes were written to + // a Stream. It indicates to this class that a send header should be used. + public static final int TYPE_TRACE_SEND = 1; + + //------------------------------ internal constants -------------------------- + + // This class was implemented using character arrays to translate bytes + // into ascii and ebcdic. The goal was to be able to quickly index into the + // arrays to find the characters. Char arrays instead of strings were used as + // much as possible in an attempt to help speed up performance. + + // An array of characters used to translate bytes to ascii. + // The position in the array corresponds to the hex value of the character. + private static final char asciiChar__ [] = { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', //0 + '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', //1 + ' ', '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', //2 + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', //3 + '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', //4 + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', //5 + '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', //6 + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~', '.', //7 + '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', //8 + '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', //9 + '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', //A + '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', //B + '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', //C + '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', //D + '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', //E + '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.' //F + }; + + // This column position header is used to mark offsets into the trace. + private static final String colPosHeader__ = + " 0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF 0123456789ABCDEF"; + + // An array of characters used to translate bytes to ebcdic. + // The position in the array corresponds to the hex value of the + // character. + private static final char ebcdicChar__[] = { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', //0 + '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', //1 + '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', //2 + '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', //3 + ' ', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '<', '(', '+', '|', //4 + '&', '.', '.', '.', '.', '.', '.', '.', '.', '.', '!', '$', '*', ')', ';', '.', //5 + '-', '/', '.', '.', '.', '.', '.', '.', '.', '.', '|', ',', '%', '_', '>', '?', //6 + '.', '.', '.', '.', '.', '.', '.', '.', '.', '`', ':', '#', '@', '\'', '=', '"', //7 + '.', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', '.', '.', '.', '.', '.', '.', //8 + '.', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', '.', '.', '.', '.', '.', '.', //9 + '.', '~', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '.', '.', '.', '.', '.', '.', //A + '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', //B + '{', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', '.', '.', '.', '.', '.', '.', //C + '}', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', '.', '.', '.', '.', '.', '.', //D + '\\', '.', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '.', '.', '.', '.', '.', '.', //E + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', '.', '.', '.', '.', '.' //F + }; + + // An array of characters representing hex numbers. + private static final char hexDigit__ [] = { + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' + }; + + // The receive header comes befor bytes which would be read from a stream. + private static final String receiveHeader__ = + " RECEIVE BUFFER: (ASCII) (EBCDIC)"; + + // The send header comes before bytes which would be written to a stream. + private static final String sendHeader__ = + " SEND BUFFER: (ASCII) (EBCDIC)"; + + private static final char spaceChar__ = ' '; + + private static final char zeroChar__ = '0'; + + // This mapping table associates a codepoint to a String describing the codepoint. + // This is needed because the trace prints the first codepoint in send and receive buffers. + // This is created lazily because there is no need to create the mapping if tracing isn't used. + // So this array will only be created when the com buffer trace is started. + private static CodePointNameTable codePointNameTable__ = null; + + //-----------------------------internal state--------------------------------- + + //-----------------------------constructors/finalizer------------------------- + + // One NetLogWriter object is created per data source, iff tracing is enabled. + public NetLogWriter(java.io.PrintWriter printWriter, int traceLevel) { + super(printWriter, traceLevel); + + // Initialize the codepoint name table if not previously initialized. + // This is done lazily so that it is not created if the trace isn't used (save some init time). + if (codePointNameTable__ == null) { + codePointNameTable__ = new CodePointNameTable(); + } + } + + //------------------------------entry points---------------------------------- + + // Specialization of LogWriter.traceConnectsExit() + public void traceConnectsExit(org.apache.derby.client.am.Connection connection) { + if (traceSuspended()) { + return; + } + NetConnection c = (NetConnection) connection; + synchronized (printWriter_) { + super.traceConnectsExit(c); + dncnetprint(" PROTOCOL manager levels: { "); + printWriter_.print("SQLAM=" + c.getSQLAM() + ", "); + printWriter_.print("AGENT=" + c.getAGENT() + ", "); + printWriter_.print("CMNTCPIP=" + c.getCMNTCPIP() + ", "); + printWriter_.print("RDB=" + c.getRDB() + ", "); + printWriter_.print("SECMGR=" + c.getSECMGR() + ", "); + printWriter_.print("XAMGR=" + c.getXAMGR() + ", "); + printWriter_.print("SYNCPTMGR=" + c.getSYNCPTMGR() + ", "); + printWriter_.print("RSYNCMGR=" + c.getRSYNCMGR()); + printWriter_.println(" }"); + printWriter_.flush(); + } + } + + public void traceConnectsResetExit(org.apache.derby.client.am.Connection connection) { + if (traceSuspended()) { + return; + } + NetConnection c = (NetConnection) connection; + synchronized (printWriter_) { + super.traceConnectsResetExit(c); + dncnetprint(" PROTOCOL manager levels: { "); + printWriter_.print("SQLAM=" + c.getSQLAM() + ", "); + printWriter_.print("AGENT=" + c.getAGENT() + ", "); + printWriter_.print("CMNTCPIP=" + c.getCMNTCPIP() + ", "); + printWriter_.print("RDB=" + c.getRDB() + ", "); + printWriter_.print("SECMGR=" + c.getSECMGR() + ", "); + printWriter_.print("XAMGR=" + c.getXAMGR() + ", "); + printWriter_.print("SYNCPTMGR=" + c.getSYNCPTMGR() + ", "); + printWriter_.print("RSYNCMGR=" + c.getRSYNCMGR()); + printWriter_.println(" }"); + printWriter_.flush(); + } + } + + // Pass the connection handle and print it in the header + // What exactly is supposed to be passed, assume one complete DSS packet + // Write the communication buffer data to the trace. + // The data is passed in via a byte array. The start and length of the data is given. + // The type is needed to indicate if the data is part of the send or receive buffer. + // The class name, method name, and trcPt number are also written to the trace. + // Not much checking is performed on the parameters. This is done to help performance. + synchronized public void traceProtocolFlow(byte[] buff, + int offset, + int len, + int type, + String className, + String methodName, + int tracepoint) { + if (traceSuspended()) { + return; + } + if (!loggingEnabled(org.apache.derby.jdbc.ClientDataSource.TRACE_PROTOCOL_FLOWS)) { + return; + } + synchronized (printWriter_) { + super.tracepoint("[net]", tracepoint, className, methodName); + + int fullLen = len; + boolean printColPos = true; + while (fullLen >= 2) { // format each DssHdr seperately + // get the length of this DssHdr + len = ((buff[offset] & 0xff) << 8) + ((buff[offset + 1] & 0xff) << 0); + + // check for valid dss header or not all of dss block + if ((len < 10) || (len > fullLen)) { + len = fullLen; + } + + // subtract that length from the full length + fullLen -= len; + // The data will only be written if there is a non-zero positive length. + if (len != 0) { + String codePointName = null; + // If the length <= 10, lookup the first codepoint so it's name can be printed + if (len >= 10) { + // Get the int value of the two byte unsigned codepoint. + int codePoint = getCodePoint(buff, offset + 8); + codePointName = codePointNameTable__.lookup(codePoint); + + // if this is not a valid codepoint then format the entire buffer + // as one block. + if (codePointName == null) { + len += fullLen; + fullLen = 0; + } + } + + if (!printColPos) { // not 1st Dss header of this buffer, write seperator + dncnetprintln(""); + } + + if (codePointName == null) { + // codePointName was still null so either < 10 bytes were given or + // the codepoint wasn't found in the table. Just print the plain send header. + dncnetprintln(getHeader(type)); + } else { + // codePointName isn't null so the name of the codepoint will be printed. + printHeaderWithCodePointName(codePointName, type); + } + + // Print the col position header in the trace. + if (printColPos) { // first Dss header of buffer, need column position header + dncnetprintln(colPosHeader__); + printColPos = false; + } + + // A char array will be used to translate the bytes to their character + // representations along with ascii and ebcdic representations. + char trcDump[] = new char[77]; + + // bCounter, aCounter, eCounter are offsets used to help position the characters + short bCounter = 7; + short aCounter = 43; + short eCounter = 61; + + // The lines will be counted starting at zero. + // This is hard coded since we are at the beginning. + trcDump[0] = zeroChar__; + trcDump[1] = zeroChar__; + trcDump[2] = zeroChar__; + trcDump[3] = zeroChar__; + + // The 0's are already in the trace so bump the line counter up a row. + int lineCounter = 0x10; + + // Make sure the character array has all blanks in it. + // Some of these blanks will be replaced later with values. + // The 0's were not wrote over. + for (int j = 4; j < 77; j++) { + trcDump[j] = spaceChar__; + } + + // i will maintain the position in the byte array to be traced. + int i = 0; + + do { + // Get the unsigned value of the byte. + // int num = b[off++] & 0xff; + int num = (buff[offset] < 0) ? buff[offset] + 256 : buff[offset]; + offset++; + i++; + // Place the characters representing the bytes in the array. + trcDump[bCounter++] = hexDigit__[((num >>> 4) & 0xf)]; + trcDump[bCounter++] = hexDigit__[(num & 0xf)]; + + // Place the ascii and ebcdc representations in the array. + trcDump[aCounter++] = asciiChar__[num]; + trcDump[eCounter++] = ebcdicChar__[num]; + + if (((i % 8) == 0)) { + if (((i % 16) == 0)) { + // Print the array each time 16 bytes are processed. + dncnetprintln(trcDump); + if (i != len) { + // Not yet at the end of the byte array. + if ((len - i) < 16) { + // This is the last line so blank it all out. + // This keeps the last line looking pretty in case + // < 16 bytes remain. + for (int j = 0; j < trcDump.length; j++) { + trcDump[j] = spaceChar__; + } + } + // Reset the counters. + bCounter = 0; + aCounter = 43; + eCounter = 61; + // Reset the lineCounter if it starts to get too large. + if (lineCounter == 0x100000) { + lineCounter = 0; + } + // Place the characters representing the line counter in the array. + trcDump[bCounter++] = hexDigit__[((lineCounter >>> 12) & 0xf)]; + trcDump[bCounter++] = hexDigit__[((lineCounter >>> 8) & 0xf)]; + trcDump[bCounter++] = hexDigit__[((lineCounter >>> 4) & 0xf)]; + trcDump[bCounter++] = hexDigit__[(lineCounter & 0xf)]; + bCounter += 3; + // Bump up the line counter. + lineCounter += 0x10; + } + } else { + // 8 bytes were processed so move the counter to adjust for + // spaces between the columns of bytes. + bCounter += 2; + } + } + // do this until we all the data has been traced. + } while (i < len); + + // print the last line and add some blank lines to make it easier to read. + if (len % 16 != 0) { + dncnetprintln(trcDump); + } + } + } + dncnetprintln(""); + } + } + + // Gets the int value of the two byte unsigned codepoint. + private static int getCodePoint(byte[] buff, int offset) { + return ((buff[offset++] & 0xff) << 8) + + ((buff[offset] & 0xff) << 0); + } + + private static String getHeader(int type) { + switch (type) { + case TYPE_TRACE_SEND: + return sendHeader__; + case TYPE_TRACE_RECEIVE: + return receiveHeader__; + default: + return null; + } + } + + private static int getStartPosition(int type) { + switch (type) { + case TYPE_TRACE_SEND: + return 20; // This is right after 'SEND BUFFER: '. + case TYPE_TRACE_RECEIVE: + return 23; // This is right after 'RECEIVE BUFFER: '. + default: + return 0; + } + } + + private void printHeaderWithCodePointName(String codePointName, int type) { + // Create a char array so some of the characters + // can be replaced with the name of the codepoint. + char headerArray[] = getHeader(type).toCharArray(); + + // At most, 16 character name will be used. This is so + // the headers on top of the ascii and ebcdic rows aren't shifted. + int replaceLen = (codePointName.length() < 17) ? codePointName.length() : 16; + + int offset = getStartPosition(type); + for (int i = 0; i < replaceLen; i++) { + headerArray[offset++] = codePointName.charAt(i); + } + dncnetprintln(headerArray); + } + + private void dncnetprint(String s) { + synchronized (printWriter_) { + printWriter_.print("[derby] " + s); + printWriter_.flush(); + } + } + + private void dncnetprintln(String s) { + synchronized (printWriter_) { + printWriter_.println("[derby] " + s); + printWriter_.flush(); + } + } + + private void dncnetprintln(char[] s) { + synchronized (printWriter_) { + printWriter_.print("[derby] "); + printWriter_.println(s); + printWriter_.flush(); + } } - } } Modified: incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetPackageReply.java URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetPackageReply.java?rev=165585&r1=165584&r2=165585&view=diff ============================================================================== --- incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetPackageReply.java (original) +++ incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetPackageReply.java Sun May 1 23:25:59 2005 @@ -22,194 +22,189 @@ import org.apache.derby.client.am.DisconnectException; -public class NetPackageReply extends NetConnectionReply -{ - NetPackageReply (NetAgent netAgent, int bufferSize) - { - super (netAgent, bufferSize); - } - - - NetSqlca parseSqlErrorCondition () throws DisconnectException - { - parseSQLERRRM(); - parseTypdefsOrMgrlvlovrs (); - NetSqlca netSqlca = parseSQLCARD (null); - return netSqlca; - } - - - // Also called by NetStatementReply - void parseDTAMCHRM () throws DisconnectException - { - boolean svrcodReceived = false; - int svrcod = CodePoint.SVRCOD_INFO; - boolean rdbnamReceived = false; - String rdbnam = null; - - parseLengthAndMatchCodePoint (CodePoint.DTAMCHRM); - pushLengthOnCollectionStack(); - int peekCP = peekCodePoint(); - - while (peekCP != Reply.END_OF_COLLECTION) { - - boolean foundInPass = false; - - if (peekCP == CodePoint.SVRCOD) { - foundInPass = true; - svrcodReceived = checkAndGetReceivedFlag (svrcodReceived); - svrcod = parseSVRCOD (CodePoint.SVRCOD_ERROR, CodePoint.SVRCOD_ERROR); - peekCP = peekCodePoint(); - } - - if (peekCP == CodePoint.RDBNAM) { - foundInPass = true; - rdbnamReceived = checkAndGetReceivedFlag (rdbnamReceived); - rdbnam = parseRDBNAM (true); - peekCP = peekCodePoint(); - } - - if (!foundInPass) - doPrmnsprmSemantics (peekCP); - - } - popCollectionStack(); - checkRequiredObjects (svrcodReceived, rdbnamReceived); - - netAgent_.setSvrcod (svrcod); - doDtamchrmSemantics(); - } - - // RDB Update Reply Message indicates that a DDM command resulted - // in an update at the target relational database. If a command - // generated multiple reply messages including an RDBUPDRM, then - // the RDBUPDRM must be the first reply message for the command. - // For each target server, the RDBUPDRM must be returned the first - // time an update is made to the target RDB within a unit of work. - // The target server may optionally return the RDBUPDRM after subsequent - // updates within the UOW. If multiple target RDBs are involved with - // the current UOW and updates are made with any of them, then the RDBUPDRM - // must be returned in response to the first update at each of them. - protected void parseRDBUPDRM () throws DisconnectException - { - boolean svrcodReceived = false; - int svrcod = CodePoint.SVRCOD_INFO; - boolean rdbnamReceived = false; - String rdbnam = null; - - parseLengthAndMatchCodePoint (CodePoint.RDBUPDRM); - pushLengthOnCollectionStack(); - - // in XA Global transaction we need to know if we have a read-only - // transaction, if we get a RDBUPDRM this is NOT a read-only transaction - // currently only XAConnections care about read-only transactions, if - // non-XA wants this information they will need to initialize the flag - // at start of UOW - netAgent_.netConnection_.setReadOnlyTransactionFlag( false ); - - 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.RDBNAM) { - foundInPass = true; - rdbnamReceived = checkAndGetReceivedFlag (rdbnamReceived); - rdbnam = parseRDBNAM (true); - peekCP = peekCodePoint(); - } - - if (!foundInPass) - doPrmnsprmSemantics (peekCP); - - } - popCollectionStack(); - checkRequiredObjects (svrcodReceived, rdbnamReceived); - - // call an event to indicate the server has been updated - netAgent_.setSvrcod (svrcod); - - } - - // SQL Error Condition Reply Message indicates that an SQL error - // has occurred. It may be sent even though no reply message - // precedes the SQLCARD object that is the normal - // response to a command when an exception occurs. - // The SQLERRM is also used when a BNDSQLSTT command is terminated - // by an INTRRDBRQS command. - // This reply message must precede an SQLCARD object. - // The SQLSTATE is returned in the SQLCARD. - // - // Returned from Server: - // SVRCOD - required (8 - ERROR) - // RDBNAM - optional - // - // Also called by NetResultSetReply and NetStatementReply - void parseSQLERRRM () throws DisconnectException - { - boolean svrcodReceived = false; - int svrcod = CodePoint.SVRCOD_INFO; - boolean rdbnamReceived = false; - String rdbnam = null; - - parseLengthAndMatchCodePoint (CodePoint.SQLERRRM); - pushLengthOnCollectionStack(); - int peekCP = peekCodePoint(); - - while (peekCP != Reply.END_OF_COLLECTION) { - - boolean foundInPass = false; - - if (peekCP == CodePoint.SVRCOD) { - foundInPass = true; - svrcodReceived = checkAndGetReceivedFlag (svrcodReceived); - svrcod = parseSVRCOD (CodePoint.SVRCOD_ERROR, CodePoint.SVRCOD_ERROR); - peekCP = peekCodePoint(); - } - - if (peekCP == CodePoint.RDBNAM) { - foundInPass = true; - rdbnamReceived = checkAndGetReceivedFlag (rdbnamReceived); - rdbnam = parseRDBNAM (true); - peekCP = peekCodePoint(); - } - - if (!foundInPass) - doPrmnsprmSemantics (peekCP); - - } - popCollectionStack(); - checkRequiredObjects (svrcodReceived); - - // move into a method - netAgent_.setSvrcod (svrcod); - } - - //--------------------- parse DDM Reply Data-------------------------------------- - - //------------------------parse DDM Scalars----------------------------- - - // RDB Package Name and Consistency token Scalar Object specifies the - // fully qualified name of a relational database package and its - // consistency token. - protected Object parsePKGNAMCT (boolean skip) throws DisconnectException - { - parseLengthAndMatchCodePoint (CodePoint.PKGNAMCT); - if (skip) { - skipBytes(); - return null; - } - agent_.accumulateChainBreakingReadExceptionAndThrow (new DisconnectException ( - agent_, - "parsePKGNAMCT not yet implemented")); - return null; // to make compiler happy - } +public class NetPackageReply extends NetConnectionReply { + NetPackageReply(NetAgent netAgent, int bufferSize) { + super(netAgent, bufferSize); + } + + + NetSqlca parseSqlErrorCondition() throws DisconnectException { + parseSQLERRRM(); + parseTypdefsOrMgrlvlovrs(); + NetSqlca netSqlca = parseSQLCARD(null); + return netSqlca; + } + + + // Also called by NetStatementReply + void parseDTAMCHRM() throws DisconnectException { + boolean svrcodReceived = false; + int svrcod = CodePoint.SVRCOD_INFO; + boolean rdbnamReceived = false; + String rdbnam = null; + + parseLengthAndMatchCodePoint(CodePoint.DTAMCHRM); + pushLengthOnCollectionStack(); + int peekCP = peekCodePoint(); + + while (peekCP != Reply.END_OF_COLLECTION) { + + boolean foundInPass = false; + + if (peekCP == CodePoint.SVRCOD) { + foundInPass = true; + svrcodReceived = checkAndGetReceivedFlag(svrcodReceived); + svrcod = parseSVRCOD(CodePoint.SVRCOD_ERROR, CodePoint.SVRCOD_ERROR); + peekCP = peekCodePoint(); + } + + if (peekCP == CodePoint.RDBNAM) { + foundInPass = true; + rdbnamReceived = checkAndGetReceivedFlag(rdbnamReceived); + rdbnam = parseRDBNAM(true); + peekCP = peekCodePoint(); + } + + if (!foundInPass) { + doPrmnsprmSemantics(peekCP); + } + + } + popCollectionStack(); + checkRequiredObjects(svrcodReceived, rdbnamReceived); + + netAgent_.setSvrcod(svrcod); + doDtamchrmSemantics(); + } + + // RDB Update Reply Message indicates that a DDM command resulted + // in an update at the target relational database. If a command + // generated multiple reply messages including an RDBUPDRM, then + // the RDBUPDRM must be the first reply message for the command. + // For each target server, the RDBUPDRM must be returned the first + // time an update is made to the target RDB within a unit of work. + // The target server may optionally return the RDBUPDRM after subsequent + // updates within the UOW. If multiple target RDBs are involved with + // the current UOW and updates are made with any of them, then the RDBUPDRM + // must be returned in response to the first update at each of them. + protected void parseRDBUPDRM() throws DisconnectException { + boolean svrcodReceived = false; + int svrcod = CodePoint.SVRCOD_INFO; + boolean rdbnamReceived = false; + String rdbnam = null; + + parseLengthAndMatchCodePoint(CodePoint.RDBUPDRM); + pushLengthOnCollectionStack(); + + // in XA Global transaction we need to know if we have a read-only + // transaction, if we get a RDBUPDRM this is NOT a read-only transaction + // currently only XAConnections care about read-only transactions, if + // non-XA wants this information they will need to initialize the flag + // at start of UOW + netAgent_.netConnection_.setReadOnlyTransactionFlag(false); + + 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.RDBNAM) { + foundInPass = true; + rdbnamReceived = checkAndGetReceivedFlag(rdbnamReceived); + rdbnam = parseRDBNAM(true); + peekCP = peekCodePoint(); + } + + if (!foundInPass) { + doPrmnsprmSemantics(peekCP); + } + + } + popCollectionStack(); + checkRequiredObjects(svrcodReceived, rdbnamReceived); + + // call an event to indicate the server has been updated + netAgent_.setSvrcod(svrcod); + + } + + // SQL Error Condition Reply Message indicates that an SQL error + // has occurred. It may be sent even though no reply message + // precedes the SQLCARD object that is the normal + // response to a command when an exception occurs. + // The SQLERRM is also used when a BNDSQLSTT command is terminated + // by an INTRRDBRQS command. + // This reply message must precede an SQLCARD object. + // The SQLSTATE is returned in the SQLCARD. + // + // Returned from Server: + // SVRCOD - required (8 - ERROR) + // RDBNAM - optional + // + // Also called by NetResultSetReply and NetStatementReply + void parseSQLERRRM() throws DisconnectException { + boolean svrcodReceived = false; + int svrcod = CodePoint.SVRCOD_INFO; + boolean rdbnamReceived = false; + String rdbnam = null; + + parseLengthAndMatchCodePoint(CodePoint.SQLERRRM); + pushLengthOnCollectionStack(); + int peekCP = peekCodePoint(); + + while (peekCP != Reply.END_OF_COLLECTION) { + + boolean foundInPass = false; + + if (peekCP == CodePoint.SVRCOD) { + foundInPass = true; + svrcodReceived = checkAndGetReceivedFlag(svrcodReceived); + svrcod = parseSVRCOD(CodePoint.SVRCOD_ERROR, CodePoint.SVRCOD_ERROR); + peekCP = peekCodePoint(); + } + + if (peekCP == CodePoint.RDBNAM) { + foundInPass = true; + rdbnamReceived = checkAndGetReceivedFlag(rdbnamReceived); + rdbnam = parseRDBNAM(true); + peekCP = peekCodePoint(); + } + + if (!foundInPass) { + doPrmnsprmSemantics(peekCP); + } + + } + popCollectionStack(); + checkRequiredObjects(svrcodReceived); + + // move into a method + netAgent_.setSvrcod(svrcod); + } + + //--------------------- parse DDM Reply Data-------------------------------------- + + //------------------------parse DDM Scalars----------------------------- + + // RDB Package Name and Consistency token Scalar Object specifies the + // fully qualified name of a relational database package and its + // consistency token. + protected Object parsePKGNAMCT(boolean skip) throws DisconnectException { + parseLengthAndMatchCodePoint(CodePoint.PKGNAMCT); + if (skip) { + skipBytes(); + return null; + } + agent_.accumulateChainBreakingReadExceptionAndThrow(new DisconnectException(agent_, + "parsePKGNAMCT not yet implemented")); + return null; // to make compiler happy + } } Modified: incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetPackageRequest.java URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetPackageRequest.java?rev=165585&r1=165584&r2=165585&view=diff ============================================================================== --- incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetPackageRequest.java (original) +++ incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetPackageRequest.java Sun May 1 23:25:59 2005 @@ -24,287 +24,271 @@ import org.apache.derby.client.am.SqlException; -public class NetPackageRequest extends NetConnectionRequest -{ - static final String COLLECTIONNAME = "NULLID"; - - NetPackageRequest (NetAgent netAgent, CcsidManager ccsidManager, int bufferSize) - { - super (netAgent, ccsidManager, bufferSize); - } - - // RDB Package Name, Consistency Token - // Scalar Object specifies the fully qualified name of a relational - // database package and its consistency token. - // - // To accomodate larger lengths, the Scalar Data Length - // (SCLDTALEN) Field is used to specify the length of the instance - // variable which follows. - static final String collectionName = "NULLID"; - void buildCommonPKGNAMinfo (Section section) throws SqlException - { - String collectionToFlow = COLLECTIONNAME; - // the scalar data length field may or may not be required. it depends - // on the level of support and length of the data. - // check the lengths of the RDBNAM, RDBCOLID, and PKGID. - // Determine if the lengths require an SCLDTALEN object. - // Note: if an SQLDTALEN is required for ONE of them, - // it is needed for ALL of them. This is why this check is - // up front. - // the SQLAM level dictates the maximum size for - // RDB Collection Identifier (RDBCOLID) - // Relational Database Name (RDBNAM) - // RDB Package Identifier (PKGID) - int maxIdentifierLength = NetConfiguration.PKG_IDENTIFIER_MAX_LEN; - - boolean scldtalenRequired = false; - scldtalenRequired = checkPKGNAMlengths (netAgent_.netConnection_.databaseName_, - maxIdentifierLength, - NetConfiguration.PKG_IDENTIFIER_FIXED_LEN); - - if (!scldtalenRequired) - scldtalenRequired = checkPKGNAMlengths (collectionToFlow, - maxIdentifierLength, - NetConfiguration.PKG_IDENTIFIER_FIXED_LEN); - - if (!scldtalenRequired) - scldtalenRequired = checkPKGNAMlengths (section.getPackageName(), - maxIdentifierLength, - NetConfiguration.PKG_IDENTIFIER_FIXED_LEN); - - // the format is different depending on if an SCLDTALEN is required. - if (!scldtalenRequired) { - writeScalarPaddedString (netAgent_.netConnection_.databaseName_, - NetConfiguration.PKG_IDENTIFIER_FIXED_LEN); - writeScalarPaddedString (collectionToFlow, - NetConfiguration.PKG_IDENTIFIER_FIXED_LEN); - writeScalarPaddedString (section.getPackageName(), - NetConfiguration.PKG_IDENTIFIER_FIXED_LEN); - } - else { - buildSCLDTA (netAgent_.netConnection_.databaseName_, NetConfiguration.PKG_IDENTIFIER_FIXED_LEN); - buildSCLDTA (collectionToFlow, NetConfiguration.PKG_IDENTIFIER_FIXED_LEN); - buildSCLDTA (section.getPackageName(), NetConfiguration.PKG_IDENTIFIER_FIXED_LEN); - } - } - - private void buildSCLDTA (String identifier, int minimumLength) throws SqlException - { - if (identifier.length() <= minimumLength) { - write2Bytes (minimumLength); - writeScalarPaddedString (identifier, minimumLength); - } - else { - write2Bytes (identifier.length()); - writeScalarPaddedString (identifier, identifier.length()); - } - } - - - // this specifies the fully qualified package name, - // consistency token, and section number within the package being used - // to execute the SQL. If the connection supports reusing the previous - // package information and this information is the same except for the section - // number then only the section number needs to be sent to the server. - void buildPKGNAMCSN (Section section) throws SqlException - { - if (!canCommandUseDefaultPKGNAMCSN ()) { - markLengthBytes (CodePoint.PKGNAMCSN); - // If PKGNAMCBytes is already available, copy the bytes to the request buffer directly. - if (section.getPKGNAMCBytes() != null) - writeStoredPKGNAMCBytes (section); - else { - // Mark the beginning of PKGNAMCSN bytes. - markForCachingPKGNAMCSN (); - buildCommonPKGNAMinfo (section); - writeScalarPaddedBytes (Configuration.dncPackageConsistencyToken, - NetConfiguration.PKGCNSTKN_FIXED_LEN, - NetConfiguration.NON_CHAR_DDM_DATA_PAD_BYTE); - // store the PKGNAMCbytes - storePKGNAMCBytes (section); - } - write2Bytes (section.getSectionNumber()); - updateLengthBytes(); - } - else - writeScalar2Bytes (CodePoint.PKGSN, section.getSectionNumber()); - } - - private void storePKGNAMCBytes (Section section) - { - // Get the locaton where we started writing PKGNAMCSN - int startPos = popMarkForCachingPKGNAMCSN (); - int copyLength = offset_ - startPos; - byte[] b = new byte[copyLength]; - System.arraycopy (bytes_, - startPos, - b, - 0, - copyLength); - section.setPKGNAMCBytes(b); - } - - private void writeStoredPKGNAMCBytes (Section section) - { - byte[] b = section.getPKGNAMCBytes(); - - // Mare sure request buffer has enough space to write this byte array. - ensureLength (offset_ + b.length); - - System.arraycopy (b, - 0, - bytes_, - offset_, - b.length); - - offset_ += b.length; - } - - private boolean canCommandUseDefaultPKGNAMCSN () - { - return false; - } - - - // throws an exception if lengths exceed the maximum. - // returns a boolean indicating if SLCDTALEN is required. - private boolean checkPKGNAMlengths (String identifier, - int maxIdentifierLength, - int lengthRequiringScldta) throws SqlException - { - int length = identifier.length(); - if (length > maxIdentifierLength) - throw new SqlException (netAgent_.logWriter_, "" + identifier + " exceeds maximum identifier length of ' " + - maxIdentifierLength + "'"); - - return (length > lengthRequiringScldta); - } - - private byte[] getBytes (String string, String encoding) throws SqlException - { - try { - return string.getBytes (encoding); - } - catch (java.lang.Exception e) { - throw new SqlException (netAgent_.logWriter_, e, "error on getBytes"); - } - } - - private void buildNOCMorNOCS (String string) throws SqlException - { - if (string == null) { - write2Bytes (0xffff); - } - else { - byte[] sqlBytes = null; - - if (netAgent_.typdef_.isCcsidMbcSet()) { - sqlBytes = getBytes (string, netAgent_.typdef_.getCcsidMbcEncoding()); - write1Byte (0x00); - write4Bytes (sqlBytes.length); - writeBytes (sqlBytes, sqlBytes.length); - write1Byte (0xff); - } - else { - sqlBytes = getBytes (string, netAgent_.typdef_.getCcsidSbcEncoding()); - write1Byte (0xff); - write1Byte (0x00); - write4Bytes (sqlBytes.length); - writeBytes (sqlBytes, sqlBytes.length); - } - } - } - - // SQLSTTGRP : FDOCA EARLY GROUP - // SQL Statement Group Description - // - // FORMAT FOR SQLAM <= 6 - // SQLSTATEMENT_m; PROTOCOL TYPE LVCM; ENVLID 0x40; Length Override 32767 - // SQLSTATEMENT_s; PROTOCOL TYPE LVCS; ENVLID 0x34; Length Override 32767 - // - // FORMAT FOR SQLAM >= 7 - // SQLSTATEMENT_m; PROTOCOL TYPE NOCM; ENVLID 0xCF; Length Override 4 - // SQLSTATEMENT_s; PROTOCOL TYPE NOCS; ENVLID 0xCB; Length Override 4 - private void buildSQLSTTGRP (String string) throws SqlException - { - buildNOCMorNOCS (string); - return; - } - - // SQLSTT : FDOCA EARLY ROW - // SQL Statement Row Description - // - // FORMAT FOR ALL SQLAM LEVELS - // SQLSTTGRP; GROUP LID 0x5C; ELEMENT TAKEN 0(all); REP FACTOR 1 - private void buildSQLSTT (String string) throws SqlException - { - buildSQLSTTGRP (string); - } - - protected void buildSQLSTTcommandData (String sql) throws SqlException - { - createEncryptedCommandData (); - int loc = offset_; - markLengthBytes (CodePoint.SQLSTT); - buildSQLSTT (sql); - updateLengthBytes(); - if (netAgent_.netConnection_.getSecurityMechanism() == - NetConfiguration.SECMEC_EUSRIDDTA || - netAgent_.netConnection_.getSecurityMechanism() == - NetConfiguration.SECMEC_EUSRPWDDTA) - encryptDataStream(loc); - - } - - - - protected void buildSQLATTRcommandData (String sql) throws SqlException - { - createEncryptedCommandData (); - int loc = offset_; - markLengthBytes (CodePoint.SQLATTR); - buildSQLSTT (sql); - updateLengthBytes(); - if (netAgent_.netConnection_.getSecurityMechanism() == - NetConfiguration.SECMEC_EUSRIDDTA || - netAgent_.netConnection_.getSecurityMechanism() == - NetConfiguration.SECMEC_EUSRPWDDTA) - encryptDataStream (loc); - - } - - - public void encryptDataStream(int lengthLocation) throws SqlException - { - byte[] clearedBytes = new byte[offset_ - lengthLocation]; - byte[] encryptedBytes; - for (int i = lengthLocation; i < offset_; i++) - clearedBytes[i - lengthLocation] = bytes_[i]; - - encryptedBytes = netAgent_.netConnection_.getEncryptionManager(). - encryptData( - clearedBytes, - NetConfiguration.SECMEC_EUSRIDPWD, - netAgent_.netConnection_.getTargetPublicKey(), - netAgent_.netConnection_.getTargetPublicKey()); - - int length = encryptedBytes.length; - - if(bytes_.length >= lengthLocation + length) - System.arraycopy(encryptedBytes, 0, bytes_, lengthLocation, length); - else { - byte[] largeByte = new byte[lengthLocation + length]; - System.arraycopy(bytes_,0,largeByte,0,lengthLocation); - System.arraycopy(encryptedBytes, 0, largeByte, lengthLocation, length); - bytes_ = largeByte; - } - - offset_ += length - clearedBytes.length; - - //we need to update the length in DSS header here. - - bytes_[lengthLocation - 6] = (byte) ( (length >>> 8) & 0xff); - bytes_[lengthLocation - 5] = (byte) (length & 0xff); - } +public class NetPackageRequest extends NetConnectionRequest { + static final String COLLECTIONNAME = "NULLID"; + + NetPackageRequest(NetAgent netAgent, CcsidManager ccsidManager, int bufferSize) { + super(netAgent, ccsidManager, bufferSize); + } + + // RDB Package Name, Consistency Token + // Scalar Object specifies the fully qualified name of a relational + // database package and its consistency token. + // + // To accomodate larger lengths, the Scalar Data Length + // (SCLDTALEN) Field is used to specify the length of the instance + // variable which follows. + static final String collectionName = "NULLID"; + + void buildCommonPKGNAMinfo(Section section) throws SqlException { + String collectionToFlow = COLLECTIONNAME; + // the scalar data length field may or may not be required. it depends + // on the level of support and length of the data. + // check the lengths of the RDBNAM, RDBCOLID, and PKGID. + // Determine if the lengths require an SCLDTALEN object. + // Note: if an SQLDTALEN is required for ONE of them, + // it is needed for ALL of them. This is why this check is + // up front. + // the SQLAM level dictates the maximum size for + // RDB Collection Identifier (RDBCOLID) + // Relational Database Name (RDBNAM) + // RDB Package Identifier (PKGID) + int maxIdentifierLength = NetConfiguration.PKG_IDENTIFIER_MAX_LEN; + + boolean scldtalenRequired = false; + scldtalenRequired = checkPKGNAMlengths(netAgent_.netConnection_.databaseName_, + maxIdentifierLength, + NetConfiguration.PKG_IDENTIFIER_FIXED_LEN); + + if (!scldtalenRequired) { + scldtalenRequired = checkPKGNAMlengths(collectionToFlow, + maxIdentifierLength, + NetConfiguration.PKG_IDENTIFIER_FIXED_LEN); + } + + if (!scldtalenRequired) { + scldtalenRequired = checkPKGNAMlengths(section.getPackageName(), + maxIdentifierLength, + NetConfiguration.PKG_IDENTIFIER_FIXED_LEN); + } + + // the format is different depending on if an SCLDTALEN is required. + if (!scldtalenRequired) { + writeScalarPaddedString(netAgent_.netConnection_.databaseName_, + NetConfiguration.PKG_IDENTIFIER_FIXED_LEN); + writeScalarPaddedString(collectionToFlow, + NetConfiguration.PKG_IDENTIFIER_FIXED_LEN); + writeScalarPaddedString(section.getPackageName(), + NetConfiguration.PKG_IDENTIFIER_FIXED_LEN); + } else { + buildSCLDTA(netAgent_.netConnection_.databaseName_, NetConfiguration.PKG_IDENTIFIER_FIXED_LEN); + buildSCLDTA(collectionToFlow, NetConfiguration.PKG_IDENTIFIER_FIXED_LEN); + buildSCLDTA(section.getPackageName(), NetConfiguration.PKG_IDENTIFIER_FIXED_LEN); + } + } + + private void buildSCLDTA(String identifier, int minimumLength) throws SqlException { + if (identifier.length() <= minimumLength) { + write2Bytes(minimumLength); + writeScalarPaddedString(identifier, minimumLength); + } else { + write2Bytes(identifier.length()); + writeScalarPaddedString(identifier, identifier.length()); + } + } + + + // this specifies the fully qualified package name, + // consistency token, and section number within the package being used + // to execute the SQL. If the connection supports reusing the previous + // package information and this information is the same except for the section + // number then only the section number needs to be sent to the server. + void buildPKGNAMCSN(Section section) throws SqlException { + if (!canCommandUseDefaultPKGNAMCSN()) { + markLengthBytes(CodePoint.PKGNAMCSN); + // If PKGNAMCBytes is already available, copy the bytes to the request buffer directly. + if (section.getPKGNAMCBytes() != null) { + writeStoredPKGNAMCBytes(section); + } else { + // Mark the beginning of PKGNAMCSN bytes. + markForCachingPKGNAMCSN(); + buildCommonPKGNAMinfo(section); + writeScalarPaddedBytes(Configuration.dncPackageConsistencyToken, + NetConfiguration.PKGCNSTKN_FIXED_LEN, + NetConfiguration.NON_CHAR_DDM_DATA_PAD_BYTE); + // store the PKGNAMCbytes + storePKGNAMCBytes(section); + } + write2Bytes(section.getSectionNumber()); + updateLengthBytes(); + } else { + writeScalar2Bytes(CodePoint.PKGSN, section.getSectionNumber()); + } + } + + private void storePKGNAMCBytes(Section section) { + // Get the locaton where we started writing PKGNAMCSN + int startPos = popMarkForCachingPKGNAMCSN(); + int copyLength = offset_ - startPos; + byte[] b = new byte[copyLength]; + System.arraycopy(bytes_, + startPos, + b, + 0, + copyLength); + section.setPKGNAMCBytes(b); + } + + private void writeStoredPKGNAMCBytes(Section section) { + byte[] b = section.getPKGNAMCBytes(); + + // Mare sure request buffer has enough space to write this byte array. + ensureLength(offset_ + b.length); + + System.arraycopy(b, + 0, + bytes_, + offset_, + b.length); + + offset_ += b.length; + } + + private boolean canCommandUseDefaultPKGNAMCSN() { + return false; + } + + + // throws an exception if lengths exceed the maximum. + // returns a boolean indicating if SLCDTALEN is required. + private boolean checkPKGNAMlengths(String identifier, + int maxIdentifierLength, + int lengthRequiringScldta) throws SqlException { + int length = identifier.length(); + if (length > maxIdentifierLength) { + throw new SqlException(netAgent_.logWriter_, "" + identifier + " exceeds maximum identifier length of ' " + + maxIdentifierLength + "'"); + } + + return (length > lengthRequiringScldta); + } + + private byte[] getBytes(String string, String encoding) throws SqlException { + try { + return string.getBytes(encoding); + } catch (java.lang.Exception e) { + throw new SqlException(netAgent_.logWriter_, e, "error on getBytes"); + } + } + + private void buildNOCMorNOCS(String string) throws SqlException { + if (string == null) { + write2Bytes(0xffff); + } else { + byte[] sqlBytes = null; + + if (netAgent_.typdef_.isCcsidMbcSet()) { + sqlBytes = getBytes(string, netAgent_.typdef_.getCcsidMbcEncoding()); + write1Byte(0x00); + write4Bytes(sqlBytes.length); + writeBytes(sqlBytes, sqlBytes.length); + write1Byte(0xff); + } else { + sqlBytes = getBytes(string, netAgent_.typdef_.getCcsidSbcEncoding()); + write1Byte(0xff); + write1Byte(0x00); + write4Bytes(sqlBytes.length); + writeBytes(sqlBytes, sqlBytes.length); + } + } + } + + // SQLSTTGRP : FDOCA EARLY GROUP + // SQL Statement Group Description + // + // FORMAT FOR SQLAM <= 6 + // SQLSTATEMENT_m; PROTOCOL TYPE LVCM; ENVLID 0x40; Length Override 32767 + // SQLSTATEMENT_s; PROTOCOL TYPE LVCS; ENVLID 0x34; Length Override 32767 + // + // FORMAT FOR SQLAM >= 7 + // SQLSTATEMENT_m; PROTOCOL TYPE NOCM; ENVLID 0xCF; Length Override 4 + // SQLSTATEMENT_s; PROTOCOL TYPE NOCS; ENVLID 0xCB; Length Override 4 + private void buildSQLSTTGRP(String string) throws SqlException { + buildNOCMorNOCS(string); + return; + } + + // SQLSTT : FDOCA EARLY ROW + // SQL Statement Row Description + // + // FORMAT FOR ALL SQLAM LEVELS + // SQLSTTGRP; GROUP LID 0x5C; ELEMENT TAKEN 0(all); REP FACTOR 1 + private void buildSQLSTT(String string) throws SqlException { + buildSQLSTTGRP(string); + } + + protected void buildSQLSTTcommandData(String sql) throws SqlException { + createEncryptedCommandData(); + int loc = offset_; + markLengthBytes(CodePoint.SQLSTT); + buildSQLSTT(sql); + updateLengthBytes(); + if (netAgent_.netConnection_.getSecurityMechanism() == + NetConfiguration.SECMEC_EUSRIDDTA || + netAgent_.netConnection_.getSecurityMechanism() == + NetConfiguration.SECMEC_EUSRPWDDTA) { + encryptDataStream(loc); + } + + } + + + protected void buildSQLATTRcommandData(String sql) throws SqlException { + createEncryptedCommandData(); + int loc = offset_; + markLengthBytes(CodePoint.SQLATTR); + buildSQLSTT(sql); + updateLengthBytes(); + if (netAgent_.netConnection_.getSecurityMechanism() == + NetConfiguration.SECMEC_EUSRIDDTA || + netAgent_.netConnection_.getSecurityMechanism() == + NetConfiguration.SECMEC_EUSRPWDDTA) { + encryptDataStream(loc); + } + + } + + + public void encryptDataStream(int lengthLocation) throws SqlException { + byte[] clearedBytes = new byte[offset_ - lengthLocation]; + byte[] encryptedBytes; + for (int i = lengthLocation; i < offset_; i++) { + clearedBytes[i - lengthLocation] = bytes_[i]; + } + + encryptedBytes = netAgent_.netConnection_.getEncryptionManager(). + encryptData(clearedBytes, + NetConfiguration.SECMEC_EUSRIDPWD, + netAgent_.netConnection_.getTargetPublicKey(), + netAgent_.netConnection_.getTargetPublicKey()); + + int length = encryptedBytes.length; + + if (bytes_.length >= lengthLocation + length) { + System.arraycopy(encryptedBytes, 0, bytes_, lengthLocation, length); + } else { + byte[] largeByte = new byte[lengthLocation + length]; + System.arraycopy(bytes_, 0, largeByte, 0, lengthLocation); + System.arraycopy(encryptedBytes, 0, largeByte, lengthLocation, length); + bytes_ = largeByte; + } + + offset_ += length - clearedBytes.length; + + //we need to update the length in DSS header here. + + bytes_[lengthLocation - 6] = (byte) ((length >>> 8) & 0xff); + bytes_[lengthLocation - 5] = (byte) (length & 0xff); + } } Modified: incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetPreparedStatement.java URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetPreparedStatement.java?rev=165585&r1=165584&r2=165585&view=diff ============================================================================== --- incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetPreparedStatement.java (original) +++ incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetPreparedStatement.java Sun May 1 23:25:59 2005 @@ -19,147 +19,140 @@ */ package org.apache.derby.client.net; -import org.apache.derby.client.am.Section; import org.apache.derby.client.am.ColumnMetaData; import org.apache.derby.client.am.PreparedStatement; +import org.apache.derby.client.am.Section; import org.apache.derby.client.am.SqlException; public class NetPreparedStatement extends NetStatement - implements org.apache.derby.client.am.MaterialPreparedStatement -{ - - // Alias for (NetPreparedStatement) super.statement. - /*final*/ org.apache.derby.client.am.PreparedStatement preparedStatement_; + implements org.apache.derby.client.am.MaterialPreparedStatement { + // Alias for (NetPreparedStatement) super.statement. + /*final*/ + org.apache.derby.client.am.PreparedStatement preparedStatement_; + + + // Relay constructor for NetCallableStatement. + NetPreparedStatement(org.apache.derby.client.am.PreparedStatement statement, + NetAgent netAgent, + NetConnection netConnection) { + super(statement, netAgent, netConnection); + initNetPreparedStatement(statement); + } + + void resetNetPreparedStatement(org.apache.derby.client.am.PreparedStatement statement, + NetAgent netAgent, + NetConnection netConnection) { + super.resetNetStatement(statement, netAgent, netConnection); + initNetPreparedStatement(statement); + } + + private void initNetPreparedStatement(org.apache.derby.client.am.PreparedStatement statement) { + preparedStatement_ = statement; + preparedStatement_.materialPreparedStatement_ = this; + } + + // Called by abstract Connection.prepareStatment().newPreparedStatement() for jdbc 2 prepared statements + // with scroll attributes. + NetPreparedStatement(NetAgent netAgent, NetConnection netConnection, String sql, int type, int concurrency, int holdability, int autoGeneratedKeys, String[] columnNames) throws SqlException { + this(new PreparedStatement(netAgent, netConnection, sql, type, concurrency, holdability, autoGeneratedKeys, columnNames), + netAgent, + netConnection); + } + + void resetNetPreparedStatement(NetAgent netAgent, NetConnection netConnection, String sql, int type, int concurrency, int holdability, int autoGeneratedKeys, String[] columnNames) throws SqlException { + preparedStatement_.resetPreparedStatement(netAgent, netConnection, sql, type, concurrency, holdability, autoGeneratedKeys, columnNames); + resetNetPreparedStatement(preparedStatement_, netAgent, netConnection); + } + + // For JDBC 3.0 positioned updates. + NetPreparedStatement(NetAgent netAgent, + NetConnection netConnection, + String sql, + Section section) throws SqlException { + this(new PreparedStatement(netAgent, netConnection, sql, section), + netAgent, + netConnection); + } + + void resetNetPreparedStatement(NetAgent netAgent, + NetConnection netConnection, + String sql, + Section section) throws SqlException { + preparedStatement_.resetPreparedStatement(netAgent, netConnection, sql, section); + resetNetPreparedStatement(preparedStatement_, netAgent, netConnection); + } + + void resetNetPreparedStatement(NetAgent netAgent, + NetConnection netConnection, + String sql, + Section section, + ColumnMetaData parameterMetaData, + ColumnMetaData resultSetMetaData) throws SqlException { + preparedStatement_.resetPreparedStatement(netAgent, netConnection, sql, section, parameterMetaData, resultSetMetaData); + this.resetNetPreparedStatement(preparedStatement_, netAgent, netConnection); + } + + protected void finalize() throws java.lang.Throwable { + super.finalize(); + } - // Relay constructor for NetCallableStatement. - NetPreparedStatement (org.apache.derby.client.am.PreparedStatement statement, - NetAgent netAgent, - NetConnection netConnection) - { - super (statement, netAgent, netConnection); - initNetPreparedStatement (statement); - } - - void resetNetPreparedStatement (org.apache.derby.client.am.PreparedStatement statement, - NetAgent netAgent, - NetConnection netConnection) - { - super.resetNetStatement(statement, netAgent, netConnection); - initNetPreparedStatement(statement); - } - - private void initNetPreparedStatement (org.apache.derby.client.am.PreparedStatement statement) - { - preparedStatement_ = statement; - preparedStatement_.materialPreparedStatement_ = this; - } - - // Called by abstract Connection.prepareStatment().newPreparedStatement() for jdbc 2 prepared statements - // with scroll attributes. - NetPreparedStatement (NetAgent netAgent, NetConnection netConnection, String sql, int type, int concurrency, int holdability, int autoGeneratedKeys, String[] columnNames) throws SqlException - { - this (new PreparedStatement (netAgent, netConnection, sql, type, concurrency, holdability, autoGeneratedKeys, columnNames), - netAgent, - netConnection); - } - - void resetNetPreparedStatement (NetAgent netAgent, NetConnection netConnection, String sql, int type, int concurrency, int holdability, int autoGeneratedKeys, String[] columnNames) throws SqlException - { - preparedStatement_.resetPreparedStatement(netAgent, netConnection, sql, type, concurrency, holdability, autoGeneratedKeys, columnNames); - resetNetPreparedStatement(preparedStatement_, netAgent, netConnection); - } - - // For JDBC 3.0 positioned updates. - NetPreparedStatement (NetAgent netAgent, - NetConnection netConnection, - String sql, - Section section) throws SqlException - { - this (new PreparedStatement (netAgent, netConnection, sql, section), - netAgent, - netConnection); - } - - void resetNetPreparedStatement (NetAgent netAgent, - NetConnection netConnection, - String sql, - Section section) throws SqlException - { - preparedStatement_.resetPreparedStatement (netAgent, netConnection, sql, section); - resetNetPreparedStatement (preparedStatement_, netAgent, netConnection); - } - - void resetNetPreparedStatement (NetAgent netAgent, - NetConnection netConnection, - String sql, - Section section, - ColumnMetaData parameterMetaData, - ColumnMetaData resultSetMetaData) throws SqlException - { - preparedStatement_.resetPreparedStatement(netAgent,netConnection,sql,section,parameterMetaData,resultSetMetaData); - this.resetNetPreparedStatement(preparedStatement_, netAgent, netConnection); - } - - protected void finalize () throws java.lang.Throwable - { - super.finalize(); - } - - public void writeExecute_ (Section section, - ColumnMetaData parameterMetaData, - Object[] inputs, - int numInputColumns, - boolean outputExpected, - // This is a hint to the material layer that more write commands will follow. - // It is ignored by the driver in all cases except when blob data is written, - // in which case this boolean is used to optimize the implementation. - // Otherwise we wouldn't be able to chain after blob data is sent. - // If we could always chain a no-op DDM after every execute that writes blobs - // then we could just always set the chaining flag to on for blob send data - boolean chainedWritesFollowingSetLob - ) throws SqlException - { - netAgent_.statementRequest_.writeExecute ( - this, - section, - parameterMetaData, - inputs, - numInputColumns, - outputExpected, - chainedWritesFollowingSetLob); - } - - - public void readExecute_ () throws SqlException - { netAgent_.statementReply_.readExecute (preparedStatement_); } - - public void writeOpenQuery_ (Section section, - int fetchSize, - int resultSetType, - int numInputColumns, + public void writeExecute_(Section section, ColumnMetaData parameterMetaData, - Object[] inputs) throws SqlException - { - netAgent_.statementRequest_.writeOpenQuery ( - this, - section, - fetchSize, - resultSetType, - numInputColumns, - parameterMetaData, - inputs); - } - // super.readOpenQuery() - - public void writeDescribeInput_ (Section section) throws SqlException - { netAgent_.statementRequest_.writeDescribeInput (this, section); } - public void readDescribeInput_ () throws SqlException - { netAgent_.statementReply_.readDescribeInput (preparedStatement_); } - - public void writeDescribeOutput_ (Section section) throws SqlException - { netAgent_.statementRequest_.writeDescribeOutput (this, section); } - public void readDescribeOutput_ () throws SqlException - { netAgent_.statementReply_.readDescribeOutput (preparedStatement_); } + Object[] inputs, + int numInputColumns, + boolean outputExpected, + // This is a hint to the material layer that more write commands will follow. + // It is ignored by the driver in all cases except when blob data is written, + // in which case this boolean is used to optimize the implementation. + // Otherwise we wouldn't be able to chain after blob data is sent. + // If we could always chain a no-op DDM after every execute that writes blobs + // then we could just always set the chaining flag to on for blob send data + boolean chainedWritesFollowingSetLob) throws SqlException { + netAgent_.statementRequest_.writeExecute(this, + section, + parameterMetaData, + inputs, + numInputColumns, + outputExpected, + chainedWritesFollowingSetLob); + } + + + public void readExecute_() throws SqlException { + netAgent_.statementReply_.readExecute(preparedStatement_); + } + + public void writeOpenQuery_(Section section, + int fetchSize, + int resultSetType, + int numInputColumns, + ColumnMetaData parameterMetaData, + Object[] inputs) throws SqlException { + netAgent_.statementRequest_.writeOpenQuery(this, + section, + fetchSize, + resultSetType, + numInputColumns, + parameterMetaData, + inputs); + } + // super.readOpenQuery() + + public void writeDescribeInput_(Section section) throws SqlException { + netAgent_.statementRequest_.writeDescribeInput(this, section); + } + + public void readDescribeInput_() throws SqlException { + netAgent_.statementReply_.readDescribeInput(preparedStatement_); + } + + public void writeDescribeOutput_(Section section) throws SqlException { + netAgent_.statementRequest_.writeDescribeOutput(this, section); + } + + public void readDescribeOutput_() throws SqlException { + netAgent_.statementReply_.readDescribeOutput(preparedStatement_); + } }
