Пример #1
0
  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();
      }
    }
  }
Пример #2
0
 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();
     }
   }
 }
Пример #3
0
  /**
   * 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();
      }
    }
  }
Пример #4
0
 OperationStatus putInternal__wrappee__base(
     Transaction txn, DatabaseEntry key, DatabaseEntry data, PutMode putMode)
     throws DatabaseException {
   Locker locker = null;
   Cursor cursor = null;
   OperationStatus commitStatus = OperationStatus.KEYEXIST;
   try {
     locker = LockerFactory.getWritableLocker(envHandle, txn, isTransactional());
     cursor = new Cursor(this, locker, null);
     cursor.setNonCloning(true);
     commitStatus = cursor.putInternal(key, data, putMode);
     return commitStatus;
   } finally {
     if (cursor != null) {
       cursor.close();
     }
     if (locker != null) {
       locker.operationEnd(commitStatus);
     }
   }
 }