/** * Method to reserve a block of identities. Note : Only allocates a single id always. * * @param size The block size * @return The reserved block */ public ValueGenerationBlock reserveBlock(long size) { // search an Id in the database PreparedStatement ps = null; ResultSet rs = null; RDBMSStoreManager rdbmsMgr = (RDBMSStoreManager) storeMgr; SQLController sqlControl = rdbmsMgr.getSQLController(); try { String stmt = getStatement(); ps = sqlControl.getStatementForUpdate(connection, stmt, false); rs = sqlControl.executeStatementQuery(null, connection, stmt, ps); if (!rs.next()) { return new ValueGenerationBlock(new Object[] {Long.valueOf(1)}); } return new ValueGenerationBlock(new Object[] {Long.valueOf(rs.getLong(1) + 1)}); } catch (SQLException e) { // TODO adds a message correspondent to the exception. // we need to work to create user friendly messages throw new ValueGenerationException(e.getMessage()); } finally { try { if (rs != null) { rs.close(); } if (ps != null) { sqlControl.closeStatement(connection, ps); } } catch (SQLException e) { // no recoverable error } } }
public void executeClear(ObjectProvider ownerOP) { String clearStmt = getClearStmt(); try { ExecutionContext ec = ownerOP.getExecutionContext(); ManagedConnection mconn = storeMgr.getConnection(ec); SQLController sqlControl = storeMgr.getSQLController(); try { PreparedStatement ps = sqlControl.getStatementForUpdate(mconn, clearStmt, false); try { int jdbcPosition = 1; jdbcPosition = BackingStoreHelper.populateOwnerInStatement(ownerOP, ec, ps, jdbcPosition, this); if (getRelationDiscriminatorMapping() != null) { BackingStoreHelper.populateRelationDiscriminatorInStatement(ec, ps, jdbcPosition, this); } sqlControl.executeStatementUpdate(ec, mconn, clearStmt, ps, true); } finally { sqlControl.closeStatement(mconn, ps); } } finally { mconn.release(); } } catch (SQLException e) { throw new NucleusDataStoreException(Localiser.msg("056013", clearStmt), e); } }
/** * Clear the association from owner to all elements. Provides cascade-delete when the elements * being deleted are PC types. * * @param ownerOP ObjectProvider for the container. */ public void clear(ObjectProvider ownerOP) { Collection dependentElements = null; CollectionMetaData collmd = ownerMemberMetaData.getCollection(); boolean dependent = collmd.isDependentElement(); if (ownerMemberMetaData.isCascadeRemoveOrphans()) { dependent = true; } if (dependent && !collmd.isEmbeddedElement() && !collmd.isSerializedElement()) { // Retain the dependent elements that need deleting after clearing dependentElements = new HashSet(); Iterator iter = iterator(ownerOP); while (iter.hasNext()) { dependentElements.add(iter.next()); } } String clearStmt = getClearStmt(); try { ExecutionContext ec = ownerOP.getExecutionContext(); ManagedConnection mconn = storeMgr.getConnection(ec); SQLController sqlControl = storeMgr.getSQLController(); try { PreparedStatement ps = sqlControl.getStatementForUpdate(mconn, clearStmt, false); try { int jdbcPosition = 1; jdbcPosition = BackingStoreHelper.populateOwnerInStatement(ownerOP, ec, ps, jdbcPosition, this); if (relationDiscriminatorMapping != null) { BackingStoreHelper.populateRelationDiscriminatorInStatement(ec, ps, jdbcPosition, this); } sqlControl.executeStatementUpdate(ec, mconn, clearStmt, ps, true); } finally { sqlControl.closeStatement(mconn, ps); } } finally { mconn.release(); } } catch (SQLException e) { throw new NucleusDataStoreException(Localiser.msg("056013", clearStmt), e); } // Cascade-delete if (dependentElements != null && dependentElements.size() > 0) { Iterator iter = dependentElements.iterator(); while (iter.hasNext()) { Object obj = iter.next(); if (ownerOP.getExecutionContext().getApiAdapter().isDeleted(obj)) { // Element is tagged for deletion so will be deleted at flush(), and we dont need it // immediately } else { ownerOP.getExecutionContext().deleteObjectInternal(obj); } } } }