I think we are already support this. It is call "block mode" however
block mode is also removed since we also have better another way using
delimiterType to handle function/store procedure execution

-Dan

On Tue, Feb 16, 2010 at 4:15 PM,  <[email protected]> wrote:
> Revision 11914 Author topping Date 2010-02-16 18:15:24 -0600 (Tue, 16 Feb
> 2010)
>
> Log Message
>
> Patch from Tony Simpson to allow db procedures to be executed
>
> Modified Paths
>
> trunk/mojo/sql-maven-plugin/src/main/java/org/codehaus/mojo/sql/SqlExecMojo.java
>
> Added Paths
>
> trunk/mojo/sql-maven-plugin/src/main/java/org/codehaus/mojo/sql/ProcedureCallHelper.java
> trunk/mojo/sql-maven-plugin/src/test/java/org/codehaus/mojo/sql/ProcedureCallHelperTest.java
>
> Diff
>
> Added:
> trunk/mojo/sql-maven-plugin/src/main/java/org/codehaus/mojo/sql/ProcedureCallHelper.java
> (0 => 11914)
>
> ---
> trunk/mojo/sql-maven-plugin/src/main/java/org/codehaus/mojo/sql/ProcedureCallHelper.java
>       
> (rev 0)
> +++
> trunk/mojo/sql-maven-plugin/src/main/java/org/codehaus/mojo/sql/ProcedureCallHelper.java
>       2010-02-17
> 00:15:24 UTC (rev 11914)
> @@ -0,0 +1,50 @@
> +package org.codehaus.mojo.sql;
> +
> +
> +public class ProcedureCallHelper {
> +    public static boolean isProcedureCall(String sql) {
> +        String startOfSql = sql.trim().substring(0, 4).toUpperCase();
> +        if (startOfSql.startsWith("CALL") || startOfSql.startsWith("EXEC"))
> {
> +            return true;
> +        } else {
> +            return false;
> +        }
> +    }
> +
> +    public static String sqlProcedureCallToJDBCCallStatement(String sql) {
> +        sql = sql.trim();
> +        String parameters = "";
> +        int parametersStart = sql.indexOf('(');
> +        if (parametersStart != -1)
> +        {
> +            int parametersEnd = sql.length() - 1;
> +            for (; parametersEnd > parametersStart &&
> sql.charAt(parametersEnd) != ')'; parametersEnd--)
> +            {
> +            }
> +            if(parametersEnd == parametersStart) {
> +                throw new RuntimeException("Could not parse procedure call
> parameters.");
> +            }
> +            parameters = sql.substring(parametersStart+1, parametersEnd);
> +        }
> +        else
> +        {
> +            parametersStart = sql.length();
> +        }
> +        int procedureNameEnds = parametersStart - 1;
> +        for (; procedureNameEnds >= 0 &&
> Character.isWhitespace(sql.charAt(procedureNameEnds)); procedureNameEnds--)
> +        {
> +        }
> +        int procedureNameStarts = procedureNameEnds;
> +        for (; procedureNameStarts >= 0 &&
> !Character.isWhitespace(sql.charAt(procedureNameStarts));
> procedureNameStarts--)
> +        {
> +        }
> +        if (procedureNameStarts == 0 || procedureNameEnds == 0 ||
> procedureNameStarts == procedureNameEnds)
> +        {
> +            throw new RuntimeException("Cound not parse procedure call,
> failed to find procedure name");
> +        }
> +        procedureNameStarts += 1;
> +        procedureNameEnds += 1;
> +        String procedureName = sql.substring(procedureNameStarts,
> procedureNameEnds);
> +        return "{call " + procedureName + "(" + parameters + ")}";
> +    }
> +}
>
> Modified:
> trunk/mojo/sql-maven-plugin/src/main/java/org/codehaus/mojo/sql/SqlExecMojo.java
> (11913 => 11914)
>
> ---
> trunk/mojo/sql-maven-plugin/src/main/java/org/codehaus/mojo/sql/SqlExecMojo.java
>       2010-02-16
> 16:34:18 UTC (rev 11913)
> +++
> trunk/mojo/sql-maven-plugin/src/main/java/org/codehaus/mojo/sql/SqlExecMojo.java
>       2010-02-17
> 00:15:24 UTC (rev 11914)
> @@ -30,6 +30,7 @@
>  import java.io.PrintStream;
>  import java.io.Reader;
>  import java.io.StringReader;
> +import java.sql.CallableStatement;
>  import java.sql.Connection;
>  import java.sql.Driver;
>  import java.sql.ResultSet;
> @@ -360,11 +361,6 @@
>      private Connection conn = null;
>
>      /**
> -     * SQL statement
> -     */
> -    private Statement statement = null;
> -
> -    /**
>       * SQL transactions to perform
>       */
>      private Vector transactions = new Vector();
> @@ -591,8 +587,6 @@
>
>          try
>          {
> -            statement = conn.createStatement();
> -            statement.setEscapeProcessing( escapeProcessing );
>
>              PrintStream out = System.out;
>              try
> @@ -649,10 +643,6 @@
>          {
>              try
>              {
> -                if ( statement != null )
> -                {
> -                    statement.close();
> -                }
>                  if ( conn != null )
>                  {
>                      conn.close();
> @@ -999,6 +989,7 @@
>              return;
>          }
>
> +        Statement statement = null;
>          ResultSet resultSet = null;
>          try
>          {
> @@ -1008,7 +999,17 @@
>              boolean ret;
>              int updateCountTotal = 0;
>
> -            ret = statement.execute( sql );
> +
> +            if(ProcedureCallHelper.isProcedureCall(sql)){
> +                CallableStatement callStatement =
> conn.prepareCall(ProcedureCallHelper.sqlProcedureCallToJDBCCallStatement(sql));
> +                ret = callStatement.execute();
> +                statement = callStatement;
> +            }
> +            else {
> +                statement = conn.createStatement();
> +                statement.setEscapeProcessing( escapeProcessing );
> +                ret = statement.execute( sql );
> +            }
>              do
>              {
>                  if ( !ret )
> @@ -1060,6 +1061,10 @@
>          }
>          finally
>          {
> +            if ( statement != null )
> +            {
> +                statement.close();
> +            }
>              if ( resultSet != null )
>              {
>                  resultSet.close();
>
> Added:
> trunk/mojo/sql-maven-plugin/src/test/java/org/codehaus/mojo/sql/ProcedureCallHelperTest.java
> (0 => 11914)
>
> ---
> trunk/mojo/sql-maven-plugin/src/test/java/org/codehaus/mojo/sql/ProcedureCallHelperTest.java
>   
> (rev 0)
> +++
> trunk/mojo/sql-maven-plugin/src/test/java/org/codehaus/mojo/sql/ProcedureCallHelperTest.java
>   2010-02-17
> 00:15:24 UTC (rev 11914)
> @@ -0,0 +1,41 @@
> +package org.codehaus.mojo.sql;
> +
> +import junit.framework.TestCase;
> +
> +public class ProcedureCallHelperTest extends TestCase {
> +     private static String query1 = "EXECUTE PROCEDURE foo(1,'cats')";
> +     private static String query2 = "exec bar";
> +     private static String query3 = "EXECUTE\n PROCEDURE\n\n foobar\n  (1, 2,
> 'the cat''s'  )";
> +     private static String query4 = "SELECT 1 FROM tablename";
> +     private static String query5 = "call bar ('bob,frank')";
> +     private static String query6 = "Exec bar ('fred', 
> nestedfunction('arg'))";
> +     
> +     public void testIsProcedureCall() {
> +             assertTrue(ProcedureCallHelper.isProcedureCall(query1));
> +             assertTrue(ProcedureCallHelper.isProcedureCall(query2));
> +             assertTrue(ProcedureCallHelper.isProcedureCall(query3));
> +             assertFalse(ProcedureCallHelper.isProcedureCall(query4));
> +             assertTrue(ProcedureCallHelper.isProcedureCall(query5));
> +             assertTrue(ProcedureCallHelper.isProcedureCall(query6));
> +     }
> +     
> +     public void testParseQuery1() {
> +             assertEquals("{call foo(1,'cats')}",
> ProcedureCallHelper.sqlProcedureCallToJDBCCallStatement(query1));
> +     }
> +     
> +     public void testParseQuery2() {
> +             assertEquals("{call bar()}",
> ProcedureCallHelper.sqlProcedureCallToJDBCCallStatement(query2));
> +     }
> +     
> +     public void testParseQuery3() {
> +             assertEquals("{call foobar(1, 2, 'the cat''s'  )}",
> ProcedureCallHelper.sqlProcedureCallToJDBCCallStatement(query3));
> +     }
> +
> +     public void testParseQuery5() {
> +             assertEquals("{call bar('bob,frank')}",
> ProcedureCallHelper.sqlProcedureCallToJDBCCallStatement(query5));
> +     }
> +     
> +     public void testParseQuery6() {
> +             assertEquals("{call bar('fred', nestedfunction('arg'))}",
> ProcedureCallHelper.sqlProcedureCallToJDBCCallStatement(query6));
> +     }
> +}
>
> ________________________________
>
> To unsubscribe from this list please visit:
>
> http://xircles.codehaus.org/manage_email

---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply via email to