Multi-ApplicationOnlineProfiling  2.1
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
jsonCache.h
Go to the documentation of this file.
1 #ifndef CACHE_H
2 #define CACHE_H
3 
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <stdint.h>
7 #include <pthread.h>
8 
9 /*
10  TYPES
11 */
12 
13 typedef enum json_type_e
14 {
23 } json_type;
24 
25 /*
26  MAIN Json type definition
27 */
28 
29 typedef struct json_t_s
30 {
32  size_t refcounter;
33 
34  pthread_spinlock_t lock;
35  volatile char locked;
36 }json_t;
37 
38 static inline void json_lock( json_t *json )
39 {
40  if( !json )
41  return;
42 
43  pthread_spin_lock( &json->lock );
44  json->locked = 1;
45 }
46 
47 static inline void json_unlock( json_t *json )
48 {
49  if( !json )
50  return;
51 
52  pthread_spin_unlock( &json->lock );
53  json->locked = 0;
54 }
55 
56 static inline int json_locked( json_t *json )
57 {
58  return json->locked;
59 }
60 
61 void json_incref( json_t *json );
62 void json_decref( json_t *json );
63 
64 /* INTERNALS ------------------------ */
66 void __json_t_release( json_t *json );
67 /* ---------------------------------- */
68 
69 static inline void json_incref_lf( json_t *json )
70 {
71  if( !json )
72  return;
73 
74  json->refcounter++;
75 }
76 
77 
78 static inline int json_decref_lf( json_t *json )
79 {
80  if( !json )
81  return 0;
82 
83  json->refcounter--;
84 
85  if( json->refcounter == 0 )
86  {
87  __json_t_release( json );
88  return 0;
89  }
90 
91  return 1;
92 }
93 
94 
95 
96 /*
97  BASIC Types
98 */
99 
100 typedef struct json_null_s
101 {
103 } json_null_t;
104 
105 json_t * json_null();
106 void json_null_destroy(json_t * json);
107 
108 typedef struct json_bool_s
109 {
111  char value;
112 } json_bool_t;
113 
114 json_t * json_bool( int thruth );
115 
116 /* INTERNALS ------------------------ */
117 void json_bool_destroy(json_t * json);
118 /* ---------------------------------- */
119 
120 /*
121  C Types
122 */
123 
124 typedef struct json_string_s
125 {
127  char *value;
128 } json_string_t;
129 
130 json_t * json_string( char * string );
131 json_t * json_string_l( char *string , int len );
132 
133 /* INTERNALS ------------------------ */
134 void json_string_destroy(json_t * json);
135 /* ---------------------------------- */
136 
137 typedef struct json_int_s
138 {
140  int64_t value;
141 } json_int_t;
142 
143 json_t * json_int( int64_t value );
144 
145 /* INTERNALS ------------------------ */
146 void json_int_destroy(json_t * json);
147 /* ---------------------------------- */
148 
149 typedef struct json_real_s
150 {
152  double value;
153 } json_real_t;
154 
155 json_t * json_real( double value );
156 
157 /* INTERNALS ------------------------ */
158 void json_real_destroy(json_t * json);
159 /* ---------------------------------- */
160 
161 /*
162  CONTAINERS Types
163 */
164 
166 {
167  char *key;
169 
171 };
172 
173 struct ObjectHT
174 {
176  size_t size;
178 };
179 
180 
181 void ObjectHT_init( struct ObjectHT *ht, int pow2_size );
182 void ObjectHT_release( struct ObjectHT *ht );
183 
184 void ObjectHT_set( struct ObjectHT *ht, char *key, json_t * elem );
185 struct ObjectHT_entry * ObjectHT_get( struct ObjectHT *ht, char *key );
186 void ObjectHT_delete( struct ObjectHT *ht, char *key );
187 
188 
189 typedef struct json_object_s
190 {
192  struct ObjectHT ht;
193 } json_object_t;
194 
195 json_t * json_object();
196 
197 json_t * json_object_set( json_t * json, char *key, json_t * elem );
198 json_t * json_object_get( json_t * json, char *key );
199 json_t * json_object_delete( json_t * json, char *key );
200 
201 
202 /* INTERNALS ------------------------ */
203 void json_object_destroy(json_t * json);
204 /* ---------------------------------- */
205 
206 typedef struct json_array_s
207 {
209 
211  size_t size;
212 } json_array_t;
213 
214 json_t * json_array();
215 
216 json_t * json_array_push(json_t *json, json_t * elem);
217 json_t * json_array_push_at(json_t *json, unsigned int offset, json_t * elem);
218 json_t * json_array_get( json_t *json, unsigned int offset );
219 json_t * json_array_set( json_t *json, unsigned int offset , json_t * elem);
220 json_t * json_array_del( json_t *json, unsigned int offset );
221 
222 /* INTERNALS ------------------------ */
223 void json_array_destroy(json_t * json);
224 int json_array_guarantee( json_array_t *a, unsigned int offset, int count );
225 /* ---------------------------------- */
226 
227 
228 /*
229  json_t MUTATORS
230 */
231 
232 #define json_to_null( a ) ( (json_null_t *)( a ) )
233 #define json_to_bool( a ) ( (json_bool_t *)( a ) )
234 #define json_to_string( a ) ( (json_string_t *)( a ) )
235 #define json_to_int( a ) ( (json_int_t *)( a ) )
236 #define json_to_real( a ) ( (json_real_t *)( a ) )
237 #define json_to_object( a ) ( (json_object_t *)( a ) )
238 #define json_to_array( a ) ( (json_array_t *)( a ) )
239 
240 /*
241  OBJECT ITERATOR
242 */
243 
244 
246 {
247  struct ObjectHT *ht;
251 
252 static inline void json_object_iterator_init( json_object_iterator *it, json_t * json )
253 {
254  if( json->type != JSON_OBJECT )
255  {
256  it->ht = NULL;
257  it->current_bucket = -1;
258  it->current_elem = NULL;
259  return;
260  }
261 
262  json_object_t *o = json_to_object( json );
263 
264  it->ht = &o->ht;
265  it->current_bucket = 0;
266  it->current_elem = NULL;
267 
268 
269 }
270 
272 {
273  if( !it->ht )
274  return 0;
275 
276  if( !it->current_elem )
277  {
278  it->current_elem = it->ht->entries[ it->current_bucket ];
279  }
280  else
281  {
282  it->current_elem = it->current_elem->prev;
283  }
284 
285  if( !it->current_elem )
286  {
287  it->current_bucket++;
288 
289  if( it->ht->size <= it->current_bucket )
290  {
291  return 0;
292  }
293  else
294  {
295  return json_object_iterator_next( it );
296  }
297 
298  }
299  else
300  {
301  return 1;
302  }
303 
304 }
305 
307 {
308 
309  if( it->current_elem )
310  {
311  return it->current_elem->key;
312  }
313 
314  return NULL;
315 }
316 
318 {
319  if( it->current_elem )
320  {
321  return it->current_elem->elem;
322  }
323 
324  return NULL;
325 }
326 
327 
328 /*
329  Dumping
330 */
331 
332 typedef enum
333 {
337 }json_format;
338 
339 
340 char * json_dump( json_t * json, json_format mode );
341 void json_dump_f(FILE * f, json_t * json, json_format mode );
342 
343 static inline void json_print( json_t * json, json_format mode )
344 {
345  json_dump_f( stdout , json, mode );
346 }
347 
348 /*
349  PARSING
350 */
351 
352 json_t * _json_parse( char ** buff );
353 json_t * json_parse( char * json );
354 
355 
356 /*
357  CACHE Implementation
358 */
359 
360 struct jsonCache
361 {
363 
364  void (*set_handler)( char *, json_t *, void *);
365  void (*delete_handler)( char *, void *);
366  void *ctx;
367 };
368 
369 
370 void jsonCache_init( struct jsonCache *cache, void (*set_handler)( char *, json_t *, void *ctx), void (*delete_handler)( char *, void *ctx), void *ctx );
371 void jsonCache_release( struct jsonCache *cache );
372 json_t * jsonCache_get( struct jsonCache *cache, char *key );
373 
374 void jsonCache_commit( struct jsonCache *cache, char *key );
375 char * jsonCache_json( struct jsonCache *c, char *key, json_format mode );
376 
377 void jsonCache_set_json( struct jsonCache *cache, char *key, char *json );
378 void jsonCache_set( struct jsonCache *cache, char *key, json_t * elem );
379 
380 void jsonCache_set_json_nocommit( struct jsonCache *cache, char *key, char *json );
381 void jsonCache_set_nocommit( struct jsonCache *cache, char *key, json_t * elem );
382 
383 void jsonCache_delete( struct jsonCache *cache, char *key );
384 void jsonCache_delete_nocommit( struct jsonCache *cache, char *key );
385 
386 #endif /* CACHE_H */
enum json_type_e json_type
void json_dump_f(FILE *f, json_t *json, json_format mode)
Definition: jsonCache.c:980
static void json_unlock(json_t *json)
Definition: jsonCache.h:47
void jsonCache_delete_nocommit(struct jsonCache *cache, char *key)
Definition: jsonCache.c:1570
json_t * json_array()
Definition: jsonCache.c:540
void json_decref(json_t *json)
Definition: jsonCache.c:23
char * jsonCache_json(struct jsonCache *c, char *key, json_format mode)
Definition: jsonCache.c:1660
struct ObjectHT ht
Definition: jsonCache.h:192
struct ObjectHT_entry * current_elem
Definition: jsonCache.h:249
void * ctx
Definition: jsonCache.h:366
void jsonCache_set_nocommit(struct jsonCache *cache, char *key, json_t *elem)
Definition: jsonCache.c:1625
void json_object_destroy(json_t *json)
Definition: jsonCache.c:480
struct ObjectHT_entry ** entries
Definition: jsonCache.h:175
void json_int_destroy(json_t *json)
Definition: jsonCache.c:223
struct json_real_s json_real_t
struct json_null_s json_null_t
void json_incref(json_t *json)
Definition: jsonCache.c:13
json_t * json_array_get(json_t *json, unsigned int offset)
Definition: jsonCache.c:618
size_t size
Definition: jsonCache.h:176
void jsonCache_set_json_nocommit(struct jsonCache *cache, char *key, char *json)
Definition: jsonCache.c:1653
void jsonCache_init(struct jsonCache *cache, void(*set_handler)(char *, json_t *, void *ctx), void(*delete_handler)(char *, void *ctx), void *ctx)
void jsonCache_set_json(struct jsonCache *cache, char *key, char *json)
Definition: jsonCache.c:1648
static void json_object_iterator_init(json_object_iterator *it, json_t *json)
Definition: jsonCache.h:252
json_t * jsonCache_get(struct jsonCache *cache, char *key)
Definition: jsonCache.c:1539
int json_array_guarantee(json_array_t *a, unsigned int offset, int count)
Definition: jsonCache.c:553
int64_t value
Definition: jsonCache.h:140
json_t * json_object_set(json_t *json, char *key, json_t *elem)
Definition: jsonCache.c:487
char * json_dump(json_t *json, json_format mode)
Definition: jsonCache.c:938
json_t * json_string(char *string)
Definition: jsonCache.c:173
void ObjectHT_init(struct ObjectHT *ht, int pow2_size)
Definition: jsonCache.c:310
double value
Definition: jsonCache.h:152
static void json_lock(json_t *json)
Definition: jsonCache.h:38
char * value
Definition: jsonCache.h:127
json_t ___
Definition: jsonCache.h:151
json_t * json_array_del(json_t *json, unsigned int offset)
Definition: jsonCache.c:655
json_t * json_object()
Definition: jsonCache.c:468
size_t refcounter
Definition: jsonCache.h:32
json_t ___
Definition: jsonCache.h:102
void jsonCache_commit(struct jsonCache *cache, char *key)
Definition: jsonCache.c:1578
static int json_decref_lf(json_t *json)
Definition: jsonCache.h:78
json_type_e
Definition: jsonCache.h:13
json_t * json_parse(char *json)
Definition: jsonCache.c:1504
json_t * json_string_l(char *string, int len)
Definition: jsonCache.c:184
json_t * json_array_push(json_t *json, json_t *elem)
Definition: jsonCache.c:610
void json_real_destroy(json_t *json)
Definition: jsonCache.c:240
static void json_incref_lf(json_t *json)
Definition: jsonCache.h:69
json_t ___
Definition: jsonCache.h:191
struct ObjectHT_entry * prev
Definition: jsonCache.h:170
int pow2_size
Definition: jsonCache.h:177
struct json_bool_s json_bool_t
volatile char locked
Definition: jsonCache.h:35
json_format
Definition: jsonCache.h:332
json_t * elem
Definition: jsonCache.h:168
json_type type
Definition: jsonCache.h:31
char * key
Definition: jsonCache.h:167
void __json_t_release(json_t *json)
Definition: jsonCache.c:97
json_t * _json_parse(char **buff)
Definition: jsonCache.c:1469
struct json_array_s json_array_t
static int json_locked(json_t *json)
Definition: jsonCache.h:56
struct json_string_s json_string_t
void ObjectHT_set(struct ObjectHT *ht, char *key, json_t *elem)
Definition: jsonCache.c:409
json_t * json_object_delete(json_t *json, char *key)
Definition: jsonCache.c:520
json_t * json_int(int64_t value)
Definition: jsonCache.c:212
struct json_object_s json_object_t
json_t * json_real(double value)
Definition: jsonCache.c:229
void json_null_destroy(json_t *json)
Definition: jsonCache.c:151
json_t * json_array_push_at(json_t *json, unsigned int offset, json_t *elem)
Definition: jsonCache.c:592
json_t ___
Definition: jsonCache.h:139
json_t ___
Definition: jsonCache.h:208
json_t * json_array_set(json_t *json, unsigned int offset, json_t *elem)
Definition: jsonCache.c:635
void json_bool_destroy(json_t *json)
Definition: jsonCache.c:167
pthread_spinlock_t lock
Definition: jsonCache.h:34
void jsonCache_delete(struct jsonCache *cache, char *key)
Definition: jsonCache.c:1565
json_t ___
Definition: jsonCache.h:126
size_t size
Definition: jsonCache.h:211
void json_string_destroy(json_t *json)
Definition: jsonCache.c:205
struct ObjectHT * ht
Definition: jsonCache.h:247
void(* delete_handler)(char *, void *)
Definition: jsonCache.h:365
void ObjectHT_delete(struct ObjectHT *ht, char *key)
Definition: jsonCache.c:461
static json_t * json_object_iterator_elem(json_object_iterator *it)
Definition: jsonCache.h:317
static int json_object_iterator_next(json_object_iterator *it)
Definition: jsonCache.h:271
struct ObjectHT_entry * ObjectHT_get(struct ObjectHT *ht, char *key)
Definition: jsonCache.c:387
json_t ** content
Definition: jsonCache.h:210
json_t * cache
Definition: jsonCache.h:362
struct json_int_s json_int_t
static void json_print(json_t *json, json_format mode)
Definition: jsonCache.h:343
void jsonCache_set(struct jsonCache *cache, char *key, json_t *elem)
Definition: jsonCache.c:1619
void jsonCache_release(struct jsonCache *cache)
Definition: jsonCache.c:1531
json_t * json_object_get(json_t *json, char *key)
Definition: jsonCache.c:500
char value
Definition: jsonCache.h:111
json_t * json_bool(int thruth)
Definition: jsonCache.c:156
#define json_to_object(a)
Definition: jsonCache.h:237
void json_array_destroy(json_t *json)
Definition: jsonCache.c:700
struct json_t_s json_t
void ObjectHT_release(struct ObjectHT *ht)
Definition: jsonCache.c:332
json_t * json_null()
Definition: jsonCache.c:145
void(* set_handler)(char *, json_t *, void *)
Definition: jsonCache.h:364
static char * json_object_iterator_key(json_object_iterator *it)
Definition: jsonCache.h:306
json_t ___
Definition: jsonCache.h:110
json_t * __json_t_init(json_type type)
Definition: jsonCache.c:31
Definition: jsonCache.h:165
struct json_object_iterator_s json_object_iterator