public OperationStatus getSearchBoth( Transaction txn, DatabaseEntry key, DatabaseEntry data, LockMode lockMode) throws DatabaseException { checkEnv(); DatabaseUtil.checkForNullDbt(key, "key", true); DatabaseUtil.checkForNullDbt(data, "data", true); checkRequiredDbState(OPEN, "Can't call Database.getSearchBoth:"); trace(Level.FINEST, "Database.getSearchBoth", txn, key, data, lockMode); CursorConfig cursorConfig = CursorConfig.DEFAULT; if (lockMode == LockMode.READ_COMMITTED) { cursorConfig = CursorConfig.READ_COMMITTED; lockMode = null; } Cursor cursor = null; try { cursor = new Cursor(this, txn, cursorConfig); cursor.setNonCloning(true); return cursor.search(key, data, lockMode, SearchMode.BOTH); } finally { if (cursor != null) { cursor.close(); } } }
OperationStatus deleteInternal__wrappee__base(Locker locker, DatabaseEntry key) throws DatabaseException { Cursor cursor = null; try { cursor = new Cursor(this, locker, null); cursor.setNonCloning(true); OperationStatus commitStatus = OperationStatus.NOTFOUND; DatabaseEntry oldData = new DatabaseEntry(); OperationStatus searchStatus = cursor.search(key, oldData, LockMode.RMW, SearchMode.SET); if (searchStatus == OperationStatus.SUCCESS) { do { if (hasTriggers()) { notifyTriggers(locker, key, oldData, null); } commitStatus = cursor.deleteNoNotify(); if (commitStatus != OperationStatus.SUCCESS) { return commitStatus; } if (databaseImpl.getSortedDuplicates()) { searchStatus = cursor.retrieveNext(key, oldData, LockMode.RMW, GetMode.NEXT_DUP); } else { searchStatus = OperationStatus.NOTFOUND; } } while (searchStatus == OperationStatus.SUCCESS); commitStatus = OperationStatus.SUCCESS; } return commitStatus; } finally { if (cursor != null) { cursor.close(); } } }
/** * Internal version of delete() that does no parameter checking. Notify triggers. Deletes all * duplicates. */ OperationStatus deleteInternal(Locker locker, DatabaseEntry key) throws DatabaseException { Cursor cursor = null; try { cursor = new Cursor(this, locker, null); cursor.setNonCloning(true); OperationStatus commitStatus = OperationStatus.NOTFOUND; /* Position a cursor at the specified data record. */ DatabaseEntry oldData = new DatabaseEntry(); OperationStatus searchStatus = cursor.search(key, oldData, LockMode.RMW, SearchMode.SET); /* Delete all records with that key. */ if (searchStatus == OperationStatus.SUCCESS) { do { /* * Notify triggers before the actual deletion so that a * primary record never exists while secondary keys refer * to it. This is relied on by secondary read-uncommitted. */ if (hasTriggers()) { notifyTriggers(locker, key, oldData, null); } /* The actual deletion. */ commitStatus = cursor.deleteNoNotify(); if (commitStatus != OperationStatus.SUCCESS) { return commitStatus; } /* Get another duplicate. */ if (databaseImpl.getSortedDuplicates()) { searchStatus = cursor.retrieveNext(key, oldData, LockMode.RMW, GetMode.NEXT_DUP); } else { searchStatus = OperationStatus.NOTFOUND; } } while (searchStatus == OperationStatus.SUCCESS); commitStatus = OperationStatus.SUCCESS; } return commitStatus; } finally { if (cursor != null) { cursor.close(); } } }