Updated footer comment
[yazpp-moved-to-github.git] / zoom / zrec.cpp
index 8537718..8e29e3a 100644 (file)
@@ -1,32 +1,57 @@
-// $Header: /home/cvsroot/yaz++/zoom/zrec.cpp,v 1.4 2002-10-09 09:07:10 mike Exp $
+// $Header: /home/cvsroot/yaz++/zoom/zrec.cpp,v 1.8 2005-06-25 15:53:21 adam Exp $
 
 // Z39.50 Record class
 
 #include "zoom.h"
-#include <yaz/yaz-util.h>      // for yaz_matchstr()
+#include <yaz/yaz-util.h>       // for yaz_matchstr()
 
 
 namespace ZOOM {
-    record::~record() {
-       if (owner == 0) {
-           // Must have been clone()d
-           ZOOM_record_destroy(r);
-       }
+    record::syntax::syntax (value rs): val(rs) {}
+
+    record::syntax::operator std::string() const {
+        switch (val) {
+        case GRS1:   return "grs1";
+        case SUTRS:  return "sutrs";
+        case USMARC: return "usmarc";
+        case UKMARC: return "ukmarc";
+        case XML:    return "xml";
+        default: break;
+        }
+        return "unknown";
+    }
+
+    bool record::syntax::operator==(const record::syntax &s) const {
+        return s.val == val;
+    }
+
+    bool record::syntax::operator==(record::syntax::value rs) const {
+        return rs == val;
+    }
+
+    record::syntax::operator record::syntax::value() const {
+        return val;
     }
 
-    // ### Would this operation be better expressed as a copy constructor?
-    record *record::clone() const {
-       // It's tempting just to replace `r' with a clone, and return
-       // `this', but probably more honest to allocate a new C++
-       // record object.
 
-       record *rec = new record(0, 0);
-       if ((rec->r = ZOOM_record_clone(r)) == 0) {
-           // Presumably an out-of-memory error
-           throw systemException();
-       }
+    record::record(resultSet &rs, size_t i): owner(rs) {
+        if ((r = ZOOM_resultset_record(rs._getYazResultSet(), i)) == 0) {
+            const char *errmsg; // unused: carries same info as `errcode'
+            const char *addinfo;
+            int errcode = ZOOM_connection_error(rs._getYazConnection(),
+                                                &errmsg, &addinfo);
+            throw bib1Exception(errcode, addinfo);
+        }
+
+        // Memory management is odd here.  The ZOOM-C record we've
+        // just fetched (`r') is owned by the ZOOM-C result-set we
+        // fetched it from (`rs.rs'), so the underlying (ZOOM-C)
+        // record is _not_ destroyed when this object is destroyed:
+        // it's done when the underlying result-set is deleted.
+    }
 
-       return rec;
+    record::~record() {
+        // Nothing to do -- see comment in constructor
     }
 
     // It's tempting to modify this method just to return either the
@@ -36,34 +61,45 @@ namespace ZOOM {
     // if we did that.
     //
     record::syntax record::recsyn() const {
-       const char *syn = ZOOM_record_get(r, "syntax", 0);
-
-       // These string constants are from yaz/util/oid.c
-       if (!yaz_matchstr(syn, "xml"))
-           return XML;
-       else if (!yaz_matchstr(syn, "GRS-1"))
-           return GRS1;
-       else if (!yaz_matchstr(syn, "SUTRS"))
-           return SUTRS;
-       else if (!yaz_matchstr(syn, "USmarc"))
-           return USMARC;
-       else if (!yaz_matchstr(syn, "UKmarc"))
-           return UKMARC;
-       else if (!yaz_matchstr(syn, "XML") ||
-                !yaz_matchstr(syn, "text-XML") ||
-                !yaz_matchstr(syn, "application-XML"))
-           return XML;
-
-       return UNKNOWN;
+        const char *syn = ZOOM_record_get(r, "syntax", 0);
+
+        // These string constants are from yaz/util/oid.c
+        if (!yaz_matchstr(syn, "xml"))
+            return syntax::XML;
+        else if (!yaz_matchstr(syn, "GRS-1"))
+            return syntax::GRS1;
+        else if (!yaz_matchstr(syn, "SUTRS"))
+            return syntax::SUTRS;
+        else if (!yaz_matchstr(syn, "USmarc"))
+            return syntax::USMARC;
+        else if (!yaz_matchstr(syn, "UKmarc"))
+            return syntax::UKMARC;
+        else if (!yaz_matchstr(syn, "XML") ||
+                 !yaz_matchstr(syn, "text-XML") ||
+                 !yaz_matchstr(syn, "application-XML"))
+            return syntax::XML;
+
+        return syntax::UNKNOWN;
     }
 
-    const char *record::render() const {
-       int len;
-       return ZOOM_record_get(r, "render", &len);
+    std::string record::render() const {
+        int len;
+        const char* data = ZOOM_record_get(r, "render", &len);
+        return std::string(data, len);
     }
 
-    const char *record::rawdata() const {
-       int len;
-       return ZOOM_record_get(r, "raw", &len);
+    std::string record::rawdata() const {
+        int len;
+        const char* data = ZOOM_record_get(r, "raw", &len);
+        return std::string(data, len);
     }
 }
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+