Exemple #1
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();
     }
   }
 }
Exemple #2
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();
      }
    }
  }