void getDetails( XmlTransaction &txn, XmlManager &mgr, const XmlContainer &container, const std::string &query, XmlQueryContext &context ) { //////////////////////////////////////////////////////////////////////// ////// Performs an query (in context) against the /////// ////// provided container. /////// //////////////////////////////////////////////////////////////////////// ///// some defensive code eliminated for clarity // // Perform the query. Result type is by default Result Document std::string fullQuery = "collection('" + container.getName() + "')" + query; try { std::cout << "Exercising query '" << fullQuery << "' " << std::endl; std::cout << "Return to continue: "; getc(stdin); XmlResults results( mgr.query( txn, fullQuery, context ) ); XmlValue value; std::cout << "\n\tProduct : Price : Inventory Level\n"; while( results.next(value) ) { /// Retrieve the value as a document XmlDocument theDocument = value.asDocument(); /// Obtain information of interest from the document. Note that the // wildcard in the query expression allows us to not worry about what // namespace this document uses. std::string item = getValue( txn, mgr, theDocument, "fn:string(/*/product)", context); std::string price = getValue( txn, mgr, theDocument, "fn:string(/*/inventory/price)", context); std::string inventory = getValue( txn, mgr, theDocument, "fn:string(/*/inventory/inventory)", context); std::cout << "\t" << item << " : " << price << " : " << inventory << std::endl; } std::cout << "\n"; std::cout << (unsigned int) results.size() << " objects returned for expression '" << fullQuery << "'\n" << std::endl; } //Catches XmlException catch(std::exception &e) { std::cerr << "Query " << fullQuery << " failed\n"; std::cerr << e.what() << "\n"; txn.abort(); exit(-1); } }
void doQuery( XmlTransaction &txn, XmlManager &db, const XmlContainer &container, const std::string &query ) { //////////////////////////////////////////////////////////////////////// ////// Performs a simple query (no context) against the /////// ////// provided container. /////// //////////////////////////////////////////////////////////////////////// ///// some defensive code eliminated for clarity // // Perform the query. Result type is by default Result Document std::string fullQuery = "collection('" + container.getName() + "')" + query; try { std::cout << "Exercising query '" << fullQuery << "' " << std::endl; std::cout << "Return to continue: "; getc(stdin); XmlQueryContext context = db.createQueryContext(); XmlResults results( db.query( txn, fullQuery, context) ); XmlValue value; while( results.next(value) ) { // Obtain the value as a string and print it to stdout std::cout << value.asString() << std::endl; } std::cout << (unsigned int) results.size() << " objects returned for expression '" << fullQuery << "'\n" << std::endl; } catch(XmlException &e) { std::cerr << "Query " << fullQuery << " failed\n"; std::cerr << e.what() << "\n"; txn.abort(); exit( -1 ); } catch(std::exception &e) { std::cerr << "Query " << fullQuery << " failed\n"; std::cerr << e.what() << "\n"; txn.abort(); exit( -1 ); } }
int main(int argc, char **argv) { std::string path2DbEnv; std::string theContainer = "namespaceExampleData.dbxml"; for ( int i=1; i<argc; i++ ) { if ( argv[i][0] == '-' ) { switch(argv[i][1]) { case 'h': path2DbEnv = argv[++i]; break; default: usage(); } } } if (! path2DbEnv.length() ) usage(); // Berkeley DB environment flags u_int32_t envFlags = DB_RECOVER|DB_CREATE|DB_INIT_MPOOL| DB_INIT_LOCK|DB_INIT_TXN|DB_INIT_LOG; // Berkeley DB cache size (64 MB). The default is quite small u_int32_t envCacheSize = 64*1024*1024; // Create and open a Berkeley DB Transactional Environment. int dberr; DB_ENV *dbEnv = 0; dberr = db_env_create(&dbEnv, 0); if (dberr == 0) { dbEnv->set_cachesize(dbEnv, 0, envCacheSize, 1); dberr = dbEnv->open(dbEnv, path2DbEnv.c_str(), envFlags, 0); } if (dberr) { std::cout << "Unable to create environment handle due to the following error: " << db_strerror(dberr) << std::endl; if (dbEnv) dbEnv->close(dbEnv, 0); return -1; } //Have the XmlManager adopt the db environment XmlManager mgr(dbEnv, DBXML_ADOPT_DBENV); //Configure the container to use transactions XmlContainerConfig config; config.setTransactional(true); //Open a container in the db environment XmlContainer container = mgr.openContainer(theContainer, config); //create a transaction XmlTransaction txn = mgr.createTransaction(); //create a context and declare the namespaces XmlQueryContext context = mgr.createQueryContext(); context.setNamespace( "fruits", "http://groceryItem.dbxml/fruits"); context.setNamespace( "vegetables", "http://groceryItem.dbxml/vegetables"); context.setNamespace( "desserts", "http://groceryItem.dbxml/desserts"); //Query for documents by their document names. doContextQuery( txn, mgr, container.getName(), "/*[dbxml:metadata('dbxml:name')='ZuluNut.xml']", context ); doContextQuery( txn, mgr, container.getName(), "/*[dbxml:metadata('dbxml:name')='TrifleOrange.xml']", context ); doContextQuery( txn, mgr, container.getName(), "/*[dbxml:metadata('dbxml:name')='TriCountyProduce.xml']", context ); //Get the document from the container using the document name doGetDocument(txn, container, "ZuluNut.xml"); doGetDocument(txn, container, "TrifleOrange.xml"); doGetDocument(txn, container, "TriCountyProduce.xml"); //commit the transaction txn.commit(); return 0; }
/** * @breif * Put a file to dbxml database, if there already * had the file in db, check the time stamp to decide if * update needed. * * @Param pathname * the path of the file * @Param docname * The doc name in the dbxml database * * @Returns * return no_error for success * otherwise an XmlException was throwed */ BdRetVal bdbXMLInterface::add_files(const string& pathname, const string& docname) { XmlContainer* container = NULL; if (m_manager == NULL) { throw XmlException(XmlException::NULL_POINTER, "n_manager NULL", __FILE__, __LINE__); } debugOut() << "try file: " << pathname << endl; QString q_pathname(pathname.c_str()); for (int i = 0; i < CONT_IDX_NUM; i ++) { QString q_cont_name("database/"); q_cont_name += (container_names[i].c_str()); q_cont_name += "/"; if (q_pathname.contains(q_cont_name, Qt::CaseInsensitive)) { container = &m_containers[i]; } } if (container == NULL) { throw XmlException(XmlException::NULL_POINTER, "container NULL", __FILE__, __LINE__); } XmlUpdateContext the_context = m_manager->createUpdateContext(); try{ XmlDocument the_doc = container->getDocument(docname); // container->deleteDocument(the_doc, the_context); } catch (XmlException &e) { // debugOut() << "open document xml exception: " << e.what() << " file name: " << docname << endl; if (e.getExceptionCode() != XmlException::DOCUMENT_NOT_FOUND) { throw e; } } debugOut() << "putting file: " << pathname << " to container " << container->getName() << " as doc " << docname << endl; try { XmlInputStream *the_stream = m_manager->createLocalFileInputStream(pathname); container->putDocument(docname, the_stream, the_context, 0); } catch (XmlException &e) { debugOut() << "xml exception: " << e.what() << endl; throw e; } return no_error; }