Package org.apache.derby.iapi.services.compiler

Examples of org.apache.derby.iapi.services.compiler.MethodBuilder


  private int getScanArguments(ExpressionClassBuilder acb,
                      MethodBuilder mb)
    throws StandardException
  {
        // get a function to allocate scan rows of the right shape and size
         MethodBuilder resultRowAllocator =
            resultColumns.generateHolderMethod(acb,
                          referencedCols,
                          (FormatableBitSet) null);

    // pass in the referenced columns on the saved objects
View Full Code Here


    // This method is an implementation of the interface method
    // Activation - ResultSet execute()

    // create an empty execute method
    MethodBuilder mb = cb.newMethodBuilder(Modifier.PUBLIC,
      ClassName.ResultSet, "execute");
    mb.addThrownException(ClassName.StandardException);

    // put a 'throwIfClosed("execute");' statement into the execute method.
    mb.pushThis(); // instance
    mb.push("execute");
    mb.callMethod(VMOpcode.INVOKEVIRTUAL, ClassName.BaseActivation, "throwIfClosed", "void", 1);

    // call this.startExecution(), so the parent class can know an execution
    // has begun.

    mb.pushThis(); // instance
    mb.callMethod(VMOpcode.INVOKEVIRTUAL, ClassName.BaseActivation, "startExecution", "void", 0);

    return  mb;
  }
View Full Code Here

    return  mb;
  }

  MethodBuilder startResetMethod() {
    MethodBuilder mb = cb.newMethodBuilder(Modifier.PUBLIC,
      "void", "reset");

    mb.addThrownException(ClassName.StandardException);
    mb.pushThis();
    mb.callMethod(VMOpcode.INVOKESPECIAL, ClassName.BaseActivation, "reset", "void", 0);


    return mb;
  }
View Full Code Here

  void addCursorPositionCode() {

    // the getter
    // This method is an implementation of the interface method
    // CursorActivation - CursorResultSet getTargetResultSet()
    MethodBuilder getter = cb.newMethodBuilder(Modifier.PUBLIC,
      ClassName.CursorResultSet, "getTargetResultSet");

    getter.getField(targetResultSetField);
    getter.methodReturn();
    getter.complete();

    // This method is an implementation of the interface method
    // CursorActivation - CursorResultSet getCursorResultSet()

    getter = cb.newMethodBuilder(Modifier.PUBLIC,
      ClassName.CursorResultSet, "getCursorResultSet");

    getter.getField(cursorResultSetField);
    getter.methodReturn();
    getter.complete();
  }
View Full Code Here

       * The method call will take SQLValue as a parameter.
       */
      String[] pd = new String[1];
      pd[0] = getSQLValueInterfaceName(); // parameter "param1"

      MethodBuilder  mb = acb.newGeneratedFun(primitiveTN, Modifier.PRIVATE, pd);

      mb.getParameter(0);

      if (returnsNullOnNullState != null)
      {
        generateReturnsNullOnNullCheck(mb);
      }
      else
      {
        mb.dup();
        mb.upCast(ClassName.DataValueDescriptor);
        mb.push(primitiveTN);
        mb.callMethod(VMOpcode.INVOKESTATIC, ClassName.BaseActivation, "nullToPrimitiveTest", "void", 2);
      }

      // stack is dvd

      /* Generate the code to get the primitive value */
      mb.callMethod(VMOpcode.INVOKEINTERFACE, ClassName.DataValueDescriptor,
                value.getTypeCompiler().getPrimitiveMethodName(), primitiveTN, 0);

      mb.methodReturn();
      mb.complete();

      /* Generate the call to the new method, with the parameter */

      mbex.pushThis();
      mbex.swap(); // caller pushed out parameter
      mbex.callMethod(VMOpcode.INVOKEVIRTUAL, (String) null, mb.getName(), primitiveTN, 1);
    }
    else
    {
      if (returnsNullOnNullState != null)
        generateReturnsNullOnNullCheck(mbex);
View Full Code Here

          String parameterType = methodParameterTypes[parameterNumber];

          if (parameterType.endsWith("[]")) {

            // constructor  - setting up correct paramter type info
            MethodBuilder constructor = acb.getConstructor();
            acb.pushThisAsActivation(constructor);
            constructor.callMethod(VMOpcode.INVOKEINTERFACE, null,
                      "getParameterValueSet", ClassName.ParameterValueSet, 0);

            constructor.push(applicationParameterNumber);
            constructor.push(JDBC30Translation.PARAMETER_MODE_UNKNOWN);
            constructor.callMethod(VMOpcode.INVOKEINTERFACE, null,
                      "setParameterMode", "void", 2);
            constructor.endStatement();
          }
        }
      }
    }
