docs: public boolean doHasNext() throws DBException
      {
          if ((m_iRecordStatus & DBConstants.RECORD_AT_EOF) != 0)
              return false; // Already at EOF, can't be one after
          if ((m_iRecordStatus & DBConstants.RECORD_NEXT_PENDING) != 0)
              return true;    // Already one waiting
          boolean bAtEOF = true;
          if (!this.isOpen())
              this.open();    // Make sure any listeners are called before disabling.
          Object[] rgobjEnabledFields = this.getRecord().setEnableNonFilter(null, false, false, false, false, true);
          FieldList record = null;
          try {
              record = this.move(DBConstants.NEXT_RECORD);
              if (record == null)
                  bAtEOF = true;
              else if ((m_iRecordStatus & DBConstants.RECORD_AT_EOF) != 0)
                  bAtEOF = true;
              else if (this.isTable())
                  bAtEOF = this.isEOF();
              else
                  bAtEOF = false;     // Valid record!
          } catch (DBException ex) {
              throw ex;
          } finally {
              this.getRecord().setEnableNonFilter(rgobjEnabledFields, false, false, false, bAtEOF, true);
          }
          if (bAtEOF)
              return false; // Does not have a next record
          m_iRecordStatus |= DBConstants.RECORD_NEXT_PENDING;     // If next call is a moveNext(), return unchanged!
          return true;        // Yes, a next record exists.
      }