| 
|   | db () noexcept | 
|   | Default constructor with uninitialized database.  More...
  | 
|   | 
| status  | open (const std::string &engine_name, config &&cfg=config{}) noexcept | 
|   | Opens the pmemkv database with specified config.  More...
  | 
|   | 
| void  | close () noexcept | 
|   | Closes pmemkv database.  More...
  | 
|   | 
| status  | count_all (std::size_t &cnt) noexcept | 
|   | It returns number of currently stored elements in pmem::kv::db.  More...
  | 
|   | 
| status  | count_above (string_view key, std::size_t &cnt) noexcept | 
|   | It returns number of currently stored elements in pmem::kv::db, whose keys are greater than the given key.  More...
  | 
|   | 
| status  | count_equal_above (string_view key, std::size_t &cnt) noexcept | 
|   | It returns number of currently stored elements in pmem::kv::db, whose keys are greater than or equal to the given key.  More...
  | 
|   | 
| status  | count_equal_below (string_view key, std::size_t &cnt) noexcept | 
|   | It returns number of currently stored elements in pmem::kv::db, whose keys are lower than or equal to the given key.  More...
  | 
|   | 
| status  | count_below (string_view key, std::size_t &cnt) noexcept | 
|   | It returns number of currently stored elements in pmem::kv::db, whose keys are less than the given key.  More...
  | 
|   | 
| status  | count_between (string_view key1, string_view key2, std::size_t &cnt) noexcept | 
|   | It returns number of currently stored elements in pmem::kv::db, whose keys are greater than the key1 and less than the key2.  More...
  | 
|   | 
| status  | get_all (get_kv_callback *callback, void *arg) noexcept | 
|   | Executes (C-like) callback function for every record stored in pmem::kv::db.  More...
  | 
|   | 
| status  | get_all (std::function< get_kv_function > f) noexcept | 
|   | Executes function for every record stored in pmem::kv::db.  More...
  | 
|   | 
| status  | get_above (string_view key, get_kv_callback *callback, void *arg) noexcept | 
|   | Executes (C-like) callback function for every record stored in pmem::kv::db, whose keys are greater than the given key.  More...
  | 
|   | 
| status  | get_above (string_view key, std::function< get_kv_function > f) noexcept | 
|   | Executes function for every record stored in pmem::kv::db, whose keys are greater than the given key.  More...
  | 
|   | 
| status  | get_equal_above (string_view key, get_kv_callback *callback, void *arg) noexcept | 
|   | Executes (C-like) callback function for every record stored in pmem::kv::db, whose keys are greater than or equal to the given key.  More...
  | 
|   | 
| status  | get_equal_above (string_view key, std::function< get_kv_function > f) noexcept | 
|   | Executes function for every record stored in pmem::kv::db, whose keys are greater than or equal to the given key.  More...
  | 
|   | 
| status  | get_equal_below (string_view key, get_kv_callback *callback, void *arg) noexcept | 
|   | Executes (C-like) callback function for every record stored in pmem::kv::db, whose keys are lower than or equal to the given key.  More...
  | 
|   | 
| status  | get_equal_below (string_view key, std::function< get_kv_function > f) noexcept | 
|   | Executes function for every record stored in pmem::kv::db, whose keys are lower than or equal to the given key.  More...
  | 
|   | 
| status  | get_below (string_view key, get_kv_callback *callback, void *arg) noexcept | 
|   | Executes (C-like) callback function for every record stored in pmem::kv::db, whose keys are lower than the given key.  More...
  | 
|   | 
| status  | get_below (string_view key, std::function< get_kv_function > f) noexcept | 
|   | Executes function for every record stored in pmem::kv::db, whose keys are less than the given key.  More...
  | 
|   | 
| status  | get_between (string_view key1, string_view key2, get_kv_callback *callback, void *arg) noexcept | 
|   | Executes (C-like) callback function for every record stored in pmem::kv::db, whose keys are greater than the key1 and less than the key2.  More...
  | 
|   | 
| status  | get_between (string_view key1, string_view key2, std::function< get_kv_function > f) noexcept | 
|   | Executes function for every record stored in pmem::kv::db, whose keys are greater than the key1 and less than the key2.  More...
  | 
|   | 
| status  | exists (string_view key) noexcept | 
|   | Checks existence of record with given key.  More...
  | 
|   | 
| status  | get (string_view key, get_v_callback *callback, void *arg) noexcept | 
|   | Executes (C-like) callback function for record with given key.  More...
  | 
