package com.sleepycat.je.dbi;
public class DatabaseImpl {
private static final short NOT_DELETED=1;
private static final short DELETED_CLEANUP_INLIST_HARVEST=2;
private static final short DELETED_CLEANUP_LOG_HARVEST=3;
private static final short DELETED=4;
private short deleteState;
public boolean isDeleted(){
return !(deleteState == NOT_DELETED);
}
public boolean isDeleteFinished(){
return (deleteState == DELETED);
}
public void startDeleteProcessing(){
assert (deleteState == NOT_DELETED);
deleteState=DELETED_CLEANUP_INLIST_HARVEST;
}
void finishedINListHarvest(){
assert (deleteState == DELETED_CLEANUP_INLIST_HARVEST);
deleteState=DELETED_CLEANUP_LOG_HARVEST;
}
/**
* Purge a DatabaseImpl and corresponding MapLN in the db mapping tree.
* Purging consists of removing all related INs from the db mapping tree and
* deleting the related MapLN. Used at the a transaction end in these cases: -
* purge the deleted database after a commit of Environment.removeDatabase -
* purge the deleted database after a commit of Environment.truncateDatabase -
* purge the newly created database after an abort of
* Environment.truncateDatabase
*/
public void deleteAndReleaseINs() throws DatabaseException {
startDeleteProcessing();
releaseDeletedINs();
}
public void releaseDeletedINs() throws DatabaseException {
if (pendingDeletedHook != null) {
pendingDeletedHook.doHook();
}
try {
long rootLsn=tree.getRootLsn();
if (rootLsn == DbLsn.NULL_LSN) {
envImpl.getDbMapTree().deleteMapLN(id);
}
else {
UtilizationTracker snapshot=new UtilizationTracker(envImpl);
snapshot.countObsoleteNodeInexact(rootLsn,LogEntryType.LOG_IN);
ObsoleteProcessor obsoleteProcessor=new ObsoleteProcessor(snapshot);
SortedLSNTreeWalker walker=new SortedLSNTreeWalker(this,true,true,rootLsn,obsoleteProcessor);
envImpl.getDbMapTree().deleteMapLN(id);
walker.walk();
envImpl.getUtilizationProfile().countAndLogSummaries(snapshot.getTrackedFiles());
}
}
finally {
deleteState=DELETED;
}
}
public void checkIsDeleted( String operation) throws DatabaseException {
if (isDeleted()) {
throw new DatabaseException("Attempt to " + operation + " a deleted database");
}
}
protected void hook288() throws DatabaseException {
deleteState=NOT_DELETED;
original();
}
protected void hook289() throws DatabaseException {
deleteState=NOT_DELETED;
original();
}
}