protected void _deleteDependencies() throws DBException { DBField[] keyFlds = this.getKeyFields(); DBFieldValues fldVals = this.getFieldValues(); DBFactory fact = this.getFactory(); DBFactory childFact[] = fact.getChildFactories(); for (int i = 0; i < childFact.length; i++) { DBRecordKey key = childFact[i].createKey(); // an empty key for (int k = 0; k < keyFlds.length; k++) { String fldName = keyFlds[k].getName(); if (fldVals.hasFieldValue(fldName)) { Object fldValue = fldVals.getFieldValue(fldName); key.setFieldValue(fldName, fldValue); } else { throw new DBException("Missing dependent key fields!"); } } // Do not perform recursive dependency deletion! // - 'key' is an incomplete (partial key only), and dependency deletion would fail // - all dependent children should already be specified by "getChildFactories()" try { int whereKeyType = DBWhere.KEY_PARTIAL_ALL; // Should use ALL available partial keys. key._delete(null, whereKeyType); // primary key delete } catch (SQLException sqe) { throw new DBException("Record deletion", sqe); } } }
/** * ** Traverses the DBFactory dependency tree, creating a DBFactoryTree ** @param level The * current tree level ** @param dbFact The current DBFactory to add ** @param parentNode The * parent node to which a new DBFactoryNode child will be added ** @param addedTables A set of * table names added to the current DBFactoryTree * */ private static void _traverseDBFactoryTree( int level, DBFactory<? extends DBRecord> dbFact, DBFactoryTree parentNode, Set<String> addedTables) { /* no DBFactory? */ if (dbFact == null) { Print.logError("Null DBFactory!"); return; } String utableName = dbFact.getUntranslatedTableName(); /* already added? */ if (addedTables.contains(utableName)) { return; } addedTables.add(utableName); /* add this node */ // Print.logInfo(StringTools.replicateString(" ",level) + dbFact.getUntranslatedTableName()); DBFactoryTree dbFactNode = new DBFactoryTree(level, parentNode, dbFact); parentNode.addChild(dbFactNode); /* find dependent children */ DBFactory<? extends DBRecord> childFact[] = dbFact.getChildFactories(); for (int i = 0; i < childFact.length; i++) { int index = childFact[i].getParentTables().indexOf(utableName); if (level == index) { DBFactoryTree._traverseDBFactoryTree(level + 1, childFact[i], dbFactNode, addedTables); } else if (!addedTables.contains(childFact[i].getUntranslatedTableName())) { Print.logWarn( "Skipping table in heiarchy: " + utableName + " ==> " + childFact[i].getUntranslatedTableName()); } } }