dlr         02/03/17 23:59:03

  Modified:    src/java/org/apache/torque/adapter DB.java DBOracle.java
               src/java/org/apache/torque/util BasePeer.java
  Log:
  Merged in patch by Bill Schneider <[EMAIL PROTECTED]> to improve
  support for Oracle:
  
  "Here goes -- this patch should take care of native limits on Oracle +
  date formatting in Oracle adapter.  Why not kill two birds with one
  stone?"
  
  Bill's patch included handling of native limits for Sybase, which I
  commented out because it was not mentioned in his description, I have
  no Sybase installation to test against, and the MS SQL adapter
  subclasses from the Sybase adapter (making the change seem more
  risky).  I also cleaned up the date handling portion of the patch to
  call a private method which I added to reduce code duplication.
  
  Revision  Changes    Path
  1.22      +4 -1      
jakarta-turbine-torque/src/java/org/apache/torque/adapter/DB.java
  
  Index: DB.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-turbine-torque/src/java/org/apache/torque/adapter/DB.java,v
  retrieving revision 1.21
  retrieving revision 1.22
  diff -u -u -r1.21 -r1.22
  --- DB.java   18 Mar 2002 07:32:22 -0000      1.21
  +++ DB.java   18 Mar 2002 07:59:02 -0000      1.22
  @@ -90,7 +90,7 @@
    * @author <a href="mailto:[EMAIL PROTECTED]";>Jon S. Stevens</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Brett McLaughlin</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Daniel Rall</a>
  - * @version $Id: DB.java,v 1.21 2002/03/18 07:32:22 dlr Exp $
  + * @version $Id: DB.java,v 1.22 2002/03/18 07:59:02 dlr Exp $
    */
   public abstract class DB implements Serializable, IDMethod
   {
  @@ -105,6 +105,9 @@
   
       /** <code>SET ROWCOUNT &lt;offset&gt; SELECT ... SET ROWCOUNT 0</code> */
       public static final int LIMIT_STYLE_SYBASE = 3;
  +
  +    /** <code><pre>SELECT ... WHERE ... AND ROWNUM < <limit></pre></code> */
  +    public static final int LIMIT_STYLE_ORACLE = 4;
   
       /** The database user name. */
       protected String DB_USER;
  
  
  
  1.10      +59 -23    
jakarta-turbine-torque/src/java/org/apache/torque/adapter/DBOracle.java
  
  Index: DBOracle.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-turbine-torque/src/java/org/apache/torque/adapter/DBOracle.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -u -r1.9 -r1.10
  --- DBOracle.java     15 Mar 2002 21:47:45 -0000      1.9
  +++ DBOracle.java     18 Mar 2002 07:59:02 -0000      1.10
  @@ -55,6 +55,7 @@
    */
   
   import java.util.Date;
  +import java.text.SimpleDateFormat;
   import java.lang.reflect.Method;
   
   import java.sql.Connection;
  @@ -69,11 +70,15 @@
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Jon S. Stevens</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Brett McLaughlin</a>
  - * @version $Id: DBOracle.java,v 1.9 2002/03/15 21:47:45 dlr Exp $
  + * @author <a href="mailto:[EMAIL PROTECTED]";>Bill Schneider</a>
  + * @author <a href="mailto:[EMAIL PROTECTED]";>Daniel Rall</a>
  + * @version $Id: DBOracle.java,v 1.10 2002/03/18 07:59:02 dlr Exp $
    */
   public class DBOracle
       extends DB
   {
  +    private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
  +
       /**
        * Empty constructor.
        */
  @@ -166,6 +171,28 @@
           con.commit();
       }
   
  +    /**
  +     * This method is used to check whether the database natively
  +     * supports limiting the size of the resultset.
  +     *
  +     * @return True.
  +     */
  +    public boolean supportsNativeLimit()
  +    {
  +        return true;
  +    }
  +
  +    /**
  +     * This method is used to check whether the database supports
  +     * limiting the size of the resultset.
  +     *
  +     * @return LIMIT_STYLE_ORACLE.
  +     */
  +    public int getLimitStyle()
  +    {
  +        return DB.LIMIT_STYLE_ORACLE;
  +    }
  +
       public ConnectionPoolDataSource getConnectionPoolDataSource()
           throws java.sql.SQLException
       {
  @@ -184,36 +211,34 @@
           }
           catch (Exception e)
           {
  -            throw new
  -                SQLException("Could not create OracleConnectioPoolDataSource 
object: " + e);
  +            throw new SQLException
  +                ("Could not create OracleConnectioPoolDataSource object: " + e);
           }
       }
   
  -   /**
  -    * This method is for the SqlExpression.quoteAndEscape rules.  The rule is,
  -    * any string in a SqlExpression with a BACKSLASH will either be changed to
  -    * "\\" or left as "\".  SapDB does not need the escape character.
  -    *
  -    * @return false.
  -    */
  -
  +    /**
  +     * This method is for the SqlExpression.quoteAndEscape rules.  The rule is,
  +     * any string in a SqlExpression with a BACKSLASH will either be changed to
  +     * "\\" or left as "\".  SapDB does not need the escape character.
  +     *
  +     * @return false.
  +     */
       public boolean escapeText()
       {
           return false;
       }
   
  -
       /**
  -     * This method is used to format any date string.
  -     * Database can use different default date formats.
  +     * This method is used to format any date string using Oracle's
  +     * <code>TO_DATE</code> built-in function.
        *
  -     * @return The proper date formated String.
  +     * @see org.apache.torque.adapter.DB#getDateString(String)
        * @deprecated use getDateString(java.util.Date)
        */
  -  public String getDateString(String dateString)
  -  {
  -    return "TO_DATE('" + dateString + "', 'yyyy-mm-dd hh24:mi:ss..' )";
  -  }
  +    public String getDateString(String dateString)
  +    {
  +        return formatDate(dateString);
  +    }
   
       /**
        * This method is used to format any date string.
  @@ -221,8 +246,19 @@
        *
        * @return The proper date formated String.
        */
  -  public String getDateString(Date date)
  -  {
  -      return "TO_DATE('" + date.toString() + "', 'yyyy-mm-dd hh24:mi:ss..' )";
  -  }
  +    public String getDateString(Date date)
  +    {
  +        return formatDate(new SimpleDateFormat(DATE_FORMAT).format(date));
  +    }
  +
  +    /**
  +     * This method is used to format any date string using Oracle's
  +     * <code>TO_DATE</code> built-in function.
  +     */
  +    private final String formatDate(String date)
  +    {
  +        char delim = getStringDelimiter();
  +        return ("TO_DATE(" + delim + date + delim + ", " + delim +
  +                "yyyy-mm-dd hh24:mi:ss" + delim + ')');
  +    }
   }
  
  
  
  1.34      +17 -2     
