/** * Set the Candidate to query. * * @param x The Candidate of the SoftwareCandidate to query. * @param exact to use matches or not * @exception DataObjectException If a database access error occurs. */ public void setQueryCandidate(jobmatch.data.CandidateDO x, boolean exact) throws DataObjectException, QueryException { // Remove from cacheHits any DOs that do not meet this // setQuery requirement. for (int i = 0; i < cacheHits.size() && !hitDb; i++) { SoftwareCandidateDO DO = (SoftwareCandidateDO) cacheHits.elementAt(i); if (null == DO) continue; boolean equals = true; // DOs are compared by their handles.. jobmatch.data.CandidateDO m = DO.getCandidate(); if (null == m && null == x) { equals = true; } else if (null == m || null == x) { equals = false; } else { equals = (DO.getCandidate().getOId().toString().equals(x.getOId().toString())); if (equals && m != x) { System.err.println("\n----------------------------------------------------------"); System.err.println("m =" + m); System.err.println("x =" + x); } } if (!equals) cacheHits.removeElementAt(i--); } // Also prepare the SQL needed to query the database // in case there is no cache, or the query involves other tables. if (partialCache || hitDb) builder.addWhereClause( "Candidate", x, "DECIMAL(19,0)", QueryBuilder.NOT_NULL, exactFlag(exact)); }
/** * Modifies the DO within its table. Performs recursive commit/delete on referenced DOs; all * operations occur within a single transaction to allow rollback in the event of error. Only the * creator of the transaction releases it. * * @param dbt The transaction object to use for this operation. * @param delete True if doing a delete, otherwise doing insert/update. * @exception com.lutris.appserver.server.sql.DatabaseManagerException if a Transaction can not be * created. * @exception RefAssertionException thrown by okTo method. * @exception java.sql.SQLException if any SQL errors occur. */ protected void modifyDO(DBTransaction dbt, boolean delete) throws SQLException, DatabaseManagerException, DataObjectException, RefAssertionException, DBRowUpdateException, QueryException { boolean ownTransaction = false; try { if (null == dbt) { DatabaseManager dbm = Enhydra.getDatabaseManager(); dbt = dbm.createTransaction(); // create a transaction ownTransaction = true; } if (null == dbt) throw new DatabaseManagerException("DatabaseManager.createTransaction returned null."); if (delete) { // Code to perform cascading deletes is generated here // if cascading deletes are not supported by the database. // The following line keeps the compiler happy // when the CASCADING_DELETES tag is empty. if (false) throw new QueryException("XXX"); } else { // commit referenced DOs. jobmatch.data.CandidateDO Candidate_DO = DO.getCandidate(); if (null != Candidate_DO) { if (Candidate_DO.isLoaded()) { okToCommitCandidate(Candidate_DO); jobmatch.data.CandidateBDO b = jobmatch.data.CandidateBDO.createExisting(Candidate_DO); b.commit(dbt); } else { // since the referenced DO is not loaded, // it cannot be dirty, so there is no need to commit it. } } else { if (!false) throw new RefAssertionException( "Cannot commit EmployerCandidateBDO ( " + toString() + " ) because Candidate is not allowed to be null."); } jobmatch.data.EmployerDO Employer_DO = DO.getEmployer(); if (null != Employer_DO) { if (Employer_DO.isLoaded()) { okToCommitEmployer(Employer_DO); jobmatch.data.EmployerBDO b = jobmatch.data.EmployerBDO.createExisting(Employer_DO); b.commit(dbt); } else { // since the referenced DO is not loaded, // it cannot be dirty, so there is no need to commit it. } } else { if (!false) throw new RefAssertionException( "Cannot commit EmployerCandidateBDO ( " + toString() + " ) because Employer is not allowed to be null."); } } if (false) { // This throw is here to keep the compiler happy // in the case of a DO that does not refer to other DOs. // In that case, the above delete/commit code blocks will be empty // and throw nothing. throw new DataObjectException("foo"); } if (delete) { dbt.delete(DO); } else { if (DO.isLoaded()) dbt.insert(DO); // dbt.insert() handles insertions and updates } if (ownTransaction) { dbt.commit(); // commit the transaction } } catch (DataObjectException doe) { throw doe; } catch (SQLException sqle) { StringBuffer message = new StringBuffer("Failed to insert/update DO: "); message.append(sqle.getMessage()); // rollback, if necessary if (ownTransaction) { try { dbt.rollback(); } catch (SQLException sqle2) { message.insert(0, "\n"); message.insert(0, sqle2.getMessage()); message.insert(0, "Rollback failed: "); } } throw new SQLException(message.toString()); } finally { // release the transaction, if any if (ownTransaction) { dbt.release(); } } }