further abstract data access by returning record pointers instead of row indices and use of iterator func