PMEMKV_CONFIG(3) | PMEMKV Programmer's Manual | PMEMKV_CONFIG(3) |
pmemkv_config - Configuration API for libpmemkv
#include <libpmemkv.h> pmemkv_config *pmemkv_config_new(void); void pmemkv_config_delete(pmemkv_config *config); int pmemkv_config_put_size(pmemkv_config *config, uint64_t value); int pmemkv_config_put_path(pmemkv_config *config, const char *value); int pmemkv_config_put_force_create(pmemkv_config *config, bool value); int pmemkv_config_put_comparator(pmemkv_config *config, pmemkv_comparator *comparator); int pmemkv_config_put_oid(pmemkv_config *config, PMEMoid *oid); int pmemkv_config_put_data(pmemkv_config *config, const char *key, const void *value,
size_t value_size); int pmemkv_config_put_object(pmemkv_config *config, const char *key, void *value,
void (*deleter)(void *)); int pmemkv_config_put_object_cb(pmemkv_config *config, const char *key, void *value,
void *(*getter)(void *), void (*deleter)(void *)); int pmemkv_config_put_uint64(pmemkv_config *config, const char *key, uint64_t value); int pmemkv_config_put_int64(pmemkv_config *config, const char *key, int64_t value); int pmemkv_config_put_string(pmemkv_config *config, const char *key, const char *value); int pmemkv_config_get_data(pmemkv_config *config, const char *key, const void **value,
size_t *value_size); int pmemkv_config_get_object(pmemkv_config *config, const char *key, void **value); int pmemkv_config_get_uint64(pmemkv_config *config, const char *key, uint64_t *value); int pmemkv_config_get_int64(pmemkv_config *config, const char *key, int64_t *value); int pmemkv_config_get_string(pmemkv_config *config, const char *key, const char **value); pmemkv_comparator *pmemkv_comparator_new(pmemkv_compare_function *fn, const char *name,
void *arg); void pmemkv_comparator_delete(pmemkv_comparator *comparator);
For general description of pmemkv and available engines see libpmemkv(7). For description of pmemkv core API see libpmemkv(3).
pmemkv database is configured using pmemkv_config structure. It stores mappings of keys (null-terminated strings) to values. A value can be:
It also delivers methods to store and read configuration items provided by a user. Once the configuration object is set (with all required parameters), it can be passed to pmemkv_open() method.
List of options which are required by pmemkv database is specific to an engine. Every engine has documented all supported config parameters (please see libpmemkv(7) for details).
On failure, NULL is returned.
Calling pmemkv_config_put_object_cb with getter implemented as:
void *getter(void *arg) { return arg; }
is equivalent to calling pmemkv_config_put_object.
Config items stored in pmemkv_config, which were put using a specific function can be obtained only using corresponding pmemkv_config_get_ function (for example, config items put using pmemkv_config_put_object can only be obtained using pmemkv_config_get_object). Exception from this rule are functions for uint64 and int64. If value put by pmemkv_config_put_int64 is in uint64_t range it can be obtained using pmemkv_config_get_uint64 and vice versa.
Neither fn nor name can be NULL.
fn should perform a three-way comparison. Return values: * negative value if the first key is less than the second one * zero if both keys are the same * positive value if the first key is greater than the second one
The comparison function should be thread safe - it can be called from multiple threads.
On failure, NULL is returned.
To set a comparator for the database use pmemkv_config_put_object:
pmemkv_comparator *cmp = pmemkv_comparator_new(&compare_fn, "my_comparator", NULL); pmemkv_config_put_object(cfg, "comparator", cmp, (void (*)(void *)) & pmemkv_comparator_delete);
Each function, except for pmemkv_config_new() and pmemkv_config_delete(), returns status. Possible return values are:
The following examples are taken from examples/pmemkv_config_c directory.
Usage of basic config functions to set parameters based on their functionalities, e.g. pmemkv_config_put_path() or pmemkv_config_put_size().
#include <assert.h> #include <libpmemkv.h> #include <libpmemobj/pool_base.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define ASSERT(expr) \
do { \
if (!(expr)) \
puts(pmemkv_errormsg()); \
assert(expr); \
} while (0) static const uint64_t SIZE = 1024UL * 1024UL * 1024UL; int key_length_compare(const char *key1, size_t keybytes1, const char *key2,
size_t keybytes2, void *arg) {
if (keybytes2 < keybytes1)
return -1;
else if (keybytes2 > keybytes1)
return 1;
else
return 0; } int main(int argc, char *argv[]) {
if (argc < 2) {
fprintf(stderr, "Usage: %s file\n", argv[0]);
exit(1);
}
/* Create config */
pmemkv_config *config = pmemkv_config_new();
ASSERT(config != NULL);
/* Add path parameter to config. Meaning of this is dependent on chosen engine.
* E.g. if config is used with cmap engine,
* it is a path to a database file or to a poolset file. However for
* vcmap it is a path to an existing directory */
int status = pmemkv_config_put_path(config, argv[1]);
ASSERT(status == PMEMKV_STATUS_OK);
/* Specifies size of the database */
status = pmemkv_config_put_size(config, SIZE);
ASSERT(status == PMEMKV_STATUS_OK);
/* Specifies value of force create flag */
status = pmemkv_config_put_force_create(config, true);
ASSERT(status == PMEMKV_STATUS_OK);
/* Specifies comparator used by the engine */
pmemkv_comparator *cmp =
pmemkv_comparator_new(&key_length_compare, "key_length_compare", NULL);
ASSERT(cmp != NULL);
status = pmemkv_config_put_comparator(config, cmp);
ASSERT(status == PMEMKV_STATUS_OK);
/* Adds pointer to oid (for details see libpmemkv(7)) to the config */
PMEMoid oid;
status = pmemkv_config_put_oid(config, &oid);
ASSERT(status == PMEMKV_STATUS_OK);
pmemkv_config_delete(config);
return 0; }
Usage of config functions to set and get data based on their data type, e.g. pmemkv_config_put_int64() or pmemkv_config_put_object().
#include <assert.h> #include <libpmemkv.h> #include <libpmemkv_json_config.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define ASSERT(expr) \
do { \
if (!(expr)) \
puts(pmemkv_errormsg()); \
assert(expr); \
} while (0) /* deleter for int pointer */ void free_int_ptr(void *ptr) {
free(ptr); } int main() {
pmemkv_config *config = pmemkv_config_new();
ASSERT(config != NULL);
/* Put int64_t value */
int status = pmemkv_config_put_int64(config, "size", 1073741824);
ASSERT(status == PMEMKV_STATUS_OK);
char buffer[] = "ABC";
/* Put binary data stored in buffer */
status = pmemkv_config_put_data(config, "binary", buffer, 3);
ASSERT(status == PMEMKV_STATUS_OK);
const void *data;
size_t data_size;
/* Get pointer to binary data stored in config */
status = pmemkv_config_get_data(config, "binary", &data, &data_size);
ASSERT(status == PMEMKV_STATUS_OK);
ASSERT(data_size == 3);
ASSERT(((const char *)data)[0] == 'A');
int *int_ptr = malloc(sizeof(int));
ASSERT(int_ptr != NULL);
*int_ptr = 10;
/* Put pointer to dynamically allocated object, free_int_ptr is called on
* pmemkv_config_delete */
status = pmemkv_config_put_object(config, "int_ptr", int_ptr, &free_int_ptr);
ASSERT(status == PMEMKV_STATUS_OK);
int *get_int_ptr;
/* Get pointer to object stored in config */
status = pmemkv_config_get_object(config, "int_ptr", (void **)&get_int_ptr);
ASSERT(status == PMEMKV_STATUS_OK);
ASSERT(*get_int_ptr == 10);
pmemkv_config_delete(config);
pmemkv_config *config_from_json = pmemkv_config_new();
ASSERT(config_from_json != NULL);
/* Parse JSON and put all items found into config_from_json */
status = pmemkv_config_from_json(config_from_json, "{\"path\":\"/dev/shm\",\
\"size\":1073741824,\
\"subconfig\":{\
\"size\":1073741824\
}\
}");
ASSERT(status == PMEMKV_STATUS_OK);
const char *path;
status = pmemkv_config_get_string(config_from_json, "path", &path);
ASSERT(status == PMEMKV_STATUS_OK);
ASSERT(strcmp(path, "/dev/shm") == 0);
pmemkv_config *subconfig;
/* Get pointer to nested configuration "subconfig" */
status = pmemkv_config_get_object(config_from_json, "subconfig",
(void **)&subconfig);
ASSERT(status == PMEMKV_STATUS_OK);
size_t sub_size;
status = pmemkv_config_get_uint64(subconfig, "size", &sub_size);
ASSERT(status == PMEMKV_STATUS_OK);
ASSERT(sub_size == 1073741824);
pmemkv_config_delete(config_from_json);
return 0; }
libpmemkv(7), libpmemkv(3) , libpmemkv_json_config(3) and <https://pmem.io>
2021-02-15 | PMEMKV - pmemkv version 1.4 |