예제 #1
0
파일: map_cli.cpp 프로젝트: astroynao/nvml
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;
}
예제 #2
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;
}