I'll get this patch in later today.

K.V. Vinay Menon wrote:

> Hi Marc,
> 
>     When you were here in London we'd discussed adding functionality to 
> use things like ROWID for fast updates and deletes [as opposed to using 
> primary keys]. I have been able to implement this by
> 
>  
> 
> 1. Adding a field in jaws.xml called rowid-column name. This is ROWID 
> for Oracle and can be something else for other databases. If you do not 
> want to use this feature just don't specify the tag and it will use the 
> default mechansm based on the primary key.
> 
>  
> 
> 2. Updated JDBCStoreEntityCommand  as follows
> 
>  
> 
>    protected String makeSQL(Object argOrArgs)
>    {
>       ExecutionState es = (ExecutionState)argOrArgs;  // NB: null if tuned
>       boolean tuned = jawsEntity.hasTunedUpdates();
> 
>  
> 
>       //Added by Vinay Menon  - Start
>       String rowIDColumn = jawsEntity.getRowIDColumnName();
>       //Added by Vinay Menon  - End
> 
>  
> 
>       String sql = "UPDATE "+jawsEntity.getTableName()+" SET ";
>       Iterator iter = jawsEntity.getCMPFields();
>       int i = 0;
>       boolean first = true;
>       while (iter.hasNext())
>       {
>          CMPFieldMetaData cmpField = (CMPFieldMetaData)iter.next();
> 
>  
> 
>          if(!cmpField.getColumnName().equalsIgnoreCase(rowIDColumn))
>          {
>              if (!tuned || es.dirtyField[i++])
>              {
>                 sql += (first?"":",") +
>                    cmpField.getColumnName() + "=?";
>                 first = false;
>              }
>         }
>       }
> 
>  
> 
>       //Modified by Vinay Menon  - Start
>       sql += " WHERE ";
> 
>  
> 
>       if(rowIDColumn!=null && rowIDColumn.trim().length()>1)
>       {
>           sql += rowIDColumn+" =?";
>       }
>       else
>       {
>         sql += getPkColumnWhereList();
>       }
>       //Modified by Vinay Menon  - End
> 
>  
> 
>       return sql;
>    }
> 
> and
> 
>  
> 
>    protected void setParameters(PreparedStatement stmt, Object argOrArgs)
>       throws Exception
>    {
>       ExecutionState es = (ExecutionState)argOrArgs;
>       boolean tuned = jawsEntity.hasTunedUpdates();
> 
>  
> 
>       //Added by Vinay Menon  - Start
>       String rowIDColumn = jawsEntity.getRowIDColumnName();
>       //Added by Vinay Menon  - End
> 
>  
> 
>       int idx = 1;
>       Iterator iter = jawsEntity.getCMPFields();
>       int i = 0;
> 
>  
> 
>       Object rowIDValue=null;
>       int rowIDJDBCType=0;
> 
>  
> 
>       while (iter.hasNext())
>       {
>          CMPFieldMetaData cmpField = (CMPFieldMetaData)iter.next();
> 
>  
> 
> 
>     f((!cmpField.getColumnName().equalsIgnoreCase(rowIDColumn)) && 
> (!cmpField.getName().equalsIgnoreCase(rowIDColumn)))
>          {
>             rowIDValue = es.currentState[i];
>             rowIDJDBCType = cmpField.getJDBCType();
>          } else {
>              if (!tuned || es.dirtyField[i])
>              {
>                 setParameter(stmt, idx++, cmpField.getJDBCType(), 
> es.currentState[i]);
>              }
>          }
> 
>  
> 
>          i++;
>       }
> 
>  
> 
>       if(rowIDColumn!=null)
>       {
>           setParameter(stmt,idx,rowIDJDBCType,rowIDValue);
>       }
>       else
>       {
>           setPrimaryKeyParameters(stmt, idx, es.ctx.getId());
>       }
>       //Modified by Vinay Menon  - End
>    }
> 
> 3. Similarly updated JDBCRemoveEntityCommand as
> 
>  
> 
>   protected void setParameters(PreparedStatement stmt, Object argOrArgs)
>       throws Exception
>    {
>       EntityEnterpriseContext ctx = (EntityEnterpriseContext)argOrArgs;
> 
>  
> 
>       ExecutionState es = (ExecutionState)argOrArgs;
> 
>  
> 
>       //Modified by Vinay Menon  - Start
>       String rowIDColumn = jawsEntity.getRowIDColumnName();
>       int i=0;
> 
>  
> 
>       if(rowIDColumn!=null)
>       {
>           Iterator iter = jawsEntity.getCMPFields();
>           while (iter.hasNext())
>           {
>              CMPFieldMetaData cmpField = (CMPFieldMetaData)iter.next();
> 
>  
> 
>              if(cmpField.getColumnName().equalsIgnoreCase(rowIDColumn))
>              {
>                 System.out.println("Delete for 
> "+rowIDColumn+"="+es.currentState[i]);
>                 setParameter(stmt, 1, cmpField.getJDBCType(), 
> es.currentState[i]);
>              }
> 
>  
> 
>              i++;
>           }
>       }
>       else
>       {
>         setPrimaryKeyParameters(stmt, 1, ctx.getId());
>       }
>       //Modified by Vinay Menon  - Start
>    }
> 
>  
> 
> and
> 
>  
> 
>    public JDBCRemoveEntityCommand(JDBCCommandFactory factory)
>    {
>       super(factory, "Remove");
> 
>  
> 
> 
>       //Modified by Vinay Menon  - Start
>       String rowIDColumn = jawsEntity.getRowIDColumnName();
> 
>  
> 
>       String sql;
> 
>  
> 
>       if(rowIDColumn!=null)
>       {
>           // Remove SQL
>           sql = "DELETE FROM " + jawsEntity.getTableName() +" WHERE 
> "+rowIDColumn+"=?";
>       }
>       else
>       {
>           // Remove SQL
>           sql = "DELETE FROM " + jawsEntity.getTableName() +
>                        " WHERE "+getPkColumnWhereList();
>       }
>       //Modified by Vinay Menon  - End
> 
>  
> 
>       setSQL(sql);
>    }
> 
> 3. Updated JawsEntityMetaData with
> 
>  
> 
>     public String getRowIDColumnName() { return rowIDColumnName; }
> 
>  
> 
>         //Added by Vinay Menon  - Start
>         //If a rowid [as in Oracle is present use it to optimize updates 
> and deleted
>         rowIDColumnName = getElementContent(getOptionalChild(element, 
> "rowid-column"));
>         //Added by Vinay Menon  - End
> 
>  
> 
> This way all you need in your ejb is a cmp field with the corresponding 
> name [or mapped to the corresponding column in jaws.xml]. Updates and 
> Deletes will use this column for all their sqls. Note that updates will 
> NOT update the rowid-column column. If nothing is specified in jaws.xml 
> defaults are used.
> 
>  
> 
> Sample SQLs generated would look like
> 
>  
> 
> DELETE FROM itemizedcall WHERE ROWID=?
> 
> or
> 
> DELETE FROM itemizedcall WHERE accountnumber=? AND mobilenumber=? AND 
> invoicenumber=? AND itemizedcallnumber=?
> 
>  
> 
> and
> 
>  
> 
> UPDATE itemizedcall SET 
> 
>itemizedcallnumber=?,callcost=?,callduration=?,mobilenumber=?,accountnumber=?,invoicenumber=?,calltype=?
> 
> WHERE ROWID =?
> 
> or
> 
> UPDATE itemizedcall SET 
> 
>itemizedcallnumber=?,callcost=?,callduration=?,mobilenumber=?,accountnumber=?,invoicenumber=?,calltype=?
> 
> WHERE account
> number=? AND mobilenumber=? AND invoicenumber=? AND itemizedcallnumber=?
> 
>  
> 
> Please let me know what you think.
> 
>  
> 
> Regards
> 
>  
> 
> Vinay
> 
>  
> 
>  
> 
> Vinay Menon
> 
>  
> 
> ISe-net Solutions
> Carphone Warehouse plc
> www.carphonewarehouse.com <http://www.carphonewarehouse.com>
> 
>  
> 
> +44-2088968038 (W)
> +44-7801054259 (M)
> +44-7808470016 (F)
> [EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>



_______________________________________________
Jboss-development mailing list
[EMAIL PROTECTED]
http://lists.sourceforge.net/lists/listinfo/jboss-development

Reply via email to