<chapter id="zoom">
- <!-- $Id: zoom.xml,v 1.6 2002-10-10 22:48:10 mike Exp $ -->
+ <!-- $Id: zoom.xml,v 1.7 2002-10-11 12:19:09 mike Exp $ -->
<title>ZOOM-C++</title>
<para>
For example, here is a tiny Z39.50 client that fetches and displays
the MARC record for Farlow & Brett Surman's
- <!-- ### there must be a better way to mark up a book title? -->
- <emphasis>The Complete Dinosaur</emphasis>
+ <citetitle>The Complete Dinosaur</citetitle>
from the Library of Congress's Z39.50 server:
</para>
- <synopsis>
+ <programlisting>
#include <iostream>
#include <yaz++/zoom.h>
{
connection conn("z3950.loc.gov", 7090);
conn.option("databaseName", "Voyager");
- resultSet rs(conn, prefixQuery("@attr attr 1=7 0253333490"));
+ conn.option("preferredRecordSyntax", "USMARC");
+ resultSet rs(conn, prefixQuery("@attr 1=7 0253333490"));
const record *rec = rs.getRecord(0);
cout << rec->render() << endl;
}
- </synopsis>
+ </programlisting>
<para>
- (Note that, for the sake of simplicity, this does not check for
- errors: we show a more realistic version of this program later.)
+ (Note that, for the sake of simplicity, this program does not check
+ for errors: we show a more robust version of the same program
+ <link linkend="revised-sample">later</link>.)
</para>
<para>
Yaz++'s implementation of the C++ binding is a thin layer over Yaz's
Usually that's what you want: it means that you can easily fetch a
record, use it and forget all about it, like this:
</para>
- <screen>
+ <programlisting>
resultSet rs(conn, query);
cout << rs.getRecord(0)->render();
- </screen>
+ </programlisting>
<para>
But sometimes you want a <literal>record</literal> to live on past
the lifetime of the <literal>resultSet</literal> from which it was
be used to make an autonomous copy. The application must
<literal>delete</literal> it when it doesn't need it any longer:
</para>
- <screen>
+ <programlisting>
record *rec;
{
resultSet rs(conn, query);
}
cout << rec->render();
delete rec;
- </screen>
+ </programlisting>
</sect2>
<sect2>
</para>
</sect2>
+ <sect2 id="revised-sample">
+ <title>Revised Sample Program</title>
+ <para>
+ Now we can revise the sample program from the
+ <link linkend="zoom-introduction">introduction</link>
+ to catch exceptions and report any errors:
+ </para>
+ <programlisting>
+ /* g++ -o zoom-c++-hw zoom-c++-hw.cpp -lyaz++ -lyaz */
+
+ #include <iostream>
+ #include <yaz++/zoom.h>
+
+ using namespace ZOOM;
+
+ int main(int argc, char **argv)
+ {
+ try {
+ connection conn("z3950.loc.gov", 7090);
+ conn.option("databaseName", "Voyager");
+ conn.option("preferredRecordSyntax", "USMARC");
+ resultSet rs(conn, prefixQuery("@attr 1=7 0253333490"));
+ const record *rec = rs.getRecord(0);
+ cout << rec->render() << endl;
+ } catch (systemException &e) {
+ cerr << "System error " <<
+ e.errcode() << " (" << e.errmsg() << ")" << endl;
+ } catch (bib1Exception &e) {
+ cerr << "BIB-1 error " <<
+ e.errcode() << " (" << e.errmsg() << "): " << e.addinfo() << endl;
+ } catch (queryException &e) {
+ cerr << "Query error " <<
+ e.errcode() << " (" << e.errmsg() << "): " << e.addinfo() << endl;
+ } catch (exception &e) {
+ cerr << "Error " <<
+ e.errcode() << " (" << e.errmsg() << ")" << endl;
+ }
+ }
+ </programlisting>
+ <para>
+ The heart of this program is the same as in the original version,
+ but it's now wrapped in a <literal>try</literal> block followed by
+ several <literal>catch</literal> blocks which try to give helpful
+ diagnostics if something goes wrong.
+ </para>
+ <para>
+ The first such block diagnoses system-level errors such as memory
+ exhaustion or a network connection being broken by a server's
+ untimely death; the second catches errors at the Z39.50 level,
+ such as a server's report that it can't provide records in USMARC
+ syntax; the third is there in case there's something wrong with
+ the syntax of the query (although in this case it's correct); and
+ finally, the last <literal>catch</literal> block is a
+ belt-and-braces measure to be sure that nothing escapes us.
+ </para>
+ </sect2>
+
<sect2>
<title>References</title>
<itemizedlist>