Added ZOOM.
[yazpp-moved-to-github.git] / zoom / zrs.cpp
diff --git a/zoom/zrs.cpp b/zoom/zrs.cpp
new file mode 100644 (file)
index 0000000..39d0422
--- /dev/null
@@ -0,0 +1,59 @@
+// $Header: /home/cvsroot/yaz++/zoom/zrs.cpp,v 1.1 2002-08-08 13:31:54 mike Exp $
+
+// Z39.50 Result Set class
+
+#include "zoom++.h"
+
+
+namespace ZOOM {
+    resultSet::resultSet(connection &c, const query &q) : owner(c) {
+       ZOOM_connection yazc = c._getYazConnection();
+       rs = ZOOM_connection_search(yazc, q._getYazQuery());
+       int errcode;
+       const char *errmsg;     // unused: carries same info as `errcode'
+       const char *addinfo;
+
+       if ((errcode = ZOOM_connection_error(yazc, &errmsg, &addinfo)) != 0) {
+           throw bib1Error(errcode, addinfo);
+       }
+    }
+
+    resultSet::~resultSet() {
+       ZOOM_resultset_destroy(rs);
+    }
+
+    const char *resultSet::option(const char *key) const {
+       return ZOOM_resultset_option_get(rs, key);
+    }
+
+    const char *resultSet::option(const char *key, const char *val) {
+       // ### There may be memory-management issues here.
+       const char *old = ZOOM_resultset_option_get(rs, key);
+       ZOOM_resultset_option_set(rs, key, val);
+       return old;
+    }
+
+    size_t resultSet::size() const {
+       return ZOOM_resultset_size(rs);
+    }
+
+    const record *resultSet::getRecord(size_t i) const {
+       ZOOM_record rec;
+       if ((rec = ZOOM_resultset_record(rs, i)) == 0) {
+           const char *errmsg; // unused: carries same info as `errcode'
+           const char *addinfo;
+           int errcode = ZOOM_connection_error(owner._getYazConnection(),
+                                               &errmsg, &addinfo);
+           throw bib1Error(errcode, addinfo);
+       }
+
+       // Memory management is odd here.  The ZOOM-C record we've
+       // just fetched (`rec') is owned by the ZOOM-C result-set we
+       // fetched it from (`rs'), so all we need to allocate is a
+       // ZOOM-C++ wrapper for it, which is destroyed at the
+       // appropriate time -- but the underlying (ZOOM-C) record is
+       // _not_ destroyed at that time, because it's done when the
+       // underlying result-set is deleted.
+       return new record(this, rec);
+    }
+}