summaryrefslogtreecommitdiff
path: root/xsd/documentation/cxx/tree/dbxml
diff options
context:
space:
mode:
Diffstat (limited to 'xsd/documentation/cxx/tree/dbxml')
-rw-r--r--xsd/documentation/cxx/tree/dbxml/driver.cxx175
-rw-r--r--xsd/documentation/cxx/tree/dbxml/index.xhtml348
-rw-r--r--xsd/documentation/cxx/tree/dbxml/library.xsd75
3 files changed, 598 insertions, 0 deletions
diff --git a/xsd/documentation/cxx/tree/dbxml/driver.cxx b/xsd/documentation/cxx/tree/dbxml/driver.cxx
new file mode 100644
index 0000000..56cbb4a
--- /dev/null
+++ b/xsd/documentation/cxx/tree/dbxml/driver.cxx
@@ -0,0 +1,175 @@
+// file : examples/cxx/tree/dbxml/driver.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : not copyrighted - public domain
+
+#include <memory> // std::auto_ptr
+#include <string>
+#include <cassert>
+#include <iostream>
+
+#include <dbxml/DbXml.hpp>
+
+#include "library.hxx"
+
+using std::cerr;
+using std::endl;
+using std::string;
+using std::auto_ptr;
+
+using namespace DbXml;
+using namespace xsd::cxx; // for xml::string
+
+void
+print_document (const string& desc,
+ XmlContainer container,
+ const string& name)
+{
+ XmlDocument doc (container.getDocument (name));
+
+ string content;
+ doc.getContent (content);
+
+ cerr << endl
+ << desc << endl
+ << content << endl;
+}
+
+int
+main ()
+{
+ try
+ {
+ using namespace library;
+ using xml_schema::date;
+
+ XmlManager manager;
+
+ {
+ XmlContainer container (manager.createContainer ("new.bdbxml"));
+
+ XmlUpdateContext update_context (manager.createUpdateContext ());
+
+ XmlQueryContext context (manager.createQueryContext ());
+ context.setNamespace ("lib", "http://www.codesynthesis.com/library");
+
+
+ // Create a new document from an object model.
+ //
+ {
+ // Create a new catalog with one book.
+ //
+ catalog c;
+
+ book b (20530902, // ISBN
+ "The Elements of Style", // Title
+ genre::reference, // Genre
+ "ES"); // ID
+
+ author strunk ("William Strunk, Jr.", date (1869, 7, 1));
+ strunk.died (date (1946, 9, 26));
+
+ b.author ().push_back (strunk);
+ c.book ().push_back (b);
+
+
+ // Create a new XML document.
+ //
+ XmlDocument doc (manager.createDocument ());
+ doc.setName ("new.xml");
+
+
+ // Obtain its DOM representation and add the root element.
+ //
+ xercesc::DOMDocument& dom_doc (*doc.getContentAsDOM ());
+
+ dom_doc.appendChild (
+ dom_doc.createElementNS (
+ xml::string ("http://www.codesynthesis.com/library").c_str (),
+ xml::string ("lib:catalog").c_str ()));
+
+
+ // Serialize the object model to the XML document. Also avoid
+ // re-initializing the Xerces-C++ runtime since XmlManager has
+ // it initialized.
+ //
+ catalog_ (dom_doc, c, xml_schema::flags::dont_initialize);
+
+
+ // Place the document into the container.
+ //
+ container.putDocument (doc, update_context);
+
+ print_document ("after create:", container, "new.xml");
+ }
+
+ // Create an object model from a document in DB.
+ //
+ {
+ // Resolve the document in the container.
+ //
+ XmlDocument doc (container.getDocument ("new.xml"));
+
+
+ // Create the object model from the document's DOM. Also avoid
+ // re-initializing the Xerces-C++ runtime since XmlManager has
+ // it initialized.
+ //
+ auto_ptr<catalog> c (catalog_ (*doc.getContentAsDOM (),
+ xml_schema::flags::dont_initialize));
+
+ cerr << *c << endl;
+ }
+
+
+ // Lookup a document fragment.
+ //
+
+ string query ("collection('new.bdbxml')/lib:catalog/book[@id='ES']");
+
+ // Find "The Elements of Style".
+ //
+ XmlValue v;
+ XmlResults results (manager.query (query, context));
+
+ if (results.next (v))
+ {
+ // Create an object model from the document fragment.
+ //
+ auto_ptr<book> b (
+ new book (
+ *static_cast<xercesc::DOMElement*> (v.asNode ())));
+
+ cerr << *b << endl;
+
+
+ // Add another author, change the availability status.
+ //
+ author white ("E.B. White", date (1899, 7, 11));
+ white.died (date (1985, 10, 1));
+
+ b->author ().push_back (white);
+ b->available (false);
+
+
+ // Update the document fragment from the object model.
+ //
+ *static_cast<xercesc::DOMElement*> (v.asNode ()) << *b;
+
+
+ // Update the document in the container.
+ //
+ XmlDocument doc (v.asDocument ());
+ container.updateDocument (doc, update_context);
+ }
+
+ print_document ("after update:", container, "new.xml");
+ }
+
+ manager.removeContainer ("new.bdbxml");
+ }
+ catch (const std::exception& e)
+ {
+ cerr << e.what () << endl;
+ return 1;
+ }
+}
diff --git a/xsd/documentation/cxx/tree/dbxml/index.xhtml b/xsd/documentation/cxx/tree/dbxml/index.xhtml
new file mode 100644
index 0000000..adfeb24
--- /dev/null
+++ b/xsd/documentation/cxx/tree/dbxml/index.xhtml
@@ -0,0 +1,348 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+
+<head>
+ <title>C++/Tree Mapping and Berkeley DB XML Integration Guide</title>
+
+ <meta name="copyright" content="&copy; 2006-2010 Code Synthesis Tools CC"/>
+ <meta name="keywords" content="xsd,xml,schema,c++,mapping,data,binding,berkeley,db,dbxml"/>
+ <meta name="description" content="C++/Tree Mapping and Berkeley DB XML Integration Guide"/>
+
+ <link rel="stylesheet" type="text/css" href="../../../default.css" />
+
+<style type="text/css">
+ pre {
+ background : #cde8f6;
+
+ padding : 0 0 0 1em;
+ margin : 2em 0em 2em 0;
+
+ }
+
+ h1 {padding-top: 1em;}
+
+</style>
+</head>
+
+<body>
+<div id="container">
+ <div id="content">
+
+ <h1>Introduction</h1>
+
+ <p>This guide shows how to integrate the
+ <a href="http://www.codesynthesis.com/products/xsd/c++/tree/">C++/Tree</a>
+ mapping generated by
+ <a href="http://www.codesynthesis.com/products/xsd/">CodeSynthesis XSD</a>
+ with
+ <a href="http://www.oracle.com/database/berkeley-db/xml/index.html">Berkeley DB XML</a>.
+
+ Berkeley DB XML is an embedded XML database which allows efficient
+ storage and query of XML instance documents.
+
+ CodeSynthesis XSD is a W3C XML Schema to C++ data binding compiler.
+
+ The C++/Tree mapping allows you to manipulate the data stored in XML
+ using objects that semantically correspond to your application
+ domain rather than dealing with direct representations of XML.
+
+ For an introduction to
+ the Berkeley DB XML refer to the
+ <a href="http://www.oracle.com/database/berkeley-db/xml/index.html">Berkeley DB XML
+ Getting Started Guide</a>.
+ For an introduction to the C++/Tree mapping refer to
+ the <a href="../guide/">C++/Tree Mapping Getting Started Guide</a>.
+ </p>
+
+
+ <p>This guide describes the following four operations:</p>
+
+ <ul>
+ <li>Create a new document in DB from an object model</li>
+ <li>Create an object model from a document in DB</li>
+ <li>Create an object model from a document fragment in DB</li>
+ <li>Update a document fragment in DB from an object model</li>
+ </ul>
+
+ <p>Our examples will be based on simple XML for book library. The XML
+ Schema definition for the library is in
+ <a href="./library.xsd">library.xsd</a> and is compiled by XSD
+ to obtain <code>library.hxx</code> and <code>library.cxx</code>.
+ All C++ code fragments that are presented in this guide are available
+ as a single program in <a href="./driver.cxx">driver.cxx</a>.
+ The complete example is available in the
+ <code>examples/cxx/tree/dbxml</code> directory of the XSD distribution.</p>
+
+ <p>Note that due to the incomplete DOM API implementation provided by DB
+ XML (as of version 2.3.10), the generated code and your application
+ should be compiled with the <code>DBXML_DOM</code> macro defined in
+ order to avoid using unsupported parts of the API.
+ </p>
+
+ <p>A sample XML document for the library schema is presented below:</p>
+
+ <pre>
+&lt;lib:catalog xmlns:lib="http://www.codesynthesis.com/library">
+ &lt;book available="true" id="ES">
+ &lt;isbn>20530902&lt;/isbn>
+ &lt;title>The Elements of Style&lt;/title>
+ &lt;genre>reference&lt;/genre>
+
+ &lt;author>
+ &lt;name>William Strunk, Jr.&lt;/name>
+ &lt;born>1869-07-01&lt;/born>
+ &lt;died>1946-09-26&lt;/died>
+ &lt;/author>
+
+ &lt;author>
+ &lt;name>E.B. White&lt;/name>
+ &lt;born>1899-07-11&lt;/born>
+ &lt;died>1985-10-01&lt;/died>
+ &lt;/author>
+ &lt;/book>
+&lt;/lib:catalog>
+ </pre>
+
+ <h1>Create Document from Object Model</h1>
+
+ <p>In this step, we will programmatically create a book catalog
+ with one book, save it into an <code>XmlDocument</code> object
+ using one of the serialization functions generated by XSD (
+ <code>catalog_</code> in our case), and store the
+ <code>XmlDocument</code> object as a new document in the
+ DB container:</p>
+
+ <pre>
+XmlManager manager;
+XmlContainer container (manager.createContainer ("new.bdbxml"));
+XmlUpdateContext update_context (manager.createUpdateContext ());
+XmlQueryContext context (manager.createQueryContext ());
+context.setNamespace ("lib", "http://www.codesynthesis.com/library");
+
+// Create a new catalog with one book.
+//
+catalog c;
+
+book b (20530902, // ISBN
+ title ("The Elements of Style"), // Title
+ genre::reference, // Genre
+ "ES"); // ID
+
+author strunk ("William Strunk, Jr.", date (1869, 7, 1));
+strunk.died (date (1946, 9, 26));
+
+b.author ().push_back (strunk);
+c.book ().push_back (b);
+
+// Create a new XML document.
+//
+XmlDocument doc (manager.createDocument ());
+doc.setName ("new.xml");
+
+// Obtain its DOM representation and add the root element.
+//
+xercesc::DOMDocument&amp; dom_doc (*doc.getContentAsDOM ());
+
+dom_doc.appendChild (
+ dom_doc.createElementNS (
+ xml::string ("http://www.codesynthesis.com/library").c_str (),
+ xml::string ("lib:catalog").c_str ()));
+
+// Serialize the object model to the XML document. Also avoid
+// re-initializing the Xerces-C++ runtime since XmlManager has
+// it initialized.
+//
+catalog_ (dom_doc, c, xml_schema::flags::dont_initialize);
+
+// Place the document into the container.
+//
+container.putDocument (doc, update_context);
+ </pre>
+
+ <p>If we now resolve the <code>new.xml</code> in the container and
+ print its content, we will get:</p>
+
+ <pre>
+&lt;lib:catalog xmlns:lib="http://www.codesynthesis.com/library">
+ &lt;book available="true" id="ES">
+ &lt;isbn>20530902&lt;/isbn>
+ &lt;title>The Elements of Style&lt;/title>
+ &lt;genre>reference&lt;/genre>
+ &lt;author>
+ &lt;name>William Strunk, Jr.&lt;/name>
+ &lt;born>1869-07-01&lt;/born>
+ &lt;died>1946-09-26&lt;/died>
+ &lt;/author>
+ &lt;/book>
+&lt;/lib:catalog>
+ </pre>
+
+ <h1>Create Object Model from Document</h1>
+
+ <p>Creating an object model from a document is a matter
+ of obtaining <code>XmlDocument</code> object and passing its DOM
+ representation to one of the parsing functions generated by XSD
+ (<code>catalog_</code> in our case):
+ </p>
+
+ <pre>
+// Resolve the document in the container.
+//
+XmlDocument doc (container.getDocument ("new.xml"));
+
+// Create the object model from the document's DOM. Also avoid
+// re-initializing the Xerces-C++ runtime since XmlManager has
+// it initialized.
+//
+auto_ptr&lt;catalog> c (catalog_ (*doc.getContentAsDOM (),
+ xml_schema::flags::dont_initialize));
+
+cerr &lt;&lt; *c &lt;&lt; endl;
+ </pre>
+
+ <p>This code fragment prints:</p>
+
+ <pre>
+book:
+isbn: 20530902
+title: The Elements of Style
+genre: reference
+author:
+name: William Strunk, Jr.
+born: 1869-07-01
+died: 1946-09-26
+available: 1
+id: ES
+ </pre>
+
+ <h1>Create Object Model from Document Fragment</h1>
+
+ <p>The following code fragment looks up the book with id <code>"ES"</code>
+ using XQuery. It then creates a <code>book</code> object from the
+ resulting <code>XmlValue</code>:</p>
+
+ <pre>
+string query ("collection('new.bdbxml')/lib:catalog/book[@id='ES']");
+
+// Find "The Elements of Style".
+//
+XmlValue v;
+XmlResults results (manager.query (query, context));
+
+if (results.next (v))
+{
+ // Create an object model from the document fragment.
+ //
+ auto_ptr&lt;book> b (
+ new book (
+ *static_cast&lt;xercesc::DOMElement*> (v.asNode ())));
+
+ cerr &lt;&lt; *b &lt;&lt; endl;
+}
+ </pre>
+
+<p>This code fragment prints:</p>
+
+ <pre>
+isbn: 20530902
+title: The Elements of Style
+genre: reference
+author:
+name: William Strunk, Jr.
+born: 1869-07-01
+died: 1946-09-26
+available: 1
+id: ES
+ </pre>
+
+ <p>Note that we had to perform a <code>static_cast</code> from
+ <code>xercesc::DOMNode</code>
+ returned by the <code>XmlValue::asNode</code> member function to
+ <code>xercesc::DOMElement</code>. This is safe since we know
+ that in our schema books are represented as XML elements.</p>
+
+ <h1>Update Document Fragment from Object Model</h1>
+
+ <p>Analogous to the create case, the following code fragment looks
+ up the book with id <code>"ES"</code> using XQuery. It then creates
+ a <code>book</code> object from the resulting <code>XmlValue</code>,
+ adds another author, changes the availability status, and saves
+ the changes back to the <code>XmlValue</code> object:
+ </p>
+
+ <pre>
+string query ("collection('new.bdbxml')/lib:catalog/book[@id='ES']");
+
+// Find "The Elements of Style".
+//
+XmlValue v;
+XmlResults results (manager.query (query, context));
+
+if (results.next (v))
+{
+ // Create an object model from the document fragment.
+ //
+ auto_ptr&lt;book> b (
+ new book (
+ *static_cast&lt;xercesc::DOMElement*> (v.asNode ())));
+
+ // Add another author, change the availability status.
+ //
+ author white ("E.B. White", date (1899, 7, 11));
+ white.died (date (1985, 10, 1));
+
+ b->author ().push_back (white);
+ b->available (false);
+
+ // Update the document fragment from the object model.
+ //
+ *static_cast&lt;xercesc::DOMElement*> (v.asNode ()) &lt;&lt; *b;
+
+ // Update the document in the container.
+ //
+ XmlDocument doc (v.asDocument ());
+ container.updateDocument (doc, update_context);
+}
+ </pre>
+
+ <p>If we now resolve the <code>new.xml</code> in the container and
+ print its content, we will get:</p>
+
+ <pre>
+&lt;lib:catalog xmlns:lib="http://www.codesynthesis.com/library">
+ &lt;book available="false" id="ES">
+ &lt;isbn>20530902&lt;/isbn>
+ &lt;title>The Elements of Style&lt;/title>
+ &lt;genre>reference&lt;/genre>
+ &lt;author>
+ &lt;name>William Strunk, Jr.&lt;/name>
+ &lt;born>1869-07-01&lt;/born>
+ &lt;died>1946-09-26&lt;/died>
+ &lt;/author>
+ &lt;author>
+ &lt;name>E.B. White&lt;/name>
+ &lt;born>1899-07-11&lt;/born>
+ &lt;died>1985-10-01&lt;/died>
+ &lt;/author>
+ &lt;/book>
+&lt;/lib:catalog>
+ </pre>
+
+ </div>
+ <div id="footer">
+ &copy;2006-2010 <a href="http://www.codesynthesis.com">CODE SYNTHESIS TOOLS CC</a>
+
+ <div id="terms">
+ Permission is granted to copy, distribute and/or modify this
+ document under the terms of the
+ <a href="http://www.codesynthesis.com/licenses/fdl-1.2.txt">GNU Free
+ Documentation License, version 1.2</a>; with no Invariant Sections,
+ no Front-Cover Texts and no Back-Cover Texts.
+ </div>
+ </div>
+
+</div>
+
+</body>
+</html>
diff --git a/xsd/documentation/cxx/tree/dbxml/library.xsd b/xsd/documentation/cxx/tree/dbxml/library.xsd
new file mode 100644
index 0000000..c71c312
--- /dev/null
+++ b/xsd/documentation/cxx/tree/dbxml/library.xsd
@@ -0,0 +1,75 @@
+<?xml version="1.0"?>
+
+<!--
+
+file : examples/cxx/tree/dbxml/library.xsd
+author : Boris Kolpackov <boris@codesynthesis.com>
+copyright : not copyrighted - public domain
+
+-->
+
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:xse="http://www.codesynthesis.com/xmlns/xml-schema-extension"
+ xmlns:lib="http://www.codesynthesis.com/library"
+ targetNamespace="http://www.codesynthesis.com/library">
+
+ <xsd:simpleType name="isbn">
+ <xsd:restriction base="xsd:unsignedInt"/>
+ </xsd:simpleType>
+
+
+ <xsd:complexType name="title">
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute name="lang" type="xsd:language"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+
+ <xsd:simpleType name="genre">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="romance"/>
+ <xsd:enumeration value="fiction"/>
+ <xsd:enumeration value="horror"/>
+ <xsd:enumeration value="history"/>
+ <xsd:enumeration value="philosophy"/>
+ <xsd:enumeration value="reference"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:complexType name="person">
+ <xsd:sequence>
+ <xsd:element name="name" type="xsd:string"/>
+ <xsd:element name="born" type="xsd:date"/>
+ <xsd:element name="died" type="xsd:date" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="author">
+ <xsd:complexContent>
+ <xsd:extension base="lib:person">
+ <xsd:attribute name="recommends" type="xsd:IDREF" xse:refType="lib:book"/>
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+ <xsd:complexType name="book">
+ <xsd:sequence>
+ <xsd:element name="isbn" type="lib:isbn"/>
+ <xsd:element name="title" type="lib:title"/>
+ <xsd:element name="genre" type="lib:genre"/>
+ <xsd:element name="author" type="lib:author" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="available" type="xsd:boolean" default="true"/>
+ <xsd:attribute name="id" type="xsd:ID" use="required"/>
+ </xsd:complexType>
+
+ <xsd:complexType name="catalog">
+ <xsd:sequence>
+ <xsd:element name="book" type="lib:book" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="catalog" type="lib:catalog"/>
+
+</xsd:schema>