jakarta-turbine-torque/src/java/org/apache/torque/util/BasePeer.java
  
  Index: BasePeer.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-turbine-torque/src/java/org/apache/torque/util/BasePeer.java,v
  retrieving revision 1.33
  retrieving revision 1.34
  diff -u -u -r1.33 -r1.34
  --- BasePeer.java     16 Mar 2002 00:20:02 -0000      1.33
  +++ BasePeer.java     18 Mar 2002 07:59:02 -0000      1.34
  @@ -115,7 +115,7 @@
    * @author <a href="mailto:[EMAIL PROTECTED]";>Frank Y. Kim</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>John D. McNally</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Brett McLaughlin</a>
  - * @version $Id: BasePeer.java,v 1.33 2002/03/16 00:20:02 jon Exp $
  + * @version $Id: BasePeer.java,v 1.34 2002/03/18 07:59:02 dlr Exp $
    */
   public abstract class BasePeer implements java.io.Serializable
   {
  @@ -2519,7 +2519,22 @@
               criteria.setLimit(-1);
           }
   
  -        if (limitString != null) query.setLimit(limitString);
  +        if (limitString != null)
  +        {
  +            switch (db.getLimitStyle())
  +            {
  +            case DB.LIMIT_STYLE_ORACLE:
  +                whereClause.add("rownum <= " + limitString);
  +                break;
  +            /* Don't have a Sybase install to validate this against. (dlr)
  +            case DB.LIMIT_STYLE_SYBASE:
  +                query.setRowcount(limitString);
  +                break;
  +            */
  +            default:
  +                query.setLimit(limitString);
  +            }
  +        }
   
           String sql = query.toString();
           category.debug(sql);
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to