|   | 
| status  | get (string_view key, std::function< get_v_function > f) noexcept | 
|   | Executes function for record with given key.  More...
  | 
|   | 
| status  | get (string_view key, std::string *value) noexcept | 
|   | Gets value copy of record with given key.  More...
  | 
|   | 
| status  | put (string_view key, string_view value) noexcept | 
|   | Inserts a key-value pair into pmemkv database.  More...
  | 
|   | 
| status  | remove (string_view key) noexcept | 
|   | Removes from database record with given key.  More...
  | 
|   | 
| status  | defrag (double start_percent=0, double amount_percent=100) | 
|   | Defragments approximately 'amount_percent' percent of elements in the database starting from 'start_percent' percent of elements.  More...
  | 
|   | 
| result< tx >  | tx_begin () noexcept | 
|   | Starts a pmemkv transaction.  More...
  | 
|   | 
| result< read_iterator >  | new_read_iterator () | 
|   | Returns new read iterator in pmem::kv::result.  More...
  | 
|   | 
| result< write_iterator >  | new_write_iterator () | 
|   | Returns new write iterator in pmem::kv::result.  More...
  | 
|   | 
| std::string  | errormsg () | 
|   | Returns a human readable string describing the last error.  More...
  | 
|   | 
Main pmemkv class, it provides functions to operate on data in database. 
Database class for creating, opening and closing pmemkv's data file. It provides functions to write, read & remove data, count elements stored and check for existence of an element based on its key.
Note: It does not explicitly provide upper_bound/lower_bound functions. If you want to obtain an element(s) above or below the selected key, you can use pmem::kv::get_above() or pmem::kv::get_below(). See descriptions of these functions for details.
Example of basic usage: 
#include <cassert>
#include <cstdlib>
#include <iostream>
#include <sstream>
 
#define ASSERT(expr)                                                                     \
    do {                                                                             \
        if (!(expr))                                                             \
            std::cout << pmemkv_errormsg() << std::endl;                     \
        assert(expr);                                                            \
    } while (0)
#define LOG(msg) std::cout << msg << std::endl
 
 
const uint64_t SIZE = 1024UL * 1024UL * 1024UL;
 
int main(int argc, char *argv[])
{
    if (argc < 2) {
        std::cerr << "Usage: " << argv[0] << " file\n";
        exit(1);
    }
 
    
    LOG("Creating config");
    config cfg;
 
    status s = cfg.put_path(argv[1]);
 
    s = cfg.put_size(SIZE);
    s = cfg.put_create_if_missing(true);
 
    
    
 
    LOG("Opening pmemkv database with 'cmap' engine");
    s = kv.open("cmap", std::move(cfg));
 
    LOG("Putting new key");
    s = kv.put("key1", "value1");
 
    size_t cnt;
    s = kv.count_all(cnt);
 
    LOG("Reading key back");
    std::string value;
    s = kv.get("key1", &value);
 
    LOG("Iterating existing keys");
    s = kv.put("key2", "value2");
    s = kv.put("key3", "value3");
        LOG("  visited: " << k.data());
        return 0;
    });
 
    LOG("Defragmenting the database");
    s = kv.defrag(0, 100);
 
    LOG("Removing existing key");
    s = kv.remove("key1");
    s = kv.exists("key1");
 
    
    
    std::cout << s << std::endl;
 
    
    std::ostringstream oss;
    oss << s;
    assert(oss.str() == "NOT_FOUND (2)");
 
    
    LOG("Closing database");
    return 0;
}
db() noexcept
Default constructor with uninitialized database.
Definition: libpmemkv.hpp:1775
 
Main C++ pmemkv public header.
 
status
Status returned by most of pmemkv functions.
Definition: libpmemkv.hpp:84
 
@ NOT_FOUND
record (or config item) not found
 
