Provided by: libpmemkv-dev_1.1-1_amd64 bug

NAME

       pmemkv - Key/Value Datastore for Persistent Memory

SYNOPSIS

              #include <libpmemkv.h>

              typedef int pmemkv_get_kv_callback(const char *key, size_t keybytes, const char *value,
                          size_t valuebytes, void *arg);
              typedef void pmemkv_get_v_callback(const char *value, size_t valuebytes, void *arg);

              int pmemkv_open(const char *engine, pmemkv_config *config, pmemkv_db **db);
              void pmemkv_close(pmemkv_db *kv);

              int pmemkv_count_all(pmemkv_db *db, size_t *cnt);
              int pmemkv_count_above(pmemkv_db *db, const char *k, size_t kb, size_t *cnt);
              int pmemkv_count_below(pmemkv_db *db, const char *k, size_t kb, size_t *cnt);
              int pmemkv_count_between(pmemkv_db *db, const char *k1, size_t kb1, const char *k2,
                          size_t kb2, size_t *cnt);

              int pmemkv_get_all(pmemkv_db *db, pmemkv_get_kv_callback *c, void *arg);
              int pmemkv_get_above(pmemkv_db *db, const char *k, size_t kb, pmemkv_get_kv_callback *c,
                          void *arg);
              int pmemkv_get_below(pmemkv_db *db, const char *k, size_t kb, pmemkv_get_kv_callback *c,
                          void *arg);
              int pmemkv_get_between(pmemkv_db *db, const char *k1, size_t kb1, const char *k2,
                          size_t kb2, pmemkv_get_kv_callback *c, void *arg);

              int pmemkv_exists(pmemkv_db *db, const char *k, size_t kb);

              int pmemkv_get(pmemkv_db *db, const char *k, size_t kb, pmemkv_get_v_callback *c,
                          void *arg);
              int pmemkv_get_copy(pmemkv_db *db, const char *k, size_t kb, char *buffer,
                          size_t buffer_size, size_t *value_size);
              int pmemkv_put(pmemkv_db *db, const char *k, size_t kb, const char *v, size_t vb);

              int pmemkv_remove(pmemkv_db *db, const char *k, size_t kb);

              int pmemkv_defrag(pmemkv_db *db, double start_percent, double amount_percent);

              const char *pmemkv_errormsg(void);

       For  pmemkv  configuration  API  description  see libpmemkv_config(3).  For general pmemkv
       information, engine descriptions and bindings details see libpmemkv(7).

