docs: public void remove() throws DBException
      {
          if ((this.getRecord().getOpenMode() & DBConstants.OPEN_READ_ONLY) != 0)
              throw new DatabaseException(DBConstants.ERROR_READ_ONLY);
          if ((this.getRecord().getOpenMode() & DBConstants.OPEN_APPEND_ONLY) != 0)
              throw new DatabaseException(DBConstants.ERROR_APPEND_ONLY);
          try   {
              if ((this.getRecord().getEditMode() != Constants.EDIT_IN_PROGRESS)
                  && (this.getRecord().getEditMode() != Constants.EDIT_CURRENT))
                      throw new DatabaseException(DBConstants.INVALID_RECORD);
              int iErrorCode = this.getRecord().handleRecordChange(DBConstants.DELETE_TYPE);
              if (iErrorCode != DBConstants.NORMAL_RETURN)
                  throw new DatabaseException(iErrorCode);
              if ((this.getRecord().getEditMode() == Constants.EDIT_IN_PROGRESS)
                  || (this.getRecord().getEditMode() == Constants.EDIT_CURRENT))  // I know I just checked for this, but it possible the the listener changed the record state
                      this.doRemove();
              m_iRecordStatus |= DBConstants.RECORD_INVALID;
          } catch (DBException ex)    {
              this.getRecord().setEditMode(Constants.EDIT_NONE);  // Unknown status after a delete
              throw ex;
          }
          this.getRecord().setEditMode(Constants.EDIT_NONE);  // Unknown status after a delete
          int iErrorCode = this.getRecord().handleRecordChange(DBConstants.AFTER_DELETE_TYPE);
          if (iErrorCode != DBConstants.NORMAL_RETURN)
              throw new DatabaseException(iErrorCode);
          m_objectID = null;
          m_dataSource = null;
      }