View Full Code Here

    /* The array gets created in the constructor.
     * All constant elements in the array are initialized
     * in the constructor. 
     */
    /* Assign the initializer to the DataValueDescriptor[] field */
    MethodBuilder cb = acb.getConstructor();
    cb.pushNewArray(ClassName.DataValueDescriptor, argumentsListSize);
    cb.setField(arrayField);

    /* Set the array elements that are constant */
    int numConstants = 0;
    MethodBuilder nonConstantMethod = null;
    MethodBuilder currentConstMethod = cb;
    for (int index = 0; index < argumentsListSize; index++)
    {
      MethodBuilder setArrayMethod;
 
      if (argumentsList.elementAt(index) instanceof ConstantNode)
      {
        numConstants++;
   
        /*if too many statements are added  to a  method,
        *size of method can hit  65k limit, which will
        *lead to the class format errors at load time.
        *To avoid this problem, when number of statements added
        *to a method is > 2048, remaing statements are added to  a new function
        *and called from the function which created the function.
        *See Beetle 5135 or 4293 for further details on this type of problem.
        */
        if(currentConstMethod.statementNumHitLimit(1))
        {
          MethodBuilder genConstantMethod = acb.newGeneratedFun("void", Modifier.PRIVATE);
          currentConstMethod.pushThis();
          currentConstMethod.callMethod(VMOpcode.INVOKEVIRTUAL,
                          (String) null,
                          genConstantMethod.getName(),
                          "void", 0);
          //if it is a generate function, close the metod.
          if(currentConstMethod != cb){
            currentConstMethod.methodReturn();
            currentConstMethod.complete();
View Full Code Here

                      MethodBuilder mbex)
                  throws StandardException
  {
    /* Generate a new method */
    /* only used within the other exprFuns, so can be private */
    MethodBuilder mb = acb.newGeneratedFun(ClassName.DataValueDescriptor, Modifier.PROTECTED);
   
    /* Allocate an object for re-use to hold the result of the operator */
    LocalField field =
      acb.newFieldDeclaration(Modifier.PRIVATE, ClassName.RefDataValue);


    /* Fill in the body of the method
     * generates:
     *    return TypeFactory.getSQLRef(this.ROWLOCATIONSCANRESULTSET.getRowLocation());
     * and adds it to exprFun
     */

    mb.pushThis();
    mb.getField((String)null, acb.getRowLocationScanResultSetName(), ClassName.CursorResultSet);
    mb.callMethod(VMOpcode.INVOKEINTERFACE, (String) null, "getRowLocation", ClassName.RowLocation, 0);


    acb.generateDataValue(mb, getTypeCompiler(), field);

    /*
    ** Store the result of the method call in the field, so we can re-use
    ** the object.
    */
    mb.putField(field);

    /* Stuff the full expression into a return statement and add that to the
     * body of the new method.
     */
    mb.methodReturn();

    // complete the method
    mb.complete();

    /* Generate the call to the new method */
    mbex.pushThis();
    mbex.callMethod(VMOpcode.INVOKEVIRTUAL, (String) null, mb.getName(), ClassName.DataValueDescriptor, 0);
  }
View Full Code Here

      if (compiledResultSets != 0) {

        // Add a method that indicates the maxium number of dynamic result sets.
        int maxDynamicResults = routineInfo.getMaxDynamicResultSets();
        if (maxDynamicResults > 0) {
          MethodBuilder gdr = acb.getClassBuilder().newMethodBuilder(Modifier.PUBLIC, "int", "getMaxDynamicResults");
          gdr.push(maxDynamicResults);
          gdr.methodReturn();
          gdr.complete();
        }

        // add a method to return all the dynamic result sets (unordered)
        MethodBuilder gdr = acb.getClassBuilder().newMethodBuilder(Modifier.PUBLIC, "java.sql.ResultSet[][]", "getDynamicResults");

        MethodBuilder cons = acb.getConstructor();
        // if (procDef.getParameterStyle() == RoutineAliasInfo.PS_JAVA)
        {
          // PARAMETER STYLE JAVA

          LocalField procedureResultSetsHolder = acb.newFieldDeclaration(Modifier.PRIVATE, "java.sql.ResultSet[][]");

          // getDynamicResults body
          gdr.getField(procedureResultSetsHolder);

          // create the holder of all the ResultSet arrays, new java.sql.ResultSet[][compiledResultSets]
          cons.pushNewArray("java.sql.ResultSet[]", compiledResultSets);
          cons.setField(procedureResultSetsHolder);


          // arguments for the dynamic result sets
          for (int i = 0; i < compiledResultSets; i++) {

            mb.pushNewArray("java.sql.ResultSet", 1);
            mb.dup();

            mb.getField(procedureResultSetsHolder);
            mb.swap();

            mb.setArrayElement(i);
          }
        }

        // complete the method that returns the ResultSet[][] to the
        gdr.methodReturn();
        gdr.complete();

        nargs += compiledResultSets;
      }

    }

    String javaReturnType = getJavaTypeName();

    MethodBuilder mbnc = null;
    MethodBuilder mbcm = mb;


    // If any of the parameters are null then
    // do not call the method, just return null.
    if (returnsNullOnNullState != null)
    {
      mbnc = acb.newGeneratedFun(javaReturnType, Modifier.PRIVATE, methodParameterTypes);

      // add the throws clause for the public static method we are going to call.
      Class[] throwsSet = ((java.lang.reflect.Method) method).getExceptionTypes();
      for (int te = 0; te < throwsSet.length; te++)
      {
        mbnc.addThrownException(throwsSet[te].getName());
      }

      mbnc.getField(returnsNullOnNullState);
      mbnc.conditionalIf();

      // set up for a null!!
      // for objects is easy.
      mbnc.pushNull(javaReturnType);

      mbnc.startElseCode()

      if (!actualMethodReturnType.equals(javaReturnType))
        mbnc.pushNewStart(javaReturnType);

      // fetch all the arguments
      for (int pa = 0; pa < nargs; pa++)
      {
        mbnc.getParameter(pa);
      }

      mbcm = mbnc;
    }

    mbcm.callMethod(VMOpcode.INVOKESTATIC, method.getDeclaringClass().getName(), methodName,
          actualMethodReturnType, nargs);


    if (returnsNullOnNullState != null)
    {
      if (!actualMethodReturnType.equals(javaReturnType))
        mbnc.pushNewComplete(1);

      mbnc.completeConditional();

      mbnc.methodReturn();
      mbnc.complete();

      // now call the wrapper method
      mb.callMethod(VMOpcode.INVOKEVIRTUAL, acb.getClassBuilder().getFullName(), mbnc.getName(),
          javaReturnType, nargs);
      mbnc = null;
    }


    if (routineInfo != null) {

      // reset the SQL allowed setting that we set upon
      // entry to the method.
      if (functionEntrySQLAllowed != null) {
        acb.pushThisAsActivation(mb);
        mb.callMethod(VMOpcode.INVOKEINTERFACE, null,
                  "getLanguageConnectionContext", ClassName.LanguageConnectionContext, 0);
        mb.callMethod(VMOpcode.INVOKEINTERFACE, null,
                  "getStatementContext", "org.apache.derby.iapi.sql.conn.StatementContext", 0);
        mb.getField(functionEntrySQLAllowed);
        mb.push(true); // override as we are ending the control set by this function all.
        mb.callMethod(VMOpcode.INVOKEINTERFACE, null,
                  "setSQLAllowed", "void", 2);

      }

      if (outParamArrays != null) {

        MethodBuilder constructor = acb.getConstructor();

        // constructor  - setting up correct paramter type info
        acb.pushThisAsActivation(constructor);
        constructor.callMethod(VMOpcode.INVOKEINTERFACE, null,
                  "getParameterValueSet", ClassName.ParameterValueSet, 0);

        // execute  - passing out parameters back.
        acb.pushThisAsActivation(mb);
        mb.callMethod(VMOpcode.INVOKEINTERFACE, null,
                  "getParameterValueSet", ClassName.ParameterValueSet, 0);

        int[] parameterModes = routineInfo.getParameterModes();
        for (int i = 0; i < outParamArrays.length; i++) {

          int parameterMode = parameterModes[i];
          if (parameterMode != JDBC30Translation.PARAMETER_MODE_IN) {

            // must be a parameter if it is INOUT or OUT.
            ValueNode sqlParamNode = ((SQLToJavaValueNode) methodParms[i]).getSQLValueNode();


            int applicationParameterNumber = applicationParameterNumbers[i];

            // Set the correct parameter nodes in the ParameterValueSet at constructor time.
            constructor.dup();
            constructor.push(applicationParameterNumber);
            constructor.push(parameterMode);
            constructor.callMethod(VMOpcode.INVOKEINTERFACE, null,
                    "setParameterMode", "void", 2);

            // Pass the value of the outparameters back to the calling code
            LocalField lf = outParamArrays[i];

            mb.dup();
            mb.push(applicationParameterNumber);
            mb.callMethod(VMOpcode.INVOKEINTERFACE, null,
                  "getParameter", ClassName.DataValueDescriptor, 1);

            // see if we need to set the desired length/scale/precision of the type
            DataTypeDescriptor paramdtd = sqlParamNode.getTypeServices();

            boolean isNumericType = paramdtd.getTypeId().isNumericTypeId();

            // is the underlying type for the OUT/INOUT parameter primitive.
            boolean isPrimitive = ((java.lang.reflect.Method) method).getParameterTypes()[i].getComponentType().isPrimitive();

            if (isNumericType) {
              // need to up-cast as the setValue(Number) method only exists on NumberDataValue

              if (!isPrimitive)
                mb.cast(ClassName.NumberDataValue);
            }
            else if (paramdtd.getTypeId().isBooleanTypeId())
            {
              // need to cast as the setValue(Boolean) method only exists on BooleanDataValue
              if (!isPrimitive)
                mb.cast(ClassName.BooleanDataValue);
            }

            if (paramdtd.getTypeId().variableLength()) {
              // need another DVD reference for the set width below.
              mb.dup();
            }


            mb.getField(lf); // pvs, dvd, array
            mb.getArrayElement(0); // pvs, dvd, value

            // The value needs to be set thorugh the setValue(Number) method.
            if (isNumericType && !isPrimitive)
            {
              mb.upCast("java.lang.Number");
            }

            mb.callMethod(VMOpcode.INVOKEINTERFACE, null, "setValue", "void", 1);

            if (paramdtd.getTypeId().variableLength()) {
              mb.push(isNumericType ? paramdtd.getPrecision() : paramdtd.getMaximumWidth());
              mb.push(paramdtd.getScale());
              mb.push(isNumericType);
              mb.callMethod(VMOpcode.INVOKEINTERFACE, ClassName.VariableSizeDataValue, "setWidth", "void", 3);
              // mb.endStatement();
            }
          }
        }
        constructor.endStatement();
        mb.endStatement();
      }

    }
  }
View Full Code Here

         *and called from the function which created the function.
         *See Beetle 5135 or 4293 for further details on this type of problem.
        */
        if(mb.statementNumHitLimit(10))
        {
          MethodBuilder dmb = acb.newGeneratedFun(ClassName.ResultSet, Modifier.PRIVATE);
          dependentNodes[index].generate(acb,dmb); //generates the resultset expression
          dmb.methodReturn();
          dmb.complete();
          /* Generate the call to the new method */
          mb.pushThis();
          //second arg will be generated by this call
          mb.callMethod(VMOpcode.INVOKEVIRTUAL, (String) null, dmb.getName(), ClassName.ResultSet, 0);
        }else
        {
          dependentNodes[index].generate(acb,mb); //generates the resultset expression
        }

        mb.setArrayElement(index);
     
      mb.getField(arrayField); // fourth argument - array reference
    }
    else
    {
      if(isDependentTable)
      {
        mb.pushNull(resultSetArrayType); //No dependent tables for this table
      }
    }


    if(cascadeDelete || isDependentTable)
    {
      parentResultSetId = targetTableDescriptor.getSchemaName() +
                             "." + targetTableDescriptor.getName();
      mb.push(parentResultSetId);

    }
    mb.callMethod(VMOpcode.INVOKEINTERFACE, (String) null, resultSetGetter, ClassName.ResultSet, argCount);


    if(!isDependentTable && cascadeDelete)
    {
      int numResultSets = acb.getRowCount();
      if(numResultSets > 0)
      {
        //generate activation.raParentResultSets = new NoPutResultSet[size]
        MethodBuilder constructor = acb.getConstructor();
        constructor.pushThis();
        constructor.pushNewArray(ClassName.CursorResultSet, numResultSets);
        constructor.putField(ClassName.BaseActivation,
                   "raParentResultSets",
                   ClassName.CursorResultSet + "[]");
        constructor.endStatement();
      }
    }
  }
View Full Code Here

TOP

Related Classes of org.apache.derby.iapi.services.compiler.MethodBuilder

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.