obj::string_view string_view
Partial string_view implementation, defined in pmem::obj namespace in libpmemobj-cpp library (see: ht...
Definition: libpmemkv.hpp:47
 
 Example on how to open and re-open an existing database: 
int main(int argc, char *argv[])
{
    if (argc < 2) {
        std::cerr << "Usage: " << argv[0] << " pool\n";
        exit(1);
    }
 
    
    LOG("Creating config");
    config cfg;
 
    
    status s = cfg.put_path(argv[1]);
 
 
    LOG("Opening pmemkv database with 'cmap' engine");
    ASSERT(kv != nullptr);
    s = kv->open("cmap", std::move(cfg));
 
    LOG("Putting new key");
    s = kv->put("key1", "value1");
 
    size_t cnt;
    s = kv->count_all(cnt);
 
    LOG("Reading key back");
    std::string value;
    s = kv->get("key1", &value);
 
    LOG("Iterating existing keys");
    s = kv->put("key2", "value2");
    s = kv->put("key3", "value3");
        LOG("  visited: " << k.data());
        return 0;
    });
 
    LOG("Closing database");
    delete kv;
    kv = nullptr;
 
    
 
    LOG("Creating config (the first one is not valid anymore)");
    config cfg2;
 
    s = cfg2.put_path(argv[1]);
 
    LOG("Re-opening pmemkv database with 'cmap' engine");
    ASSERT(kv != nullptr);
    s = kv->open("cmap", std::move(cfg2));
 
    s = kv->exists("key1");
 
    LOG("Removing existing key");
    s = kv->remove("key1");
    s = kv->exists("key1");
 
    LOG("Closing database");
    delete kv;
 
    return 0;
}
  Example for pmemkv's database supporting multiple engines: 
#include <cassert>
#include <cstdlib>
#include <iostream>
#include <libpmemobj++/container/string.hpp>
#include <libpmemobj++/container/vector.hpp>
#include <libpmemobj++/make_persistent.hpp>
#include <libpmemobj++/persistent_ptr.hpp>
#include <libpmemobj++/transaction.hpp>
 
#undef LOG
#define ASSERT(expr)                                                                     \
    do {                                                                             \
        if (!(expr))                                                             \
            std::cout << pmemkv_errormsg() << std::endl;                     \
        assert(expr);                                                            \
    } while (0)
#define LOG(msg) std::cout << msg << std::endl
 
using pmemoid_vector = pmem::obj::vector<PMEMoid>;
 
const uint64_t SIZE = 1024UL * 1024UL * 1024UL;
 
struct Root {
    pmem::obj::persistent_ptr<pmemoid_vector> oids;
    pmem::obj::persistent_ptr<pmem::obj::string> str;
};
 
int main(int argc, char *argv[])
{
    if (argc < 2) {
        std::cerr << "Usage: " << argv[0] << " file\n";
        exit(1);
    }
 
    const char *path = argv[1];
 
    pmem::obj::pool<Root> pop;
 
    try {
        pop = pmem::obj::pool<Root>::create(path, "pmemkv", SIZE, S_IRWXU);
 
        pmem::obj::transaction::run(pop, [&] {
            pop.root()->oids = pmem::obj::make_persistent<pmemoid_vector>();
            pop.root()->str = pmem::obj::make_persistent<pmem::obj::string>();
 
            pop.root()->oids->emplace_back(OID_NULL);
            pop.root()->oids->emplace_back(OID_NULL);
        });
 
        LOG("Creating configs");
        config cfg_1;
        config cfg_2;
 
        status ret = cfg_1.put_oid(&(pop.root()->oids->at(0)));
 
        ret = cfg_2.put_oid(&(pop.root()->oids->at(1)));
 
        LOG("Starting first cmap engine");
        ASSERT(kv_1 != nullptr);
        status s = kv_1->open(
"cmap", std::move(cfg_1));
 
 
        *(pop.root()->str) = "some string";
 
        LOG("Starting second cmap engine");
        ASSERT(kv_2 != nullptr);
        s = kv_2->open("cmap", std::move(cfg_2));
 
        LOG("Putting new key into first cmap");
        s = kv_1->put("key_1", "value_1");
 
        LOG("Putting new key into second cmap");
        s = kv_2->put("key_2", "value_2");
 
        LOG("Reading key back from first cmap");
        std::string value;
        s = kv_1->get("key_1", &value);
 
        LOG("Reading key back from second cmap");
        value.clear();
        s = kv_2->get("key_2", &value);
 
        LOG("Defragmenting the first cmap");
        s = kv_1->defrag(0, 100);
 
        LOG("Defragmenting the second cmap");
        s = kv_2->defrag(0, 100);
 
        LOG("Stopping first cmap engine");
        delete kv_1;
 
        LOG("Stopping second cmap engine");
        delete kv_2;
 
    } catch (std::exception &e) {
        std::cerr << "Exception occurred: " << e.what() << std::endl;
    }
 
    try {
        pop.close();
    } catch (const std::logic_error &e) {
        std::cerr << "Exception occurred: " << e.what() << std::endl;
    }
 
    return 0;
}