DESCRIPTION

       Keys and values stored in a pmemkv database can be arbitrary binary data and  can  contain
       multiple  null characters.  Every function which accepts key expects const char *k pointer
       to data and its size as size_t.

       Some of the functions (mainly range-query API) are not guaranteed to be implemented by all
       engines.    If   an   engine   does  not  support  a  certain  function,  it  will  return
       PMEMKV_STATUS_NOT_SUPPORTED.

       int pmemkv_open(const char *engine, pmemkv_config *config, pmemkv_db **db);
              Opens the pmemkv database and stores a pointer to a pmemkv_db instance in *db.  The
              engine  parameter  specifies  the  engine  name  (see  libpmemkv(7) for the list of
              available  engines).    The   config   parameter   specifies   configuration   (see
              libpmemkv_config(3) for details).  Pmemkv takes ownership of the config parameter -
              this means that pmemkv_config_delete() must NOT be called after successful open.

       void pmemkv_close(pmemkv_db *kv);
              Closes pmemkv database.

       int pmemkv_count_all(pmemkv_db *db, size_t *cnt);
              Stores in *cnt the number of records in db.

       int pmemkv_count_above(pmemkv_db *db, const char *k, size_t kb, size_t *cnt);
              Stores in *cnt the number of records in db whose keys are greater than the key k of
              length kb.

       int pmemkv_count_below(pmemkv_db *db, const char *k, size_t kb, size_t *cnt);
              Stores  in  *cnt  the number of records in db whose keys are less than the key k of
              length kb.

       int pmemkv_count_between(pmemkv_db *db, const char *k1, size_t kb1, const char *k2, size_t
       kb2, size_t *cnt);
              Stores  in  *cnt the number of records in db whose keys are greater than key k1 (of
              length kb1) and less than key k2 (of length kb2).

       int pmemkv_get_all(pmemkv_db *db, pmemkv_get_kv_callback *c, void *arg);
              Executes function c for every  record  stored  in  db.   Arguments  passed  to  the
              function  are:  pointer  to a key, size of the key, pointer to a value, size of the
              value and arg specified by the user.  Function c can stop  iteration  by  returning
              non-zero value.  In that case pmemkv_get_all() returns PMEMKV_STATUS_STOPPED_BY_CB.
              Returning 0 continues iteration.

       int pmemkv_get_above(pmemkv_db *db, const char *k, size_t kb,  pmemkv_get_kv_callback  *c,
       void *arg);
              Executes function c for every record stored in db whose keys are greater than key k
              (of length kb).  Arguments passed to c are: pointer to a  key,  size  of  the  key,
              pointer  to  a  value, size of the value and arg specified by the user.  Function c
              can stop iteration by returning non-zero value.  In  that  case  pmemkv_get_above()
              returns PMEMKV_STATUS_STOPPED_BY_CB.  Returning 0 continues iteration.

       int  pmemkv_get_below(pmemkv_db  *db, const char *k, size_t kb, pmemkv_get_kv_callback *c,
       oid *arg);
              Executes function c for every record stored in db whose keys are less  than  key  k
              (of  length  kb).   Arguments  passed  to c are: pointer to a key, size of the key,
              pointer to a value, size of the value and arg specified by the  user.   Function  c
              can  stop  iteration  by returning non-zero value.  In that case pmemkv_get_below()
              returns PMEMKV_STATUS_STOPPED_BY_CB.  Returning 0 continues iteration.

       int pmemkv_get_between(pmemkv_db *db, const char *k1, size_t kb1, const char  *k2,  size_t
       kb2, pmemkv_get_kv_callback *c, void *arg);
              Executes  function  c for every record stored in db whose keys are greater than key
              k1 (of length kb1) and less than key k2 (of length kb2).   Arguments  passed  to  c
              are:  pointer  to a key, size of the key, pointer to a value, size of the value and
              arg specified by the user.  Function c can stop  iteration  by  returning  non-zero
              value.   In  that  case  pmemkv_get_between()  returns PMEMKV_STATUS_STOPPED_BY_CB.
              Returning 0 continues iteration.

       int pmemkv_exists(pmemkv_db *db, const char *k, size_t kb);
              Checks existence of record  with  key  k  of  length  kb.   If  record  is  present
              PMEMKV_STATUS_OK is returned, otherwise PMEMKV_STATUS_NOT_FOUND is returned.  Other
              possible return values are described in the ERRORS section.

       int pmemkv_get(pmemkv_db *db, const char *k, size_t  kb,  pmemkv_get_v_callback  *c,  void
       *arg);
              Executes  function c on record with key k (of length kb).  If record is present and
              no error occurred the function returns PMEMKV_STATUS_OK.  If record does not  exist
              PMEMKV_STATUS_NOT_FOUND is returned.  Other possible return values are described in
              the ERRORS section.  Function c is called with the following parameters: pointer to
              a  value,  size  of  the  value and arg specified by the user.  Value points to the
              location where data  is  actually  stored  (no  copy  occurs).   This  function  is
              guaranteed to be implemented by all engines.

       int  pmemkv_get_copy(pmemkv_db  *db,  const  char  *k,  size_t  kb,  char  *buffer, size_t
       buffer_size, size_t *value_size);
              Copies value of record with key k of length kb to  user  provided  buffer.   buffer
              points  to  the  value  buffer,  buffer_size  specifies its size and *value_size is
              filled in by this function.  If the value doesn’t fit in the provided  buffer  then
              this  function  returns  PMEMKV_STATUS_UNKNOWN_ERROR.  Otherwise, in absence of any
              errors, PMEMKV_STATUS_OK is returned.  Other possible return values  are  described
              in  the  ERRORS  section.   This  function  is  guaranteed to be implemented by all
              engines.

       int pmemkv_put(pmemkv_db *db, const char *k, size_t kb, const char *v, size_t vb);
              Inserts a key-value pair into pmemkv database.  kb is the length of key k and vb is
              the  length  of  value v.  When this function returns, caller is free to reuse both
              buffers.  This function is guaranteed to be implemented by all engines.

       int pmemkv_remove(pmemkv_db *db, const char *k, size_t kb);
              Removes record with key k  of  length  kb.   This  function  is  guaranteed  to  be
              implemented by all engines.

       int pmemkv_defrag(pmemkv_db *db, double start_percent, double amount_percent);
              Defragments  approximately  `amount_percent'  percent  of  elements in the database
              starting from `start_percent' percent of elements.

       const char *pmemkv_errormsg(void);
              Returns a human readable string describing the last error.

   ERRORS
       Each function, except  for  pmemkv_close()  and  pmemkv_errormsg(),  returns  one  of  the
       following status codes:

       • PMEMKV_STATUS_OK – no error

       • PMEMKV_STATUS_UNKNOWN_ERROR – unknown error

       • PMEMKV_STATUS_NOT_FOUND – record not found

       • PMEMKV_STATUS_NOT_SUPPORTED – function is not implemented by current engine

       • PMEMKV_STATUS_INVALID_ARGUMENT – argument to function has wrong value

       • PMEMKV_STATUS_CONFIG_PARSING_ERROR – parsing data to config failed

       • PMEMKV_STATUS_CONFIG_TYPE_ERROR – config item has different type than expected

       • PMEMKV_STATUS_STOPPED_BY_CB – iteration was stopped by user’s callback

       • PMEMKV_STATUS_OUT_OF_MEMORY  –  operation  failed because there is not enough memory (or
         space on the device)

       • PMEMKV_STATUS_WRONG_ENGINE_NAME – engine name does not match any available engine

       • PMEMKV_STATUS_TRANSACTION_SCOPE_ERROR – an  error  with  the  scope  of  the  libpmemobj
         transaction

       • PMEMKV_STATUS_DEFRAG_ERROR  – the defragmentation process failed (possibly in the middle
         of a run)

       Status returned from a function can change in a future version of  a  library  to  a  more
       specific  one.   For  example,  if  a  function returns PMEMKV_STATUS_UNKNOWN_ERROR, it is
       possible  that  in  future  versions  it   will   return   PMEMKV_STATUS_INVALID_ARGUMENT.
       Recommended way to check for an error is to compare status with PMEMKV_STATUS_OK.

