docs: def getAllIterator(cls, where=None, buffer=100,
                                           useObject=None, orderBy=None):
          """Retrieve every object as an iterator.
  
          Possibly limitted by the where list of clauses that will be
          AND-ed.
  
          Since an iterator is returned, only ``buffer`` rows are loaded
          from the database at once. This is useful if you need
          to process all objects.
  
          If useObject is given, this object is returned each time, but
          with new data. This can be used to avoid creating many new
          objects when only one object is needed each time.
          """
          (sql, fields) = cls._prepareSQL("SELECTALL", where, orderBy=orderBy)
          curs = cls.cursor()
          fetchedAt = time.time()
          curs.execute(sql)
  
          # We might start eating memory at this point
  
          def getNext(rows=[]):
              forgetter = cls
              if not rows:
                  rows += curs.fetchmany(buffer)
              if not rows:
                  curs.close()
                  return None
              row = rows[0]
              del rows[0]
              try:
                  idPositions = [fields.index(key) for key in cls._sqlPrimary]
              except ValueError:
                  raise "Bad sqlPrimary, should be a list or tuple: %s" % cls._sqlPrimary
              ids = [row[pos] for pos in idPositions]
              if useObject:
                  result = useObject
                  result.reset()
                  result._setID(ids)
              else:
                  result = forgetter(*ids)
              result._loadFromRow(row, fields, curs)
              result._updated = fetchedAt
              return result
  
          return iter(getNext, None)