DLL exports
[yazpp-moved-to-github.git] / zoom / zrs.cpp
1 // $Header: /home/cvsroot/yaz++/zoom/zrs.cpp,v 1.3 2002-10-09 09:07:10 mike Exp $
2
3 // Z39.50 Result Set class
4
5 #include "zoom.h"
6
7
8 namespace ZOOM {
9     resultSet::resultSet(connection &c, const query &q) : owner(c) {
10         ZOOM_connection yazc = c._getYazConnection();
11         rs = ZOOM_connection_search(yazc, q._getYazQuery());
12         int errcode;
13         const char *errmsg;     // unused: carries same info as `errcode'
14         const char *addinfo;
15
16         if ((errcode = ZOOM_connection_error(yazc, &errmsg, &addinfo)) != 0) {
17             throw bib1Exception(errcode, addinfo);
18         }
19     }
20
21     resultSet::~resultSet() {
22         ZOOM_resultset_destroy(rs);
23     }
24
25     const char *resultSet::option(const char *key) const {
26         return ZOOM_resultset_option_get(rs, key);
27     }
28
29     const char *resultSet::option(const char *key, const char *val) {
30         // ### There may be memory-management issues here.
31         const char *old = ZOOM_resultset_option_get(rs, key);
32         ZOOM_resultset_option_set(rs, key, val);
33         return old;
34     }
35
36     size_t resultSet::size() const {
37         return ZOOM_resultset_size(rs);
38     }
39
40     const record *resultSet::getRecord(size_t i) const {
41         ZOOM_record rec;
42         if ((rec = ZOOM_resultset_record(rs, i)) == 0) {
43             const char *errmsg; // unused: carries same info as `errcode'
44             const char *addinfo;
45             int errcode = ZOOM_connection_error(owner._getYazConnection(),
46                                                 &errmsg, &addinfo);
47             throw bib1Exception(errcode, addinfo);
48         }
49
50         // Memory management is odd here.  The ZOOM-C record we've
51         // just fetched (`rec') is owned by the ZOOM-C result-set we
52         // fetched it from (`rs'), so all we need to allocate is a
53         // ZOOM-C++ wrapper for it, which is destroyed at the
54         // appropriate time -- but the underlying (ZOOM-C) record is
55         // _not_ destroyed at that time, because it's done when the
56         // underlying result-set is deleted.
57         return new record(this, rec);
58     }
59 }