/* package */ Db openSecondaryDatabase( final DbEnv dbenv, final DbTxn txn, final String fileName, final String databaseName, final Db primary) throws DatabaseException, java.io.FileNotFoundException { int associateFlags = 0; int foreignFlags = 0; associateFlags |= allowPopulate ? DbConstants.DB_CREATE : 0; if (getTransactional() && txn == null) associateFlags |= DbConstants.DB_AUTO_COMMIT; if (immutableSecondaryKey) associateFlags |= DbConstants.DB_IMMUTABLE_KEY; final Db db = super.openDatabase(dbenv, txn, fileName, databaseName); boolean succeeded = false; try { /* * The multi-key creator must be set before the call to associate * so that we can work out whether the C API callback should be * set or not. */ db.set_secmultikey_create(multiKeyCreator); primary.associate(txn, db, keyCreator, associateFlags); if (foreign != null) { db.set_foreignmultikey_nullifier(multiKeyNullifier); foreign.associate_foreign(db, keyNullifier, foreignFlags | fkDelAction.getId()); } succeeded = true; return db; } finally { if (!succeeded) try { db.close(0); } catch (Throwable t) { // Ignore it -- there is already an exception in flight. } } }