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
