コード例 #1
0
ファイル: JdbcProxyGenerator.java プロジェクト: Colin25/c3p0
    protected void generateDelegateCode(
        Class intfcl, String genclass, Method method, IndentedWriter iw) throws IOException {

      String mname = method.getName();
      if (jdbc4WrapperMethod(mname)) {
        generateWrapperDelegateCode(intfcl, genclass, method, iw);
        return;
      }

      Class retType = method.getReturnType();

      iw.println("if (proxyConn != null) proxyConn.maybeDirtyTransaction();");
      iw.println();

      if (mname.equals("close")) {
        iw.println("if (! this.isDetached())");
        iw.println("{");
        iw.upIndent();

        iw.println("if (creator instanceof Statement)");
        iw.upIndent();
        iw.println(
            "parentPooledConnection.markInactiveResultSetForStatement( (Statement) creator, inner );");
        iw.downIndent();
        iw.println("else if (creator instanceof DatabaseMetaData)");
        iw.upIndent();
        iw.println("parentPooledConnection.markInactiveMetaDataResultSet( inner );");
        iw.downIndent();
        iw.println("else if (creator instanceof Connection)");
        iw.upIndent();
        iw.println("parentPooledConnection.markInactiveRawConnectionResultSet( inner );");
        iw.downIndent();
        iw.println(
            "else throw new InternalError(\042Must be Statement or DatabaseMetaData -- Bad Creator: \042 + creator);");

        iw.println(
            "if (creatorProxy instanceof ProxyResultSetDetachable) ((ProxyResultSetDetachable) creatorProxy).detachProxyResultSet( this );");

        iw.println("this.detach();");
        iw.println("inner.close();");
        iw.println("this.inner = null;");

        iw.downIndent();
        iw.println("}");
      } else if (mname.equals("getStatement")) {
        iw.println("if (creator instanceof Statement)");
        iw.upIndent();
        iw.println("return (Statement) creatorProxy;");
        iw.downIndent();
        iw.println("else if (creator instanceof DatabaseMetaData)");
        iw.upIndent();
        iw.println("return null;");
        iw.downIndent();
        iw.println(
            "else throw new InternalError(\042Must be Statement or DatabaseMetaData -- Bad Creator: \042 + creator);");
      } else if (mname.equals("isClosed")) {
        iw.println("return this.isDetached();");
      } else super.generateDelegateCode(intfcl, genclass, method, iw);
    }
コード例 #2
0
ファイル: JdbcProxyGenerator.java プロジェクト: Colin25/c3p0
    protected void generateDelegateCode(
        Class intfcl, String genclass, Method method, IndentedWriter iw) throws IOException {
      String mname = method.getName();
      if (jdbc4WrapperMethod(mname)) {
        generateWrapperDelegateCode(intfcl, genclass, method, iw);
        return;
      }

      Class retType = method.getReturnType();

      if (ResultSet.class.isAssignableFrom(retType)) {
        iw.println("ResultSet innerResultSet = inner." + CodegenUtils.methodCall(method) + ";");
        iw.println("if (innerResultSet == null) return null;");
        iw.println(
            "return new NewProxyResultSet( innerResultSet, parentPooledConnection, inner, this );");
      } else if (mname.equals("getConnection")) {
        iw.println("return this.proxyCon;");
      } else super.generateDelegateCode(intfcl, genclass, method, iw);
    }
