1 /* sdb - MIT - Copyright 2011-2020 - pancake */
2 
3 #include "sdbht.h"
4 
sdbkv_fini(SdbKv * kv)5 void sdbkv_fini(SdbKv *kv) {
6 	free (kv->base.key);
7 	free (kv->base.value);
8 }
9 
sdb_ht_new(void)10 SDB_API HtPP* sdb_ht_new(void) {
11 	HtPP *ht = ht_pp_new ((HtPPDupValue)strdup, (HtPPKvFreeFunc)sdbkv_fini, (HtPPCalcSizeV)strlen);
12 	if (ht) {
13 		ht->opt.elem_size = sizeof (SdbKv);
14 	}
15 	return ht;
16 }
17 
sdb_ht_internal_insert(HtPP * ht,const char * key,const char * value,bool update)18 static bool sdb_ht_internal_insert(HtPP* ht, const char* key, const char* value, bool update) {
19 	if (!ht || !key || !value) {
20 		return false;
21 	}
22 	SdbKv kvp = {{ 0 }};
23 	kvp.base.key = strdup ((void *)key);
24 	if (!kvp.base.key) {
25 		goto err;
26 	}
27 	kvp.base.value = strdup ((void *)value);
28 	if (!kvp.base.value) {
29 		goto err;
30 	}
31 	kvp.base.key_len = strlen (kvp.base.key);
32 	kvp.base.value_len = strlen (kvp.base.value);
33 	kvp.expire = 0;
34 	return ht_pp_insert_kv (ht, (HtPPKv*)&kvp, update);
35 
36  err:
37 	free (kvp.base.key);
38 	free (kvp.base.value);
39 	return false;
40 }
41 
sdb_ht_insert(HtPP * ht,const char * key,const char * value)42 SDB_API bool sdb_ht_insert(HtPP* ht, const char* key, const char* value) {
43 	return sdb_ht_internal_insert (ht, key, value, false);
44 }
45 
sdb_ht_insert_kvp(HtPP * ht,SdbKv * kvp,bool update)46 SDB_API bool sdb_ht_insert_kvp(HtPP* ht, SdbKv *kvp, bool update) {
47 	return ht_pp_insert_kv (ht, (HtPPKv*)kvp, update);
48 }
49 
sdb_ht_update(HtPP * ht,const char * key,const char * value)50 SDB_API bool sdb_ht_update(HtPP *ht, const char *key, const char* value) {
51 	return sdb_ht_internal_insert (ht, key, value, true);
52 }
53 
sdb_ht_find_kvp(HtPP * ht,const char * key,bool * found)54 SDB_API SdbKv* sdb_ht_find_kvp(HtPP* ht, const char* key, bool* found) {
55 	return (SdbKv *)ht_pp_find_kv (ht, key, found);
56 }
57 
sdb_ht_find(HtPP * ht,const char * key,bool * found)58 SDB_API char* sdb_ht_find(HtPP* ht, const char* key, bool* found) {
59 	return (char *)ht_pp_find (ht, key, found);
60 }
61 
sdb_ht_free(HtPP * ht)62 SDB_API void sdb_ht_free(HtPP *ht) {
63 	ht_pp_free (ht);
64 }
65 
sdb_ht_delete(HtPP * ht,const char * key)66 SDB_API bool sdb_ht_delete(HtPP* ht, const char *key) {
67 	return ht_pp_delete (ht, key);
68 }
69