henning 2004/05/17 06:29:19
Modified: src/generator/src/templates/om Tag: TORQUE_3_1_HENNING
Object.vm Peer.vm
src/java/org/apache/torque/om Tag: TORQUE_3_1_HENNING
Persistent.java
src/java/org/apache/torque/util Tag: TORQUE_3_1_HENNING
BasePeer.java
xdocs Tag: TORQUE_3_1_HENNING release-changes.xml
Removed: proposals/henning/skipidbroker Tag: TORQUE_3_1_HENNING
README skipidbroker.patch
Log:
Added the skipidbroker proposal to the TORQUE_3_1_HENNING branch.
Revision Changes Path
No revision
No revision
1.7.2.2.2.1 +56 -6 db-torque/src/generator/src/templates/om/Object.vm
Index: Object.vm
===================================================================
RCS file: /home/cvs/db-torque/src/generator/src/templates/om/Object.vm,v
retrieving revision 1.7.2.2
retrieving revision 1.7.2.2.2.1
diff -u -r1.7.2.2 -r1.7.2.2.2.1
--- Object.vm 22 Jan 2004 01:06:50 -0000 1.7.2.2
+++ Object.vm 17 May 2004 13:29:19 -0000 1.7.2.2.2.1
@@ -1022,15 +1022,28 @@
*/
public void save() throws $saveException
{
+ save(false);
+ }
+
+ /**
+ * Stores the object in the database. If the object is new,
+ * it inserts it; otherwise an update is performed.
+ *
+ * @param skipIdBroker If this is true, the criteria already contains
+ * a value for the PK and the ID Broker should not be used
+ * @throws $saveException
+ */
+ public void save(boolean skipIdBroker) throws $saveException
+ {
#if ($complexObjectModel)
save(${table.JavaName}Peer.getMapBuilder()
- .getDatabaseMap().getName());
+ .getDatabaseMap().getName(), skipIdBroker);
#else
if (isModified())
{
if (isNew())
{
- ${table.JavaName}Peer.doInsert(($table.JavaName) this);
+ ${table.JavaName}Peer.doInsert(($table.JavaName) this,
skipIdBroker);
setNew(false);
}
else
@@ -1055,12 +1068,31 @@
*/
public void save(String dbName) throws TorqueException
{
+ save(dbName, false);
+ }
+
+ /**
+ * Stores the object in the database. If the object is new,
+ * it inserts it; otherwise an update is performed.
+ #if ($complexObjectModel)
+ * Note: this code is here because the method body is
+ * auto-generated conditionally and therefore needs to be
+ * in this file instead of in the super class, BaseObject.
+ #end
+ *
+ * @param dbName
+ * @param skipIdBroker If this is true, the criteria already contains
+ * a value for the PK and the ID Broker should not be used
+ * @throws TorqueException
+ */
+ public void save(String dbName, boolean skipIdBroker) throws TorqueException
+ {
Connection con = null;
#if ($complexObjectModel)
try
{
con = Transaction.begin(dbName);
- save(con);
+ save(con, skipIdBroker);
Transaction.commit(con);
}
catch(TorqueException e)
@@ -1077,7 +1109,7 @@
if (isNew())
{
${table.JavaName}Peer
- .doInsert(($table.JavaName) this, con);
+ .doInsert(($table.JavaName) this, con, skipIdBroker);
setNew(false);
}
else
@@ -1099,6 +1131,7 @@
by another object which falls in this transaction. */
private boolean alreadyInSave = false;
#end
+
/**
* Stores the object in the database. If the object is new,
* it inserts it; otherwise an update is performed. This method
@@ -1111,6 +1144,23 @@
*/
public void save(Connection con) throws TorqueException
{
+ save(con, false);
+ }
+
+ /**
+ * Stores the object in the database. If the object is new,
+ * it inserts it; otherwise an update is performed. This method
+ * is meant to be used as part of a transaction, otherwise use
+ * the save() method and the connection details will be handled
+ * internally
+ *
+ * @param con
+ * @param skipIdBroker If this is true, the criteria already contains
+ * a value for the PK and the ID Broker should not be used
+ * @throws TorqueException
+ */
+ public void save(Connection con, boolean skipIdBroker) throws TorqueException
+ {
#if ($complexObjectModel)
if (!alreadyInSave)
{
@@ -1132,7 +1182,7 @@
#set($i = $velocityCount - 1)
if ($aVarName != null)
{
- ${aVarName}.save(con);
+ ${aVarName}.save(con, skipIdBroker);
set$pVars.get($i)($aVarName);
}
#end
@@ -1145,7 +1195,7 @@
{
if (isNew())
{
- ${table.JavaName}Peer.doInsert(($table.JavaName) this, con);
+ ${table.JavaName}Peer.doInsert(($table.JavaName) this, con,
skipIdBroker);
setNew(false);
}
else
1.5.2.3.2.1 +92 -8 db-torque/src/generator/src/templates/om/Peer.vm
Index: Peer.vm
===================================================================
RCS file: /home/cvs/db-torque/src/generator/src/templates/om/Peer.vm,v
retrieving revision 1.5.2.3
retrieving revision 1.5.2.3.2.1
diff -u -r1.5.2.3 -r1.5.2.3.2.1
--- Peer.vm 6 Apr 2004 12:49:46 -0000 1.5.2.3
+++ Peer.vm 17 May 2004 13:29:19 -0000 1.5.2.3.2.1
@@ -229,8 +229,23 @@
public static ObjectKey doInsert(Criteria criteria)
throws TorqueException
{
+ return doInsert(criteria, false);
+ }
+
+ /**
+ * Method to do inserts.
+ *
+ * @param criteria object used to create the INSERT statement.
+ * @param skipIdBroker If this is true, the criteria already contains
+ * a value for the PK and the ID Broker should not be used
+ * @throws TorqueException Any exceptions caught during processing will be
+ * rethrown wrapped into a TorqueException.
+ */
+ public static ObjectKey doInsert(Criteria criteria, boolean skipIdBroker)
+ throws TorqueException
+ {
return $basePrefix${table.JavaName}Peer
- .doInsert(criteria, (Connection) null);
+ .doInsert(criteria, (Connection) null, skipIdBroker);
}
/**
@@ -246,6 +261,24 @@
public static ObjectKey doInsert(Criteria criteria, Connection con)
throws TorqueException
{
+ return doInsert(criteria, con, false);
+ }
+
+ /**
+ * Method to do inserts. This method is to be used during a transaction,
+ * otherwise use the doInsert(Criteria) method. It will take care of
+ * the connection details internally.
+ *
+ * @param criteria object used to create the INSERT statement.
+ * @param con the connection to use
+ * @param skipIdBroker If this is true, the criteria already contains
+ * a value for the PK and the ID Broker should not be used
+ * @throws TorqueException Any exceptions caught during processing will be
+ * rethrown wrapped into a TorqueException.
+ */
+ public static ObjectKey doInsert(Criteria criteria, Connection con, boolean
skipIdBroker)
+ throws TorqueException
+ {
#foreach ($col in $table.Columns)
#set ( $cup=$col.Name.toUpperCase() )
#if($col.isBooleanInt())
@@ -294,11 +327,11 @@
}
if (con == null)
{
- return BasePeer.doInsert(criteria);
+ return BasePeer.doInsert(criteria, skipIdBroker);
}
else
{
- return BasePeer.doInsert(criteria, con);
+ return BasePeer.doInsert(criteria, con, skipIdBroker);
}
}
@@ -790,10 +823,30 @@
*/
public static void doInsert($table.JavaName obj) throws TorqueException
{
+ doInsert(obj, false);
+ }
+
+ /**
+ * Method to do inserts
+ *
+ * @param skipIdBroker If this is true, the criteria already contains
+ * a value for the PK and the ID Broker should not be used
+ * @throws TorqueException Any exceptions caught during processing will be
+ * rethrown wrapped into a TorqueException.
+ */
+ public static void doInsert($table.JavaName obj, boolean skipIdBroker) throws
TorqueException
+ {
#if ($table.IdMethod.equals("none") || $table.PrimaryKey.size() == 0)
- doInsert(buildCriteria(obj));
+ doInsert(buildCriteria(obj, skipIdBroker), skipIdBroker);
#else
- obj.setPrimaryKey(doInsert(buildCriteria(obj)));
+ if (skipIdBroker)
+ {
+ doInsert(buildCriteria(obj, skipIdBroker), skipIdBroker);
+ }
+ else
+ {
+ obj.setPrimaryKey(doInsert(buildCriteria(obj, skipIdBroker),
skipIdBroker));
+ }
#end
obj.setNew(false);
obj.setModified(false);
@@ -833,10 +886,35 @@
public static void doInsert($table.JavaName obj, Connection con)
throws TorqueException
{
+ doInsert(obj, con, false);
+ }
+
+ /**
+ * Method to do inserts. This method is to be used during a transaction,
+ * otherwise use the doInsert($table.JavaName) method. It will take
+ * care of the connection details internally.
+ *
+ * @param obj the data object to insert into the database.
+ * @param con the connection to use
+ * @param skipIdBroker If this is true, the criteria already contains
+ * a value for the PK and the ID Broker should not be used
+ * @throws TorqueException Any exceptions caught during processing will be
+ * rethrown wrapped into a TorqueException.
+ */
+ public static void doInsert($table.JavaName obj, Connection con, boolean
skipIdBroker)
+ throws TorqueException
+ {
#if ($table.IdMethod.equals("none") || $table.PrimaryKey.size() == 0)
- doInsert(buildCriteria(obj), con);
+ doInsert(buildCriteria(obj, skipIdBroker), con, skipIdBroker);
#else
- obj.setPrimaryKey(doInsert(buildCriteria(obj), con));
+ if (skipIdBroker)
+ {
+ doInsert(buildCriteria(obj, skipIdBroker), con, skipIdBroker);
+ }
+ else
+ {
+ obj.setPrimaryKey(doInsert(buildCriteria(obj, skipIdBroker), con,
skipIdBroker));
+ }
#end
obj.setNew(false);
obj.setModified(false);
@@ -925,12 +1003,18 @@
/** Build a Criteria object from the data object for this peer */
public static Criteria buildCriteria( $table.JavaName obj )
{
+ return buildCriteria(obj, false);
+ }
+
+ /** Build a Criteria object from the data object for this peer */
+ public static Criteria buildCriteria( $table.JavaName obj, boolean includePk )
+ {
Criteria criteria = new Criteria(DATABASE_NAME);
#foreach ($col in $table.Columns)
#set ( $cfc=$col.JavaName )
#set ( $cup=$col.Name.toUpperCase() )
#if ($col.isPrimaryKey() && !$table.IdMethod.equals("none"))
- if (!obj.isNew())
+ if (includePk || !obj.isNew())
#end
criteria.add($cup, obj.get${cfc}());
#end
No revision
No revision
1.11.2.1.2.1 +35 -1 db-torque/src/java/org/apache/torque/om/Persistent.java
Index: Persistent.java
===================================================================
RCS file: /home/cvs/db-torque/src/java/org/apache/torque/om/Persistent.java,v
retrieving revision 1.11.2.1
retrieving revision 1.11.2.1.2.1
diff -u -r1.11.2.1 -r1.11.2.1.2.1
--- Persistent.java 29 Feb 2004 23:14:11 -0000 1.11.2.1
+++ Persistent.java 17 May 2004 13:29:19 -0000 1.11.2.1.2.1
@@ -108,4 +108,38 @@
* @throws Exception This method might throw an exception
*/
void save(Connection con) throws Exception;
+
+ /**
+ * Saves the object.
+ *
+ * @param skipIdBroker If this is true, the criteria already contains
+ * a value for the PK and the ID Broker should not be used
+ * @throws Exception This method might throw an exception
+ */
+ void save(boolean skipIdBroker) throws Exception;
+
+ /**
+ * Stores the object in the database. If the object is new,
+ * it inserts it; otherwise an update is performed.
+ *
+ * @param dbName the name of the database
+ * @param skipIdBroker If this is true, the criteria already contains
+ * a value for the PK and the ID Broker should not be used
+ * @throws Exception This method might throw an exception
+ */
+ void save(String dbName, boolean skipIdBroker) throws Exception;
+
+ /**
+ * Stores the object in the database. If the object is new,
+ * it inserts it; otherwise an update is performed. This method
+ * is meant to be used as part of a transaction, otherwise use
+ * the save() method and the connection details will be handled
+ * internally
+ *
+ * @param con the Connection used to store the object
+ * @param skipIdBroker If this is true, the criteria already contains
+ * a value for the PK and the ID Broker should not be used
+ * @throws Exception This method might throw an exception
+ */
+ void save(Connection con, boolean skipIdBroker) throws Exception;
}
No revision
No revision
1.76.2.1.2.1 +73 -2 db-torque/src/java/org/apache/torque/util/BasePeer.java
Index: BasePeer.java
===================================================================
RCS file: /home/cvs/db-torque/src/java/org/apache/torque/util/BasePeer.java,v
retrieving revision 1.76.2.1
retrieving revision 1.76.2.1.2.1
diff -u -r1.76.2.1 -r1.76.2.1.2.1
--- BasePeer.java 29 Feb 2004 23:19:09 -0000 1.76.2.1
+++ BasePeer.java 17 May 2004 13:29:19 -0000 1.76.2.1.2.1
@@ -585,6 +585,38 @@
*/
public static ObjectKey doInsert(Criteria criteria) throws TorqueException
{
+ return doInsert(criteria, false);
+ }
+
+ /**
+ * Method to perform inserts based on values and keys in a
+ * Criteria.
+ * <p>
+ * If the primary key is auto incremented the data in Criteria
+ * will be inserted and the auto increment value will be returned.
+ * <p>
+ * If the primary key is included in Criteria then that value will
+ * be used to insert the row.
+ * <p>
+ * If no primary key is included in Criteria then we will try to
+ * figure out the primary key from the database map and insert the
+ * row with the next available id using util.db.IDBroker.
+ * <p>
+ * If no primary key is defined for the table the values will be
+ * inserted as specified in Criteria and -1 will be returned.
+ *
+ * @param criteria Object containing values to insert.
+ * @param skipIdBroker If this is true, the criteria already contains
+ * a value for the PK and the ID Broker should not be used
+ * @return An Object which is the id of the row that was inserted
+ * (if the table has a primary key) or null (if the table does not
+ * have a primary key).
+ * @throws TorqueException Any exceptions caught during processing will be
+ * rethrown wrapped into a TorqueException.
+ */
+ public static ObjectKey doInsert(Criteria criteria, boolean skipIdBroker)
+ throws TorqueException
+ {
Connection con = null;
ObjectKey id = null;
@@ -593,7 +625,7 @@
con = Transaction.beginOptional(
criteria.getDbName(),
criteria.isUseTransaction());
- id = doInsert(criteria, con);
+ id = doInsert(criteria, con, skipIdBroker);
Transaction.commit(con);
}
catch (TorqueException e)
@@ -633,6 +665,39 @@
public static ObjectKey doInsert(Criteria criteria, Connection con)
throws TorqueException
{
+ return doInsert(criteria, con, false);
+ }
+
+ /**
+ * Method to perform inserts based on values and keys in a
+ * Criteria.
+ * <p>
+ * If the primary key is auto incremented the data in Criteria
+ * will be inserted and the auto increment value will be returned.
+ * <p>
+ * If the primary key is included in Criteria then that value will
+ * be used to insert the row.
+ * <p>
+ * If no primary key is included in Criteria then we will try to
+ * figure out the primary key from the database map and insert the
+ * row with the next available id using util.db.IDBroker.
+ * <p>
+ * If no primary key is defined for the table the values will be
+ * inserted as specified in Criteria and null will be returned.
+ *
+ * @param criteria Object containing values to insert.
+ * @param con A Connection.
+ * @param skipIdBroker If this is true, the criteria already contains
+ * a value for the PK and the ID Broker should not be used
+ * @return An Object which is the id of the row that was inserted
+ * (if the table has a primary key) or null (if the table does not
+ * have a primary key).
+ * @throws TorqueException Any exceptions caught during processing will be
+ * rethrown wrapped into a TorqueException.
+ */
+ public static ObjectKey doInsert(Criteria criteria, Connection con, boolean
skipIdBroker)
+ throws TorqueException
+ {
SimpleKey id = null;
// Get the table name and method for determining the primary
@@ -656,6 +721,8 @@
ColumnMap pk = getPrimaryKey(criteria);
+ if (!skipIdBroker)
+ {
// pk will be null if there is no primary key defined for the table
// we're inserting into.
if (pk != null && !criteria.containsKey(pk.getFullyQualifiedName()))
@@ -689,6 +756,7 @@
criteria.add(pk.getFullyQualifiedName(), id);
}
}
+ }
// Use Village to perform the insert.
TableDataSet tds = null;
@@ -717,6 +785,8 @@
}
}
+ if (!skipIdBroker)
+ {
// If the primary key column is auto-incremented, get the id
// now.
if (pk != null && keyGen != null && keyGen.isPostInsert())
@@ -736,6 +806,7 @@
{
throwTorqueException(e);
}
+ }
}
return id;
No revision
No revision
1.3.2.5.2.7 +19 -1 db-torque/xdocs/release-changes.xml
Index: release-changes.xml
===================================================================
RCS file: /home/cvs/db-torque/xdocs/release-changes.xml,v
retrieving revision 1.3.2.5.2.6
retrieving revision 1.3.2.5.2.7
diff -u -r1.3.2.5.2.6 -r1.3.2.5.2.7
--- release-changes.xml 17 May 2004 13:23:01 -0000 1.3.2.5.2.6
+++ release-changes.xml 17 May 2004 13:29:19 -0000 1.3.2.5.2.7
@@ -115,6 +115,24 @@
]]></source>
</p>
</subsection>
+
+<subsection name="Skip ID Broker Patch">
+<p>
+If an application wants to read a save file back into a Torque
+database, every object will get a new primary key value, even if the
+values of the primary keys were saved, too. This is fatal for all
+kinds of foreign key relations and even more fatal if save file
+integrity is an issue to an application.<br/>
+
+This patch allows a restore program to use <code>Persistent.save(true)</code>
+and friends to skip the idbroker call. All other methods continue to work as
+before.<br/>
+
+As Torque copies these methods into the generated OM classes, it is necessary to
+rebuild the OM scheme.<br/>
+</p>
+</subsection>
+
</section>
<section name="Torque 3.1.1.">
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]