int main(int argc, char *argv[]) { if (argc < 4) { std::cerr << "usage: " << argv[0] << " file-name <persistent|volatile> " "[insert|insert_new " "<key value>|get <key>|remove <key> | remove_free " "<key>]" << std::endl; return 1; } std::string path = argv[1]; std::string type = argv[2]; pool<root> pop; if (access(path.c_str(), F_OK) != 0) { pop = pool<root>::create(path, LAYOUT, PMEMOBJ_MIN_POOL, S_IRWXU); } else { pop = pool<root>::open(path, LAYOUT); } auto q = pop.get_root(); if (!q->ptree) { transaction::exec_tx( pop, [&] { q->ptree = make_persistent<pmap>(); }); } auto vtree = std::make_shared<vmap>(); for (int i = 3; i < argc;) { queue_op op = parse_queue_op(argv[i++]); if (type == "volatile") exec_op<vmap>(pop, vtree, op, argv, i); else exec_op<pmap>(pop, q->ptree, op, argv, i); } pop.close(); return 0; }
int main(int argc, char *argv[]) { if (argc < 4) { std::cerr << "usage: " << argv[0] << " file-name <persistent|volatile> " "[insert|insert_new " "<key value>|get <key>|remove <key> | remove_free " "<key>]" << std::endl; return 1; } std::string path = argv[1]; std::string type = argv[2]; pool<root> pop; try { if (file_exists(path.c_str()) != 0) { pop = pool<root>::create(path, LAYOUT, PMEMOBJ_MIN_POOL, CREATE_MODE_RW); } else { pop = pool<root>::open(path, LAYOUT); } } catch (pmem::pool_error &e) { std::cerr << e.what() << std::endl; return 1; } persistent_ptr<root> q; try { q = pop.get_root(); } catch (std::exception &e) { std::cerr << e.what() << std::endl; pop.close(); return 1; } if (!q->ptree) { try { transaction::exec_tx(pop, [&] { q->ptree = make_persistent<pmap>(); }); } catch (pmem::transaction_error &e) { std::cerr << e.what() << std::endl; pop.close(); return 1; } } auto vtree = std::make_shared<vmap>(); for (int i = 3; i < argc;) { queue_op op = parse_queue_op(argv[i++]); try { if (type == "volatile") exec_op<vmap>(pop, vtree, op, argv, i); else exec_op<pmap>(pop, q->ptree, op, argv, i); } catch (std::exception &e) { std::cerr << e.what() << std::endl; break; } } pop.close(); return 0; }