EXAMPLE

              #include <assert.h>
              #include <libpmemkv.h>
              #include <stdio.h>
              #include <stdlib.h>
              #include <string.h>

              #define LOG(msg) puts(msg)
              #define MAX_VAL_LEN 64

              static const uint64_t SIZE = 1024UL * 1024UL * 1024UL;

              int get_kv_callback(const char *k, size_t kb, const char *value, size_t value_bytes,
                          void *arg)
              {
                  printf("   visited: %s\n", k);

                  return 0;
              }

              int main(int argc, char *argv[])
              {
                  if (argc < 2) {
                      fprintf(stderr, "Usage: %s file\n", argv[0]);
                      exit(1);
                  }

                  /* See libpmemkv_config(3) for more detailed example of config creation */
                  LOG("Creating config");
                  pmemkv_config *cfg = pmemkv_config_new();
                  assert(cfg != NULL);

                  int s = pmemkv_config_put_string(cfg, "path", argv[1]);
                  assert(s == PMEMKV_STATUS_OK);
                  s = pmemkv_config_put_uint64(cfg, "size", SIZE);
                  assert(s == PMEMKV_STATUS_OK);
                  s = pmemkv_config_put_uint64(cfg, "force_create", 1);
                  assert(s == PMEMKV_STATUS_OK);

                  LOG("Opening pmemkv database with 'cmap' engine");
                  pmemkv_db *db = NULL;
                  s = pmemkv_open("cmap", cfg, &db);
                  assert(s == PMEMKV_STATUS_OK);
                  assert(db != NULL);

                  LOG("Putting new key");
                  const char *key1 = "key1";
                  const char *value1 = "value1";
                  s = pmemkv_put(db, key1, strlen(key1), value1, strlen(value1));
                  assert(s == PMEMKV_STATUS_OK);

                  size_t cnt;
                  s = pmemkv_count_all(db, &cnt);
                  assert(s == PMEMKV_STATUS_OK);
                  assert(cnt == 1);

                  LOG("Reading key back");
                  char val[MAX_VAL_LEN];
                  s = pmemkv_get_copy(db, key1, strlen(key1), val, MAX_VAL_LEN, NULL);
                  assert(s == PMEMKV_STATUS_OK);
                  assert(!strcmp(val, "value1"));

                  LOG("Iterating existing keys");
                  const char *key2 = "key2";
                  const char *value2 = "value2";
                  const char *key3 = "key3";
                  const char *value3 = "value3";
                  pmemkv_put(db, key2, strlen(key2), value2, strlen(value2));
                  pmemkv_put(db, key3, strlen(key3), value3, strlen(value3));
                  pmemkv_get_all(db, &get_kv_callback, NULL);

                  LOG("Removing existing key");
                  s = pmemkv_remove(db, key1, strlen(key1));
                  assert(s == PMEMKV_STATUS_OK);
                  assert(pmemkv_exists(db, key1, strlen(key1)) == PMEMKV_STATUS_NOT_FOUND);

                  LOG("Defragmenting the database");
                  s = pmemkv_defrag(db, 0, 100);
                  assert(s == PMEMKV_STATUS_OK);

                  LOG("Closing database");
                  pmemkv_close(db);

                  return 0;
              }

SEE ALSO

       libpmemkv(7), libpmemkv_config(3) and <https://pmem.io>