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