Use AM_LDFLAGS instead of LDFLAGS
[yazpp-moved-to-github.git] / zoom / zrec.cpp
index 18e34be..38cce34 100644 (file)
@@ -1,32 +1,57 @@
-// $Header: /home/cvsroot/yaz++/zoom/zrec.cpp,v 1.1 2002-08-08 13:31:54 mike Exp $
+// $Header: /home/cvsroot/yaz++/zoom/zrec.cpp,v 1.7 2003-09-22 13:06:27 mike Exp $
 
 // Z39.50 Record class
 
-#include "zoom++.h"
-#include <string.h>            // for strcasecmp()
+#include "zoom.h"
+#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 systemError();
+    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);
        }
 
-       return rec;
+       // 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.
+    }
+
+    record::~record() {
+       // Nothing to do -- see comment in constructor
     }
 
     // It's tempting to modify this method just to return either the
@@ -39,31 +64,33 @@ namespace ZOOM {
        const char *syn = ZOOM_record_get(r, "syntax", 0);
 
        // These string constants are from yaz/util/oid.c
-       if (!strcasecmp(syn, "xml"))
-           return XML;
-       else if (!strcasecmp(syn, "GRS-1"))
-           return GRS1;
-       else if (!strcasecmp(syn, "SUTRS"))
-           return SUTRS;
-       else if (!strcasecmp(syn, "USmarc"))
-           return USMARC;
-       else if (!strcasecmp(syn, "UKmarc"))
-           return UKMARC;
-       else if (!strcasecmp(syn, "XML") ||
-                !strcasecmp(syn, "text-XML") ||
-                !strcasecmp(syn, "application-XML"))
-           return XML;
-
-       return UNKNOWN;
+       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 {
+    std::string record::render() const {
        int len;
-       return ZOOM_record_get(r, "render", &len);
+       const char* data = ZOOM_record_get(r, "render", &len);
+       return std::string(data, len);
     }
 
-    const char *record::rawdata() const {
+    std::string record::rawdata() const {
        int len;
-       return ZOOM_record_get(r, "raw", &len);
+       const char* data = ZOOM_record_get(r, "raw", &len);
+       return std::string(data, len);
     }
 }