コード例 #3
0
ファイル: JdbcProxyGenerator.java プロジェクト: Colin25/c3p0
    protected void generateDelegateCode(
        Class intfcl, String genclass, Method method, IndentedWriter iw) throws IOException {
      String mname = method.getName();
      if (jdbc4WrapperMethod(mname)) {
        generateWrapperDelegateCode(intfcl, genclass, method, iw);
        return;
      }

      if (mname.equals("createStatement")) {
        iw.println("txn_known_resolved = false;");
        iw.println();
        iw.println("Statement innerStmt = inner." + CodegenUtils.methodCall(method) + ";");
        iw.println("parentPooledConnection.markActiveUncachedStatement( innerStmt );");
        iw.println(
            "return new NewProxyStatement( innerStmt, parentPooledConnection, false, this );");
      } else if (mname.equals("prepareStatement")) {
        iw.println("txn_known_resolved = false;");
        iw.println();
        iw.println("PreparedStatement innerStmt;");
        iw.println();
        iw.println("if ( parentPooledConnection.isStatementCaching() )");
        iw.println("{");
        iw.upIndent();

        iw.println("try");
        iw.println("{");
        iw.upIndent();

        generateFindMethodAndArgs(method, iw);
        iw.println(
            "innerStmt = (PreparedStatement) parentPooledConnection.checkoutStatement( method, args );");
        iw.println(
            "return new NewProxyPreparedStatement( innerStmt, parentPooledConnection, true, this );");

        iw.downIndent();
        iw.println("}");
        iw.println("catch (ResourceClosedException e)");
        iw.println("{");
        iw.upIndent();

        iw.println("if ( logger.isLoggable( MLevel.FINE ) )");
        iw.upIndent();
        iw.println(
            "logger.log( MLevel.FINE, "
                + "\042A Connection tried to prepare a Statement via a Statement cache that is already closed. "
                + "This can happen -- rarely -- if a DataSource is closed or reset() while Connections are checked-out and in use.\042, e );");
        iw.downIndent();

        // repeated code... any changes probably need to be duplicated below
        iw.println("innerStmt = inner." + CodegenUtils.methodCall(method) + ";");
        iw.println("parentPooledConnection.markActiveUncachedStatement( innerStmt );");
        iw.println(
            "return new NewProxyPreparedStatement( innerStmt, parentPooledConnection, false, this );");

        iw.downIndent();
        iw.println("}");

        iw.downIndent();
        iw.println("}");
        iw.println("else");
        iw.println("{");
        iw.upIndent();

        // repeated code... any changes probably need to be duplicated above
        iw.println("innerStmt = inner." + CodegenUtils.methodCall(method) + ";");
        iw.println("parentPooledConnection.markActiveUncachedStatement( innerStmt );");
        iw.println(
            "return new NewProxyPreparedStatement( innerStmt, parentPooledConnection, false, this );");

        iw.downIndent();
        iw.println("}");

      } else if (mname.equals("prepareCall")) {
        iw.println("txn_known_resolved = false;");
        iw.println();
        iw.println("CallableStatement innerStmt;");
        iw.println();
        iw.println("if ( parentPooledConnection.isStatementCaching() )");
        iw.println("{");
        iw.upIndent();

        iw.println("try");
        iw.println("{");
        iw.upIndent();

        generateFindMethodAndArgs(method, iw);
        iw.println(
            "innerStmt = (CallableStatement) parentPooledConnection.checkoutStatement( method, args );");
        iw.println(
            "return new NewProxyCallableStatement( innerStmt, parentPooledConnection, true, this );");

        iw.downIndent();
        iw.println("}");
        iw.println("catch (ResourceClosedException e)");
        iw.println("{");
        iw.upIndent();

        iw.println("if ( logger.isLoggable( MLevel.FINE ) )");
        iw.upIndent();
        iw.println(
            "logger.log( MLevel.FINE, "
                + "\042A Connection tried to prepare a CallableStatement via a Statement cache that is already closed. "
                + "This can happen -- rarely -- if a DataSource is closed or reset() while Connections are checked-out and in use.\042, e );");
        iw.downIndent();

        // repeated code... any changes probably need to be duplicated below
        iw.println("innerStmt = inner." + CodegenUtils.methodCall(method) + ";");
        iw.println("parentPooledConnection.markActiveUncachedStatement( innerStmt );");
        iw.println(
            "return new NewProxyCallableStatement( innerStmt, parentPooledConnection, false, this );");

        iw.downIndent();
        iw.println("}");

        iw.downIndent();
        iw.println("}");
        iw.println("else");
        iw.println("{");
        iw.upIndent();

        // repeated code... any changes probably need to be duplicated above
        iw.println("innerStmt = inner." + CodegenUtils.methodCall(method) + ";");
        iw.println("parentPooledConnection.markActiveUncachedStatement( innerStmt );");
        iw.println(
            "return new NewProxyCallableStatement( innerStmt, parentPooledConnection, false, this );");

        iw.downIndent();
        iw.println("}");

      } else if (mname.equals("getMetaData")) {
        iw.println("txn_known_resolved = false;");
        iw.println();
        iw.println("if (this.metaData == null)");
        iw.println("{");
        iw.upIndent();
        iw.println(
            "DatabaseMetaData innerMetaData = inner." + CodegenUtils.methodCall(method) + ";");
        iw.println(
            "this.metaData = new NewProxyDatabaseMetaData( innerMetaData, parentPooledConnection, this );");
        iw.downIndent();
        iw.println("}");
        iw.println("return this.metaData;");
      } else if (mname.equals("setTransactionIsolation")) {
        // do nothing with txn_known_resolved

        super.generateDelegateCode(intfcl, genclass, method, iw);
        iw.println(
            "parentPooledConnection.markNewTxnIsolation( "
                + CodegenUtils.generatedArgumentName(0)
                + " );");
      } else if (mname.equals("setCatalog")) {
        // do nothing with txn_known_resolved

        super.generateDelegateCode(intfcl, genclass, method, iw);
        iw.println(
            "parentPooledConnection.markNewCatalog( "
                + CodegenUtils.generatedArgumentName(0)
                + " );");
      } else if (mname.equals("setHoldability")) {
        // do nothing with txn_known_resolved

        super.generateDelegateCode(intfcl, genclass, method, iw);
        iw.println(
            "parentPooledConnection.markNewHoldability( "
                + CodegenUtils.generatedArgumentName(0)
                + " );");
      } else if (mname.equals("setReadOnly")) {
        // do nothing with txn_known_resolved

        super.generateDelegateCode(intfcl, genclass, method, iw);
        iw.println(
            "parentPooledConnection.markNewReadOnly( "
                + CodegenUtils.generatedArgumentName(0)
                + " );");
      } else if (mname.equals("setTypeMap")) {
        // do nothing with txn_known_resolved

        super.generateDelegateCode(intfcl, genclass, method, iw);
        iw.println(
            "parentPooledConnection.markNewTypeMap( "
                + CodegenUtils.generatedArgumentName(0)
                + " );");
      } else if (mname.equals("getWarnings") || mname.equals("clearWarnings")) {
        // do nothing with txn_known_resolved

        super.generateDelegateCode(intfcl, genclass, method, iw);
      } else if (mname.equals("close")) {
        iw.println("if (! this.isDetached())");
        iw.println("{");
        iw.upIndent();
        iw.println("NewPooledConnection npc = parentPooledConnection;");
        iw.println("this.detach();");
        iw.println("npc.markClosedProxyConnection( this, txn_known_resolved );");
        iw.println("this.inner = null;");
        iw.downIndent();
        iw.println("}");
        iw.println("else if (Debug.DEBUG && logger.isLoggable( MLevel.FINE ))");
        iw.println("{");
        iw.upIndent();
        iw.println("logger.log( MLevel.FINE, this + \042: close() called more than once.\042 );");

        // premature-detach-debug-debug only!
        if (PREMATURE_DETACH_DEBUG) {
          iw.println("prematureDetachRecorder.record();");
          iw.println(
              "logger.warning( prematureDetachRecorder.getDump(\042Apparent multiple close of "
                  + getInnerTypeName()
                  + ".\042) );");
        }
        // end-premature-detach-debug-only!

        iw.downIndent();
        iw.println("}");
      } else if (mname.equals("isClosed")) {
        iw.println("return this.isDetached();");
      } else if (mname.equals("isValid")) {
        iw.println("if (this.isDetached()) return false;");

        super.generateDelegateCode(intfcl, genclass, method, iw);
      } else {
        boolean known_resolved =
            (mname.equals("commit") || mname.equals("rollback") || mname.equals("setAutoCommit"));

        if (!known_resolved) {
          iw.println("txn_known_resolved = false;");
          iw.println();
        }
        super.generateDelegateCode(intfcl, genclass, method, iw);
        if (known_resolved) {
          iw.println();
          iw.println("txn_known_resolved = true;");
        }
      }
    }
