You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-dev@db.apache.org by to...@apache.org on 2005/04/24 18:29:10 UTC

cvs commit: db-ojb/src/java/org/apache/ojb/broker/accesslayer StatementsForClassImpl.java

tomdz       2005/04/24 09:29:10

  Modified:    src/java/org/apache/ojb/broker/accesslayer/sql
                        SqlGeneratorDefaultImpl.java
               src/java/org/apache/ojb/broker/query QueryFactory.java
                        QueryByExampleImpl.java QueryByExample.java
                        QueryFactoryNew.java QueryFactoryNewImpl.java
               src/java/org/apache/ojb/broker/core
                        QueryReferenceBroker.java
               src/java/org/apache/ojb/broker/metadata
                        ArgumentDescriptor.java ProcedureDescriptor.java
                        RepositoryTags.java RepositoryElements.java
                        ClassDescriptor.java RepositoryXmlHandler.java
               src/java/org/apache/ojb/broker/accesslayer
                        StatementsForClassImpl.java
  Added:       src/java/org/apache/ojb/broker/accesslayer/sql
                        SqlProcedureFKStatement.java
               src/java/org/apache/ojb/broker/metadata
                        SelectByFKProcedureDescriptor.java
                        SelectByPKProcedureDescriptor.java
  Log:
  Applied patch (except to the XDoclet module) supplied by Vadim Gritsenko with issue OJB-16 with small changes to account for changes in the 1.1 branch
  
  Revision  Changes    Path
  1.29      +29 -6     db-ojb/src/java/org/apache/ojb/broker/accesslayer/sql/SqlGeneratorDefaultImpl.java
  
  Index: SqlGeneratorDefaultImpl.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/accesslayer/sql/SqlGeneratorDefaultImpl.java,v
  retrieving revision 1.28
  retrieving revision 1.29
  diff -u -r1.28 -r1.29
  --- SqlGeneratorDefaultImpl.java	2 Dec 2004 21:37:46 -0000	1.28
  +++ SqlGeneratorDefaultImpl.java	24 Apr 2005 16:29:10 -0000	1.29
  @@ -28,6 +28,7 @@
   import org.apache.ojb.broker.query.InCriterion;
   import org.apache.ojb.broker.query.NullCriteria;
   import org.apache.ojb.broker.query.Query;
  +import org.apache.ojb.broker.query.QueryByExample;
   import org.apache.ojb.broker.query.SelectionCriteria;
   import org.apache.ojb.broker.query.SqlCriteria;
   import org.apache.ojb.broker.util.logging.Logger;
  @@ -185,11 +186,19 @@
        */
       public String getPreparedSelectByPkStatement(ClassDescriptor cld)
       {
  -        SqlStatement sql;
  -        String result;
  +        ProcedureDescriptor pd = cld.getSelectByPKProcedure();
  +        SqlStatement        sql;
   
  -        sql = new SqlSelectByPkStatement(m_platform, m_logger, cld);
  -        result = sql.getStatement();
  +        if (pd == null)
  +        {
  +            sql = new SqlSelectByPkStatement(m_platform, m_logger, cld);
  +        }
  +        else
  +        {
  +            sql = new SqlProcedureStatement(pd, m_logger);
  +        }
  +
  +        String result = sql.getStatement();
   
           if (m_logger.isDebugEnabled())
           {
  @@ -205,7 +214,21 @@
        */
       public String getPreparedSelectStatement(Query query, ClassDescriptor cld)
       {
  -        return new SqlSelectStatement(m_platform, m_logger, cld, query).getStatement();
  +        ProcedureDescriptor pd = cld.getSelectByFKProcedure();
  +        SqlStatement        sql;
  +
  +        if ((query instanceof QueryByExample) && (pd != null))
  +        {
  +            // Special case for QueryByExample and SelectByFKProcedure
  +            sql = new SqlProcedureFKStatement(pd, (QueryByExample)query, m_logger);
  +        }
  +        else
  +         {
  +            // All other queries
  +            sql = new SqlSelectStatement(m_platform, m_logger, cld, query);
  +        }
  +
  +        return sql.getStatement();
       }
   
       /**
  
  
  
  1.1                  db-ojb/src/java/org/apache/ojb/broker/accesslayer/sql/SqlProcedureFKStatement.java
  
  Index: SqlProcedureFKStatement.java
  ===================================================================
  package org.apache.ojb.broker.accesslayer.sql;
  
  /* Copyright 2003-2004 The Apache Software Foundation
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  import java.util.Collection;
  import java.util.Enumeration;
  import java.util.HashMap;
  import java.util.Iterator;
  
  import org.apache.ojb.broker.metadata.ArgumentDescriptor;
  import org.apache.ojb.broker.metadata.ProcedureDescriptor;
  import org.apache.ojb.broker.query.QueryByExample;
  import org.apache.ojb.broker.query.SelectionCriteria;
  import org.apache.ojb.broker.util.logging.Logger;
  
  /**
   * Model a call to a stored procedure based on ProcedureDescriptors
   *
   * @see org.apache.ojb.broker.metadata.ProcedureDescriptor
   * @author <a href="mailto:rburt3@mchsi.com">Randall Burt</a>
   * @author <a href="mailto:rgallagh@bellsouth.net">Ron Gallagher</a>
   * @author <a href="mailto:vgritsenko@apache.org">Vadim Gritsenko</a>
   * @version $Id: SqlProcedureFKStatement.java,v 1.1 2005/04/24 16:29:10 tomdz Exp $
   */
  public class SqlProcedureFKStatement implements SqlStatement
  {
  
      /**
       * The descriptor that defines the procedure to invoke.
       */
      private ProcedureDescriptor procedureDescriptor;
  
      /**
       * Query
       */
      private QueryByExample query;
  
      /**
       * The logger to utilize
       */
      private Logger logger;
  
      /**
       * Create an instance of this object.
       *
       * @param procedureDescriptor the descriptor that defines the procedure to invoke.
       * @param logger the logger to utilize
       */
      public SqlProcedureFKStatement(ProcedureDescriptor procedureDescriptor, QueryByExample query, Logger logger)
      {
          // Save the values.
          this.procedureDescriptor = procedureDescriptor;
          this.query = query;
          this.logger = logger;
      }
  
      /**
       * Get the syntax that is required to invoke the procedure that is defined
       * by the <code>ProcedureDescriptor</code> that was passed to the
       * constructor of this class.
       *
       * @see SqlStatement#getStatement()
       */
      public String getStatement()
      {
          // Collect criteria name/values
          HashMap values = new HashMap();
          for (Enumeration e = query.getCriteria().getElements(); e.hasMoreElements();) {
              SelectionCriteria c = (SelectionCriteria) e.nextElement();
              if (c.getValue() != null) {
                  values.put(c.getAttribute(), c.getValue());
              }
          }
  
          // Build statement
          StringBuffer sb = new StringBuffer(512);
          if (this.procedureDescriptor.hasReturnValue())
          {
              sb.append("{ ?= call ");
          }
          else
          {
              sb.append("{ call ");
          }
          sb.append(this.procedureDescriptor.getName());
          sb.append("(");
  
          Collection arguments = this.procedureDescriptor.getArguments();
          for (Iterator i = arguments.iterator(); i.hasNext();)
          {
              ArgumentDescriptor argument = (ArgumentDescriptor) i.next();
              Object value = values.get(argument.getFieldRefName());
              if (value == null) {
                  sb.append("NULL");
              } else {
                  sb.append("?");
              }
  
              if (i.hasNext()) {
                  sb.append(',');
              }
          }
          sb.append(") }");
          return sb.toString();
      }
  }
  
  
  
  1.23      +10 -1     db-ojb/src/java/org/apache/ojb/broker/query/QueryFactory.java
  
  Index: QueryFactory.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/query/QueryFactory.java,v
  retrieving revision 1.22
  retrieving revision 1.23
  diff -u -r1.22 -r1.23
  --- QueryFactory.java	13 Apr 2005 18:44:17 -0000	1.22
  +++ QueryFactory.java	24 Apr 2005 16:29:10 -0000	1.23
  @@ -120,6 +120,15 @@
       }
   
       /**
  +     * Return a QueryByExample for name-value pairs
  +     * @return QueryByExample
  +     */
  +    public static QueryByExample newQueryByExample(Class classToSearchFrom, String[] names, Object[] values, boolean distinct)
  +    {
  +        return theFactory.newQueryByExample(classToSearchFrom, names, values, distinct);
  +    }
  +
  +    /**
        * create a new QueryByMtoNCriteria
        * @param classToSearchFrom
        * @param indirectionTable
  
  
  
  1.2       +82 -39    db-ojb/src/java/org/apache/ojb/broker/query/QueryByExampleImpl.java
  
  Index: QueryByExampleImpl.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/query/QueryByExampleImpl.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- QueryByExampleImpl.java	1 Apr 2005 20:28:08 -0000	1.1
  +++ QueryByExampleImpl.java	24 Apr 2005 16:29:10 -0000	1.2
  @@ -33,40 +33,59 @@
   {
       private static final long serialVersionUID = -7982652379502961071L;
   
  -    private Object m_exampleObject;
  -    private boolean m_ignoreZero = false; // numeric 0 are treated as null
  +    private Object   exampleObject;
  +    private String[] fieldNames;
  +    private Object[] values;
  +    private boolean  ignoreZero = false; // numeric 0 are treated as null
   
       /**
        * @param anExampleObject
        */
       QueryByExampleImpl(Object anExampleObject)
       {
  -        this (anExampleObject, false);
  +        this(anExampleObject, false);
       }
  -    
  +
       /**
        * @param anExampleObject
        * @param distinct
        */
  -    QueryByExampleImpl(Object anExampleObject, boolean distinct)
  +    QueryByExampleImpl(Object exampleObject, boolean distinct)
       {
  -        m_exampleObject = anExampleObject;
  +        this.exampleObject = exampleObject;
  +        this.fieldNames    = null;
  +        this.values        = null;
   
  -        setSearchClass(anExampleObject.getClass());
  -        setBaseClass(anExampleObject.getClass());
  -    
  +        setSearchClass(exampleObject.getClass());
  +        setBaseClass(exampleObject.getClass());
  +        setDistinct(distinct);
  +    }
  +
  +    /**
  +     * Build a Query based on name/value pairs<br>
  +     * all non null values are used as EqualToCriteria
  +     */
  +    QueryByExampleImpl(Class classToSearchFrom, String[] names, Object[] values, boolean distinct)
  +    {
  +        this.exampleObject = null;
  +        this.fieldNames    = names;
  +        this.values        = values;
  +
  +        setSearchClass(classToSearchFrom);
  +        setBaseClass(classToSearchFrom);
           setDistinct(distinct);
       }
   
       /**
        * Copy Constructor
  -     * @param aQuery
  +     * @param source
        */
  -    QueryByExampleImpl(QueryByExampleImpl aQuery)
  +    QueryByExampleImpl(QueryByExampleImpl source)
       {
  -        super(aQuery);
  -        
  -        m_exampleObject = aQuery.getExampleObject();
  +        super(source);
  +        exampleObject = source.exampleObject;
  +        fieldNames    = source.fieldNames;
  +        values        = source.values;
       }
   
       /**
  @@ -74,7 +93,7 @@
        */
       public Object getExampleObject()
       {
  -        return m_exampleObject;
  +        return exampleObject;
       }
       
       /**
  @@ -86,51 +105,75 @@
        */
       protected void buildCriteria(PersistenceBroker aPb)
       {
  -        Object example = getExampleObject();
  -        DescriptorRepository repository = aPb.getConfiguration().getModel();
  -        ClassDescriptor cld = repository.getDescriptorFor(example.getClass());
  -        FieldDescriptor[] fds = cld.getFieldDescriptions();
           Criteria criteria = new Criteria();
   
  -        for (int i = 0; i < fds.length; i++)
  +        if (exampleObject != null)
           {
  -            try
  +            Object               example    = getExampleObject();
  +            DescriptorRepository repository = aPb.getConfiguration().getModel();
  +            ClassDescriptor      cld        = repository.getDescriptorFor(example.getClass());
  +            FieldDescriptor[]    fds        = cld.getFieldDescriptions();
  +    
  +            for (int idx = 0; idx < fds.length; idx++)
               {
  -                PersistentField f = fds[i].getPersistentField();
  -                Object value = f.get(example);
  -                
  -                if (value != null)
  +                try
                   {
  -                    if (value instanceof Number && isIgnoreZero())
  +                    PersistentField f     = fds[idx].getPersistentField();
  +                    Object          value = f.get(example);
  +                    
  +                    if (value != null)
                       {
  -                        Number numVal = (Number)value;
  -                        if (numVal.floatValue() != 0f)
  +                        if (isIgnoreZero() && (value instanceof Number))
                           {
  -                            criteria.addEqualTo(f.getName(), value);                            
  +                            Number numVal = (Number)value;
  +    
  +                            if (numVal.floatValue() != 0f)
  +                            {
  +                                criteria.addEqualTo(f.getName(), value);                            
  +                            }
                           }
  +                        else
  +                        {
  +                            criteria.addEqualTo(f.getName(), value);
  +                        }    
                       }
  -                    else
  -                    {
  -                        criteria.addEqualTo(f.getName(), value);
  -                    }    
  +                }
  +                catch (Throwable ex)
  +                {
  +                    LoggerFactory.getDefaultLogger().error(ex);
                   }
               }
  -            catch (Throwable ex)
  +        }
  +        else
  +        {
  +            for (int idx = 0; idx < fieldNames.length; idx++)
               {
  -                LoggerFactory.getDefaultLogger().error(ex);
  +                if (isIgnoreZero() && (values[idx]  instanceof Number))
  +                {
  +                    Number numVal = (Number)values[idx] ;
  +
  +                    if (numVal.floatValue() != 0f)
  +                    {
  +                        criteria.addEqualTo(fieldNames[idx], values[idx] );                            
  +                    }
  +                }
  +                else
  +                {
  +                    criteria.addEqualTo(fieldNames[idx], values[idx]);
  +                }    
               }
           }
   
           setCriteria(criteria);
       }
  -    
  +
       /**
        * if true numeric 0 is not included in the criteria.
        * @return Returns the ignoreZero.
        */
       public boolean isIgnoreZero()
       {
  -        return m_ignoreZero;
  +        return ignoreZero;
       }
       
       /**
  @@ -139,7 +182,7 @@
        */
       public void setIgnoreZero(boolean ignoreZero)
       {
  -        m_ignoreZero = ignoreZero;
  +        this.ignoreZero = ignoreZero;
       }
       
       /**
  
  
  
  1.9       +2 -2      db-ojb/src/java/org/apache/ojb/broker/query/QueryByExample.java
  
  Index: QueryByExample.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/query/QueryByExample.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- QueryByExample.java	1 Apr 2005 20:28:08 -0000	1.8
  +++ QueryByExample.java	24 Apr 2005 16:29:10 -0000	1.9
  @@ -22,7 +22,7 @@
    * @author <a href="mailto:jbraeuchi@gmx.ch">Jakob Braeuchi</a>
    * @version $Id$
    */
  -public interface QueryByExample extends Query
  +public interface QueryByExample extends QueryByCriteria
   {
       /**
        * if true numeric 0 is not included in the criteria.
  
  
  
  1.2       +12 -1     db-ojb/src/java/org/apache/ojb/broker/query/QueryFactoryNew.java
  
  Index: QueryFactoryNew.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/query/QueryFactoryNew.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- QueryFactoryNew.java	7 Apr 2005 19:55:11 -0000	1.1
  +++ QueryFactoryNew.java	24 Apr 2005 16:29:10 -0000	1.2
  @@ -90,6 +90,17 @@
       QueryByExample newQueryByExample(Object example);
   
       /**
  +     * Return a QueryByCriteria for example.
  +     * <br>Use with care because building of Query is not foolproof !!!
  +     * @param classToSearchFrom
  +     * @param names
  +     * @param values
  +     * @param distinct
  +     * @return QueryByExample
  +     */
  +    QueryByExample newQueryByExample(Class classToSearchFrom, String[] names, Object[] values, boolean distinct);
  +
  +    /**
        * create a new QueryByMtoNCriteria.
        * @param classToSearchFrom
        * @param indirectionTable
  
  
  
  1.2       +15 -1     db-ojb/src/java/org/apache/ojb/broker/query/QueryFactoryNewImpl.java
  
  Index: QueryFactoryNewImpl.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/query/QueryFactoryNewImpl.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- QueryFactoryNewImpl.java	7 Apr 2005 19:55:11 -0000	1.1
  +++ QueryFactoryNewImpl.java	24 Apr 2005 16:29:10 -0000	1.2
  @@ -116,6 +116,20 @@
       }
   
       /**
  +     * Return a QueryByCriteria for example.
  +     * <br>Use with care because building of Query is not foolproof !!!
  +     * @param classToSearchFrom
  +     * @param names
  +     * @param values
  +     * @param distinct
  +     * @return QueryByExample
  +     */
  +    public QueryByExample newQueryByExample(Class classToSearchFrom, String[] names, Object[] values, boolean distinct)
  +    {
  +        return new QueryByExampleImpl(classToSearchFrom, names, values, distinct);
  +    }
  +
  +    /**
        * create a new QueryByMtoNCriteria.
        * @param classToSearchFrom
        * @param indirectionTable
  
  
  
  1.36      +28 -10    db-ojb/src/java/org/apache/ojb/broker/core/QueryReferenceBroker.java
  
  Index: QueryReferenceBroker.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/core/QueryReferenceBroker.java,v
  retrieving revision 1.35
  retrieving revision 1.36
  diff -u -r1.35 -r1.36
  --- QueryReferenceBroker.java	23 Apr 2005 14:39:51 -0000	1.35
  +++ QueryReferenceBroker.java	24 Apr 2005 16:29:10 -0000	1.36
  @@ -362,7 +362,8 @@
                   }
                   else if ((m_retrievalTasks != null)
                           && !rds.isLazy()
  -                        && (rds.getItemProxyClass() == null))
  +                        && (rds.getItemProxyClass() == null)
  +                        && (pb.getClassDescriptor(rds.getItemClass()).getSelectByFKProcedure() == null))
                   {
                       addRetrievalTask(obj, rds);
                       isRefObjDefined = false;
  @@ -585,7 +586,8 @@
           {
               if ((m_retrievalTasks != null) && !cds.isLazy()
                       && !cds.hasProxyItems()
  -                    && (cds.getQueryCustomizer() == null))
  +                    && (cds.getQueryCustomizer() == null)
  +                    && (pb.getClassDescriptor(cds.getItemClass()).getSelectByFKProcedure() == null))
               {
                   addRetrievalTask(obj, cds);
               }
  @@ -732,18 +734,34 @@
        */
       private QueryByCriteria getFKQuery1toN(Object obj, CollectionDescriptor cod)
       {
  -        ValueContainer[] values = pb.serviceBrokerHelper().getFkTargetValuesForObject(cod, obj ,false);
  -        ClassDescriptor refCld = cod.getItemClassDescriptor();
  +        ValueContainer[]  container = pb.serviceBrokerHelper().getFkTargetValuesForObject(cod, obj ,false);
  +        ClassDescriptor   refCld = cod.getItemClassDescriptor();
           FieldDescriptor[] fields = cod.getForeignKeyFieldDescriptors(refCld);
  -        Criteria criteria = new Criteria();
   
  -        for (int i = 0; i < fields.length; i++)
  +        if (refCld.getSelectByFKProcedure() != null)
           {
  -            FieldDescriptor fld = fields[i];
  -            criteria.addEqualTo(fld.getAttributeName(), values[i].getValue());
  +            String[]          names  = new String[fields.length];
  +            Object[]          values = new Object[fields.length];
  +    
  +            for (int idx = 0; idx < fields.length; idx++)
  +            {
  +                names[idx]  = fields[idx].getAttributeName();
  +                values[idx] = container[idx].getValue();
  +            }
  +    
  +            return pb.getQueryFactory().newQueryByExample(refCld.getClassOfObject(), names, values, false);
           }
  +        else
  +        {
  +            Criteria criteria = new Criteria();
  +
  +            for (int idx = 0; idx < fields.length; idx++)
  +            {
  +                criteria.addEqualTo(fields[idx].getAttributeName(), container[idx].getValue());
  +            }
   
  -        return pb.getQueryFactory().newQuery(refCld.getClassOfObject(), criteria);
  +            return pb.getQueryFactory().newQuery(refCld.getClassOfObject(), criteria);
  +        }
       }
   
       /**
  
  
  
  1.10      +10 -1     db-ojb/src/java/org/apache/ojb/broker/metadata/ArgumentDescriptor.java
  
  Index: ArgumentDescriptor.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/metadata/ArgumentDescriptor.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- ArgumentDescriptor.java	11 Aug 2004 00:41:46 -0000	1.9
  +++ ArgumentDescriptor.java	24 Apr 2005 16:29:10 -0000	1.10
  @@ -187,6 +187,15 @@
           }
       }
   
  +    /**
  +     * Retrieve the field name that this argument is related to.
  +     * @return The current value
  +     */
  +    public final String getFieldRefName()
  +    {
  +        return this.fieldRefName;
  +    }
  +
       //---------------------------------------------------------------
       /**
        * Retrieve the field descriptor that this argument is related to.
  
  
  
  1.8       +2 -2      db-ojb/src/java/org/apache/ojb/broker/metadata/ProcedureDescriptor.java
  
  Index: ProcedureDescriptor.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/metadata/ProcedureDescriptor.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- ProcedureDescriptor.java	4 Apr 2004 23:53:34 -0000	1.7
  +++ ProcedureDescriptor.java	24 Apr 2005 16:29:10 -0000	1.8
  @@ -124,7 +124,7 @@
        * @return <code>true</code> if there is a return value for this
        * procedure.
        */
  -    public final boolean hasReturnValue()
  +    public boolean hasReturnValue()
       {
           return (this.returnValueFieldRef != null);
       }
  
  
  
  1.41      +2 -0      db-ojb/src/java/org/apache/ojb/broker/metadata/RepositoryTags.java
  
  Index: RepositoryTags.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/metadata/RepositoryTags.java,v
  retrieving revision 1.40
  retrieving revision 1.41
  diff -u -r1.40 -r1.41
  --- RepositoryTags.java	6 Jan 2005 21:00:02 -0000	1.40
  +++ RepositoryTags.java	24 Apr 2005 16:29:10 -0000	1.41
  @@ -165,6 +165,8 @@
           table.put("insert-procedure", new Integer(INSERT_PROCEDURE));
           table.put("update-procedure", new Integer(UPDATE_PROCEDURE));
           table.put("delete-procedure", new Integer(DELETE_PROCEDURE));
  +        table.put("select-by-pk-procedure", new Integer(SELECTBYPK_PROCEDURE));
  +        table.put("select-by-fk-procedure", new Integer(SELECTBYFK_PROCEDURE));
           table.put("constant-argument", new Integer(CONSTANT_ARGUMENT));
           table.put("runtime-argument", new Integer(RUNTIME_ARGUMENT));
           table.put("return", new Integer(RETURN));
  
  
  
  1.41      +4 -1      db-ojb/src/java/org/apache/ojb/broker/metadata/RepositoryElements.java
  
  Index: RepositoryElements.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/metadata/RepositoryElements.java,v
  retrieving revision 1.40
  retrieving revision 1.41
  diff -u -r1.40 -r1.41
  --- RepositoryElements.java	6 Jan 2005 21:00:02 -0000	1.40
  +++ RepositoryElements.java	24 Apr 2005 16:29:10 -0000	1.41
  @@ -148,8 +148,11 @@
   
   	public static final int USE_OBJECT_FACTORY = 121;
   
  +    public static final int SELECTBYPK_PROCEDURE = 123;
  +    public static final int SELECTBYFK_PROCEDURE = 124;
  +
       // maintain a next id to keep track where we are
  -    static final int _NEXT = 123;
  +    static final int _NEXT = 125;
   
       // String constants
       public static final String TAG_ACCESS = "access";
  
  
  
  1.106     +61 -2     db-ojb/src/java/org/apache/ojb/broker/metadata/ClassDescriptor.java
  
  Index: ClassDescriptor.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/metadata/ClassDescriptor.java,v
  retrieving revision 1.105
  retrieving revision 1.106
  diff -u -r1.105 -r1.106
  --- ClassDescriptor.java	2 Apr 2005 09:44:39 -0000	1.105
  +++ ClassDescriptor.java	24 Apr 2005 16:29:10 -0000	1.106
  @@ -77,6 +77,17 @@
        */
       private DeleteProcedureDescriptor deleteProcedure;
   
  +    /**
  +     * The descriptor for the select by PK procedure/function.
  +     */
  +    private SelectByPKProcedureDescriptor selectByPKProcedure;
  +
  +    //---------------------------------------------------------------
  +    /**
  +     * The descriptor for the select by FK procedure/function.
  +     */
  +    private SelectByFKProcedureDescriptor selectByFKProcedure;
  +
       //---------------------------------------------------------------
       // transient fields, to make this class serializable we have to declare
       // some transient fields and some associated string fields to reinitialze
  @@ -248,6 +259,7 @@
       {
           return baseClass;
       }
  +
       public void setBaseClass(String baseClass)
       {
           this.baseClass = baseClass;
  @@ -257,6 +269,7 @@
       {
           this.superPersistentFieldDescriptors = superPersistentFieldDescriptors;
       }
  +
       public Vector getSuperPersistentFieldDescriptors()
       {
           return superPersistentFieldDescriptors;
  @@ -1688,7 +1701,53 @@
        */
       public DeleteProcedureDescriptor getDeleteProcedure()
       {
  -        return this.deleteProcedure;
  +        return deleteProcedure;
  +    }
  +
  +    /**
  +     * Change the descriptor for the select by PK procedure/function.
  +     *
  +     * @param newValue the new value.
  +     */
  +    public void setSelectByPKProcedure(SelectByPKProcedureDescriptor newValue)
  +    {
  +        selectByPKProcedure = newValue;
  +    }
  +
  +    /**
  +     * Change the descriptor for the select by FK procedure/function.
  +     *
  +     * @param newValue the new value.
  +     */
  +    public void setSelectByFKProcedure(SelectByFKProcedureDescriptor newValue)
  +    {
  +        selectByFKProcedure = newValue;
  +        if (selectByFKProcedure != null)
  +        {
  +            selectByFKProcedure.initArguments();
  +        }
  +    }
  +
  +    //---------------------------------------------------------------
  +    /**
  +     * Retrieve the descriptor for the select by PK procedure/function.
  +     *
  +     * @return The current value
  +     */
  +    public SelectByFKProcedureDescriptor getSelectByFKProcedure()
  +    {
  +        return selectByFKProcedure;
  +    }
  +
  +    //---------------------------------------------------------------
  +    /**
  +     * Retrieve the descriptor for the select by PK procedure/function.
  +     *
  +     * @return The current value
  +     */
  +    public SelectByPKProcedureDescriptor getSelectByPKProcedure()
  +    {
  +        return this.selectByPKProcedure;
       }
   
       /**
  
  
  
  1.68      +65 -1     db-ojb/src/java/org/apache/ojb/broker/metadata/RepositoryXmlHandler.java
  
  Index: RepositoryXmlHandler.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/metadata/RepositoryXmlHandler.java,v
  retrieving revision 1.67
  retrieving revision 1.68
  diff -u -r1.67 -r1.68
  --- RepositoryXmlHandler.java	6 Jan 2005 21:00:02 -0000	1.67
  +++ RepositoryXmlHandler.java	24 Apr 2005 16:29:10 -0000	1.68
  @@ -947,6 +947,56 @@
                           break;
   
                       }
  +                case SELECTBYPK_PROCEDURE:
  +                    {
  +                        if (isDebug) logger.debug("    > " + RepositoryTags.getTagById(SELECTBYPK_PROCEDURE));
  +
  +                        // Get the proc name
  +                        String procName = atts.getValue(RepositoryTags.getTagById(NAME));
  +                        if (isDebug) logger.debug("     " + RepositoryTags.getTagById(NAME) +
  +                                                  ": " + procName);
  +
  +                        // create the procedure descriptor
  +                        SelectByPKProcedureDescriptor proc =
  +                            new SelectByPKProcedureDescriptor(m_CurrentCLD,
  +                                                          procName);
  +                        m_CurrentProcedure = proc;
  +
  +                        // Get the name of the field ref that will receive the
  +                        // return value.
  +                        String returnFieldRefName = atts.getValue(RepositoryTags.getTagById(RETURN_FIELD_REF));
  +                        if (isDebug) logger.debug("     " + RepositoryTags.getTagById(RETURN_FIELD_REF) +
  +                                                  ": " + returnFieldRefName);
  +                        proc.setReturnValueFieldRef(returnFieldRefName);
  +
  +                        break;
  +
  +                    }
  +                case SELECTBYFK_PROCEDURE:
  +                    {
  +                        if (isDebug) logger.debug("    > " + RepositoryTags.getTagById(SELECTBYFK_PROCEDURE));
  +
  +                        // Get the proc name
  +                        String procName = atts.getValue(RepositoryTags.getTagById(NAME));
  +                        if (isDebug) logger.debug("     " + RepositoryTags.getTagById(NAME) +
  +                                                  ": " + procName);
  +
  +                        // create the procedure descriptor
  +                        SelectByFKProcedureDescriptor proc =
  +                            new SelectByFKProcedureDescriptor(m_CurrentCLD,
  +                                                          procName);
  +                        m_CurrentProcedure = proc;
  +
  +                        // Get the name of the field ref that will receive the
  +                        // return value.
  +                        String returnFieldRefName = atts.getValue(RepositoryTags.getTagById(RETURN_FIELD_REF));
  +                        if (isDebug) logger.debug("     " + RepositoryTags.getTagById(RETURN_FIELD_REF) +
  +                                                  ": " + returnFieldRefName);
  +                        proc.setReturnValueFieldRef(returnFieldRefName);
  +
  +                        break;
  +
  +                    }
                   case CONSTANT_ARGUMENT:
                       {
                           String value = null;
  @@ -1140,6 +1190,20 @@
                           m_CurrentProcedure = null;
                           break;
                       }
  +                case SELECTBYPK_PROCEDURE:
  +                    {
  +                        if (isDebug) logger.debug("    < " + RepositoryTags.getTagById(SELECTBYPK_PROCEDURE));
  +                        m_CurrentCLD.setSelectByPKProcedure((SelectByPKProcedureDescriptor)m_CurrentProcedure);
  +                        m_CurrentProcedure = null;
  +                        break;
  +                    }
  +                case SELECTBYFK_PROCEDURE:
  +                    {
  +                        if (isDebug) logger.debug("    < " + RepositoryTags.getTagById(SELECTBYFK_PROCEDURE));
  +                        m_CurrentCLD.setSelectByFKProcedure((SelectByFKProcedureDescriptor)m_CurrentProcedure);
  +                        m_CurrentProcedure = null;
  +                        break;
  +                    }
                   case CONSTANT_ARGUMENT:
                       {
                           if (isDebug) logger.debug("    < " + RepositoryTags.getTagById(CONSTANT_ARGUMENT));
  
  
  
  1.1                  db-ojb/src/java/org/apache/ojb/broker/metadata/SelectByFKProcedureDescriptor.java
  
  Index: SelectByFKProcedureDescriptor.java
  ===================================================================
  package org.apache.ojb.broker.metadata;
  
  /* Copyright 2004-2004 The Apache Software Foundation
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  import org.apache.commons.lang.builder.ToStringBuilder;
  import org.apache.commons.lang.builder.ToStringStyle;
  
  import java.io.Serializable;
  import java.util.Vector;
  
  /**
   * An SelectByFKProcedureDescriptor contains information that is related to the
   * procedure/function that is used to handle selecting of the record by somebody's FK.
   * <br>
   * Note: Be careful when use SelectByFKProcedureDescriptor variables or caching
   * SelectByFKProcedureDescriptor instances, because instances could become invalid
   * during runtime (see {@link MetadataManager}).
   *
   * @author <a href="mailto:vgritsenko@apache.org">Vadim Gritsenko</a>
   * @version $Id: SelectByFKProcedureDescriptor.java,v 1.1 2005/04/24 16:29:10 tomdz Exp $
   */
  public class SelectByFKProcedureDescriptor extends ProcedureDescriptor
      implements Serializable, XmlCapable
  {
      private static final long serialVersionUID = 3834306215823355958L;
  
      //---------------------------------------------------------------
      /**
       * Constructor declaration
       */
      public SelectByFKProcedureDescriptor(
          ClassDescriptor classDescriptor,
          String name)
      {
          super(classDescriptor, name);
          addArguments(getClassDescriptor().getFieldDescriptions());
      }
  
      /**
       * SelectByFK procedure always returns one value, ResultSet
       */
      public boolean hasReturnValue()
      {
          return true;
      }
  
      /*
       * @see XmlCapable#toXML()
       */
      public String toXML()
      {
          String eol = System.getProperty( "line.separator" );
  
          // The result
          StringBuffer result = new StringBuffer( 1024 );
          result.append( eol );
          result.append( "   " );
  
          // Opening tag and attributes
          result.append( " " );
          result.append( RepositoryTags.getOpeningTagNonClosingById( SELECTBYFK_PROCEDURE ) );
          result.append( " " );
          result.append( RepositoryTags.getAttribute( NAME, this.getName() ) );
          result.append( ">" );
          result.append( eol );
  
          // Closing tag
          result.append( "    " );
          result.append( RepositoryTags.getClosingTagById( SELECTBYFK_PROCEDURE ) );
          result.append( eol );
          return result.toString();
      }
  
      //---------------------------------------------------------------
      /**
       * Provide a string representation of this object
       *
       * @return a string representation of this object
       */
      public String toString()
      {
          ToStringBuilder buf = new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE);
          buf.append("name", this.getName());
          return buf.toString();
      }
  
      public void initArguments() {
          Vector refs = getClassDescriptor().getSuperPersistentFieldDescriptors();
          if (refs != null) {
              // Re-init arguments collection
              getArguments().clear();
  
              // Add super arguments
              addSuperArguments(getClassDescriptor().getBaseClass());
  
              // Add my arguments
              addArguments(getClassDescriptor().getFieldDescriptions());
          }
      }
  
      private void addSuperArguments(String baseClass) {
          if (baseClass != null) {
              ClassDescriptor baseCld = getClassDescriptor().getRepository().getDescriptorFor(baseClass);
              addSuperArguments(baseCld.getBaseClass());
              addArguments(baseCld.getFieldDescriptions());
          }
      }
  }
  
  
  
  1.1                  db-ojb/src/java/org/apache/ojb/broker/metadata/SelectByPKProcedureDescriptor.java
  
  Index: SelectByPKProcedureDescriptor.java
  ===================================================================
  package org.apache.ojb.broker.metadata;
  
  /* Copyright 2005 The Apache Software Foundation
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  import org.apache.commons.lang.builder.ToStringBuilder;
  import org.apache.commons.lang.builder.ToStringStyle;
  import java.io.Serializable;
  
  /**
   * An SelectByPKProcedureDescriptor contains information that is related to the
   * procedure/function that is used to handle selecting of the record by its PK.
   * <br>
   * Note: Be careful when use SelectByPKProcedureDescriptor variables or caching
   * SelectByPKProcedureDescriptor instances, because instances could become invalid
   * during runtime (see {@link MetadataManager}).
   *
   * @author <a href="mailto:vgritsenko@apache.org">Vadim Gritsenko<a>
   * @version $Id: SelectByPKProcedureDescriptor.java,v 1.1 2005/04/24 16:29:10 tomdz Exp $
   */
  public class SelectByPKProcedureDescriptor extends ProcedureDescriptor
      implements Serializable, XmlCapable
  {
      private static final long serialVersionUID = 3257566204813063731L;
  
      //---------------------------------------------------------------
      /**
       * Constructor declaration
       */
      public SelectByPKProcedureDescriptor(
          ClassDescriptor classDescriptor,
          String name)
      {
          super(classDescriptor, name);
          this.addArguments(this.getClassDescriptor().getPkFields());
          this.addArguments(this.getClassDescriptor().getLockingFields());
      }
  
      /**
       * SelectByPK procedure always returns one value, ResultSet
       */
      public boolean hasReturnValue()
      {
          return true;
      }
  
      /*
       * @see XmlCapable#toXML()
       */
      public String toXML()
      {
          String eol = System.getProperty( "line.separator" );
  
          // The result
          StringBuffer result = new StringBuffer( 1024 );
          result.append( eol );
          result.append( "   " );
  
          // Opening tag and attributes
          result.append( " " );
          result.append( RepositoryTags.getOpeningTagNonClosingById( SELECTBYPK_PROCEDURE ) );
          result.append( " " );
          result.append( RepositoryTags.getAttribute( NAME, this.getName() ) );
          result.append( ">" );
          result.append( eol );
  
          // Closing tag
          result.append( "    " );
          result.append( RepositoryTags.getClosingTagById( SELECTBYPK_PROCEDURE ) );
          result.append( eol );
          return result.toString();
      }
  
      //---------------------------------------------------------------
      /**
       * Provide a string representation of this object
       *
       * @return a string representation of this object
       */
      public String toString()
      {
          ToStringBuilder buf = new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE);
          buf.append("name", this.getName());
          return buf.toString();
      }
  }
  
  
  
  1.28      +9 -2      db-ojb/src/java/org/apache/ojb/broker/accesslayer/StatementsForClassImpl.java
  
  Index: StatementsForClassImpl.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/accesslayer/StatementsForClassImpl.java,v
  retrieving revision 1.27
  retrieving revision 1.28
  diff -u -r1.27 -r1.28
  --- StatementsForClassImpl.java	6 Apr 2005 14:45:42 -0000	1.27
  +++ StatementsForClassImpl.java	24 Apr 2005 16:29:10 -0000	1.28
  @@ -184,6 +184,12 @@
           return stmt;
       }
   
  +    protected boolean usePreparedSelectByPKStatement()
  +    {
  +        return !(classDescriptor.getSelectByPKProcedure() != null &&
  +                classDescriptor.getSelectByPKProcedure().hasReturnValues());
  +    }
  +
       public PreparedStatement getSelectByPKStmt(Connection con) throws SQLException
       {
           if (selectByPKSql == null)
  @@ -192,7 +198,8 @@
           }
           try
           {
  -            return prepareStatement(con, selectByPKSql, Query.NOT_SCROLLABLE, true);
  +            return prepareStatement(con, selectByPKSql, Query.NOT_SCROLLABLE,
  +                                    usePreparedSelectByPKStatement());
           }
           catch (SQLException ex)
           {
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-dev-help@db.apache.org