diff --git a/src/sdsdkv-client.h b/src/sdsdkv-client.h index 2f8156c..a681670 100644 --- a/src/sdsdkv-client.h +++ b/src/sdsdkv-client.h @@ -140,7 +140,8 @@ struct sdsdkv_client : public personality { // ch_placement_find_closest( m_place, - // TODO(skg) How to properly handle arbitrary data? + // TODO(skg) How to properly handle arbitrary-sized data (e.g., data + // less than sizeof(uint64_t))? *(uint64_t *)(key), replication, server_indices diff --git a/src/sdsdkv-config.h b/src/sdsdkv-config.h index c10308d..b1df95c 100644 --- a/src/sdsdkv-config.h +++ b/src/sdsdkv-config.h @@ -62,6 +62,8 @@ class sdsdkv_iconfig { // sdsdkv_config_db db_type; // + sdsdkv_compare_fn cmp_fn; + // std::string group_name; // std::string db_path; @@ -88,6 +90,7 @@ class sdsdkv_iconfig { personality = config.personality; hash_be = config.hash_be; db_type = config.db_type; + cmp_fn = config.cmp_fn; group_name = string(config.group_name); db_path = string(config.db_path); db_name = string(config.db_name); diff --git a/src/sdsdkv-server.h b/src/sdsdkv-server.h index 4609ed6..0fdad09 100644 --- a/src/sdsdkv-server.h +++ b/src/sdsdkv-server.h @@ -122,8 +122,7 @@ struct sdsdkv_server : public personality { m_config->db_name.c_str(), m_config->db_path.c_str(), sdsdkv_iconfig::get_real_db_type(m_config->db_type), - // TODO(skg) Make a user param. - SDSKV_COMPARE_DEFAULT, + m_config->cmp_fn, &m_dbid ); if (rc != SDSKV_SUCCESS) return sdskv2irc(rc); diff --git a/src/sdsdkv.h b/src/sdsdkv.h index 3b8e4a8..368070e 100644 --- a/src/sdsdkv.h +++ b/src/sdsdkv.h @@ -24,6 +24,12 @@ extern "C" { /** Convenience definition (in case anyone needs this). */ #define SDSDKV 1 +/** Default comparison function type. */ +#define SDSDKV_COMPARE_DEFAULT NULL + +/** Custom comparison function type. */ +typedef int (*sdsdkv_compare_fn)(const void*, size_t, const void*, size_t); + /** External context type. */ typedef void* sdsdkv_context; @@ -97,6 +103,7 @@ enum sdsdkv_config_db { SDSDKV_DB_LEVELDB }; + // TODO(skg) Allow for two modes of operation: // - Total lash-up // - Connect @@ -111,6 +118,8 @@ typedef struct sdsdkv_config { sdsdkv_config_hashing hash_be; /** Database type. */ sdsdkv_config_db db_type; + /** Key comparison function. */ + sdsdkv_compare_fn cmp_fn; /** Group name. */ char *group_name; /** If applicable, the path where database files will be written. */ diff --git a/tests/trivial.cc b/tests/trivial.cc index c7a2987..e9eb118 100644 --- a/tests/trivial.cc +++ b/tests/trivial.cc @@ -54,11 +54,13 @@ main(int argc, char **argv) /* .init_comm = */ MPI_COMM_WORLD, /* .personality = */ - (rank == 0) ? SDSDKV_PERSONALITY_SERVER: SDSDKV_PERSONALITY_CLIENT, + (rank == 0) ? SDSDKV_PERSONALITY_SERVER : SDSDKV_PERSONALITY_CLIENT, /* .hash_be = */ SDSDKV_HASHING_CH_PLACEMENT, /* .db_type = */ SDSDKV_DB_LEVELDB, + /* .cmp_fn= */ + SDSDKV_COMPARE_DEFAULT, /* .group_name = */ (char *)"groupname", /* .db_path = */