// // See the file LICENSE for redistribution information. // // Copyright (c) 2002,2009 Oracle. All rights reserved. // // // Test program for management of XmlManager objects // System includes #include #include #include // XQilla includes #include // Xerces includes #include #include #include // DB XML includes (external) #include "dbxml/DbXml.hpp" // test code includes #include "../util/TestLogging.hpp" using namespace DbXmlTest; using namespace DbXml; using namespace std; // function prototypes (so that main() appears first...) void doTest(TestLogger &log, const std::string &testid, bool transacted, bool nodeLevelStorage, bool indexNodes, const std::string &path2DbEnv1, const std::string &path2DbEnv2); void usage(const std::string &progname, int exitCode); DB_ENV *createEnv(const char *path, u_int32_t flags); int main(int argc, char **argv) { string testid; // arbitrary id for test (used for file names) bool transacted(false); // true iff a transacted environment is used bool nodeLevelStorage(false); // node level storage (whole docs otherwise) bool indexNodes(false); // true if nodes should be indexed bool verifyLog(false); // true iff log file is to be verified string path2DbEnv1, path2DbEnv2; // paths to DB XML env (must exist) string logDir("./"); // path to dir to contain log file int err(1); for(int i=1; iremove(tenv, path2DbEnv1.c_str(), 0); DB_ENV *env = createEnv(path2DbEnv1.c_str(), flags|DB_INIT_TXN); XmlManager db1(env, DBXML_ADOPT_DBENV); db1.setDefaultContainerType(nodeLevelStorage ? XmlContainer::NodeContainer : XmlContainer::WholedocContainer); db1.setDefaultContainerFlags(indexNodes ? DBXML_INDEX_NODES : DBXML_NO_INDEX_NODES); XmlTransaction txn = db1.createTransaction(); XmlContainer c1 = db1.createContainer(txn, "container_3_1.dbxml"); txn.abort(); // try again...should fail try { XmlTransaction txn1 = db1.createTransaction(); XmlContainer c2 = db1.openContainer( txn1, "container_3_1.dbxml"); // ERROR_MSG(log,"8.5.3: openContainer should have failed"); txn1.abort(); } catch (XmlException &e) { // // good ERROR_MSG(log,"8.5.3: openContainer should not have failed"); } } TEST_MSG(log, "Completed test"); // 8.5.4 - test transaction notifications // a. same as 8.5.3, but use externally created DB_TXN, and // destroy original XmlTransaction, making sure the ref // counting works. TEST_MSG(log, "8.5.4 - Test transaction notifications"); { DB_ENV *env = createEnv(path2DbEnv1.c_str(), flags|DB_INIT_TXN); XmlManager db1(env, DBXML_ADOPT_DBENV); db1.setDefaultContainerType(nodeLevelStorage ? XmlContainer::NodeContainer : XmlContainer::WholedocContainer); db1.setDefaultContainerFlags(indexNodes ? DBXML_INDEX_NODES : DBXML_NO_INDEX_NODES); DB_TXN *dbTxn; env->txn_begin(env, 0, &dbTxn, 0); XmlTransaction *xmlTxn; { XmlTransaction txn = db1.createTransaction(dbTxn); xmlTxn = new XmlTransaction(txn); } XmlContainer c1 = db1.createContainer(*xmlTxn, "container_3_2.dbxml"); delete xmlTxn; dbTxn->abort(dbTxn); // try again...should fail try { XmlTransaction txn = db1.createTransaction(); XmlContainer c2 = db1.openContainer( txn, "container_3_2.dbxml"); // ERROR_MSG(log,"8.5.4: openContainer should have failed"); } catch (XmlException &e) { // // good ERROR_MSG(log,"8.5.4: openContainer should not have failed"); } } TEST_MSG(log, "Completed test"); // 8.5.5 - test transaction notifications // a. same as 8.5.4, but commit the txn, actually create the container TEST_MSG(log, "8.5.5 - Test transaction notifications"); { DB_ENV *env = createEnv(path2DbEnv1.c_str(), flags|DB_INIT_TXN); XmlManager db1(env, DBXML_ADOPT_DBENV); db1.setDefaultContainerType(nodeLevelStorage ? XmlContainer::NodeContainer : XmlContainer::WholedocContainer); db1.setDefaultContainerFlags(indexNodes ? DBXML_INDEX_NODES : DBXML_NO_INDEX_NODES); DB_TXN *dbTxn; env->txn_begin(env, 0, &dbTxn, 0); XmlTransaction *xmlTxn; { XmlTransaction txn = db1.createTransaction(dbTxn); xmlTxn = new XmlTransaction(txn); } XmlContainer c1 = db1.createContainer( *xmlTxn, "container_3_3.dbxml"); delete xmlTxn; dbTxn->commit(dbTxn, 0); // open again...should work this time try { XmlTransaction txn = db1.createTransaction(); XmlContainer c2 = db1.openContainer( txn, "container_3_3.dbxml"); } catch (XmlException &e) { ERROR_MSG(log,"8.5.5: openContainer should have succeeded"); } } TEST_MSG(log, "Completed test"); } DB_ENV *createEnv(const char *path, u_int32_t flags) { DB_ENV *env; int err = db_env_create(&env, 0); if (err == 0) { err = env->open(env, path, flags, 0); if (err == 0) return env; } cerr << "Failed to create/open DB_ENV: " << err << endl; exit(-1); return 0; // not-reached } void usage(const std::string &progname, int exitCode) { string::size_type pos = progname.rfind('/'); if(pos == string::npos) { pos = progname.rfind('\\'); } if(pos == string::npos) { pos = 0; } else { ++pos; } cerr << "Usage: " << progname.substr(pos) << " [OPTIONS] --env1 path_to_dbenv --env2 path_to_dbenv " << endl; cerr << "Options:" << endl; cerr << "\t-t|--transacted\t\tuse a transacted environment" << endl; cerr << "\t-n|--nls\t\tuse node level storage" << endl; cerr << "\t--indexnodes\t\tuse DBXML_INDEX_NODES flag" << endl; cerr << "\t--id id\t\tassign a (test) ID to this invocation" << endl; cerr << "\t-h|--help|-?\t\tprint this help" << endl; cerr << "\t-v|--verify\t\tverify the log file for warnings and errors" << endl; cerr << "\t-l|--logdir\t\tdirectory for the log files [.]" << endl; cerr << endl; exit(exitCode); }