baliuka 2003/03/11 02:19:48 Modified: dbutils/src/java/org/apache/commons/dbutils ProcedureUtils.java dbutils/src/test/org/apache/commons/dbutils Demo.java DemoHandler.java ProcedureUtilsTest.java Log: Added support for dynamic SQL in ProcedureUtils Revision Changes Path 1.6 +47 -29 jakarta-commons-sandbox/dbutils/src/java/org/apache/commons/dbutils/ProcedureUtils.java Index: ProcedureUtils.java =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/dbutils/src/java/org/apache/commons/dbutils/ProcedureUtils.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- ProcedureUtils.java 10 Mar 2003 19:35:42 -0000 1.5 +++ ProcedureUtils.java 11 Mar 2003 10:19:48 -0000 1.6 @@ -61,6 +61,7 @@ import java.lang.reflect.*; import java.sql.*; import java.io.*; +import java.text.MessageFormat; import com.thoughtworks.qdox.JavaDocBuilder; import com.thoughtworks.qdox.model.*; @@ -84,6 +85,7 @@ int indexMap[]; ResultSetHandler handler; boolean update; + boolean dynamic; //TODO: boolean cached; boolean flushOnExecute; @@ -95,34 +97,40 @@ } - static ProcedureDescriptor compile(Method proc, String sqlStr, - ResultSetHandler handler,boolean update){ + static List parseSQL(String sqlStr,StringBuffer sb){ - java.util.ArrayList indexes = new java.util.ArrayList(); + List indexes = new java.util.ArrayList(); char sql[] = sqlStr.toCharArray(); - StringBuffer sb = new StringBuffer(); StringBuffer digit = new StringBuffer(); - boolean arg = false; - boolean escape = false; + final int ARG = 2; + final int ESCAPE = 4; + BitSet state = new BitSet(); for (int i = 0; i < sql.length; i++ ){ if(sql[i] == '$'){ - if(escape && !arg){ - escape = false; - arg = false; + if( state.get(ESCAPE) ){ + sb.append('$'); + state.clear(); continue; } - escape = true; - arg = false; - continue; + if(state.get(ARG)){ + indexes.add( new Integer(Integer.parseInt(digit.toString())) ); + sb.append('?'); + digit.delete(0, digit.length() ); + } + state.clear(); + state.set(ESCAPE); + continue ; } - if (Character.isDigit(sql[i]) && escape){ + if ( Character.isDigit(sql[i]) && + (state.get(ESCAPE) || state.get(ARG)) ){ digit.append(sql[i]); - arg = true; + state.clear(); + state.set(ARG); if( i != sql.length - 1 ){ continue; }else { @@ -130,7 +138,7 @@ } } - if(arg){ + if(state.get(ARG)){ indexes.add( new Integer(Integer.parseInt(digit.toString())) ); sb.append('?'); digit.delete(0, digit.length() ); @@ -138,11 +146,18 @@ if( i < sql.length ){ sb.append(sql[i]); } - escape = false; - arg = false; - + state.clear(); } + return indexes; + } + + static ProcedureDescriptor compile(Method proc, String sqlStr, + ResultSetHandler handler, boolean update){ + + StringBuffer sb = new StringBuffer(); + List indexes = parseSQL( sqlStr, sb ); + if( update && proc.getReturnType() != Void.TYPE && proc.getReturnType() != Integer.TYPE ){ throw new IllegalArgumentException( "update method " + proc + @@ -152,6 +167,11 @@ } ProcedureDescriptor descriptor = new ProcedureDescriptor(); + Object textArgs[] = new Object[proc.getParameterTypes().length]; + Arrays.fill(textArgs,""); + descriptor.dynamic = !sb.toString().equals( + MessageFormat.format(sb.toString(),textArgs) ); + if(indexes.size() > 0){ @@ -172,8 +192,8 @@ return descriptor; } - - static Method findMethod(Class cls, JavaMethod jmethod){ + + static Method findMethod(Class cls, JavaMethod jmethod){ Method methods[] = cls.getDeclaredMethods(); for(int i=0; i< methods.length; i++ ){ @@ -202,7 +222,7 @@ throw new IllegalStateException("metadata not found for " + jmethod); } - static ResultSetHandler findHandler(Method method, JavaMethod jmethod){ + static ResultSetHandler findHandler(Method method, JavaMethod jmethod){ ResultSetHandler handler = null; @@ -281,7 +301,7 @@ throw new IllegalStateException( "Handler not found for " + method ); } - static Map buildProcedures(Class cls){ + static Map buildProcedures(Class cls){ String res = cls.getName().replace('.','/') + ".java"; InputStream is = cls.getClassLoader().getResourceAsStream(res); @@ -321,7 +341,7 @@ } //TODO: ConvertUtils - static Object convert( Class to, Object from ){ + static Object convert( Class to, Object from ){ return from; } @@ -363,7 +383,7 @@ } return pargs; } - + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { try{ @@ -383,14 +403,14 @@ if(!descriptor.update){ return convert( method.getReturnType(), DbUtils.executeQuery( connection, - descriptor.jdbcSQL, + descriptor.dynamic ? MessageFormat.format(descriptor.jdbcSQL,args) : descriptor.jdbcSQL, prepareArgs(descriptor,args), descriptor.handler, - args + args )); }else{ int updateCount = DbUtils.executeUpdate( connection, - descriptor.jdbcSQL, + descriptor.dynamic ? MessageFormat.format(descriptor.jdbcSQL,args) : descriptor.jdbcSQL, prepareArgs(descriptor,args) ); @@ -418,8 +438,6 @@ } } - - } 1.5 +11 -1 jakarta-commons-sandbox/dbutils/src/test/org/apache/commons/dbutils/Demo.java Index: Demo.java =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/dbutils/src/test/org/apache/commons/dbutils/Demo.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- Demo.java 10 Mar 2003 19:35:42 -0000 1.4 +++ Demo.java 11 Mar 2003 10:19:48 -0000 1.5 @@ -37,11 +37,17 @@ /** - [EMAIL PROTECTED] SELECT ID, NAME FROM TBL + [EMAIL PROTECTED] SELECT * FROM TBL [EMAIL PROTECTED] DemoHandler */ public int print(java.io.PrintStream out) throws java.io.IOException; + /** + [EMAIL PROTECTED] SELECT * FROM {1} WHERE {2} > $4 + [EMAIL PROTECTED] DemoHandler + */ + public int dynamicPrint(java.io.PrintStream out, + String table, String field, int value) ; @@ -58,4 +64,8 @@ */ public void undeclaredError(); + + + + } 1.4 +1 -0 jakarta-commons-sandbox/dbutils/src/test/org/apache/commons/dbutils/DemoHandler.java Index: DemoHandler.java =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/dbutils/src/test/org/apache/commons/dbutils/DemoHandler.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- DemoHandler.java 10 Mar 2003 19:35:42 -0000 1.3 +++ DemoHandler.java 11 Mar 2003 10:19:48 -0000 1.4 @@ -30,6 +30,7 @@ } } + out.println(); return new Integer(cnt); } 1.5 +54 -1 jakarta-commons-sandbox/dbutils/src/test/org/apache/commons/dbutils/ProcedureUtilsTest.java Index: ProcedureUtilsTest.java =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/dbutils/src/test/org/apache/commons/dbutils/ProcedureUtilsTest.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- ProcedureUtilsTest.java 10 Mar 2003 19:35:42 -0000 1.4 +++ ProcedureUtilsTest.java 11 Mar 2003 10:19:48 -0000 1.5 @@ -54,6 +54,56 @@ demo.create(); } + public void testParseSQL() throws Exception { + + String in = "$1"; + String out = "?"; + StringBuffer buffer = new StringBuffer(); + List ind = ProcedureUtils.parseSQL(in, buffer); + + assertTrue(ind.contains(new Integer(1))); + assertEquals( out, buffer.toString() ); + + in = "$$1"; + out = "$1"; + buffer = new StringBuffer(); + ProcedureUtils.parseSQL(in, buffer); + + assertEquals( out, buffer.toString() ); + + in = "$$$1"; + out = "$?"; + buffer = new StringBuffer(); + ProcedureUtils.parseSQL(in, buffer); + + assertEquals( out, buffer.toString() ); + + + in = "$2$1$3"; + out = "???"; + buffer = new StringBuffer(); + ind = ProcedureUtils.parseSQL(in, buffer); + + assertEquals( out, buffer.toString() ); + assertEquals( ind.get(0), new Integer(2) ); + assertEquals( ind.get(1), new Integer(1) ); + assertEquals( ind.get(2), new Integer(3) ); + + + in = "A$2B$1C$3D$$0"; + out = "A?B?C?D$0"; + buffer = new StringBuffer(); + ind = ProcedureUtils.parseSQL(in, buffer); + + assertEquals( out, buffer.toString() ); + assertEquals( ind.get(0), new Integer(2) ); + assertEquals( ind.get(1), new Integer(1) ); + assertEquals( ind.get(2), new Integer(3) ); + + + + } + public void testGetInstance() throws Exception { Demo demo = getDemo(); @@ -65,9 +115,12 @@ demo.add(i + 2,"test" + i); } demo.print(System.out); - + System.out.println("DYNAMIC SQL:"); + demo.dynamicPrint(System.out,"TBL","ID",8); + demo.clear(); + } public void testSQLException() {
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]