Connection.java
上传用户:tanyanyong
上传日期:2013-06-23
资源大小:1355k
文件大小:130k
源码类别:

电子政务应用

开发平台:

MultiPlatform

  1.      *
  2.      * @return DOCUMENT ME!
  3.      */
  4.     int getNetBufferLength() {
  5.         return this.netBufferLength;
  6.     }
  7.     boolean isPedantic() {
  8.         return this.pedantic;
  9.     }
  10.     void setReadInfoMsgEnabled(boolean flag) {
  11.         this.readInfoMsg = flag;
  12.     }
  13.     boolean isReadInfoMsgEnabled() {
  14.         return this.readInfoMsg;
  15.     }
  16.     int getServerMajorVersion() {
  17.         return this.io.getServerMajorVersion();
  18.     }
  19.     int getServerMinorVersion() {
  20.         return this.io.getServerMinorVersion();
  21.     }
  22.     int getServerSubMinorVersion() {
  23.         return this.io.getServerSubMinorVersion();
  24.     }
  25.     String getServerVersion() {
  26.         return this.io.getServerVersion();
  27.     }
  28.     String getURL() {
  29.         return this.myURL;
  30.     }
  31.     /**
  32.      * Set whether or not this connection should use SSL
  33.      *
  34.      * @param flag DOCUMENT ME!
  35.      */
  36.     void setUseSSL(boolean flag) {
  37.         this.useSSL = flag;
  38.     }
  39.     String getUser() {
  40.         return this.user;
  41.     }
  42.     boolean alwaysClearStream() {
  43.         return this.alwaysClearStream;
  44.     }
  45.     boolean continueBatchOnError() {
  46.         return this.continueBatchOnError;
  47.     }
  48.     /**
  49.      * Send a query to the server.  Returns one of the ResultSet objects. This
  50.      * is synchronized, so Statement's queries will be serialized.
  51.      *
  52.      * @param sql the SQL statement to be executed
  53.      * @param maxRowsToRetreive DOCUMENT ME!
  54.      * @param catalog DOCUMENT ME!
  55.      *
  56.      * @return a ResultSet holding the results
  57.      *
  58.      * @exception java.sql.SQLException if a database error occurs
  59.      */
  60.     ResultSet execSQL(String sql, int maxRowsToRetreive, String catalog)
  61.         throws java.sql.SQLException {
  62.         if (Driver.TRACE) {
  63.             Object[] args = { sql, new Integer(maxRowsToRetreive) };
  64.             Debug.methodCall(this, "execSQL", args);
  65.         }
  66.         return execSQL(sql, maxRowsToRetreive, null,
  67.             java.sql.ResultSet.CONCUR_READ_ONLY, catalog);
  68.     }
  69.     ResultSet execSQL(String sql, int maxRows, int resultSetType,
  70.         boolean streamResults, boolean queryIsSelectOnly, String catalog)
  71.         throws SQLException {
  72.         return execSQL(sql, maxRows, null, resultSetType, streamResults,
  73.             queryIsSelectOnly, catalog);
  74.     }
  75.     ResultSet execSQL(String sql, int maxRows, Buffer packet, String catalog)
  76.         throws java.sql.SQLException {
  77.         return execSQL(sql, maxRows, packet,
  78.             java.sql.ResultSet.CONCUR_READ_ONLY, catalog);
  79.     }
  80.     ResultSet execSQL(String sql, int maxRows, Buffer packet,
  81.         int resultSetType, String catalog) throws java.sql.SQLException {
  82.         return execSQL(sql, maxRows, packet, resultSetType, true, false, catalog);
  83.     }
  84.     ResultSet execSQL(String sql, int maxRows, Buffer packet,
  85.         int resultSetType, boolean streamResults, boolean queryIsSelectOnly,
  86.         String catalog) throws java.sql.SQLException {
  87.         if (Driver.TRACE) {
  88.             Object[] args = { sql, new Integer(maxRows), packet };
  89.             Debug.methodCall(this, "execSQL", args);
  90.         }
  91.         if ((sql == null) || (sql.length() == 0)) {
  92.             if (packet == null) {
  93.                 throw new SQLException("Query can not be null or empty",
  94.                     SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
  95.             }
  96.         }
  97.         //
  98.         // Fall-back if the master is back online if we've
  99.         // issued queriesBeforeRetryMaster queries since
  100.         // we failed over
  101.         //
  102.         synchronized (this.mutex) {
  103.             this.lastQueryFinishedTime = 0; // we're busy!
  104.             pingAndReconnect(false);
  105.             try {
  106.                 int realMaxRows = (maxRows == -1) ? MysqlDefs.MAX_ROWS : maxRows;
  107.                 if (packet == null) {
  108.                     String encoding = null;
  109.                     if (useUnicode()) {
  110.                         encoding = getEncoding();
  111.                     }
  112.                     return this.io.sqlQuery(sql, realMaxRows, encoding, this,
  113.                         resultSetType, streamResults, catalog);
  114.                 } else {
  115.                     return this.io.sqlQueryDirect(packet, realMaxRows, this,
  116.                         resultSetType, streamResults, catalog);
  117.                 }
  118.             } catch (java.sql.SQLException sqlE) {
  119.                 // don't clobber SQL exceptions
  120.                 String sqlState = sqlE.getSQLState();
  121.                 if ((sqlState != null)
  122.                         && sqlState.equals(
  123.                             SQLError.SQL_STATE_COMMUNICATION_LINK_FAILURE)) {
  124.                     cleanup(sqlE);
  125.                 }
  126.                 throw sqlE;
  127.             } catch (Exception ex) {
  128.                 if (ex instanceof IOException) {
  129.                     cleanup(ex);
  130.                 }
  131.                 String exceptionType = ex.getClass().getName();
  132.                 String exceptionMessage = ex.getMessage();
  133.                 if (!this.useParanoidErrorMessages()) {
  134.                     exceptionMessage += "nnNested Stack Trace:n";
  135.                     exceptionMessage += Util.stackTraceToString(ex);
  136.                 }
  137.                 throw new java.sql.SQLException(
  138.                     "Error during query: Unexpected Exception: "
  139.                     + exceptionType + " message given: " + exceptionMessage,
  140.                     SQLError.SQL_STATE_GENERAL_ERROR);
  141.             } finally {
  142.                 this.lastQueryFinishedTime = System.currentTimeMillis();
  143.             }
  144.         }
  145.     }
  146.     /**
  147.      * Has the maxRows value changed?
  148.      *
  149.      * @param stmt DOCUMENT ME!
  150.      */
  151.     void maxRowsChanged(Statement stmt) {
  152.         synchronized (this.mutex) {
  153.             if (this.statementsUsingMaxRows == null) {
  154.                 this.statementsUsingMaxRows = new HashMap();
  155.             }
  156.             this.statementsUsingMaxRows.put(stmt, stmt);
  157.             this.maxRowsChanged = true;
  158.         }
  159.     }
  160.     /**
  161.      * Called by statements on their .close() to let the connection know when
  162.      * it is safe to set the connection back to 'default' row limits.
  163.      *
  164.      * @param stmt the statement releasing it's max-rows requirement
  165.      *
  166.      * @throws SQLException if a database error occurs issuing the statement
  167.      *         that sets the limit default.
  168.      */
  169.     void unsetMaxRows(Statement stmt) throws SQLException {
  170.         synchronized (this.mutex) {
  171.             if (this.statementsUsingMaxRows != null) {
  172.                 Object found = this.statementsUsingMaxRows.remove(stmt);
  173.                 if ((found != null)
  174.                         && (this.statementsUsingMaxRows.size() == 0)) {
  175.                     execSQL("SET OPTION SQL_SELECT_LIMIT=DEFAULT", -1,
  176.                         this.database);
  177.                     this.maxRowsChanged = false;
  178.                 }
  179.             }
  180.         }
  181.     }
  182.     boolean useAnsiQuotedIdentifiers() {
  183.         return this.useAnsiQuotes;
  184.     }
  185.     boolean useHostsInPrivileges() {
  186.         return this.useHostsInPrivileges;
  187.     }
  188.     /**
  189.      * Has maxRows() been set?
  190.      *
  191.      * @return DOCUMENT ME!
  192.      */
  193.     boolean useMaxRows() {
  194.         synchronized (this.mutex) {
  195.             return this.maxRowsChanged;
  196.         }
  197.     }
  198.     boolean useStreamLengthsInPrepStmts() {
  199.         return this.useStreamLengthsInPrepStmts;
  200.     }
  201.     /**
  202.      * Sets state for a failed-over connection
  203.      *
  204.      * @throws SQLException DOCUMENT ME!
  205.      */
  206.     private void setFailedOverState() throws SQLException {
  207.         // FIXME: User Selectable?
  208.         setReadOnly(true);
  209.         this.queriesIssuedFailedOver = 0;
  210.         this.failedOver = true;
  211.         this.masterFailTimeMillis = System.currentTimeMillis();
  212.     }
  213.     private void checkClosed() throws SQLException {
  214.         if (this.isClosed) {
  215.             StringBuffer exceptionMessage = new StringBuffer();
  216.             exceptionMessage.append(
  217.                 "No operations allowed after connection closed.");
  218.             if (!this.paranoid) {
  219.                 if (this.forcedCloseReason != null) {
  220.                     exceptionMessage.append(
  221.                         "nnConnection was closed due to the following exception:");
  222.                     exceptionMessage.append(Util.stackTraceToString(
  223.                             this.forcedCloseReason));
  224.                 } else if (this.explicitCloseLocation != null) {
  225.                     exceptionMessage.append(
  226.                         "nnConnection was closed explicitly by the application at the following location:");
  227.                     exceptionMessage.append(Util.stackTraceToString(
  228.                             this.explicitCloseLocation));
  229.                 }
  230.             }
  231.             throw new SQLException(exceptionMessage.toString(), "08003");
  232.         }
  233.     }
  234.     /**
  235.      * If useUnicode flag is set and explicit client character encoding isn't
  236.      * specified then assign encoding from server if any.
  237.      *
  238.      * @throws SQLException DOCUMENT ME!
  239.      */
  240.     private void checkServerEncoding() throws SQLException {
  241.         if (this.doUnicode && (this.encoding != null)) {
  242.             // spec'd by client, don't map, but check
  243.             // for character encoding 'overlaps' when using
  244.             // pre-4.1 servers
  245.             if (!this.io.versionMeetsMinimum(4, 1, 0)) {
  246.                 if ("ISO8859_2".equals("this.encoding")) {
  247.                     throw new SQLException(
  248.                         "Character encoding 'ISO8859_2' specified in JDBC URL which maps to multiple MySQL character encodings:"
  249.                         + "nn" + "* 'latin2'n" + "* 'czech'n"
  250.                         + "* 'hungarian'n" + "* 'croat'n"
  251.                         + "nSpecify one of the above encodings using the 'mysqlEncoding' connection property.",
  252.                         SQLError.SQL_STATE_INVALID_CONNECTION_ATTRIBUTE);
  253.                 } else if ("ISO8859_13".equals("this.encoding")) {
  254.                     throw new SQLException(
  255.                         "Character encoding 'ISO8859_13' specified in JDBC URL which maps to multiple MySQL character encodings:"
  256.                         + "nn" + "* 'latvian'n" + "* 'latvian1'n"
  257.                         + "* 'estonia'n"
  258.                         + "nSpecify one of the above encodings using the 'mysqlEncoding' connection property.",
  259.                         SQLError.SQL_STATE_INVALID_CONNECTION_ATTRIBUTE);
  260.                 }
  261.             }
  262.             return;
  263.         }
  264.         this.mysqlEncodingName = (String) this.serverVariables.get(
  265.                 "character_set");
  266.         if (this.mysqlEncodingName == null) {
  267.             // must be 4.1.1 or newer?
  268.             this.mysqlEncodingName = (String) this.serverVariables.get(
  269.                     "character_set_client");
  270.         }
  271.         String javaEncodingName = null;
  272.         if (this.mysqlEncodingName != null) {
  273.             javaEncodingName = (String) charsetMap.get(this.mysqlEncodingName
  274.                     .toUpperCase());
  275.         }
  276.         //
  277.         // First check if we can do the encoding ourselves
  278.         //
  279.         if (!this.doUnicode && (javaEncodingName != null)) {
  280.             SingleByteCharsetConverter converter = getCharsetConverter(javaEncodingName);
  281.             if (converter != null) { // we know how to convert this ourselves
  282.                 this.doUnicode = true; // force the issue
  283.                 this.encoding = javaEncodingName;
  284.                 return;
  285.             }
  286.         }
  287.         //
  288.         // Now, try and find a Java I/O converter that can do
  289.         // the encoding for us
  290.         //
  291.         if (this.mysqlEncodingName != null) {
  292.             if (javaEncodingName == null) {
  293.                 // We don't have a mapping for it, so try
  294.                 // and canonicalize the name....
  295.                 if (Character.isLowerCase(this.mysqlEncodingName.charAt(0))) {
  296.                     char[] ach = this.mysqlEncodingName.toCharArray();
  297.                     ach[0] = Character.toUpperCase(this.mysqlEncodingName
  298.                             .charAt(0));
  299.                     this.encoding = new String(ach);
  300.                 }
  301.             }
  302.             //
  303.             // Attempt to use the encoding, and bail out if it
  304.             // can't be used
  305.             //
  306.             try {
  307.                 "abc".getBytes(javaEncodingName);
  308.                 this.encoding = javaEncodingName;
  309.                 this.doUnicode = true;
  310.             } catch (UnsupportedEncodingException UE) {
  311.                 throw new SQLException(
  312.                     "The driver can not map the character encoding '"
  313.                     + this.encoding + "' that your server is using "
  314.                     + "to a character encoding your JVM understands. You "
  315.                     + "can specify this mapping manually by adding "useUnicode=true" "
  316.                     + "as well as "characterEncoding=[an_encoding_your_jvm_understands]" "
  317.                     + "to your JDBC URL.",
  318.                     SQLError.SQL_STATE_INVALID_CONNECTION_ATTRIBUTE);
  319.             }
  320.         }
  321.     }
  322.     /**
  323.      * Set transaction isolation level to the value received from server if
  324.      * any. Is called by connectionInit(...)
  325.      *
  326.      * @throws SQLException DOCUMENT ME!
  327.      */
  328.     private void checkTransactionIsolationLevel() throws SQLException {
  329.         String txIsolationName = null;
  330.         if (this.io.versionMeetsMinimum(4, 0, 3)) {
  331.             txIsolationName = "tx_isolation";
  332.         } else {
  333.             txIsolationName = "transaction_isolation";
  334.         }
  335.         String s = (String) this.serverVariables.get(txIsolationName);
  336.         if (s != null) {
  337.             Integer intTI = (Integer) mapTransIsolationName2Value.get(s);
  338.             if (intTI != null) {
  339.                 isolationLevel = intTI.intValue();
  340.             }
  341.         }
  342.     }
  343.     /**
  344.      * Destroys this connection and any underlying resources
  345.      *
  346.      * @param cleanupReason DOCUMENT ME!
  347.      */
  348.     private void cleanup(Throwable cleanupReason) {
  349.         try {
  350.             if ((this.io != null) && !isClosed()) {
  351.                 realClose(false, false);
  352.             } else if (this.io != null) {
  353.                 this.io.forceClose();
  354.             }
  355.         } catch (SQLException sqlEx) {
  356.             // ignore, we're going away.
  357.         }
  358.         this.isClosed = true;
  359.         this.forcedCloseReason = cleanupReason;
  360.     }
  361.     private void detectFloatingPointStyle() throws SQLException {
  362.         java.sql.Statement stmt = null;
  363.         java.sql.ResultSet rs = null;
  364.         try {
  365.             stmt = createStatement();
  366.             if (stmt.getMaxRows() != 0) {
  367.                 stmt.setMaxRows(0);
  368.             }
  369.             rs = stmt.executeQuery(
  370.                     "select round('inf'), round('-inf'), round('nan')");
  371.             if (rs.next()) {
  372.                 String posInf = rs.getString(1);
  373.                 if ("inf".equalsIgnoreCase(posInf)) {
  374.                     this.positiveInfinityRep = "'inf'";
  375.                     this.positiveInfinityRepIsClipped = false;
  376.                 }
  377.                 String negInf = rs.getString(2);
  378.                 if ("-inf".equalsIgnoreCase(negInf)) {
  379.                     this.negativeInfinityRep = "'-inf'";
  380.                     this.negativeInfinityRepIsClipped = false;
  381.                 }
  382.                 String nan = rs.getString(3);
  383.                 if ("nan".equalsIgnoreCase(nan)) {
  384.                     this.notANumberRep = "'nan'";
  385.                     this.notANumberRepIsClipped = false;
  386.                 }
  387.             }
  388.             rs.close();
  389.             rs = null;
  390.             stmt.close();
  391.             stmt = null;
  392.         } catch (SQLException sqlEx) {
  393.             ; // ignore here, we default to lowest-common denominator
  394.         } finally {
  395.             if (rs != null) {
  396.                 try {
  397.                     rs.close();
  398.                 } catch (SQLException sqlEx) {
  399.                     ; // ignore
  400.                 }
  401.                 rs = null;
  402.             }
  403.             if (stmt != null) {
  404.                 try {
  405.                     stmt.close();
  406.                 } catch (SQLException sqlEx) {
  407.                     ; // ignore
  408.                 }
  409.                 stmt = null;
  410.             }
  411.         }
  412.     }
  413.     /**
  414.      * Initializes driver properties that come from URL or properties passed to
  415.      * the driver manager.
  416.      *
  417.      * @param info DOCUMENT ME!
  418.      *
  419.      * @throws SQLException DOCUMENT ME!
  420.      */
  421.     private void initializeDriverProperties(Properties info)
  422.         throws SQLException {
  423.         this.socketFactoryClassName = info.getProperty("socketFactory",
  424.                 DEFAULT_SOCKET_FACTORY);
  425.         this.useUnbufferedInput = "TRUE".equalsIgnoreCase(info.getProperty(
  426.                     "useUnbufferedInput"));
  427.         if (info.getProperty("cachePrepStmts") != null) {
  428.             this.cachePreparedStatements = info.getProperty("cachePrepStmts")
  429.                                                .equalsIgnoreCase("TRUE");
  430.             if (this.cachePreparedStatements) {
  431.                 if (info.getProperty("prepStmtCacheSize") != null) {
  432.                     try {
  433.                         this.preparedStatementCacheSize = Integer.parseInt(info
  434.                                 .getProperty("prepStmtCacheSize"));
  435.                         if (this.preparedStatementCacheSize < 0) {
  436.                             throw new SQLException("Connection property 'prepStmtCacheSize' must be a non-negative integer value.",
  437.                                 SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
  438.                         }
  439.                     } catch (NumberFormatException nfe) {
  440.                         throw new SQLException("Connection property 'prepStmtCacheSize' must be a non-negative integer value.",
  441.                             SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
  442.                     }
  443.                 }
  444.                 if (info.getProperty("prepStmtCacheSqlLimit") != null) {
  445.                     try {
  446.                         this.preparedStatementCacheMaxSqlSize = Integer
  447.                             .parseInt(info.getProperty("prepStmtCacheSqlLimit"));
  448.                         if (this.preparedStatementCacheMaxSqlSize < 0) {
  449.                             throw new SQLException("Connection property 'prepStmtCacheSqlLimit' must be a non-negative integer value.",
  450.                                 SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
  451.                         }
  452.                     } catch (NumberFormatException nfe) {
  453.                         throw new SQLException("Connection property 'prepStmtCacheSqlLimit' must be a non-negative integer value.",
  454.                             SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
  455.                     }
  456.                 }
  457.                 this.cachedPreparedStatementParams = new HashMap(this.preparedStatementCacheSize);
  458.             }
  459.         }
  460.         if (info.getProperty("alwaysClearStream") != null) {
  461.             this.alwaysClearStream = info.getProperty("alwaysClearStream")
  462.                                          .equalsIgnoreCase("TRUE");
  463.         }
  464.         if (info.getProperty("reconnectAtTxEnd") != null) {
  465.             this.reconnectAtTxEnd = info.getProperty("reconnectAtTxEnd")
  466.                                         .equalsIgnoreCase("TRUE");
  467.         }
  468.         if (info.getProperty("clobberStreamingResults") != null) {
  469.             this.clobberStreamingResults = info.getProperty(
  470.                     "clobberStreamingResults").equalsIgnoreCase("TRUE");
  471.         }
  472.         if (info.getProperty("strictUpdates") != null) {
  473.             this.strictUpdates = info.getProperty("strictUpdates")
  474.                                      .equalsIgnoreCase("TRUE");
  475.         }
  476.         if (info.getProperty("ignoreNonTxTables") != null) {
  477.             this.ignoreNonTxTables = info.getProperty("ignoreNonTxTables")
  478.                                          .equalsIgnoreCase("TRUE");
  479.         }
  480.         if (info.getProperty("secondsBeforeRetryMaster") != null) {
  481.             String secondsBeforeRetryStr = info.getProperty(
  482.                     "secondsBeforeRetryMaster");
  483.             try {
  484.                 int seconds = Integer.parseInt(secondsBeforeRetryStr);
  485.                 if (seconds < 1) {
  486.                     throw new SQLException("Illegal (< 1)  value '"
  487.                         + secondsBeforeRetryStr
  488.                         + "' for 'secondsBeforeRetryMaster'",
  489.                         SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
  490.                 }
  491.                 this.secondsBeforeRetryMaster = seconds;
  492.             } catch (NumberFormatException nfe) {
  493.                 throw new SQLException("Illegal non-numeric value '"
  494.                     + secondsBeforeRetryStr
  495.                     + "' for 'secondsBeforeRetryMaster'",
  496.                     SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
  497.             }
  498.         }
  499.         if (info.getProperty("queriesBeforeRetryMaster") != null) {
  500.             String queriesBeforeRetryStr = info.getProperty(
  501.                     "queriesBeforeRetryMaster");
  502.             try {
  503.                 this.queriesBeforeRetryMaster = Integer.parseInt(queriesBeforeRetryStr);
  504.             } catch (NumberFormatException nfe) {
  505.                 throw new SQLException("Illegal non-numeric value '"
  506.                     + queriesBeforeRetryStr
  507.                     + "' for 'queriesBeforeRetryMaster'",
  508.                     SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
  509.             }
  510.         }
  511.         if (info.getProperty("allowLoadLocalInfile") != null) {
  512.             this.allowLoadLocalInfile = info.getProperty("allowLoadLocalInfile")
  513.                                             .equalsIgnoreCase("TRUE");
  514.         }
  515.         if (info.getProperty("continueBatchOnError") != null) {
  516.             this.continueBatchOnError = info.getProperty("continueBatchOnError")
  517.                                             .equalsIgnoreCase("TRUE");
  518.         }
  519.         if (info.getProperty("pedantic") != null) {
  520.             this.pedantic = info.getProperty("pedantic").equalsIgnoreCase("TRUE");
  521.         }
  522.         if (info.getProperty("useStreamLengthsInPrepStmts") != null) {
  523.             this.useStreamLengthsInPrepStmts = info.getProperty(
  524.                     "useStreamLengthsInPrepStmts").equalsIgnoreCase("TRUE");
  525.         }
  526.         if (info.getProperty("useTimezone") != null) {
  527.             this.useTimezone = info.getProperty("useTimezone").equalsIgnoreCase("TRUE");
  528.         }
  529.         if (info.getProperty("relaxAutoCommit") != null) {
  530.             this.relaxAutoCommit = info.getProperty("relaxAutoCommit")
  531.                                        .equalsIgnoreCase("TRUE");
  532.         } else if (info.getProperty("relaxAutocommit") != null) {
  533.             this.relaxAutoCommit = info.getProperty("relaxAutocommit")
  534.                                        .equalsIgnoreCase("TRUE");
  535.         }
  536.         if (info.getProperty("paranoid") != null) {
  537.             this.paranoid = info.getProperty("paranoid").equalsIgnoreCase("TRUE");
  538.         }
  539.         if (info.getProperty("autoReconnect") != null) {
  540.             this.highAvailability = info.getProperty("autoReconnect")
  541.                                         .equalsIgnoreCase("TRUE");
  542.         }
  543.         if (info.getProperty("capitalizeTypeNames") != null) {
  544.             this.capitalizeDBMDTypes = info.getProperty("capitalizeTypeNames")
  545.                                            .equalsIgnoreCase("TRUE");
  546.         }
  547.         if (info.getProperty("ultraDevHack") != null) {
  548.             this.useUltraDevWorkAround = info.getProperty("ultraDevHack")
  549.                                              .equalsIgnoreCase("TRUE");
  550.         }
  551.         if (info.getProperty("strictFloatingPoint") != null) {
  552.             this.strictFloatingPoint = info.getProperty("strictFloatingPoint")
  553.                                            .equalsIgnoreCase("TRUE");
  554.         }
  555.         if (info.getProperty("useSSL") != null) {
  556.             this.useSSL = info.getProperty("useSSL").equalsIgnoreCase("TRUE");
  557.         }
  558.         if (info.getProperty("useCompression") != null) {
  559.             this.useCompression = info.getProperty("useCompression")
  560.                                       .equalsIgnoreCase("TRUE");
  561.         }
  562.         if (info.getProperty("socketTimeout") != null) {
  563.             try {
  564.                 int n = Integer.parseInt(info.getProperty("socketTimeout"));
  565.                 if (n < 0) {
  566.                     throw new SQLException("socketTimeout can not " + "be < 0",
  567.                         SQLError.SQL_STATE_INVALID_CONNECTION_ATTRIBUTE);
  568.                 }
  569.                 this.socketTimeout = n;
  570.             } catch (NumberFormatException NFE) {
  571.                 throw new SQLException("Illegal parameter '"
  572.                     + info.getProperty("socketTimeout") + "' for socketTimeout",
  573.                     SQLError.SQL_STATE_INVALID_CONNECTION_ATTRIBUTE);
  574.             }
  575.         }
  576.         if (this.highAvailability) {
  577.             if (info.getProperty("maxReconnects") != null) {
  578.                 try {
  579.                     int n = Integer.parseInt(info.getProperty("maxReconnects"));
  580.                     this.maxReconnects = n;
  581.                 } catch (NumberFormatException NFE) {
  582.                     throw new SQLException("Illegal parameter '"
  583.                         + info.getProperty("maxReconnects")
  584.                         + "' for maxReconnects",
  585.                         SQLError.SQL_STATE_INVALID_CONNECTION_ATTRIBUTE);
  586.                 }
  587.             }
  588.             if (info.getProperty("initialTimeout") != null) {
  589.                 try {
  590.                     double n = Integer.parseInt(info.getProperty(
  591.                                 "initialTimeout"));
  592.                     this.initialTimeout = n;
  593.                 } catch (NumberFormatException NFE) {
  594.                     throw new SQLException("Illegal parameter '"
  595.                         + info.getProperty("initialTimeout")
  596.                         + "' for initialTimeout",
  597.                         SQLError.SQL_STATE_INVALID_CONNECTION_ATTRIBUTE);
  598.                 }
  599.             }
  600.         }
  601.         if (info.getProperty("maxRows") != null) {
  602.             try {
  603.                 int n = Integer.parseInt(info.getProperty("maxRows"));
  604.                 if (n == 0) {
  605.                     n = -1;
  606.                 }
  607.                 // adjust so that it will become MysqlDefs.MAX_ROWS
  608.                 // in execSQL()
  609.                 this.maxRows = n;
  610.                 this.maxRowsChanged = true;
  611.             } catch (NumberFormatException NFE) {
  612.                 throw new SQLException("Illegal parameter '"
  613.                     + info.getProperty("maxRows") + "' for maxRows",
  614.                     SQLError.SQL_STATE_INVALID_CONNECTION_ATTRIBUTE);
  615.             }
  616.         }
  617.         if (info.getProperty("useHostsInPrivileges") != null) {
  618.             this.useHostsInPrivileges = info.getProperty("useHostsInPrivileges")
  619.                                             .equalsIgnoreCase("TRUE");
  620.         }
  621.         if (info.getProperty("interactiveClient") != null) {
  622.             this.isInteractiveClient = info.getProperty("interactiveClient")
  623.                                            .equalsIgnoreCase("TRUE");
  624.         }
  625.         if (info.getProperty("useUnicode") != null) {
  626.             this.doUnicode = info.getProperty("useUnicode").equalsIgnoreCase("TRUE");
  627.         }
  628.         if (this.doUnicode) {
  629.             if (info.getProperty("mysqlEncoding") != null) {
  630.                 this.mysqlEncodingName = info.getProperty("mysqlEncoding");
  631.             }
  632.             if (info.getProperty("characterEncoding") != null) {
  633.                 this.encoding = info.getProperty("characterEncoding");
  634.                 // Attempt to use the encoding, and bail out if it
  635.                 // can't be used
  636.                 try {
  637.                     String testString = "abc";
  638.                     testString.getBytes(this.encoding);
  639.                 } catch (UnsupportedEncodingException UE) {
  640.                     throw new SQLException("Unsupported character "
  641.                         + "encoding '" + this.encoding + "'.",
  642.                         SQLError.SQL_STATE_INVALID_CONNECTION_ATTRIBUTE);
  643.                 }
  644.             }
  645.         }
  646.     }
  647.     /**
  648.      * Sets varying properties that depend on server information. Called once
  649.      * we have connected to the server.
  650.      *
  651.      * @param info DOCUMENT ME!
  652.      *
  653.      * @throws SQLException DOCUMENT ME!
  654.      */
  655.     private void initializePropsFromServer(Properties info)
  656.         throws SQLException {
  657.         if (this.io.versionMeetsMinimum(3, 22, 1)) {
  658.             this.useFastPing = true;
  659.         }
  660.         detectFloatingPointStyle();
  661.         this.serverVariables.clear();
  662.         //
  663.         // If version is greater than 3.21.22 get the server
  664.         // variables.
  665.         if (this.io.versionMeetsMinimum(3, 21, 22)) {
  666.             com.mysql.jdbc.Statement stmt = null;
  667.             com.mysql.jdbc.ResultSet results = null;
  668.             try {
  669.                 stmt = (com.mysql.jdbc.Statement) createStatement();
  670.                 if (stmt.getMaxRows() != 0) {
  671.                     stmt.setMaxRows(0);
  672.                 }
  673.                 results = (com.mysql.jdbc.ResultSet) stmt.executeQuery(
  674.                         "SHOW VARIABLES");
  675.                 while (results.next()) {
  676.                     this.serverVariables.put(results.getString(1),
  677.                         results.getString(2));
  678.                 }
  679.             } catch (java.sql.SQLException e) {
  680.                 throw e;
  681.             } finally {
  682.                 if (results != null) {
  683.                     try {
  684.                         results.close();
  685.                     } catch (java.sql.SQLException sqlE) {
  686.                         ;
  687.                     }
  688.                 }
  689.                 if (stmt != null) {
  690.                     try {
  691.                         stmt.close();
  692.                     } catch (java.sql.SQLException sqlE) {
  693.                         ;
  694.                     }
  695.                 }
  696.             }
  697.             String lowerCaseTables = (String) serverVariables.get(
  698.                     "lower_case_table_names");
  699.             this.lowerCaseTableNames = "on".equalsIgnoreCase(lowerCaseTables)
  700.                 || "1".equalsIgnoreCase(lowerCaseTables)
  701. || "2".equalsIgnoreCase(lowerCaseTables);
  702.             if (this.useTimezone
  703.                     && this.serverVariables.containsKey("timezone")) {
  704.                 // user can specify/override as property
  705.                 String canoncicalTimezone = this.props.getProperty(
  706.                         "serverTimezone");
  707.                 if ((canoncicalTimezone == null)
  708.                         || (canoncicalTimezone.length() == 0)) {
  709.                     String serverTimezoneStr = (String) this.serverVariables
  710.                         .get("timezone");
  711.                     try {
  712.                         canoncicalTimezone = TimeUtil.getCanoncialTimezone(serverTimezoneStr);
  713.                         if (canoncicalTimezone == null) {
  714.                             throw new SQLException("Can't map timezone '"
  715.                                 + serverTimezoneStr + "' to "
  716.                                 + " canonical timezone.",
  717.                                 SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
  718.                         }
  719.                     } catch (IllegalArgumentException iae) {
  720.                         throw new SQLException(iae.getMessage(),
  721.                             SQLError.SQL_STATE_GENERAL_ERROR);
  722.                     }
  723.                 }
  724.                 serverTimezone = TimeZone.getTimeZone(canoncicalTimezone);
  725.                 //
  726.                 // The Calendar class has the behavior of mapping
  727.                 // unknown timezones to 'GMT' instead of throwing an 
  728.                 // exception, so we must check for this...
  729.                 //
  730.                 if (!canoncicalTimezone.equalsIgnoreCase("GMT")
  731.                         && serverTimezone.getID().equals("GMT")) {
  732.                     throw new SQLException("No timezone mapping entry for '"
  733.                         + canoncicalTimezone + "'",
  734.                         SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
  735.                 }
  736.             }
  737.             if (this.serverVariables.containsKey("max_allowed_packet")) {
  738.                 this.maxAllowedPacket = Integer.parseInt((String) this.serverVariables
  739.                         .get("max_allowed_packet"));
  740.             }
  741.             if (this.serverVariables.containsKey("net_buffer_length")) {
  742.                 this.netBufferLength = Integer.parseInt((String) this.serverVariables
  743.                         .get("net_buffer_length"));
  744.             }
  745.             checkTransactionIsolationLevel();
  746.             checkServerEncoding();
  747.             this.io.checkForCharsetMismatch();
  748.         }
  749.         if (this.io.versionMeetsMinimum(3, 23, 15)) {
  750.             this.transactionsSupported = true;
  751.             setAutoCommit(true); // to override anything
  752.                                  // the server is set to...reqd
  753.                                  // by JDBC spec.
  754.         } else {
  755.             this.transactionsSupported = false;
  756.         }
  757.         if (this.io.versionMeetsMinimum(3, 23, 36)) {
  758.             this.hasIsolationLevels = true;
  759.         } else {
  760.             this.hasIsolationLevels = false;
  761.         }
  762.         // Start logging perf/profile data if the user has requested it.
  763.         String profileSql = info.getProperty("profileSql");
  764.         if ((profileSql != null) && profileSql.trim().equalsIgnoreCase("true")) {
  765.             this.io.setProfileSql(true);
  766.         } else {
  767.             this.io.setProfileSql(false);
  768.         }
  769.         this.hasQuotedIdentifiers = this.io.versionMeetsMinimum(3, 23, 6);
  770.         if (this.serverVariables.containsKey("sql_mode")) {
  771.             int sqlMode = 0;
  772.             try {
  773.                 sqlMode = Integer.parseInt((String) this.serverVariables.get(
  774.                             "sql_mode"));
  775.             } catch (NumberFormatException nfe) {
  776.                 sqlMode = 0;
  777.             }
  778.             if ((sqlMode & 4) > 0) {
  779.                 this.useAnsiQuotes = true;
  780.             } else {
  781.                 this.useAnsiQuotes = false;
  782.             }
  783.         }
  784.         //
  785.         // Setup client character set for MySQL-4.1 and newer
  786.         //
  787.         if (this.io.versionMeetsMinimum(4, 1, 0) && useUnicode()
  788.                 && (getEncoding() != null)) {
  789.             if (getEncoding().equalsIgnoreCase("UTF-8")
  790.                     || getEncoding().equalsIgnoreCase("UTF8")) {
  791.                 // charset names are case-sensitive
  792.                 execSQL("SET NAMES utf8", -1, this.database);
  793.             } else {
  794.                 String namesEncoding = this.mysqlEncodingName;
  795.                 if ("koi8_ru".equals(this.mysqlEncodingName)) {
  796.                     // This has a _different_ name in 4.1...
  797.                     namesEncoding = "ko18r";
  798.                 }
  799.                 if (namesEncoding != null) {
  800.                     execSQL("SET NAMES " + namesEncoding, -1, this.database);
  801.                 }
  802.             }
  803.         }
  804.         this.io.resetMaxBuf();
  805.     }
  806.     /**
  807.      * Loads the mapping between MySQL character sets and Java character sets
  808.      */
  809.     private static void loadCharacterSetMapping() {
  810.         multibyteCharsetsMap = new HashMap();
  811.         Iterator multibyteCharsets = CharsetMapping.MULTIBYTE_CHARSETS.keySet()
  812.                                                                       .iterator();
  813.         while (multibyteCharsets.hasNext()) {
  814.             String charset = ((String) multibyteCharsets.next()).toUpperCase();
  815.             multibyteCharsetsMap.put(charset, charset);
  816.         }
  817.         //
  818.         // Now change all server encodings to upper-case to "future-proof"
  819.         // this mapping
  820.         //
  821.         Iterator keys = CharsetMapping.CHARSETMAP.keySet().iterator();
  822.         charsetMap = new HashMap();
  823.         while (keys.hasNext()) {
  824.             String mysqlCharsetName = ((String) keys.next()).trim();
  825.             String javaCharsetName = CharsetMapping.CHARSETMAP.get(mysqlCharsetName)
  826.                                                               .toString().trim();
  827.             charsetMap.put(mysqlCharsetName.toUpperCase(), javaCharsetName);
  828.             charsetMap.put(mysqlCharsetName, javaCharsetName);
  829.         }
  830.     }
  831.     private boolean getUseUltraDevWorkAround() {
  832.         return useUltraDevWorkAround;
  833.     }
  834.     // *********************************************************************
  835.     //
  836.     //                END OF PUBLIC INTERFACE
  837.     //
  838.     // *********************************************************************
  839.     /**
  840.      * Detect if the connection is still good
  841.      *
  842.      * @throws Exception DOCUMENT ME!
  843.      */
  844.     private void ping() throws Exception {
  845.         if (this.useFastPing) {
  846.             this.io.sendCommand(MysqlDefs.PING, null, null);
  847.         } else {
  848.             this.io.sqlQuery(PING_COMMAND, MysqlDefs.MAX_ROWS, this.encoding,
  849.                 this, java.sql.ResultSet.CONCUR_READ_ONLY, false, this.database);
  850.         }
  851.     }
  852.     private void pingAndReconnect(boolean ignoreAutoCommitSetting)
  853.         throws SQLException {
  854.         boolean localAutoCommit = this.autoCommit;
  855.         // We use this to catch the 'edge' case
  856.         // of autoReconnect going from true->false
  857.         //
  858.         if (ignoreAutoCommitSetting) {
  859.             localAutoCommit = true;
  860.         }
  861.         if (this.failedOver && localAutoCommit) {
  862.             this.queriesIssuedFailedOver++;
  863.             if (shouldFallBack()) {
  864.                 createNewIO(true);
  865.                 String connectedHost = this.io.getHost();
  866.                 if ((connectedHost != null)
  867.                         && this.hostList.get(0).equals(connectedHost)) {
  868.                     this.failedOver = false;
  869.                     this.queriesIssuedFailedOver = 0;
  870.                     setReadOnly(false);
  871.                 }
  872.             }
  873.         }
  874.         if ((this.highAvailability || this.failedOver) && localAutoCommit) {
  875.             try {
  876.                 ping();
  877.             } catch (Exception Ex) {
  878.                 createNewIO(true);
  879.             }
  880.         }
  881.     }
  882.     private void rollbackNoChecks() throws SQLException {
  883.         execSQL("rollback", -1, null);
  884.     }
  885.     /**
  886.      * Should we try to connect back to the master? We try when we've been
  887.      * failed over >= this.secondsBeforeRetryMaster _or_ we've issued >
  888.      * this.queriesIssuedFailedOver
  889.      *
  890.      * @return DOCUMENT ME!
  891.      */
  892.     private boolean shouldFallBack() {
  893.         long secondsSinceFailedOver = (System.currentTimeMillis()
  894.             - this.masterFailTimeMillis) / 1000;
  895.         return ((secondsSinceFailedOver >= this.secondsBeforeRetryMaster)
  896.         || ((this.queriesIssuedFailedOver % this.queriesBeforeRetryMaster) == 0));
  897.     }
  898.     /**
  899.      * Wrapper class for UltraDev CallableStatements that are really
  900.      * PreparedStatments. Nice going, UltraDev developers.
  901.      */
  902.     class UltraDevWorkAround implements java.sql.CallableStatement {
  903.         private java.sql.PreparedStatement delegate = null;
  904.         UltraDevWorkAround(java.sql.PreparedStatement pstmt) {
  905.             delegate = pstmt;
  906.         }
  907.         public void setArray(int p1, final java.sql.Array p2)
  908.             throws java.sql.SQLException {
  909.             delegate.setArray(p1, p2);
  910.         }
  911.         public java.sql.Array getArray(int p1) throws java.sql.SQLException {
  912.             throw new SQLException("Not supported");
  913.         }
  914.         /**
  915.          * @see CallableStatement#getArray(String)
  916.          */
  917.         public java.sql.Array getArray(String arg0) throws SQLException {
  918.             throw new NotImplemented();
  919.         }
  920.         public void setAsciiStream(int p1, final java.io.InputStream p2, int p3)
  921.             throws java.sql.SQLException {
  922.             delegate.setAsciiStream(p1, p2, p3);
  923.         }
  924.         /**
  925.          * @see CallableStatement#setAsciiStream(String, InputStream, int)
  926.          */
  927.         public void setAsciiStream(String arg0, InputStream arg1, int arg2)
  928.             throws SQLException {
  929.             throw new NotImplemented();
  930.         }
  931.         public void setBigDecimal(int p1, final java.math.BigDecimal p2)
  932.             throws java.sql.SQLException {
  933.             delegate.setBigDecimal(p1, p2);
  934.         }
  935.         /**
  936.          * @see CallableStatement#setBigDecimal(String, BigDecimal)
  937.          */
  938.         public void setBigDecimal(String arg0, BigDecimal arg1)
  939.             throws SQLException {
  940.             throw new NotImplemented();
  941.         }
  942.         public java.math.BigDecimal getBigDecimal(int p1)
  943.             throws java.sql.SQLException {
  944.             throw new SQLException("Not supported");
  945.         }
  946.         public java.math.BigDecimal getBigDecimal(int p1, int p2)
  947.             throws java.sql.SQLException {
  948.             throw new SQLException("Not supported");
  949.         }
  950.         /**
  951.          * @see CallableStatement#getBigDecimal(String)
  952.          */
  953.         public BigDecimal getBigDecimal(String arg0) throws SQLException {
  954.             return null;
  955.         }
  956.         public void setBinaryStream(int p1, final java.io.InputStream p2, int p3)
  957.             throws java.sql.SQLException {
  958.             delegate.setBinaryStream(p1, p2, p3);
  959.         }
  960.         /**
  961.          * @see CallableStatement#setBinaryStream(String, InputStream, int)
  962.          */
  963.         public void setBinaryStream(String arg0, InputStream arg1, int arg2)
  964.             throws SQLException {
  965.             throw new NotImplemented();
  966.         }
  967.         public void setBlob(int p1, final java.sql.Blob p2)
  968.             throws java.sql.SQLException {
  969.             delegate.setBlob(p1, p2);
  970.         }
  971.         public java.sql.Blob getBlob(int p1) throws java.sql.SQLException {
  972.             throw new SQLException("Not supported");
  973.         }
  974.         /**
  975.          * @see CallableStatement#getBlob(String)
  976.          */
  977.         public java.sql.Blob getBlob(String arg0) throws SQLException {
  978.             throw new NotImplemented();
  979.         }
  980.         public void setBoolean(int p1, boolean p2) throws java.sql.SQLException {
  981.             delegate.setBoolean(p1, p2);
  982.         }
  983.         /**
  984.          * @see CallableStatement#setBoolean(String, boolean)
  985.          */
  986.         public void setBoolean(String arg0, boolean arg1)
  987.             throws SQLException {
  988.             throw new NotImplemented();
  989.         }
  990.         public boolean getBoolean(int p1) throws java.sql.SQLException {
  991.             throw new SQLException("Not supported");
  992.         }
  993.         /**
  994.          * @see CallableStatement#getBoolean(String)
  995.          */
  996.         public boolean getBoolean(String arg0) throws SQLException {
  997.             throw new NotImplemented();
  998.         }
  999.         public void setByte(int p1, byte p2) throws java.sql.SQLException {
  1000.             delegate.setByte(p1, p2);
  1001.         }
  1002.         /**
  1003.          * @see CallableStatement#setByte(String, byte)
  1004.          */
  1005.         public void setByte(String arg0, byte arg1) throws SQLException {
  1006.             throw new NotImplemented();
  1007.         }
  1008.         public byte getByte(int p1) throws java.sql.SQLException {
  1009.             throw new SQLException("Not supported");
  1010.         }
  1011.         /**
  1012.          * @see CallableStatement#getByte(String)
  1013.          */
  1014.         public byte getByte(String arg0) throws SQLException {
  1015.             throw new NotImplemented();
  1016.         }
  1017.         public void setBytes(int p1, byte[] p2) throws java.sql.SQLException {
  1018.             delegate.setBytes(p1, p2);
  1019.         }
  1020.         /**
  1021.          * @see CallableStatement#setBytes(String, byte[])
  1022.          */
  1023.         public void setBytes(String arg0, byte[] arg1)
  1024.             throws SQLException {
  1025.             throw new NotImplemented();
  1026.         }
  1027.         public byte[] getBytes(int p1) throws java.sql.SQLException {
  1028.             throw new SQLException("Not supported");
  1029.         }
  1030.         /**
  1031.          * @see CallableStatement#getBytes(String)
  1032.          */
  1033.         public byte[] getBytes(String arg0) throws SQLException {
  1034.             throw new NotImplemented();
  1035.         }
  1036.         public void setCharacterStream(int p1, final java.io.Reader p2, int p3)
  1037.             throws java.sql.SQLException {
  1038.             delegate.setCharacterStream(p1, p2, p3);
  1039.         }
  1040.         /**
  1041.          * @see CallableStatement#setCharacterStream(String, Reader, int)
  1042.          */
  1043.         public void setCharacterStream(String arg0, Reader arg1, int arg2)
  1044.             throws SQLException {
  1045.             throw new NotImplemented();
  1046.         }
  1047.         public void setClob(int p1, final java.sql.Clob p2)
  1048.             throws java.sql.SQLException {
  1049.             delegate.setClob(p1, p2);
  1050.         }
  1051.         public java.sql.Clob getClob(int p1) throws java.sql.SQLException {
  1052.             throw new SQLException("Not supported");
  1053.         }
  1054.         /**
  1055.          * @see CallableStatement#getClob(String)
  1056.          */
  1057.         public Clob getClob(String arg0) throws SQLException {
  1058.             throw new NotImplemented();
  1059.         }
  1060.         public java.sql.Connection getConnection() throws java.sql.SQLException {
  1061.             return delegate.getConnection();
  1062.         }
  1063.         public void setCursorName(java.lang.String p1)
  1064.             throws java.sql.SQLException {
  1065.             throw new SQLException("Not supported");
  1066.         }
  1067.         public void setDate(int p1, final java.sql.Date p2)
  1068.             throws java.sql.SQLException {
  1069.             delegate.setDate(p1, p2);
  1070.         }
  1071.         public void setDate(int p1, final java.sql.Date p2,
  1072.             final java.util.Calendar p3) throws java.sql.SQLException {
  1073.             delegate.setDate(p1, p2, p3);
  1074.         }
  1075.         /**
  1076.          * @see CallableStatement#setDate(String, Date, Calendar)
  1077.          */
  1078.         public void setDate(String arg0, Date arg1, Calendar arg2)
  1079.             throws SQLException {
  1080.             throw new NotImplemented();
  1081.         }
  1082.         /**
  1083.          * @see CallableStatement#setDate(String, Date)
  1084.          */
  1085.         public void setDate(String arg0, Date arg1) throws SQLException {
  1086.             throw new NotImplemented();
  1087.         }
  1088.         public java.sql.Date getDate(int p1) throws java.sql.SQLException {
  1089.             throw new SQLException("Not supported");
  1090.         }
  1091.         public java.sql.Date getDate(int p1, final java.util.Calendar p2)
  1092.             throws java.sql.SQLException {
  1093.             throw new SQLException("Not supported");
  1094.         }
  1095.         /**
  1096.          * @see CallableStatement#getDate(String, Calendar)
  1097.          */
  1098.         public Date getDate(String arg0, Calendar arg1)
  1099.             throws SQLException {
  1100.             throw new NotImplemented();
  1101.         }
  1102.         /**
  1103.          * @see CallableStatement#getDate(String)
  1104.          */
  1105.         public Date getDate(String arg0) throws SQLException {
  1106.             throw new NotImplemented();
  1107.         }
  1108.         public void setDouble(int p1, double p2) throws java.sql.SQLException {
  1109.             delegate.setDouble(p1, p2);
  1110.         }
  1111.         /**
  1112.          * @see CallableStatement#setDouble(String, double)
  1113.          */
  1114.         public void setDouble(String arg0, double arg1)
  1115.             throws SQLException {
  1116.             throw new NotImplemented();
  1117.         }
  1118.         public double getDouble(int p1) throws java.sql.SQLException {
  1119.             throw new SQLException("Not supported");
  1120.         }
  1121.         /**
  1122.          * @see CallableStatement#getDouble(String)
  1123.          */
  1124.         public double getDouble(String arg0) throws SQLException {
  1125.             throw new NotImplemented();
  1126.         }
  1127.         public void setEscapeProcessing(boolean p1)
  1128.             throws java.sql.SQLException {
  1129.             delegate.setEscapeProcessing(p1);
  1130.         }
  1131.         public void setFetchDirection(int p1) throws java.sql.SQLException {
  1132.             delegate.setFetchDirection(p1);
  1133.         }
  1134.         public int getFetchDirection() throws java.sql.SQLException {
  1135.             return delegate.getFetchDirection();
  1136.         }
  1137.         public void setFetchSize(int p1) throws java.sql.SQLException {
  1138.             delegate.setFetchSize(p1);
  1139.         }
  1140.         public int getFetchSize() throws java.sql.SQLException {
  1141.             return delegate.getFetchSize();
  1142.         }
  1143.         public void setFloat(int p1, float p2) throws java.sql.SQLException {
  1144.             delegate.setFloat(p1, p2);
  1145.         }
  1146.         /**
  1147.          * @see CallableStatement#setFloat(String, float)
  1148.          */
  1149.         public void setFloat(String arg0, float arg1) throws SQLException {
  1150.             throw new NotImplemented();
  1151.         }
  1152.         public float getFloat(int p1) throws java.sql.SQLException {
  1153.             throw new SQLException("Not supported");
  1154.         }
  1155.         /**
  1156.          * @see CallableStatement#getFloat(String)
  1157.          */
  1158.         public float getFloat(String arg0) throws SQLException {
  1159.             throw new NotImplemented();
  1160.         }
  1161.         /**
  1162.          * @see Statement#getGeneratedKeys()
  1163.          */
  1164.         public java.sql.ResultSet getGeneratedKeys() throws SQLException {
  1165.             return delegate.getGeneratedKeys();
  1166.         }
  1167.         public void setInt(int p1, int p2) throws java.sql.SQLException {
  1168.             delegate.setInt(p1, p2);
  1169.         }
  1170.         /**
  1171.          * @see CallableStatement#setInt(String, int)
  1172.          */
  1173.         public void setInt(String arg0, int arg1) throws SQLException {
  1174.             throw new NotImplemented();
  1175.         }
  1176.         public int getInt(int p1) throws java.sql.SQLException {
  1177.             throw new SQLException("Not supported");
  1178.         }
  1179.         /**
  1180.          * @see CallableStatement#getInt(String)
  1181.          */
  1182.         public int getInt(String arg0) throws SQLException {
  1183.             throw new NotImplemented();
  1184.         }
  1185.         public void setLong(int p1, long p2) throws java.sql.SQLException {
  1186.             delegate.setLong(p1, p2);
  1187.         }
  1188.         /**
  1189.          * @see CallableStatement#setLong(String, long)
  1190.          */
  1191.         public void setLong(String arg0, long arg1) throws SQLException {
  1192.             throw new NotImplemented();
  1193.         }
  1194.         public long getLong(int p1) throws java.sql.SQLException {
  1195.             throw new SQLException("Not supported");
  1196.         }
  1197.         /**
  1198.          * @see CallableStatement#getLong(String)
  1199.          */
  1200.         public long getLong(String arg0) throws SQLException {
  1201.             throw new NotImplemented();
  1202.         }
  1203.         public void setMaxFieldSize(int p1) throws java.sql.SQLException {
  1204.             delegate.setMaxFieldSize(p1);
  1205.         }
  1206.         public int getMaxFieldSize() throws java.sql.SQLException {
  1207.             return delegate.getMaxFieldSize();
  1208.         }
  1209.         public void setMaxRows(int p1) throws java.sql.SQLException {
  1210.             delegate.setMaxRows(p1);
  1211.         }
  1212.         public int getMaxRows() throws java.sql.SQLException {
  1213.             return delegate.getMaxRows();
  1214.         }
  1215.         public java.sql.ResultSetMetaData getMetaData()
  1216.             throws java.sql.SQLException {
  1217.             throw new SQLException("Not supported");
  1218.         }
  1219.         public boolean getMoreResults() throws java.sql.SQLException {
  1220.             return delegate.getMoreResults();
  1221.         }
  1222.         /**
  1223.          * @see Statement#getMoreResults(int)
  1224.          */
  1225.         public boolean getMoreResults(int arg0) throws SQLException {
  1226.             return delegate.getMoreResults();
  1227.         }
  1228.         public void setNull(int p1, int p2) throws java.sql.SQLException {
  1229.             delegate.setNull(p1, p2);
  1230.         }
  1231.         public void setNull(int p1, int p2, java.lang.String p3)
  1232.             throws java.sql.SQLException {
  1233.             delegate.setNull(p1, p2, p3);
  1234.         }
  1235.         /**
  1236.          * @see CallableStatement#setNull(String, int, String)
  1237.          */
  1238.         public void setNull(String arg0, int arg1, String arg2)
  1239.             throws SQLException {
  1240.             throw new NotImplemented();
  1241.         }
  1242.         /**
  1243.          * @see CallableStatement#setNull(String, int)
  1244.          */
  1245.         public void setNull(String arg0, int arg1) throws SQLException {
  1246.             throw new NotImplemented();
  1247.         }
  1248.         public void setObject(int p1, final java.lang.Object p2)
  1249.             throws java.sql.SQLException {
  1250.             delegate.setObject(p1, p2);
  1251.         }
  1252.         public void setObject(int p1, final java.lang.Object p2, int p3)
  1253.             throws java.sql.SQLException {
  1254.             delegate.setObject(p1, p2, p3);
  1255.         }
  1256.         public void setObject(int p1, final java.lang.Object p2, int p3, int p4)
  1257.             throws java.sql.SQLException {
  1258.             delegate.setObject(p1, p2, p3, p4);
  1259.         }
  1260.         /**
  1261.          * @see CallableStatement#setObject(String, Object, int, int)
  1262.          */
  1263.         public void setObject(String arg0, Object arg1, int arg2, int arg3)
  1264.             throws SQLException {
  1265.             throw new NotImplemented();
  1266.         }
  1267.         /**
  1268.          * @see CallableStatement#setObject(String, Object, int)
  1269.          */
  1270.         public void setObject(String arg0, Object arg1, int arg2)
  1271.             throws SQLException {
  1272.             throw new NotImplemented();
  1273.         }
  1274.         /**
  1275.          * @see CallableStatement#setObject(String, Object)
  1276.          */
  1277.         public void setObject(String arg0, Object arg1)
  1278.             throws SQLException {
  1279.             throw new NotImplemented();
  1280.         }
  1281.         public java.lang.Object getObject(int p1) throws java.sql.SQLException {
  1282.             throw new SQLException("Not supported");
  1283.         }
  1284.         public java.lang.Object getObject(int p1, final java.util.Map p2)
  1285.             throws java.sql.SQLException {
  1286.             throw new SQLException("Not supported");
  1287.         }
  1288.         /**
  1289.          * @see CallableStatement#getObject(String, Map)
  1290.          */
  1291.         public Object getObject(String arg0, Map arg1)
  1292.             throws SQLException {
  1293.             throw new NotImplemented();
  1294.         }
  1295.         /**
  1296.          * @see CallableStatement#getObject(String)
  1297.          */
  1298.         public Object getObject(String arg0) throws SQLException {
  1299.             throw new NotImplemented();
  1300.         }
  1301.         /**
  1302.          * @see PreparedStatement#getParameterMetaData()
  1303.          */
  1304.         public ParameterMetaData getParameterMetaData()
  1305.             throws SQLException {
  1306.             return delegate.getParameterMetaData();
  1307.         }
  1308.         public void setQueryTimeout(int p1) throws java.sql.SQLException {
  1309.             throw new SQLException("Not supported");
  1310.         }
  1311.         public int getQueryTimeout() throws java.sql.SQLException {
  1312.             return delegate.getQueryTimeout();
  1313.         }
  1314.         public void setRef(int p1, final java.sql.Ref p2)
  1315.             throws java.sql.SQLException {
  1316.             throw new SQLException("Not supported");
  1317.         }
  1318.         public java.sql.Ref getRef(int p1) throws java.sql.SQLException {
  1319.             throw new SQLException("Not supported");
  1320.         }
  1321.         /**
  1322.          * @see CallableStatement#getRef(String)
  1323.          */
  1324.         public Ref getRef(String arg0) throws SQLException {
  1325.             throw new NotImplemented();
  1326.         }
  1327.         public java.sql.ResultSet getResultSet() throws java.sql.SQLException {
  1328.             return delegate.getResultSet();
  1329.         }
  1330.         public int getResultSetConcurrency() throws java.sql.SQLException {
  1331.             return delegate.getResultSetConcurrency();
  1332.         }
  1333.         /**
  1334.          * @see Statement#getResultSetHoldability()
  1335.          */
  1336.         public int getResultSetHoldability() throws SQLException {
  1337.             return delegate.getResultSetHoldability();
  1338.         }
  1339.         public int getResultSetType() throws java.sql.SQLException {
  1340.             return delegate.getResultSetType();
  1341.         }
  1342.         public void setShort(int p1, short p2) throws java.sql.SQLException {
  1343.             delegate.setShort(p1, p2);
  1344.         }
  1345.         /**
  1346.          * @see CallableStatement#setShort(String, short)
  1347.          */
  1348.         public void setShort(String arg0, short arg1) throws SQLException {
  1349.             throw new NotImplemented();
  1350.         }
  1351.         public short getShort(int p1) throws java.sql.SQLException {
  1352.             throw new SQLException("Not supported");
  1353.         }
  1354.         /**
  1355.          * @see CallableStatement#getShort(String)
  1356.          */
  1357.         public short getShort(String arg0) throws SQLException {
  1358.             throw new NotImplemented();
  1359.         }
  1360.         public void setString(int p1, java.lang.String p2)
  1361.             throws java.sql.SQLException {
  1362.             delegate.setString(p1, p2);
  1363.         }
  1364.         /**
  1365.          * @see CallableStatement#setString(String, String)
  1366.          */
  1367.         public void setString(String arg0, String arg1)
  1368.             throws SQLException {
  1369.             throw new NotImplemented();
  1370.         }
  1371.         public java.lang.String getString(int p1) throws java.sql.SQLException {
  1372.             throw new SQLException("Not supported");
  1373.         }
  1374.         /**
  1375.          * @see CallableStatement#getString(String)
  1376.          */
  1377.         public String getString(String arg0) throws SQLException {
  1378.             throw new NotImplemented();
  1379.         }
  1380.         public void setTime(int p1, final java.sql.Time p2)
  1381.             throws java.sql.SQLException {
  1382.             delegate.setTime(p1, p2);
  1383.         }
  1384.         public void setTime(int p1, final java.sql.Time p2,
  1385.             final java.util.Calendar p3) throws java.sql.SQLException {
  1386.             delegate.setTime(p1, p2, p3);
  1387.         }
  1388.         /**
  1389.          * @see CallableStatement#setTime(String, Time, Calendar)
  1390.          */
  1391.         public void setTime(String arg0, Time arg1, Calendar arg2)
  1392.             throws SQLException {
  1393.             throw new NotImplemented();
  1394.         }
  1395.         /**
  1396.          * @see CallableStatement#setTime(String, Time)
  1397.          */
  1398.         public void setTime(String arg0, Time arg1) throws SQLException {
  1399.             throw new NotImplemented();
  1400.         }
  1401.         public java.sql.Time getTime(int p1) throws java.sql.SQLException {
  1402.             throw new SQLException("Not supported");
  1403.         }
  1404.         public java.sql.Time getTime(int p1, final java.util.Calendar p2)
  1405.             throws java.sql.SQLException {
  1406.             throw new SQLException("Not supported");
  1407.         }
  1408.         /**
  1409.          * @see CallableStatement#getTime(String, Calendar)
  1410.          */
  1411.         public Time getTime(String arg0, Calendar arg1)
  1412.             throws SQLException {
  1413.             throw new NotImplemented();
  1414.         }
  1415.         /**
  1416.          * @see CallableStatement#getTime(String)
  1417.          */
  1418.         public Time getTime(String arg0) throws SQLException {
  1419.             throw new NotImplemented();
  1420.         }
  1421.         public void setTimestamp(int p1, final java.sql.Timestamp p2)
  1422.             throws java.sql.SQLException {
  1423.             delegate.setTimestamp(p1, p2);
  1424.         }
  1425.         public void setTimestamp(int p1, final java.sql.Timestamp p2,
  1426.             final java.util.Calendar p3) throws java.sql.SQLException {
  1427.             delegate.setTimestamp(p1, p2, p3);
  1428.         }
  1429.         /**
  1430.          * @see CallableStatement#setTimestamp(String, Timestamp, Calendar)
  1431.          */
  1432.         public void setTimestamp(String arg0, Timestamp arg1, Calendar arg2)
  1433.             throws SQLException {
  1434.             throw new NotImplemented();
  1435.         }
  1436.         /**
  1437.          * @see CallableStatement#setTimestamp(String, Timestamp)
  1438.          */
  1439.         public void setTimestamp(String arg0, Timestamp arg1)
  1440.             throws SQLException {
  1441.             throw new NotImplemented();
  1442.         }
  1443.         public java.sql.Timestamp getTimestamp(int p1)
  1444.             throws java.sql.SQLException {
  1445.             throw new SQLException("Not supported");
  1446.         }
  1447.         public java.sql.Timestamp getTimestamp(int p1,
  1448.             final java.util.Calendar p2) throws java.sql.SQLException {
  1449.             throw new SQLException("Not supported");
  1450.         }
  1451.         /**
  1452.          * @see CallableStatement#getTimestamp(String, Calendar)
  1453.          */
  1454.         public Timestamp getTimestamp(String arg0, Calendar arg1)
  1455.             throws SQLException {
  1456.             throw new NotImplemented();
  1457.         }
  1458.         /**
  1459.          * @see CallableStatement#getTimestamp(String)
  1460.          */
  1461.         public Timestamp getTimestamp(String arg0) throws SQLException {
  1462.             throw new NotImplemented();
  1463.         }
  1464.         /**
  1465.          * @see CallableStatement#setURL(String, URL)
  1466.          */
  1467.         public void setURL(String arg0, URL arg1) throws SQLException {
  1468.             throw new NotImplemented();
  1469.         }
  1470.         /**
  1471.          * @see PreparedStatement#setURL(int, URL)
  1472.          */
  1473.         public void setURL(int arg0, URL arg1) throws SQLException {
  1474.             delegate.setURL(arg0, arg1);
  1475.         }
  1476.         /**
  1477.          * @see CallableStatement#getURL(int)
  1478.          */
  1479.         public URL getURL(int arg0) throws SQLException {
  1480.             throw new NotImplemented();
  1481.         }
  1482.         /**
  1483.          * @see CallableStatement#getURL(String)
  1484.          */
  1485.         public URL getURL(String arg0) throws SQLException {
  1486.             throw new NotImplemented();
  1487.         }
  1488.         public void setUnicodeStream(int p1, final java.io.InputStream p2,
  1489.             int p3) throws java.sql.SQLException {
  1490.             delegate.setUnicodeStream(p1, p2, p3);
  1491.         }
  1492.         public int getUpdateCount() throws java.sql.SQLException {
  1493.             return delegate.getUpdateCount();
  1494.         }
  1495.         public java.sql.SQLWarning getWarnings() throws java.sql.SQLException {
  1496.             return delegate.getWarnings();
  1497.         }
  1498.         public void addBatch() throws java.sql.SQLException {
  1499.             delegate.addBatch();
  1500.         }
  1501.         public void addBatch(java.lang.String p1) throws java.sql.SQLException {
  1502.             delegate.addBatch(p1);
  1503.         }
  1504.         public void cancel() throws java.sql.SQLException {
  1505.             delegate.cancel();
  1506.         }
  1507.         public void clearBatch() throws java.sql.SQLException {
  1508.             delegate.clearBatch();
  1509.         }
  1510.         public void clearParameters() throws java.sql.SQLException {
  1511.             delegate.clearParameters();
  1512.         }
  1513.         public void clearWarnings() throws java.sql.SQLException {
  1514.             delegate.clearWarnings();
  1515.         }
  1516.         public void close() throws java.sql.SQLException {
  1517.             delegate.close();
  1518.         }
  1519.         public boolean execute() throws java.sql.SQLException {
  1520.             return delegate.execute();
  1521.         }
  1522.         public boolean execute(java.lang.String p1)
  1523.             throws java.sql.SQLException {
  1524.             return delegate.execute(p1);
  1525.         }
  1526.         /**
  1527.          * @see Statement#execute(String, int)
  1528.          */
  1529.         public boolean execute(String arg0, int arg1) throws SQLException {
  1530.             return delegate.execute(arg0, arg1);
  1531.         }
  1532.         /**
  1533.          * @see Statement#execute(String, int[])
  1534.          */
  1535.         public boolean execute(String arg0, int[] arg1)
  1536.             throws SQLException {
  1537.             return delegate.execute(arg0, arg1);
  1538.         }
  1539.         /**
  1540.          * @see Statement#execute(String, String[])
  1541.          */
  1542.         public boolean execute(String arg0, String[] arg1)
  1543.             throws SQLException {
  1544.             return delegate.execute(arg0, arg1);
  1545.         }
  1546.         public int[] executeBatch() throws java.sql.SQLException {
  1547.             return delegate.executeBatch();
  1548.         }
  1549.         public java.sql.ResultSet executeQuery() throws java.sql.SQLException {
  1550.             return delegate.executeQuery();
  1551.         }
  1552.         public java.sql.ResultSet executeQuery(java.lang.String p1)
  1553.             throws java.sql.SQLException {
  1554.             return delegate.executeQuery(p1);
  1555.         }
  1556.         public int executeUpdate() throws java.sql.SQLException {
  1557.             return delegate.executeUpdate();
  1558.         }
  1559.         public int executeUpdate(java.lang.String p1)
  1560.             throws java.sql.SQLException {
  1561.             return delegate.executeUpdate(p1);
  1562.         }
  1563.         /**
  1564.          * @see Statement#executeUpdate(String, int)
  1565.          */
  1566.         public int executeUpdate(String arg0, int arg1)
  1567.             throws SQLException {
  1568.             return delegate.executeUpdate(arg0, arg1);
  1569.         }
  1570.         /**
  1571.          * @see Statement#executeUpdate(String, int[])
  1572.          */
  1573.         public int executeUpdate(String arg0, int[] arg1)
  1574.             throws SQLException {
  1575.             return delegate.executeUpdate(arg0, arg1);
  1576.         }
  1577.         /**
  1578.          * @see Statement#executeUpdate(String, String[])
  1579.          */
  1580.         public int executeUpdate(String arg0, String[] arg1)
  1581.             throws SQLException {
  1582.             return delegate.executeUpdate(arg0, arg1);
  1583.         }
  1584.         public void registerOutParameter(int p1, int p2)
  1585.             throws java.sql.SQLException {
  1586.             throw new SQLException("Not supported");
  1587.         }
  1588.         public void registerOutParameter(int p1, int p2, int p3)
  1589.             throws java.sql.SQLException {
  1590.             throw new SQLException("Not supported");
  1591.         }
  1592.         public void registerOutParameter(int p1, int p2, java.lang.String p3)
  1593.             throws java.sql.SQLException {
  1594.             throw new SQLException("Not supported");
  1595.         }
  1596.         /**
  1597.          * @see CallableStatement#registerOutParameter(String, int, int)
  1598.          */
  1599.         public void registerOutParameter(String arg0, int arg1, int arg2)
  1600.             throws SQLException {
  1601.             throw new NotImplemented();
  1602.         }
  1603.         /**
  1604.          * @see CallableStatement#registerOutParameter(String, int, String)
  1605.          */
  1606.         public void registerOutParameter(String arg0, int arg1, String arg2)
  1607.             throws SQLException {
  1608.             throw new NotImplemented();
  1609.         }
  1610.         /**
  1611.          * @see CallableStatement#registerOutParameter(String, int)
  1612.          */
  1613.         public void registerOutParameter(String arg0, int arg1)
  1614.             throws SQLException {
  1615.             throw new NotImplemented();
  1616.         }
  1617.         public boolean wasNull() throws java.sql.SQLException {
  1618.             throw new SQLException("Not supported");
  1619.         }
  1620.     }
  1621. }