61 #define GET_PTR_FOR_HASH(key) ((unsigned int)(key)) 63 #define GET_PTR_FOR_HASH(key) (((UINT64)(key)) & 0xFFFFFFFFUL) 97 static unsigned int mht_3str_pseudo_key (
const void *key,
int key_size,
const unsigned int max_value);
109 #if defined (ENABLE_UNUSED_FUNCTION) 110 static unsigned int mht_get32_next_power_of_2 (
unsigned int const ht_size);
111 static unsigned int mht_get_linear_hash32 (
const unsigned int key,
const unsigned int ht_size);
130 unsigned const char *byte_p = (
unsigned char *) key;
131 unsigned int pseudo_key;
135 for (pseudo_key = 0;; byte_p++)
152 pseudo_key = (pseudo_key << 5) - pseudo_key + *byte_p;
177 unsigned const char *byte_p = (
unsigned char *) key;
178 unsigned int pseudo_key;
183 for (pseudo_key = 0;; byte_p++)
200 pseudo_key = (pseudo_key << 4) + *byte_p;
201 i = pseudo_key & 0xf0000000;
204 pseudo_key ^= i >> 24;
232 unsigned const char *byte_p = (
unsigned char *) key;
233 unsigned int pseudo_key = 0;
237 for (pseudo_key = 0;; byte_p++)
254 pseudo_key = (pseudo_key * 32 + *byte_p++) % max_value;
280 unsigned char tbl[] = {
281 166, 231, 148, 061, 050, 131, 000, 057, 126, 223,
282 044, 245, 138, 251, 24, 113, 86, 215, 196, 173,
283 226, 115, 48, 169, 46, 207, 92, 101, 58, 235,
284 72, 225, 6, 199, 244, 29, 146, 99, 96, 25,
285 222, 191, 140, 213, 234, 219, 120, 81, 182, 183,
286 36, 141, 66, 83, 144, 137, 142, 175, 188, 69,
287 154, 203, 168, 193, 102, 167, 84, 253, 242, 67,
288 192, 249, 62, 159, 236, 181, 74, 187, 216, 49,
289 22, 151, 132, 109, 162, 51, 240, 105, 238, 143,
290 28, 37, 250, 171, 8, 161, 198, 135, 180, 221,
291 82, 35, 32, 217, 158, 127, 76, 149, 170, 155,
292 56, 17, 118, 119, 228, 77, 2, 19, 80, 73, 78,
293 111, 124, 5, 90, 139, 104, 129, 38, 103, 20,
294 189, 178, 3, 128, 185, 254, 95, 172, 117, 10,
295 123, 152, 241, 214, 87, 68, 45, 98, 243, 176,
296 41, 174, 79, 220, 229, 186, 107, 200, 97, 134,
297 71, 116, 157, 18, 227, 224, 153, 94, 63, 12,
298 85, 106, 91, 248, 209, 54, 55, 164, 13, 194,
299 211, 16, 9, 14, 47, 60, 197, 26, 75, 40,
300 65, 230, 39, 212, 125, 114, 195, 64, 121, 190,
301 31, 108, 53, 202, 59, 88, 177, 150, 23, 4,
302 237, 34, 179, 112, 233, 110, 15, 156, 165, 122,
303 43, 136, 33, 70, 7, 52, 93, 210, 163, 160,
304 89, 30, 255, 204, 21, 42, 27, 184, 145, 246,
305 247, 100, 205, 130, 147, 208, 201, 206, 239, 252,
306 133, 218, 11, 232, 1, 0
308 unsigned int byte1, byte2, byte3, byte4;
309 unsigned const char *byte_p = (
unsigned char *) key;
313 byte1 = tbl[*byte_p];
314 byte2 = tbl[(
unsigned int) (*byte_p + 1) % 256];
315 byte3 = tbl[(
unsigned int) (*byte_p + 2) % 256];
316 byte4 = tbl[(
unsigned int) (*byte_p + 3) % 256];
325 else if (key_size > 0)
352 byte1 = tbl[byte1 ^ *byte_p];
353 byte2 = tbl[byte2 ^ *byte_p];
354 byte3 = tbl[byte3 ^ *byte_p];
355 byte4 = tbl[byte4 ^ *byte_p];
364 return (byte1 | (byte2 << 8) | (byte3 << 16) | (byte4 << 24));
378 unsigned int hash = 5381;
388 while ((c = *(k + i++)) != 0)
390 hash = ((hash << 5) + hash) + c;
395 for (; i < key_size; i++)
397 hash = ((hash << 5) + hash) + *(k +
i);
401 hash += ~(hash << 9);
402 hash ^= ((hash >> 14) | (i << 18));
404 hash ^= ((hash >> 10) | (i << 22));
423 unsigned const char *byte_p = (
unsigned char *) key;
428 for (hash = 0; *byte_p; byte_p++)
433 hash = (hash << 5) - hash + ch;
435 return hash % ht_size;
537 return (*(
const unsigned int *) key) % ht_size;
563 unsigned int hash = 0;
588 y = (
unsigned int) bigint;
614 hash = (
unsigned int) (*time);
621 hash = (
unsigned int) (*time_st);
627 hash = (
unsigned int) (ts_tz->
timestamp);
635 hash = (
unsigned int) (datetime->
date ^ datetime->
time);
648 hash = (
unsigned int) (*date);
654 hash = (
unsigned int) mon->
amount;
716 return hash % ht_size;
733 return ((*(
const int *) key1 == *(
const int *) key2));
769 return ((strcmp ((
const char *) key1, (
const char *) key2)) == 0);
781 return (key1 == key2);
810 11, 23, 37, 53, 67, 79, 97, 109, 127, 149,
811 167, 191, 211, 227, 251, 269, 293, 311, 331, 349,
812 367, 389, 409, 431, 449, 467, 487, 509, 541, 563,
813 587, 607, 631, 653, 673, 521, 541, 557, 569, 587,
814 599, 613, 641, 673, 701, 727, 751, 787, 821, 853,
815 881, 907, 941, 977, 1039, 1087, 1129, 1171, 1213, 1259,
816 1301, 1361, 1409, 1471, 1523, 1579, 1637, 1693, 1747, 1777,
817 1823, 1867, 1913, 1973, 2017, 2129, 2237, 2339, 2441, 2543,
818 2647, 2749, 2851, 2953, 3061, 3163, 3271, 3373, 3491, 3593,
819 3697, 3803, 3907, 4013, 4177, 4337, 4493, 4649, 4801, 4957,
820 5059, 5167, 5273, 5381, 5483, 5591, 5693, 5801, 5903, 6007,
821 6113, 6217, 6317, 6421, 6521, 6637, 6737, 6841, 6847, 7057,
822 7283, 7487, 7687, 7901, 8101, 8311, 8513, 8713, 8923, 9127,
823 9337, 9539, 9739, 9941, 10141, 10343, 10559, 10771, 10973, 11177,
824 11383, 11587, 11789, 12007, 12409, 12809, 13217, 13619, 14029, 14431,
825 14831, 15233, 15641, 16057, 16477, 16879, 17291, 18097, 18899, 19699,
826 20507, 21313, 22123, 23131, 24133, 25147, 26153, 27179, 28181, 29123
832 int left, right, middle;
837 if (!((ht_size & (ht_size - 1)) == 0))
840 while (!(ht_size & (ht_size - 1)))
842 ht_size &= (ht_size - 1);
850 for (middle = 0, left = 0, right =
NPRIMES - 1; left <= right;)
894 mht_create (
const char *name,
int est_size,
unsigned int (*hash_func) (
const void *key,
unsigned int ht_size),
895 int (*cmp_func) (
const void *key1,
const void *key2))
899 unsigned int ht_estsize;
932 size = ht_estsize *
DB_SIZEOF (*hvector);
952 ht->
size = ht_estsize;
960 for (; ht_estsize > 0; ht_estsize--)
982 mht_create_hls (
const char *name,
int est_size,
unsigned int (*hash_func) (
const void *key,
unsigned int ht_size),
983 int (*cmp_func) (
const void *key1,
const void *key2))
987 unsigned int ht_estsize;
1020 size = ht_estsize *
DB_SIZEOF (*hvector);
1022 if (hvector ==
NULL)
1034 ht->
table = hvector;
1036 ht->
size = ht_estsize;
1043 for (; ht_estsize > 0; ht_estsize--)
1066 float rehash_factor;
1081 est_size = (
unsigned int) (ht->
size * rehash_factor);
1089 if (new_hvector ==
NULL)
1096 memset (new_hvector, 0x00, size);
1099 for (ht->
ncollisions = 0, hvector = ht->
table, i = 0; i < ht->size; hvector++, i++)
1102 for (hentry = *hvector; hentry !=
NULL; hentry = next_hentry)
1104 next_hentry = hentry->
next;
1107 if (hash >= est_size)
1113 hentry->
next = new_hvector[hash];
1118 new_hvector[hash] = hentry;
1125 ht->
table = new_hvector;
1185 unsigned int i, error_code;
1193 for (hvector = ht->
table, i = 0; i < ht->size; hvector++, i++)
1196 for (hentry = *hvector; hentry !=
NULL; hentry = next_hentry)
1201 error_code = (*rem_func) (hentry->
key, hentry->
data, func_args);
1211 next_hentry = hentry->
next;
1243 unsigned int i, error_code;
1251 for (hvector = ht->
table, i = 0; i < ht->size; hvector++, i++)
1254 for (hentry = *hvector; hentry !=
NULL; hentry = next_hentry)
1259 error_code = (*rem_func) (
NULL, hentry->
data, func_args);
1268 next_hentry = hentry->
next;
1300 int (*print_func) (
THREAD_ENTRY * thread_p, FILE * fp,
const void *key,
void *data,
void *args),
1316 "HTABLE NAME = %s, SIZE = %d, REHASH_AT = %d,\n" "NENTRIES = %d, NPREALLOC = %d, NCOLLISIONS = %d\n\n",
1319 if (print_id_opt == -1)
1323 else if (print_id_opt)
1326 for (hvector = ht->
table, i = 0; i < ht->size; hvector++, i++)
1328 if (*hvector !=
NULL)
1330 fprintf (out_fp,
"HASH AT %d\n", i);
1332 for (hentry = *hvector; cont ==
TRUE && hentry !=
NULL; hentry = hentry->
next)
1334 cont = (*print_func) (thread_p, out_fp, hentry->
key, hentry->
data, func_args);
1344 cont = (*print_func) (thread_p, out_fp, hentry->
key, hentry->
data, func_args);
1348 fprintf (out_fp,
"\n");
1370 int (*print_func) (
THREAD_ENTRY * thread_p, FILE * fp,
const void *data,
void *args),
1386 "HTABLE NAME = %s, SIZE = %d,\n" "NENTRIES = %d, NPREALLOC = %d, NCOLLISIONS = %d\n\n",
1392 for (hvector = ht->
table, i = 0; i < ht->size; hvector++, i++)
1394 if (*hvector !=
NULL)
1396 fprintf (out_fp,
"HASH AT %d\n", i);
1398 for (hentry = *hvector; cont ==
TRUE && hentry !=
NULL; hentry = hentry->
next)
1400 cont = (*print_func) (thread_p, out_fp, hentry->
data, func_args);
1405 fprintf (out_fp,
"\n");
1432 if (hash >= ht->
size)
1438 for (hentry = ht->
table[hash]; hentry !=
NULL; hentry = hentry->
next)
1445 return hentry->
data;
1508 if (hash >= ht->
size)
1514 for (hentry = ht->
table[hash]; hentry !=
NULL; hentry = hentry->
next)
1520 return hentry->
data;
1525 return hentry->
data;
1561 if (hash >= ht->
size)
1567 hentry = ht->
table[hash];
1575 return hentry->
data;
1616 if (hash >= ht->
size)
1624 for (hentry = ht->
table[hash]; hentry !=
NULL; hentry = hentry->
next)
1631 return hentry->
data;
1639 hentry->
data = data;
1683 hentry->
data = data;
1704 ht->
table[hash] = hentry;
1814 if (hash >= ht->
size)
1822 for (hentry = ht->
table[hash]; hentry !=
NULL; hentry = hentry->
next)
1824 if ((hentry->
key == key || (*ht->
cmp_func) (hentry->
key, key)) && hentry->
data == data)
1831 hentry->
data = data;
1871 hentry->
data = data;
1888 ht->
table[hash] = hentry;
1907 #if defined (ENABLE_UNUSED_FUNCTION) 1909 mht_put2_data (
MHT_TABLE * ht,
const void *key,
void *data)
1932 mht_put2 (
MHT_TABLE * ht,
const void *key,
void *data)
1952 mht_rem (
MHT_TABLE * ht,
const void *key,
int (*rem_func) (
const void *key,
void *data,
void *args),
void *func_args)
1966 if (hash >= ht->
size)
1972 for (hentry = ht->
table[hash], prev_hentry =
NULL; hentry !=
NULL; prev_hentry = hentry, hentry = hentry->
next)
1985 error_code = (*rem_func) (hentry->
key, hentry->
data, func_args);
2042 if (prev_hentry !=
NULL)
2078 mht_rem2 (
MHT_TABLE * ht,
const void *key,
const void *data,
int (*rem_func) (
const void *key,
void *data,
void *args),
2090 if (hash >= ht->
size)
2096 for (hentry = ht->
table[hash], prev_hentry =
NULL; hentry !=
NULL; prev_hentry = hentry, hentry = hentry->
next)
2098 if ((hentry->
key == key || (*ht->
cmp_func) (hentry->
key, key)) && hentry->
data == data)
2108 error_code = (*rem_func) (hentry->
key, hentry->
data, func_args);
2160 if (prev_hentry !=
NULL)
2199 mht_map (
const MHT_TABLE * ht,
int (*map_func) (
const void *key,
void *data,
void *args),
void *func_args)
2207 for (hentry = ht->
act_head; hentry !=
NULL; hentry = next)
2211 error_code = (*map_func) (hentry->
key, hentry->
data, func_args);
2218 return (error_code);
2232 int (*map_func) (
THREAD_ENTRY * thread_p,
void *data,
void *args),
void *func_args)
2240 for (hentry = ht->
act_head; hentry !=
NULL; hentry = next)
2244 error_code = (*map_func) (thread_p, hentry->
data, func_args);
2251 return (error_code);
2277 unsigned int hashcode = 0;
2281 if (!val ||
DB_IS_NULL (val) || ht_size <= 1)
2302 y = (
unsigned int) bigint;
2310 x = (
unsigned int *) &val->
data.
f;
2311 y = (*x) & 0xFFFFFFF0;
2318 unsigned int *x, y, z;
2319 x = (
unsigned int *) &val->
data.
d;
2320 y = (x[0]) & 0xFFFFFFF0;
2321 z = (x[1]) & 0xFFFFFFF0;
2327 unsigned int *buf = (
unsigned int *) val->
data.
num.
d.
buf;
2372 len = (int)
strlen (ptr);
2376 for (i--; 0 <= i && ptr[
i]; i--)
2386 if (!ptr || ptr[0] == 0 || i <= 0)
2393 hashcode %= ht_size;
2405 for (i = 0; i < size; i++)
2418 char *json_body =
NULL;
2422 if (json_body ==
NULL)
2428 len = (int)
strlen (json_body);
2431 hashcode %= ht_size;
2458 #if defined (ENABLE_UNUSED_FUNCTION) 2467 mht_get32_next_power_of_2 (
const unsigned int ht_size)
2469 unsigned int map = 0xffff0000, mapsave;
2477 if ((map & ht_size) == 0)
2482 for (mi = 3; mi >= 0; mi--)
2485 map = (map << (1 << mi)) & mapsave;
2486 if ((map & ht_size) == 0)
2488 map = (map ^ 0xffffffff) & mapsave;
2514 unsigned int c2 = 0x27d4eb2d;
2516 key = (key ^ 61) ^ (key >> 16);
2521 return (key % ht_size);
2524 #if defined (ENABLE_UNUSED_FUNCTION) 2532 mht_get_linear_hash32 (
const unsigned int key,
const unsigned int ht_size)
2534 unsigned int np, ret;
2536 np = mht_get32_next_power_of_2 (ht_size);
2537 ret = key & (np - 1);
2539 for (ret = key & (np - 1); ret >= ht_size; ret &= (np - 1))
2579 if (hash >= ht->
size)
2600 hentry->
data = data;
2605 ht->
table[hash] = hentry;
DB_C_FLOAT db_get_float(const DB_VALUE *value)
void mht_destroy_hls(MHT_HLS_TABLE *ht)
void * mht_get_hls(const MHT_HLS_TABLE *ht, const void *key, void **last)
static unsigned int mht_calculate_htsize(unsigned int ht_size)
static const void * mht_put2_internal(MHT_TABLE *ht, const void *key, void *data, MHT_PUT_OPT opt)
int mht_map_no_key(THREAD_ENTRY *thread_p, const MHT_TABLE *ht, int(*map_func)(THREAD_ENTRY *thread_p, void *data, void *args), void *func_args)
unsigned int mht_ptrhash(const void *key, const unsigned int ht_size)
unsigned int nprealloc_entries
enum mht_put_opt MHT_PUT_OPT
DB_COLLECTION * db_get_set(const DB_VALUE *value)
int mht_clear(MHT_TABLE *ht, int(*rem_func)(const void *key, void *data, void *args), void *func_args)
DB_MIDXKEY * db_get_midxkey(const DB_VALUE *value)
DB_VALUE_COMPARE_RESULT tp_value_compare(const DB_VALUE *value1, const DB_VALUE *value2, int allow_coercion, int total_order)
unsigned int mht_1strhash(const void *key, const unsigned int ht_size)
unsigned int mht_4strhash(const void *key, const unsigned int ht_size)
DB_CONST_C_BIT db_get_bit(const DB_VALUE *value, int *length)
int db_get_int(const DB_VALUE *value)
DB_C_DOUBLE db_get_double(const DB_VALUE *value)
int db_get_string_collation(const DB_VALUE *value)
DB_ENUM_ELEMENT enumeration
const void * mht_put_if_not_exists(MHT_TABLE *ht, const void *key, void *data)
int mht_rem(MHT_TABLE *ht, const void *key, int(*rem_func)(const void *key, void *data, void *args), void *func_args)
const void * mht_put(MHT_TABLE *ht, const void *key, void *data)
char * db_get_json_raw_body(const DB_VALUE *value)
static unsigned int mht_5str_pseudo_key(const void *key, int key_size)
DB_C_NUMERIC db_get_numeric(const DB_VALUE *value)
DB_DATETIMETZ * db_get_datetimetz(const DB_VALUE *value)
int mht_compare_ints_are_equal(const void *key1, const void *key2)
int mht_dump_hls(THREAD_ENTRY *thread_p, FILE *out_fp, const MHT_HLS_TABLE *ht, const int print_id_opt, int(*print_func)(THREAD_ENTRY *thread_p, FILE *fp, const void *data, void *args), void *func_args)
int set_size(DB_COLLECTION *set)
unsigned int nprealloc_entries
int mht_compare_logpageids_are_equal(const void *key1, const void *key2)
#define er_log_debug(...)
static const unsigned int mht_Primes[NPRIMES]
void * mht_get2(const MHT_TABLE *ht, const void *key, void **last)
unsigned int(* hash_func)(const void *key, unsigned int htsize)
void * db_fixed_alloc(HL_HEAPID heap_id, size_t size)
#define MHT2STR_COLL(id, str, size)
static const void * mht_put_hls_internal(MHT_HLS_TABLE *ht, const void *key, void *data, MHT_PUT_OPT opt)
#define GET_PTR_FOR_HASH(key)
static int mht_rehash(MHT_TABLE *ht)
void db_destroy_fixed_heap(HL_HEAPID heap_id)
static const void * mht_put_internal(MHT_TABLE *ht, const void *key, void *data, MHT_PUT_OPT opt)
DB_TIMESTAMPTZ * db_get_timestamptz(const DB_VALUE *value)
#define OID_PSEUDO_KEY(oidp)
DB_MONETARY * db_get_monetary(const DB_VALUE *value)
void mht_destroy(MHT_TABLE *ht)
unsigned int DB_TIMESTAMP
void er_set(int severity, const char *file_name, const int line_no, int err_id, int num_args,...)
unsigned int mht_1strlowerhash(const void *key, const unsigned int ht_size)
#define ER_OUT_OF_VIRTUAL_MEMORY
DB_TYPE db_value_type(const DB_VALUE *value)
int intl_identifier_casecmp(const char *str1, const char *str2)
unsigned int mht_3strhash(const void *key, const unsigned int ht_size)
unsigned int mht_numhash(const void *key, const unsigned int ht_size)
static const float MHT_REHASH_FACTOR
DB_OBJECT * db_get_object(const DB_VALUE *value)
unsigned int mht_valhash(const void *key, const unsigned int ht_size)
unsigned char buf[DB_NUMERIC_BUF_SIZE]
void * mht_get(MHT_TABLE *ht, const void *key)
HENTRY_PTR prealloc_entries
const void * mht_put2_new(MHT_TABLE *ht, const void *key, void *data)
int mht_compare_identifiers_equal(const void *key1, const void *key2)
DB_TIMESTAMPTZ timestamptz
const void * mht_put_data(MHT_TABLE *ht, const void *key, void *data)
const void * mht_put_hls(MHT_HLS_TABLE *ht, const void *key, void *data)
MHT_TABLE * mht_create(const char *name, int est_size, unsigned int(*hash_func)(const void *key, unsigned int ht_size), int(*cmp_func)(const void *key1, const void *key2))
#define db_private_free(thrd, ptr)
unsigned int mht_5strhash(const void *key, const unsigned int ht_size)
int set_get_element(DB_COLLECTION *set, int index, DB_VALUE *value)
int pr_midxkey_get_element_nocopy(const DB_MIDXKEY *midxkey, int index, DB_VALUE *value, int *prev_indexp, char **prev_ptrp)
#define CEIL_PTVDIV(dividend, divisor)
int pr_clear_value(DB_VALUE *value)
DB_BIGINT db_get_bigint(const DB_VALUE *value)
struct hentry * HENTRY_PTR
int mht_compare_ptrs_are_equal(const void *key1, const void *key2)
int mht_dump(THREAD_ENTRY *thread_p, FILE *out_fp, const MHT_TABLE *ht, const int print_id_opt, int(*print_func)(THREAD_ENTRY *thread_p, FILE *fp, const void *key, void *data, void *args), void *func_args)
static unsigned int mht_get_shiftmult32(unsigned int key, const unsigned int ht_size)
unsigned int mht_get_hash_number(const int ht_size, const DB_VALUE *val)
OID * db_get_oid(const DB_VALUE *value)
const void * mht_put_new(MHT_TABLE *ht, const void *key, void *data)
unsigned int mht_count(const MHT_TABLE *ht)
static unsigned int mht_3str_pseudo_key(const void *key, int key_size, const unsigned int max_value)
#define free_and_init(ptr)
DB_DATE * db_get_date(const DB_VALUE *value)
int mht_clear_hls(MHT_HLS_TABLE *ht, int(*rem_func)(const void *key, void *data, void *args), void *func_args)
int mht_rem2(MHT_TABLE *ht, const void *key, const void *data, int(*rem_func)(const void *key, void *data, void *args), void *func_args)
HENTRY_HLS_PTR prealloc_entries
DB_TIMESTAMP * db_get_timestamp(const DB_VALUE *value)
int db_get_string_size(const DB_VALUE *value)
DB_C_SHORT db_get_short(const DB_VALUE *value)
int(* cmp_func)(const void *key1, const void *key2)
MHT_HLS_TABLE * mht_create_hls(const char *name, int est_size, unsigned int(*hash_func)(const void *key, unsigned int ht_size), int(*cmp_func)(const void *key1, const void *key2))
int mht_map(const MHT_TABLE *ht, int(*map_func)(const void *key, void *data, void *args), void *func_args)
int db_make_null(DB_VALUE *value)
HL_HEAPID db_create_fixed_heap(int req_size, int recs_per_chunk)
#define DB_IS_NULL(value)
unsigned int(* hash_func)(const void *key, unsigned int htsize)
static unsigned int mht_1str_pseudo_key(const void *key, int key_size)
static unsigned int mht_4str_pseudo_key(const void *key, int key_size)
struct hentry_hls * HENTRY_HLS_PTR
DB_DATETIME * db_get_datetime(const DB_VALUE *value)
unsigned int mht_2str_pseudo_key(const void *key, int key_size)
unsigned int mht_2strhash(const void *key, const unsigned int ht_size)
static const float MHT_REHASH_TRESHOLD
DB_TIME * db_get_time(const DB_VALUE *value)
DB_C_POINTER db_get_pointer(const DB_VALUE *value)
int mht_compare_strings_are_equal(const void *key1, const void *key2)
int mht_adjust_lru_list(MHT_TABLE *ht, HENTRY_PTR hentry)
int(* cmp_func)(const void *key1, const void *key2)
DB_CONST_C_CHAR db_get_string(const DB_VALUE *value)
int mht_compare_dbvalues_are_equal(const void *key1, const void *key2)