// SPDX-License-Identifier: BSD-3-Clause /* Copyright 2019-2020, Intel Corporation */ /* * simplekv.cpp -- implementation of simple kv which uses vector to hold * values, string as a key and array to hold buckets */ #include #include #include #include "simplekv.hpp" using kv_type = simple_kv; struct root { pmem::obj::persistent_ptr kv; }; void show_usage(char *argv[]) { std::cerr << "usage: " << argv[0] << " file-name [get key|put key value]" << std::endl; } int main(int argc, char *argv[]) { if (argc < 3) { show_usage(argv); return 1; } const char *path = argv[1]; pmem::obj::pool pop; try { pop = pmem::obj::pool::open(path, "simplekv"); auto r = pop.root(); if (r->kv == nullptr) { pmem::obj::transaction::run(pop, [&] { r->kv = pmem::obj::make_persistent(); }); } if (std::string(argv[2]) == "get" && argc == 4) std::cout << r->kv->get(argv[3]) << std::endl; else if (std::string(argv[2]) == "put" && argc == 5) r->kv->put(argv[3], std::stoi(argv[4])); else if (std::string(argv[2]) == "burst" && std::string(argv[3]) == "get" && argc == 5) { int m = std::stoi(argv[4]); for(int i=0; i < m; i++) { char key[32] = {0}; sprintf(key, "key%d", i); r->kv->get(key); } } else if (std::string(argv[2]) == "burst" && std::string(argv[3]) == "put" && argc == 5) { int m = std::stoi(argv[4]); for(int i=0; i < m; i++) { char key[32] = {0}; sprintf(key, "key%d", i); r->kv->put(key, i); } } else { show_usage(argv); pop.close(); return 1; } } catch (pmem::pool_error &e) { std::cerr << e.what() << std::endl; std::cerr << "To create pool run: pmempool create obj --layout=simplekv -s 100M path_to_pool" << std::endl; } catch (std::exception &e) { std::cerr << e.what() << std::endl; } try { pop.close(); } catch (const std::logic_error &e) { std::cerr << e.what() << std::endl; } return 0; }