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