1 /*
2 * This file is part of the zlog Library.
3 *
4 * Copyright (C) 2011 by Hardy Simpson <HardySimpson1984@gmail.com>
5 *
6 * Licensed under the LGPL v2.1, see the file COPYING in base directory.
7 */
8
9 #include <stdlib.h>
10 #include <stdio.h>
11 #include <errno.h>
12
13 #include "mdc.h"
14 #include "zc_defs.h"
15
zlog_mdc_profile(zlog_mdc_t * a_mdc,int flag)16 void zlog_mdc_profile(zlog_mdc_t *a_mdc, int flag)
17 {
18 zc_hashtable_entry_t *a_entry;
19 zlog_mdc_kv_t *a_mdc_kv;
20
21 zc_assert(a_mdc,);
22 zc_profile(flag, "---mdc[%p]---", a_mdc);
23
24 zc_hashtable_foreach(a_mdc->tab, a_entry) {
25 a_mdc_kv = a_entry->value;
26 zc_profile(flag, "----mdc_kv[%p][%s]-[%s]----",
27 a_mdc_kv,
28 a_mdc_kv->key, a_mdc_kv->value);
29 }
30 return;
31 }
32 /*******************************************************************************/
zlog_mdc_del(zlog_mdc_t * a_mdc)33 void zlog_mdc_del(zlog_mdc_t * a_mdc)
34 {
35 zc_assert(a_mdc,);
36 if (a_mdc->tab) zc_hashtable_del(a_mdc->tab);
37 free(a_mdc);
38 zc_debug("zlog_mdc_del[%p]", a_mdc);
39 return;
40 }
41
zlog_mdc_kv_del(zlog_mdc_kv_t * a_mdc_kv)42 static void zlog_mdc_kv_del(zlog_mdc_kv_t * a_mdc_kv)
43 {
44 free(a_mdc_kv);
45 zc_debug("zlog_mdc_kv_del[%p]", a_mdc_kv);
46 }
47
zlog_mdc_kv_new(const char * key,const char * value)48 static zlog_mdc_kv_t *zlog_mdc_kv_new(const char *key, const char *value)
49 {
50 zlog_mdc_kv_t *a_mdc_kv;
51
52 a_mdc_kv = calloc(1, sizeof(zlog_mdc_kv_t));
53 if (!a_mdc_kv) {
54 zc_error("calloc fail, errno[%d]", errno);
55 return NULL;
56 }
57
58 snprintf(a_mdc_kv->key, sizeof(a_mdc_kv->key), "%s", key);
59 a_mdc_kv->value_len = snprintf(a_mdc_kv->value, sizeof(a_mdc_kv->value), "%s", value);
60 return a_mdc_kv;
61 }
62
zlog_mdc_new(void)63 zlog_mdc_t *zlog_mdc_new(void)
64 {
65 zlog_mdc_t *a_mdc;
66
67 a_mdc = calloc(1, sizeof(zlog_mdc_t));
68 if (!a_mdc) {
69 zc_error("calloc fail, errno[%d]", errno);
70 return NULL;
71 }
72
73 a_mdc->tab = zc_hashtable_new(20,
74 zc_hashtable_str_hash,
75 zc_hashtable_str_equal, NULL,
76 (zc_hashtable_del_fn) zlog_mdc_kv_del);
77 if (!a_mdc->tab) {
78 zc_error("zc_hashtable_new fail");
79 goto err;
80 }
81
82 //zlog_mdc_profile(a_mdc, ZC_DEBUG);
83 return a_mdc;
84 err:
85 zlog_mdc_del(a_mdc);
86 return NULL;
87 }
88
89 /*******************************************************************************/
zlog_mdc_put(zlog_mdc_t * a_mdc,const char * key,const char * value)90 int zlog_mdc_put(zlog_mdc_t * a_mdc, const char *key, const char *value)
91 {
92 zlog_mdc_kv_t *a_mdc_kv;
93
94 a_mdc_kv = zlog_mdc_kv_new(key, value);
95 if (!a_mdc_kv) {
96 zc_error("zlog_mdc_kv_new failed");
97 return -1;
98 }
99
100 if (zc_hashtable_put(a_mdc->tab, a_mdc_kv->key, a_mdc_kv)) {
101 zc_error("zc_hashtable_put fail");
102 zlog_mdc_kv_del(a_mdc_kv);
103 return -1;
104 }
105
106 return 0;
107 }
108
zlog_mdc_clean(zlog_mdc_t * a_mdc)109 void zlog_mdc_clean(zlog_mdc_t * a_mdc)
110 {
111 zc_hashtable_clean(a_mdc->tab);
112 return;
113 }
114
zlog_mdc_get(zlog_mdc_t * a_mdc,const char * key)115 char *zlog_mdc_get(zlog_mdc_t * a_mdc, const char *key)
116 {
117 zlog_mdc_kv_t *a_mdc_kv;
118
119 a_mdc_kv = zc_hashtable_get(a_mdc->tab, key);
120 if (!a_mdc_kv) {
121 zc_error("zc_hashtable_get fail");
122 return NULL;
123 } else {
124 return a_mdc_kv->value;
125 }
126 }
127
zlog_mdc_get_kv(zlog_mdc_t * a_mdc,const char * key)128 zlog_mdc_kv_t *zlog_mdc_get_kv(zlog_mdc_t * a_mdc, const char *key)
129 {
130 zlog_mdc_kv_t *a_mdc_kv;
131
132 a_mdc_kv = zc_hashtable_get(a_mdc->tab, key);
133 if (!a_mdc_kv) {
134 zc_error("zc_hashtable_get fail");
135 return NULL;
136 } else {
137 return a_mdc_kv;
138 }
139 }
140
zlog_mdc_remove(zlog_mdc_t * a_mdc,const char * key)141 void zlog_mdc_remove(zlog_mdc_t * a_mdc, const char *key)
142 {
143 zc_hashtable_remove(a_mdc->tab, key);
144 return;
145 }
146