X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=zoom%2Fzrec.cpp;h=f43662e734d369949f8b6a9013c01f049368956a;hb=16dba5340834b1c35523bb1fb92355e9f56fe0f0;hp=09dee2f05c54470eb2f288408744192f84b554ae;hpb=fb113bcbf8398f8faa896529405909c7f8092b20;p=yazpp-moved-to-github.git diff --git a/zoom/zrec.cpp b/zoom/zrec.cpp index 09dee2f..f43662e 100644 --- a/zoom/zrec.cpp +++ b/zoom/zrec.cpp @@ -1,32 +1,57 @@ -// $Header: /home/cvsroot/yaz++/zoom/zrec.cpp,v 1.3 2002-08-08 16:14:26 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 // for yaz_matchstr() +#include "zoom.h" +#include // 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,44 @@ 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 + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +