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]

Reply via email to