Fix error handling in ResultSet#getRecords
[yaz4j-moved-to-github.git] / src / main / java / org / yaz4j / ResultSet.java
index a60f9a5..b2fd119 100644 (file)
@@ -6,26 +6,26 @@ import java.util.List;
 import java.util.NoSuchElementException;
 import org.yaz4j.exception.ZoomException;
 import org.yaz4j.jni.SWIGTYPE_p_ZOOM_record_p;
-import org.yaz4j.jni.SWIGTYPE_p_p_ZOOM_record_p;
 import org.yaz4j.jni.SWIGTYPE_p_ZOOM_resultset_p;
+import org.yaz4j.jni.SWIGTYPE_p_p_ZOOM_record_p;
 import org.yaz4j.jni.yaz4jlib;
 
 /**
  * This class represents a "buffered handle" to the result set created on the
- * server and thus retrieving records may invlove a request to the server if
+ * server and thus retrieving records may involve a request to the server if
  * those records are not locally cached. Details on how to configure the retrieval
  * (present) process are available in the YAZ manual
  *
  * @see <a href="http://www.indexdata.com/yaz/doc/zoom.resultsets.html">YAZ ZOOM result sets</a>
  *
- * Becacuse of the server misbehaviour or errors during retrieval the
+ * Because of server misbehavior or errors during retrieval the
  * "getRecord" method may either return null or throw exceptions, even when the
  * index of retrieved records lies within the bounds of the set. Client
  * code should be prepared for such situations.
  *
  * This class implements the iterable interface and as such can be used within
- * foreach loops, it's important to note however that in this case the errors
- * during retrieval will be masked with standard NoSuchElementExceptions
+ * foreach loops, it's important to note, however, that in this case the errors
+ * during retrieval will be masked with standard NoSuchElementExceptions.
  *
  * @author jakub
  */
@@ -82,26 +82,34 @@ public class ResultSet implements Iterable<Record> {
     return new Record(record, this);
   }
   
+  /**
+   * Retrieve a collection of records at once. If a record cannot be retrieved,
+   * it is omitted from the list (thus the list size may be smaller than 'count').
+   * @param start start index within the result set
+   * @param count number of records to retrieve
+   * @return
+   * @throws ZoomException raised in case of protocol errors
+   */
   public List<Record> getRecords(long start, int count) throws ZoomException {
-       List<Record> out = new ArrayList<Record>(count);
-       
-       SWIGTYPE_p_p_ZOOM_record_p recs = yaz4jlib.new_zoomRecordArray(count);
-       yaz4jlib.ZOOM_resultset_records(resultSet, recs, start, count);
-       
-       for (int i = 0; i < count; i++) {
-               SWIGTYPE_p_ZOOM_record_p record = yaz4jlib.zoomRecordArray_getitem(recs, i);
-               if (record == null) {
-                       continue;
-               }
-               
-               int errorCode = yaz4jlib.ZOOM_record_error(record, null, null, null);
-           if (errorCode != 0) {
-             throw new ZoomException("Record excpetion, code " + errorCode);
-           }
-           
-           out.add(new Record(record, this));
-       }
-
+    List<Record> out = new ArrayList<Record>(count);
+    SWIGTYPE_p_p_ZOOM_record_p recs = yaz4jlib.new_zoomRecordArray(count);
+    yaz4jlib.ZOOM_resultset_records(resultSet, recs, start, count);
+    ZoomException err = this.conn.getZoomException();
+    if (err != null) { 
+      throw err;
+    }
+    for (int i = 0; i < count; i++) {
+      SWIGTYPE_p_ZOOM_record_p record =
+        yaz4jlib.zoomRecordArray_getitem(recs, i);
+      if (record == null) {
+        continue;
+      }
+      int errorCode = yaz4jlib.ZOOM_record_error(record, null, null, null);
+      if (errorCode != 0) {
+        throw new ZoomException("Record excpetion, code " + errorCode);
+      }
+      out.add(new Record(record, this));
+    }
     return out;
   }
 
@@ -130,6 +138,13 @@ public class ResultSet implements Iterable<Record> {
     };
   }
 
+  /**
+   * 
+   * @param type
+   * @param spec
+   * @return
+   * @throws ZoomException 
+   */
   public ResultSet sort(String type, String spec) throws ZoomException {
     int ret = yaz4jlib.ZOOM_resultset_sort1(resultSet, type, spec);
     if (ret != 0) throw new ZoomException("Sorting resultset failed");