コード例 #4
0
ファイル: JdbcProxyGenerator.java プロジェクト: Colin25/c3p0
    protected void generateDelegateCode(
        Class intfcl, String genclass, Method method, IndentedWriter iw) throws IOException {

      String mname = method.getName();
      if (jdbc4WrapperMethod(mname)) {
        generateWrapperDelegateCode(intfcl, genclass, method, iw);
        return;
      }

      Class retType = method.getReturnType();

      iw.println("maybeDirtyTransaction();");
      iw.println();

      if (ResultSet.class.isAssignableFrom(retType)) {
        iw.println("ResultSet innerResultSet = inner." + CodegenUtils.methodCall(method) + ";");
        iw.println("if (innerResultSet == null) return null;");
        iw.println(
            "parentPooledConnection.markActiveResultSetForStatement( inner, innerResultSet );");
        iw.println(
            "NewProxyResultSet out = new NewProxyResultSet( innerResultSet, parentPooledConnection, inner, this );");
        iw.println("synchronized ( myProxyResultSets ) { myProxyResultSets.add( out ); }");
        iw.println("return out;");
      } else if (mname.equals("getConnection")) {
        iw.println("if (! this.isDetached())");
        iw.upIndent();
        iw.println("return creatorProxy;");
        iw.downIndent();
        iw.println("else");
        iw.upIndent();
        iw.println("throw new SQLException(\"You cannot operate on a closed Statement!\");");
        iw.downIndent();
      } else if (mname.equals("close")) {
        iw.println("if (! this.isDetached())");
        iw.println("{");
        iw.upIndent();
        // iw.println("System.err.println(\042Closing proxy Statement: \042 + this);");
        iw.println("synchronized ( myProxyResultSets )");
        iw.println("{");
        iw.upIndent();
        iw.println("for( Iterator ii = myProxyResultSets.iterator(); ii.hasNext(); )");
        iw.println("{");
        iw.upIndent();
        iw.println("ResultSet closeMe = (ResultSet) ii.next();");
        iw.println("ii.remove();");
        iw.println();
        iw.println("try { closeMe.close(); }");
        iw.println("catch (SQLException e)");
        iw.println("{");
        iw.upIndent();
        iw.println("if (logger.isLoggable( MLevel.WARNING ))");
        iw.upIndent();
        iw.println(
            "logger.log( MLevel.WARNING, \042Exception on close of apparently orphaned ResultSet.\042, e);");
        iw.downIndent();
        iw.downIndent();
        iw.println("}");
        iw.println("if (logger.isLoggable( MLevel.FINE ))");
        iw.upIndent();
        iw.println(
            "logger.log( MLevel.FINE, this + \042 closed orphaned ResultSet: \042 +closeMe);");
        iw.downIndent();
        iw.downIndent();
        iw.println("}");
        iw.downIndent();
        iw.println("}");
        iw.println();
        iw.println("if ( is_cached )");
        iw.upIndent();
        iw.println("parentPooledConnection.checkinStatement( inner );");
        iw.downIndent();
        iw.println("else");
        iw.println("{");
        iw.upIndent();
        iw.println("parentPooledConnection.markInactiveUncachedStatement( inner );");

        iw.println("try{ inner.close(); }");
        iw.println("catch (Exception e )");
        iw.println("{");
        iw.upIndent();

        iw.println("if (logger.isLoggable( MLevel.WARNING ))");
        iw.upIndent();
        iw.println(
            "logger.log( MLevel.WARNING, \042Exception on close of inner statement.\042, e);");
        iw.downIndent();

        iw.println("SQLException sqle = SqlUtils.toSQLException( e );");
        iw.println("throw sqle;");
        iw.downIndent();
        iw.println("}");
        iw.downIndent();
        iw.println("}");

        iw.println();
        iw.println("this.detach();");
        iw.println("this.inner = null;");
        iw.println("this.creatorProxy = null;");

        iw.downIndent();
        iw.println("}");
      } else if (mname.equals("isClosed")) {
        iw.println("return this.isDetached();");
      } else super.generateDelegateCode(intfcl, genclass, method, iw);
    }